| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Arvind Yadav <arvind.yadav.cs@gmail.com> |
| Date: Wed, 24 May 2017 12:09:53 +0530 |
| Subject: dmaengine: imx-sdma: Handle return value of clk_prepare_enable |
| |
| From: Arvind Yadav <arvind.yadav.cs@gmail.com> |
| |
| |
| [ Upstream commit fb9caf370f4d0457789d13a1a1b110a8db846e5e ] |
| |
| clk_prepare_enable() can fail here and we must check its return value. |
| |
| Signed-off-by: Arvind Yadav <arvind.yadav.cs@gmail.com> |
| Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/dma/imx-sdma.c | 23 ++++++++++++++++++----- |
| 1 file changed, 18 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/dma/imx-sdma.c |
| +++ b/drivers/dma/imx-sdma.c |
| @@ -1755,19 +1755,26 @@ static int sdma_probe(struct platform_de |
| 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_d |
| 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]; |