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>
(cherry picked from commit
fd073e017e317006a4c254ca5ae3ea17b6f32502)
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);