From ec4de359d4a2bafa24b8078dce4c9979a477de39 Mon Sep 17 00:00:00 2001 From: Robin Gong Date: Tue, 27 Apr 2021 02:19:47 +0800 Subject: [PATCH] MLK-25465-6 dmaengine: imx-sdma: fix the long dma transfer timing grater than 2s In case the dma transfer timing longer than 2s, sdma would be power off so that cyclic transfer would be broken, forbid runtime auto suspend in such case instead. Signed-off-by: Robin Gong Reviewed-by: Shengjiu Wang (cherry picked from commit 9df533ad0ab7767db7cff1293d0c8dafb599130b) --- drivers/dma/imx-sdma.c | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index 93fbcb234d7a..6f856aedbc66 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c @@ -975,12 +975,8 @@ static irqreturn_t sdma_int_handler(int irq, void *dev_id) struct sdma_engine *sdma = dev_id; unsigned long stat; - if (sdma->drvdata->pm_runtime) - pm_runtime_get_sync(sdma->dev); - else { - clk_enable(sdma->clk_ipg); - clk_enable(sdma->clk_ahb); - } + clk_enable(sdma->clk_ipg); + clk_enable(sdma->clk_ahb); stat = readl_relaxed(sdma->regs + SDMA_H_INTR); writel_relaxed(stat, sdma->regs + SDMA_H_INTR); @@ -1011,13 +1007,8 @@ static irqreturn_t sdma_int_handler(int irq, void *dev_id) __clear_bit(channel, &stat); } - if (sdma->drvdata->pm_runtime) { - pm_runtime_mark_last_busy(sdma->dev); - pm_runtime_put_autosuspend(sdma->dev); - } else { - clk_disable(sdma->clk_ipg); - clk_disable(sdma->clk_ahb); - } + clk_disable(sdma->clk_ipg); + clk_disable(sdma->clk_ahb); return IRQ_HANDLED; } @@ -1266,9 +1257,6 @@ static int sdma_terminate_all(struct dma_chan *chan) struct sdma_channel *sdmac = to_sdma_chan(chan); unsigned long flags; - if (sdmac->sdma->drvdata->pm_runtime) - pm_runtime_get_sync(sdmac->sdma->dev); - spin_lock_irqsave(&sdmac->vc.lock, flags); sdma_disable_channel(chan); @@ -1281,10 +1269,8 @@ static int sdma_terminate_all(struct dma_chan *chan) spin_unlock_irqrestore(&sdmac->vc.lock, flags); - if (sdmac->sdma->drvdata->pm_runtime) { - pm_runtime_mark_last_busy(sdmac->sdma->dev); - pm_runtime_put_autosuspend(sdmac->sdma->dev); - } + if (sdmac->sdma->drvdata->pm_runtime) + pm_runtime_allow(sdmac->sdma->dev); return 0; } @@ -2086,17 +2072,12 @@ static void sdma_issue_pending(struct dma_chan *chan) unsigned long flags; if (sdmac->sdma->drvdata->pm_runtime) - pm_runtime_get_sync(sdmac->sdma->dev); + pm_runtime_forbid(sdmac->sdma->dev); spin_lock_irqsave(&sdmac->vc.lock, flags); if (vchan_issue_pending(&sdmac->vc) && !sdmac->desc) sdma_start_desc(sdmac); spin_unlock_irqrestore(&sdmac->vc.lock, flags); - - if (sdmac->sdma->drvdata->pm_runtime) { - pm_runtime_mark_last_busy(sdmac->sdma->dev); - pm_runtime_put_autosuspend(sdmac->sdma->dev); - } } #define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1 34 -- 2.17.1