diff options
author | Robin Gong <yibin.gong@nxp.com> | 2019-11-05 21:32:22 +0800 |
---|---|---|
committer | Robin Gong <yibin.gong@nxp.com> | 2019-11-06 19:01:43 +0800 |
commit | 56ee55c71c5f3ef254acb4dee581e68f79ef13a5 (patch) | |
tree | 815f6f4399361c5435a86c5b8e44d40e1907e6f9 /drivers/dma/fsl-edma-v3.c | |
parent | d3c0c6f9b64eff31fb17d41548d6ff0ab88fcd53 (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.c | 8 |
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); |