From e643457b796b59f06de0a1be0f74ddf1c80b2629 Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Thu, 22 Aug 2019 17:11:01 +0200 Subject: [PATCH] dw-dma: fix clearing done bit when using HW LL Fixes clearing done bit when using HW LL. There can be a situation, when more than one linked list item has been already transferred, so we need to clear all of them. Signed-off-by: Tomasz Lauda --- src/drivers/dw/dma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/drivers/dw/dma.c b/src/drivers/dw/dma.c index 1354aaf90..2d3f042a5 100644 --- a/src/drivers/dw/dma.c +++ b/src/drivers/dw/dma.c @@ -989,10 +989,11 @@ static void dw_dma_verify_transfer(struct dma *dma, unsigned int channel, dw_write(dma, DW_DMA_CHAN_EN, DW_CHAN_MASK(channel)); /* fallthrough */ default: - if (ll_uncached->ctrl_hi & DW_CTLH_DONE(1)) { + while (ll_uncached->ctrl_hi & DW_CTLH_DONE(1)) { ll_uncached->ctrl_hi &= ~DW_CTLH_DONE(1); chan->lli_current = (struct dw_lli *)chan->lli_current->llp; + ll_uncached = cache_to_uncache(chan->lli_current); } break; }