summaryrefslogtreecommitdiff
path: root/drivers/dma/fsl-edma-v3.c
diff options
context:
space:
mode:
authorRobin Gong <yibin.gong@nxp.com>2019-11-05 21:32:22 +0800
committerRobin Gong <yibin.gong@nxp.com>2019-11-06 19:01:43 +0800
commit56ee55c71c5f3ef254acb4dee581e68f79ef13a5 (patch)
tree815f6f4399361c5435a86c5b8e44d40e1907e6f9 /drivers/dma/fsl-edma-v3.c
parentd3c0c6f9b64eff31fb17d41548d6ff0ab88fcd53 (diff)
MLK-22909 dmaengine: fsl-edma-v3: clear interrupt coming after channel terminated
Clear EDMA_CH_INT in case dma done interrupt comes after channel terminated instead of channel free-ed, otherwise, RCU maybe caught because it's ignored without interrupt status cleared as Android team report in Monkey test. Signed-off-by: Robin Gong <yibin.gong@nxp.com> Acked-by: Fugang Duan <fugang.duan@nxp.com> (cherry picked from commit ef91ff6ed465cebe2fe6483a480351abba36e237)
Diffstat (limited to 'drivers/dma/fsl-edma-v3.c')
-rw-r--r--drivers/dma/fsl-edma-v3.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/dma/fsl-edma-v3.c b/drivers/dma/fsl-edma-v3.c
index 36371130528f..3711f0fba64a 100644
--- a/drivers/dma/fsl-edma-v3.c
+++ b/drivers/dma/fsl-edma-v3.c
@@ -712,8 +712,8 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id)
spin_lock(&fsl_chan->vchan.lock);
- /* Ignore this interrupt since channel has been disabled already */
- if (!fsl_chan->edesc)
+ /* Ignore this interrupt since channel has been freeed with power off */
+ if (!fsl_chan->edesc && !fsl_chan->tcd_pool)
goto irq_handled;
base_addr = fsl_chan->membase;
@@ -724,6 +724,10 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id)
writel(1, base_addr + EDMA_CH_INT);
+ /* Ignore this interrupt since channel has been disabled already */
+ if (!fsl_chan->edesc)
+ goto irq_handled;
+
if (!fsl_chan->edesc->iscyclic) {
fsl_edma3_get_realcnt(fsl_chan);
list_del(&fsl_chan->edesc->vdesc.node);