From 7c7a8f4d82fe199a0a8dcfd1b92ae184c937f0c9 Mon Sep 17 00:00:00 2001 From: Robert Jarzmik Date: Sat, 8 Aug 2009 23:07:21 +0200 Subject: [PATCH] --- yaml --- r: 166069 b: refs/heads/master c: d46f5e4a20867da84d12a35407cf7dcc8713c9cc h: refs/heads/master i: 166067: bc7371bee51ad678a0c4cf1cdb53292d48bd1c39 v: v3 --- [refs] | 2 +- trunk/arch/arm/plat-pxa/dma.c | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index 5993b14f6e83..17935cce8eff 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 43c6342b1562cc27d8ba1240220cb887ad0e36f0 +refs/heads/master: d46f5e4a20867da84d12a35407cf7dcc8713c9cc diff --git a/trunk/arch/arm/plat-pxa/dma.c b/trunk/arch/arm/plat-pxa/dma.c index 897663dbc5f4..56b51cf0718b 100644 --- a/trunk/arch/arm/plat-pxa/dma.c +++ b/trunk/arch/arm/plat-pxa/dma.c @@ -94,20 +94,21 @@ EXPORT_SYMBOL(pxa_free_dma); static irqreturn_t dma_irq_handler(int irq, void *dev_id) { int i, dint = DINT; - - for (i = 0; i < num_dma_channels; i++) { - if (dint & (1 << i)) { - struct dma_channel *channel = &dma_channels[i]; - if (channel->name && channel->irq_handler) { - channel->irq_handler(i, channel->data); - } else { - /* - * IRQ for an unregistered DMA channel: - * let's clear the interrupts and disable it. - */ - printk (KERN_WARNING "spurious IRQ for DMA channel %d\n", i); - DCSR(i) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR; - } + struct dma_channel *channel; + + while (dint) { + i = __ffs(dint); + dint &= (dint - 1); + channel = &dma_channels[i]; + if (channel->name && channel->irq_handler) { + channel->irq_handler(i, channel->data); + } else { + /* + * IRQ for an unregistered DMA channel: + * let's clear the interrupts and disable it. + */ + printk (KERN_WARNING "spurious IRQ for DMA channel %d\n", i); + DCSR(i) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR; } } return IRQ_HANDLED;