summaryrefslogtreecommitdiff
path: root/drivers/dma
diff options
context:
space:
mode:
authorRobin Gong <yibin.gong@nxp.com>2020-04-28 00:48:30 +0800
committerRobin Gong <yibin.gong@nxp.com>2020-04-28 22:23:41 +0800
commit6446b3a52390c090e17578b19bd71e14dd4c372b (patch)
tree0b7cad3f520ec5ff2e28c93b5a605ab45e771fc5 /drivers/dma
parent2191fda25cfdac089abba543b6ee0428d326e527 (diff)
MLK-23652-2: dmagengine: fsl-edma-v3: fix race condition
Add spinlock for 'tcd_pool', otherwise, in some race condition, 'tcd_pool = NULL' cause ISR never clear edma channel INT anymore which cause interrupt storm. Besides, clear interrupt directly before poweroff for safe. Signed-off-by: Robin Gong <yibin.gong@nxp.com> Reviewed-by: Fugang Duan <fugang.duan@nxp.com> (cherry picked from commit 37149f29a631f074ac65889375cd1b077284edf8)
Diffstat (limited to 'drivers/dma')
-rw-r--r--drivers/dma/fsl-edma-v3.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/dma/fsl-edma-v3.c b/drivers/dma/fsl-edma-v3.c
index f55f66018ad2..7204124a0742 100644
--- a/drivers/dma/fsl-edma-v3.c
+++ b/drivers/dma/fsl-edma-v3.c
@@ -838,8 +838,15 @@ static void fsl_edma3_free_chan_resources(struct dma_chan *chan)
vchan_dma_desc_free_list(&fsl_chan->vchan, &head);
dma_pool_destroy(fsl_chan->tcd_pool);
+
+ spin_lock_irqsave(&fsl_chan->vchan.lock, flags);
fsl_chan->tcd_pool = NULL;
fsl_chan->used = false;
+ /* Clear interrupt before power off */
+ if (readl(fsl_chan->membase + EDMA_CH_INT))
+ writel(1, fsl_chan->membase + EDMA_CH_INT);
+ spin_unlock_irqrestore(&fsl_chan->vchan.lock, flags);
+
pm_runtime_put_sync(fsl_chan->dev);
}