|
@@ -239,7 +239,19 @@ static void dw_shutdown(struct platform_device *pdev)
|
|
|
{
|
|
|
struct dw_dma_chip *chip = platform_get_drvdata(pdev);
|
|
|
|
|
|
+ /*
|
|
|
+ * We have to call dw_dma_disable() to stop any ongoing transfer. On
|
|
|
+ * some platforms we can't do that since DMA device is powered off.
|
|
|
+ * Moreover we have no possibility to check if the platform is affected
|
|
|
+ * or not. That's why we call pm_runtime_get_sync() / pm_runtime_put()
|
|
|
+ * unconditionally. On the other hand we can't use
|
|
|
+ * pm_runtime_suspended() because runtime PM framework is not fully
|
|
|
+ * used by the driver.
|
|
|
+ */
|
|
|
+ pm_runtime_get_sync(chip->dev);
|
|
|
dw_dma_disable(chip);
|
|
|
+ pm_runtime_put_sync_suspend(chip->dev);
|
|
|
+
|
|
|
clk_disable_unprepare(chip->clk);
|
|
|
}
|
|
|
|