On cnl, all the dma share the same interrupt pin, so all the dma controller need to be checked in interrupt function.
--- V4: refine code style
Signed-off-by: Rander Wang rander.wang@linux.intel.com --- src/drivers/dw-dma.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c index 7659bec..690dafc 100644 --- a/src/drivers/dw-dma.c +++ b/src/drivers/dw-dma.c @@ -1032,7 +1032,7 @@ static int dw_dma_probe(struct dma *dma) #else
/* this will probably be called at the end of every period copied */ -static void dw_dma_irq_handler(void *data) +static void dma_irq_handler(void *data) { struct dma *dma = (struct dma *)data; struct dma_pdata *p = dma_get_drvdata(dma); @@ -1138,6 +1138,33 @@ 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_handler(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) + 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) + dma_irq_handler(dma); +} +#else +static void dw_dma_irq_handler(void *data) +{ + dma_irq_handler(data); +} +#endif + static int dw_dma_probe(struct dma *dma) { struct dma_pdata *dw_pdata;