ARM: common: edma: clear completion interrupts on stop
authorJohn Ogness <john.ogness@linutronix.de>
Mon, 27 Apr 2015 11:52:15 +0000 (13:52 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 6 May 2015 20:27:01 +0000 (22:27 +0200)
When stopping a DMA transfer with interrupts disabled it is possible
that the DMA transfer completes before the events are cleared. In
this case the completion interrupt will be pending, causing a
completion callback after the transfer was stopped.

By clearing the completion interrupt for the stopping channel it is
ensured that no completion event will be generated after the stop.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm/common/edma.c

index 5662a872689b39c04e09eef6ac80b9f81d168107..873dbfcc7dc9db9278e0727a20c30f53df4db1bf 100644 (file)
@@ -1350,6 +1350,9 @@ void edma_stop(unsigned channel)
                edma_shadow0_write_array(ctlr, SH_SECR, j, mask);
                edma_write_array(ctlr, EDMA_EMCR, j, mask);
 
+               /* clear possibly pending completion interrupt */
+               edma_shadow0_write_array(ctlr, SH_ICR, j, mask);
+
                pr_debug("EDMA: EER%d %08x\n", j,
                                edma_shadow0_read_array(ctlr, SH_EER, j));