From 433de9fb50c0107e7aee6734fda1a4a7e1f86d51 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Sat, 20 Apr 2019 16:21:36 +0200 Subject: [PATCH] dw-dma: clear block/transfer irq after stop Clears block/transfer interrupts after stopping the DMA channel. It prevents sudden interrupt trigger after enabling different DMA channel than the one previously stopped. Signed-off-by: Tomasz Lauda --- src/drivers/dw/dma.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/drivers/dw/dma.c b/src/drivers/dw/dma.c index b48a3a5e4fb1..0c1bf15cb172 100644 --- a/src/drivers/dw/dma.c +++ b/src/drivers/dw/dma.c @@ -480,6 +480,9 @@ static int dw_dma_stop(struct dma *dma, int channel) dw_dma_interrupt_unregister(dma, channel); #if CONFIG_HW_LLI + /* clear block interrupt */ + dw_write(dma, DW_CLEAR_BLOCK, DW_CHAN(channel)); + for (i = 0; i < chan->desc_count; i++) { lli->ctrl_hi &= ~DW_CTLH_DONE(1); lli++; @@ -487,6 +490,9 @@ static int dw_dma_stop(struct dma *dma, int channel) dcache_writeback_region(chan->lli, sizeof(struct dw_lli) * chan->desc_count); +#else + /* clear transfer interrupt */ + dw_write(dma, DW_CLEAR_TFR, DW_CHAN(channel)); #endif chan->status = COMP_STATE_PREPARE;