From 98ab463470302d9ae32511a9b4c914c592ee8494 Mon Sep 17 00:00:00 2001 From: Jassi Brar Date: Thu, 5 Nov 2009 13:44:33 +0900 Subject: [PATCH] --- yaml --- r: 168413 b: refs/heads/master c: 9b08284bf22f438baa2d6b68015ff17ddb431a61 h: refs/heads/master i: 168411: 5ebbd80e08c241462fc1f42f61fa6833d9822086 v: v3 --- [refs] | 2 +- trunk/arch/arm/plat-s3c64xx/dma.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index c99c62ae2fa6..b313e36c6e7b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7507f39c57d4a285aea11c379fbc65c2b3f375ef +refs/heads/master: 9b08284bf22f438baa2d6b68015ff17ddb431a61 diff --git a/trunk/arch/arm/plat-s3c64xx/dma.c b/trunk/arch/arm/plat-s3c64xx/dma.c index a94281bb84d6..7d12eb8fa58d 100644 --- a/trunk/arch/arm/plat-s3c64xx/dma.c +++ b/trunk/arch/arm/plat-s3c64xx/dma.c @@ -576,6 +576,7 @@ static irqreturn_t s3c64xx_dma_irq(int irq, void *pw) errstat = readl(dmac->regs + PL080_ERR_STATUS); for (offs = 0, bit = 1; offs < 8; offs++, bit <<= 1) { + struct s3c64xx_dma_buff *buff; if (!(errstat & bit) && !(tcstat & bit)) continue; @@ -591,7 +592,33 @@ static irqreturn_t s3c64xx_dma_irq(int irq, void *pw) if (errstat & bit) writel(bit, dmac->regs + PL080_ERR_CLEAR); - s3c64xx_dma_bufffdone(chan, chan->curr, res); + /* 'next' points to the buffer that is next to the + * currently active buffer. + * For CIRCULAR queues, 'next' will be same as 'curr' + * when 'end' is the active buffer. + */ + buff = chan->curr; + while (buff && buff != chan->next + && buff->next != chan->next) + buff = buff->next; + + if (!buff) + BUG(); + + if (buff == chan->next) + buff = chan->end; + + s3c64xx_dma_bufffdone(chan, buff, res); + + /* Update 'next' */ + buff = chan->next; + if (chan->next == chan->end) { + chan->next = chan->curr; + if (!(chan->flags & S3C2410_DMAF_CIRCULAR)) + chan->end = NULL; + } else { + chan->next = buff->next; + } } return IRQ_HANDLED;