Skip to contentSkip to conversation

ARM: common: edma: clear completion interrupts on stop

PATCH In review John Ogness 2 participants 2 messages Apr 27, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/3 ARM: common: edma: clear completion interrupts on stop

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.

---
 arch/arm/common/edma.c |    3 +++
 1 file changed, 3 insertions(+)
arch/arm/common/edma.c +3 -0
index 5662a87..873dbfc 100644
@@ -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));
 
Signature · 1 line
1.7.10.4
Acked-by on v1 1/3
#1 lore raw
Quoted 7 lines · John Ogness

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.

Quoted 20 lines
---
 arch/arm/common/edma.c |    3 +++
 1 file changed, 3 insertions(+)
arch/arm/common/edma.c +3 -0
index 5662a87..873dbfc 100644
@@ -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));
 
Signature · 1 line
Péter