dmaengine: stm32-mdma: add suspend/resume power management support
authorPierre-Yves MORDRET <pierre-yves.mordret@st.com>
Mon, 27 Jan 2020 08:53:29 +0000 (09:53 +0100)
committerVinod Koul <vkoul@kernel.org>
Mon, 24 Feb 2020 16:50:01 +0000 (22:20 +0530)
Add suspend/resume power management relying on PM Runtime engine.

Signed-off-by: Pierre-Yves MORDRET <pierre-yves.mordret@st.com>
Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
Link: https://lore.kernel.org/r/20200127085334.13163-2-amelie.delaunay@st.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/stm32-mdma.c

index 5838311cf990044f8a0b962590e851ccedc805f1..2898411941d5824fa1c76d7c66f8657f9ceb4a25 100644 (file)
@@ -1697,7 +1697,40 @@ static int stm32_mdma_runtime_resume(struct device *dev)
 }
 #endif
 
+#ifdef CONFIG_PM_SLEEP
+static int stm32_mdma_pm_suspend(struct device *dev)
+{
+       struct stm32_mdma_device *dmadev = dev_get_drvdata(dev);
+       u32 ccr, id;
+       int ret;
+
+       ret = pm_runtime_get_sync(dev);
+       if (ret < 0)
+               return ret;
+
+       for (id = 0; id < dmadev->nr_channels; id++) {
+               ccr = stm32_mdma_read(dmadev, STM32_MDMA_CCR(id));
+               if (ccr & STM32_MDMA_CCR_EN) {
+                       dev_warn(dev, "Suspend is prevented by Chan %i\n", id);
+                       return -EBUSY;
+               }
+       }
+
+       pm_runtime_put_sync(dev);
+
+       pm_runtime_force_suspend(dev);
+
+       return 0;
+}
+
+static int stm32_mdma_pm_resume(struct device *dev)
+{
+       return pm_runtime_force_resume(dev);
+}
+#endif
+
 static const struct dev_pm_ops stm32_mdma_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(stm32_mdma_pm_suspend, stm32_mdma_pm_resume)
        SET_RUNTIME_PM_OPS(stm32_mdma_runtime_suspend,
                           stm32_mdma_runtime_resume, NULL)
 };