diff options
author | Robin Gong <yibin.gong@nxp.com> | 2019-05-08 00:13:40 +0800 |
---|---|---|
committer | Robin Gong <yibin.gong@nxp.com> | 2019-07-22 19:15:57 +0800 |
commit | fd073e017e317006a4c254ca5ae3ea17b6f32502 (patch) | |
tree | b69df3dfb8666717bca4c092381465c8021d8002 /drivers/dma | |
parent | 0b6da46b7bdb2284e24757d48466268b9feb5b7c (diff) |
MLK-22284-2 dmaengine: fsl-edma-v3: check dma description before register touch
Check dma desscription firstly to ignore any unexpected interrupt
after channel terminate, otherwise, still have chance to touch channel
register whose power has been already off.
Signed-off-by: Robin Gong <yibin.gong@nxp.com>
Reviewed-by: S.j. Wang <shengjiu.wang@nxp.com>
Diffstat (limited to 'drivers/dma')
-rw-r--r-- | drivers/dma/fsl-edma-v3.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/dma/fsl-edma-v3.c b/drivers/dma/fsl-edma-v3.c index 1d63c6866d15..3f69dd3438f7 100644 --- a/drivers/dma/fsl-edma-v3.c +++ b/drivers/dma/fsl-edma-v3.c @@ -708,20 +708,20 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id) unsigned int intr; void __iomem *base_addr; + spin_lock(&fsl_chan->vchan.lock); + + /* Ignore this interrupt since channel has been disabled already */ + if (!fsl_chan->edesc) + goto irq_handled; + base_addr = fsl_chan->membase; intr = readl(base_addr + EDMA_CH_INT); if (!intr) - return IRQ_NONE; + goto irq_handled; writel(1, base_addr + EDMA_CH_INT); - spin_lock(&fsl_chan->vchan.lock); - - /* 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); |