From: "kaiwei.liu" <kaiwei.liu@xxxxxxxxxx> The DMA doesn't support device suspend/resume before, now some modules using DMA have add device suspend/resume which may invalidate the DMA runtime suspend/reusume mechanism and result in abnormal DMA suspend/resume. So here add relative interface for DMA device suspend/resume. Signed-off-by: kaiwei.liu <kaiwei.liu@xxxxxxxxxx> --- drivers/dma/sprd-dma.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/dma/sprd-dma.c b/drivers/dma/sprd-dma.c index 08fcf1ec368c..0fa950dfa4f0 100644 --- a/drivers/dma/sprd-dma.c +++ b/drivers/dma/sprd-dma.c @@ -1291,10 +1291,30 @@ static int __maybe_unused sprd_dma_runtime_resume(struct device *dev) return ret; } +static int sprd_dma_suspend_noirq(struct device *dev) +{ + if ((pm_runtime_status_suspended(dev)) || + (atomic_read(&(dev->power.usage_count)) > 1)) + return 0; + + return sprd_dma_runtime_suspend(dev); +} + +static int sprd_dma_resume_early(struct device *dev) +{ + if ((pm_runtime_status_suspended(dev)) || + (atomic_read(&(dev->power.usage_count)) > 1)) + return 0; + + return sprd_dma_runtime_resume(dev); +} + static const struct dev_pm_ops sprd_dma_pm_ops = { SET_RUNTIME_PM_OPS(sprd_dma_runtime_suspend, sprd_dma_runtime_resume, NULL) + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sprd_dma_suspend_noirq, + sprd_dma_resume_early) }; static struct platform_driver sprd_dma_driver = { -- 2.17.1