From: Robin Gong Date: Mon, 26 Apr 2021 18:19:47 +0000 (+0800) Subject: MLK-25465-6 dmaengine: imx-sdma: fix the long dma transfer timing grater than 2s X-Git-Tag: rel_imx_5.10.35_2.0.0-somdevices.0~154 X-Git-Url: https://git.somdevices.com/?a=commitdiff_plain;h=ec4de359d4a2bafa24b8078dce4c9979a477de39;p=linux.git 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) --- 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