drivers/dma/pl330.c: add missing iounmap
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@lip6.fr> Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>hifive-unleashed-5.1
parent
2b4f130e05
commit
7bec78e0a8
|
@ -829,7 +829,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
|
||||||
if (IS_ERR(pdmac->clk)) {
|
if (IS_ERR(pdmac->clk)) {
|
||||||
dev_err(&adev->dev, "Cannot get operation clock.\n");
|
dev_err(&adev->dev, "Cannot get operation clock.\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto probe_err1;
|
goto probe_err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
amba_set_drvdata(adev, pdmac);
|
amba_set_drvdata(adev, pdmac);
|
||||||
|
@ -843,11 +843,11 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
|
||||||
ret = request_irq(irq, pl330_irq_handler, 0,
|
ret = request_irq(irq, pl330_irq_handler, 0,
|
||||||
dev_name(&adev->dev), pi);
|
dev_name(&adev->dev), pi);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto probe_err2;
|
goto probe_err3;
|
||||||
|
|
||||||
ret = pl330_add(pi);
|
ret = pl330_add(pi);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto probe_err3;
|
goto probe_err4;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&pdmac->desc_pool);
|
INIT_LIST_HEAD(&pdmac->desc_pool);
|
||||||
spin_lock_init(&pdmac->pool_lock);
|
spin_lock_init(&pdmac->pool_lock);
|
||||||
|
@ -904,7 +904,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
|
||||||
ret = dma_async_device_register(pd);
|
ret = dma_async_device_register(pd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&adev->dev, "unable to register DMAC\n");
|
dev_err(&adev->dev, "unable to register DMAC\n");
|
||||||
goto probe_err4;
|
goto probe_err5;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_info(&adev->dev,
|
dev_info(&adev->dev,
|
||||||
|
@ -917,10 +917,15 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
probe_err4:
|
probe_err5:
|
||||||
pl330_del(pi);
|
pl330_del(pi);
|
||||||
probe_err3:
|
probe_err4:
|
||||||
free_irq(irq, pi);
|
free_irq(irq, pi);
|
||||||
|
probe_err3:
|
||||||
|
#ifndef CONFIG_PM_RUNTIME
|
||||||
|
clk_disable(pdmac->clk);
|
||||||
|
#endif
|
||||||
|
clk_put(pdmac->clk);
|
||||||
probe_err2:
|
probe_err2:
|
||||||
iounmap(pi->base);
|
iounmap(pi->base);
|
||||||
probe_err1:
|
probe_err1:
|
||||||
|
|
Loading…
Reference in New Issue