On Thu, 2012-01-12 at 10:55 +0100, Julia Lawall wrote: > From: Julia Lawall <Julia.Lawall@xxxxxxx> > > Add missing iounmap in error handling code, in a case where the function > already preforms iounmap on some other execution path. > > This patch additionally adds calls to clk_disable and clk_put. > > A simplified version of the semantic match that finds this problem is as > follows: (http://coccinelle.lip6.fr/) > > // <smpl> > @@ > expression e; > statement S,S1; > int ret; > @@ > e = \(ioremap\|ioremap_nocache\)(...) > ... when != iounmap(e) > if (<+...e...+>) S > ... when any > when != iounmap(e) > *if (...) > { ... when != iounmap(e) > return ...; } > ... when any > iounmap(e); > // </smpl> > > Signed-off-by: Julia Lawall <Julia.Lawall@xxxxxxx> Acked by Vinod Koul <vinod.koul@xxxxxxxxxxxxxxx> Which tree is this intended for? > > --- > Perhaps clk_put is not needed? It is not present in the remove function. > > drivers/dma/pl330.c | 17 +++++++++++------ > 1 file changed, 11 insertions(+), 6 deletions(-) > > diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c > index 2b3aab3..2f83094 100644 > --- a/drivers/dma/pl330.c > +++ b/drivers/dma/pl330.c > @@ -2690,7 +2690,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) > if (IS_ERR(pdmac->clk)) { > dev_err(&adev->dev, "Cannot get operation clock.\n"); > ret = -EINVAL; > - goto probe_err1; > + goto probe_err2; > } > > amba_set_drvdata(adev, pdmac); > @@ -2704,11 +2704,11 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) > ret = request_irq(irq, pl330_irq_handler, 0, > dev_name(&adev->dev), pi); > if (ret) > - goto probe_err2; > + goto probe_err3; > > ret = pl330_add(pi); > if (ret) > - goto probe_err3; > + goto probe_err4; > > INIT_LIST_HEAD(&pdmac->desc_pool); > spin_lock_init(&pdmac->pool_lock); > @@ -2765,7 +2765,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) > ret = dma_async_device_register(pd); > if (ret) { > dev_err(&adev->dev, "unable to register DMAC\n"); > - goto probe_err4; > + goto probe_err5; > } > > dev_info(&adev->dev, > @@ -2778,10 +2778,15 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) > > return 0; > > -probe_err4: > +probe_err5: > pl330_del(pi); > -probe_err3: > +probe_err4: > free_irq(irq, pi); > +probe_err3: > +#ifndef CONFIG_PM_RUNTIME > + clk_disable(pdmac->clk); > +#endif > + clk_put(pdmac->clk); > probe_err2: > iounmap(pi->base); > probe_err1: > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- ~Vinod -- To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html