diff options
author | Robin Gong <yibin.gong@nxp.com> | 2020-04-28 00:48:30 +0800 |
---|---|---|
committer | Robin Gong <yibin.gong@nxp.com> | 2020-04-28 22:23:41 +0800 |
commit | 6446b3a52390c090e17578b19bd71e14dd4c372b (patch) | |
tree | 0b7cad3f520ec5ff2e28c93b5a605ab45e771fc5 /drivers/dma | |
parent | 2191fda25cfdac089abba543b6ee0428d326e527 (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.c | 7 |
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); } |