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@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;