[Sound-open-firmware] [PATCH_V4] cnl: dma: refine dma interrupt processing on cnl
Rander Wang
rander.wang at linux.intel.com
Tue Mar 13 06:58:53 CET 2018
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 at 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;
--
2.14.1
More information about the Sound-open-firmware
mailing list