[Sound-open-firmware] [PATCH_V3 2/2] cnl: dma: refine dma interrupt processing on cnl

Rander Wang rander.wang at linux.intel.com
Mon Mar 12 07:25:31 CET 2018


On cnl, all the dma share the same interrupt pin, so
all the dma controller need to be checked in interrupt
function.

---
V3:make it work only on CNL

Signed-off-by: Rander Wang <rander.wang at linux.intel.com>
---
 src/drivers/dw-dma.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c
index 7659bec..33b5e5f 100644
--- a/src/drivers/dw-dma.c
+++ b/src/drivers/dw-dma.c
@@ -1138,6 +1138,28 @@ static void dw_dma_irq_handler(void *data)
 	}
 }
 
+#if defined CONFIG_CANNONLAKE
+/*All the dma share the same interrupt on CNL, so check each dma*/
+/*controller when interrupt coming, then do the work            */
+static void dw_dma_irq_cnl(void *data)
+{
+	struct dma *dma;
+	uint32_t status_intr;
+
+	/*check interrupt status of DMA controller 0*/
+	dma = dma_get(DMA_GP_LP_DMAC0);
+	status_intr = dw_read(dma, DW_INTR_STATUS);
+	if (status_intr)
+		dw_dma_irq_handler(dma);
+
+	/*check interrupt status of DMA controller 1*/
+	dma = dma_get(DMA_GP_LP_DMAC1);
+	status_intr = dw_read(dma, DW_INTR_STATUS);
+	if (status_intr)
+		dw_dma_irq_handler(dma);
+}
+#endif
+
 static int dw_dma_probe(struct dma *dma)
 {
 	struct dma_pdata *dw_pdata;
@@ -1160,7 +1182,11 @@ static int dw_dma_probe(struct dma *dma)
 	}
 
 	/* register our IRQ handler */
+#if defined CONFIG_CANNONLAKE
+	interrupt_register(dma_irq(dma), dw_dma_irq_cnl, dma);
+#else
 	interrupt_register(dma_irq(dma), dw_dma_irq_handler, dma);
+#endif
 	interrupt_enable(dma_irq(dma));
 
 	return 0;
-- 
2.14.1



More information about the Sound-open-firmware mailing list