dmaengine: sh: rz-dmac: Improve cleanup order in probe()/remove()
authorBiju Das <biju.das.jz@bp.renesas.com>
Thu, 6 Jul 2023 11:21:49 +0000 (12:21 +0100)
committerVinod Koul <vkoul@kernel.org>
Wed, 12 Jul 2023 16:54:00 +0000 (22:24 +0530)
We usually do cleanup in reverse order of init. Currently, in the
case of error, this is not followed in rz_dmac_probe(), and similar
case for remove().

This patch improves error handling in probe() and cleanup in
reverse order of init in the remove().

Reported-by: Pavel Machek <pavel@denx.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Pavel Machek <pavel@denx.de>
Link: https://lore.kernel.org/r/20230706112150.198941-2-biju.das.jz@bp.renesas.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/sh/rz-dmac.c

index 9479f29..229f642 100644 (file)
@@ -947,7 +947,6 @@ static int rz_dmac_probe(struct platform_device *pdev)
 dma_register_err:
        of_dma_controller_free(pdev->dev.of_node);
 err:
-       reset_control_assert(dmac->rstc);
        channel_num = i ? i - 1 : 0;
        for (i = 0; i < channel_num; i++) {
                struct rz_dmac_chan *channel = &dmac->channels[i];
@@ -958,6 +957,7 @@ err:
                                  channel->lmdesc.base_dma);
        }
 
+       reset_control_assert(dmac->rstc);
 err_pm_runtime_put:
        pm_runtime_put(&pdev->dev);
 err_pm_disable:
@@ -971,6 +971,8 @@ static int rz_dmac_remove(struct platform_device *pdev)
        struct rz_dmac *dmac = platform_get_drvdata(pdev);
        unsigned int i;
 
+       dma_async_device_unregister(&dmac->engine);
+       of_dma_controller_free(pdev->dev.of_node);
        for (i = 0; i < dmac->n_channels; i++) {
                struct rz_dmac_chan *channel = &dmac->channels[i];
 
@@ -979,8 +981,6 @@ static int rz_dmac_remove(struct platform_device *pdev)
                                  channel->lmdesc.base,
                                  channel->lmdesc.base_dma);
        }
-       of_dma_controller_free(pdev->dev.of_node);
-       dma_async_device_unregister(&dmac->engine);
        reset_control_assert(dmac->rstc);
        pm_runtime_put(&pdev->dev);
        pm_runtime_disable(&pdev->dev);