|
@@ -1755,19 +1755,26 @@ static int sdma_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR(sdma->clk_ahb))
|
|
|
return PTR_ERR(sdma->clk_ahb);
|
|
|
|
|
|
- clk_prepare(sdma->clk_ipg);
|
|
|
- clk_prepare(sdma->clk_ahb);
|
|
|
+ ret = clk_prepare(sdma->clk_ipg);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = clk_prepare(sdma->clk_ahb);
|
|
|
+ if (ret)
|
|
|
+ goto err_clk;
|
|
|
|
|
|
ret = devm_request_irq(&pdev->dev, irq, sdma_int_handler, 0, "sdma",
|
|
|
sdma);
|
|
|
if (ret)
|
|
|
- return ret;
|
|
|
+ goto err_irq;
|
|
|
|
|
|
sdma->irq = irq;
|
|
|
|
|
|
sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL);
|
|
|
- if (!sdma->script_addrs)
|
|
|
- return -ENOMEM;
|
|
|
+ if (!sdma->script_addrs) {
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto err_irq;
|
|
|
+ }
|
|
|
|
|
|
/* initially no scripts available */
|
|
|
saddr_arr = (s32 *)sdma->script_addrs;
|
|
@@ -1882,6 +1889,10 @@ err_register:
|
|
|
dma_async_device_unregister(&sdma->dma_device);
|
|
|
err_init:
|
|
|
kfree(sdma->script_addrs);
|
|
|
+err_irq:
|
|
|
+ clk_unprepare(sdma->clk_ahb);
|
|
|
+err_clk:
|
|
|
+ clk_unprepare(sdma->clk_ipg);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -1893,6 +1904,8 @@ static int sdma_remove(struct platform_device *pdev)
|
|
|
devm_free_irq(&pdev->dev, sdma->irq, sdma);
|
|
|
dma_async_device_unregister(&sdma->dma_device);
|
|
|
kfree(sdma->script_addrs);
|
|
|
+ clk_unprepare(sdma->clk_ahb);
|
|
|
+ clk_unprepare(sdma->clk_ipg);
|
|
|
/* Kill the tasklet */
|
|
|
for (i = 0; i < MAX_DMA_CHANNELS; i++) {
|
|
|
struct sdma_channel *sdmac = &sdma->channel[i];
|