MLK-25465-6 dmaengine: imx-sdma: fix the long dma transfer timing grater than 2s
authorRobin Gong <yibin.gong@nxp.com>
Mon, 26 Apr 2021 18:19:47 +0000 (02:19 +0800)
committerRobin Gong <yibin.gong@nxp.com>
Wed, 28 Apr 2021 13:17:48 +0000 (21:17 +0800)
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 <yibin.gong@nxp.com>
Reviewed-by: Shengjiu Wang <shengjiu.wang@nxp.com>
(cherry picked from commit 9df533ad0ab7767db7cff1293d0c8dafb599130b)

drivers/dma/imx-sdma.c

index 93fbcb2..6f856ae 100644 (file)
@@ -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