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)5.4-rM2-2.2.x-imx-squashed
parent
2191fda25c
commit
6446b3a523
|
@ -838,8 +838,15 @@ static void fsl_edma3_free_chan_resources(struct dma_chan *chan)
|
||||||
|
|
||||||
vchan_dma_desc_free_list(&fsl_chan->vchan, &head);
|
vchan_dma_desc_free_list(&fsl_chan->vchan, &head);
|
||||||
dma_pool_destroy(fsl_chan->tcd_pool);
|
dma_pool_destroy(fsl_chan->tcd_pool);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&fsl_chan->vchan.lock, flags);
|
||||||
fsl_chan->tcd_pool = NULL;
|
fsl_chan->tcd_pool = NULL;
|
||||||
fsl_chan->used = false;
|
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);
|
pm_runtime_put_sync(fsl_chan->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue