It's cleaner to teardown RPM by revering the enable sequence, which makes code much easier to follow. Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx> --- drivers/dma/tegra20-apb-dma.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c index 7158bd3145c4..cc4a9ca20780 100644 --- a/drivers/dma/tegra20-apb-dma.c +++ b/drivers/dma/tegra20-apb-dma.c @@ -1429,13 +1429,15 @@ static int tegra_dma_probe(struct platform_device *pdev) spin_lock_init(&tdma->global_lock); pm_runtime_enable(&pdev->dev); - if (!pm_runtime_enabled(&pdev->dev)) + if (!pm_runtime_enabled(&pdev->dev)) { ret = tegra_dma_runtime_resume(&pdev->dev); - else + if (ret) + return ret; + } else { ret = pm_runtime_get_sync(&pdev->dev); - - if (ret < 0) - goto err_pm_disable; + if (ret < 0) + goto err_pm_disable; + } /* Reset DMA controller */ reset_control_assert(tdma->rst); @@ -1545,9 +1547,10 @@ static int tegra_dma_probe(struct platform_device *pdev) dma_async_device_unregister(&tdma->dma_dev); err_pm_disable: - pm_runtime_disable(&pdev->dev); - if (!pm_runtime_status_suspended(&pdev->dev)) + if (!pm_runtime_enabled(&pdev->dev)) tegra_dma_runtime_suspend(&pdev->dev); + else + pm_runtime_disable(&pdev->dev); return ret; } @@ -1558,9 +1561,10 @@ static int tegra_dma_remove(struct platform_device *pdev) dma_async_device_unregister(&tdma->dma_dev); - pm_runtime_disable(&pdev->dev); - if (!pm_runtime_status_suspended(&pdev->dev)) + if (!pm_runtime_enabled(&pdev->dev)) tegra_dma_runtime_suspend(&pdev->dev); + else + pm_runtime_disable(&pdev->dev); return 0; } -- 2.24.0