1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

[ARM] pxa/dma: optimize irq handler loop

Reduce loop for dma irq handler callbacks to the minimum
required.

Since V1: included suggestion from Nicolas Pitre to improve
even further the loop.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
This commit is contained in:
Robert Jarzmik 2009-08-08 23:07:21 +02:00 committed by Eric Miao
parent 43c6342b15
commit d46f5e4a20

View file

@ -94,20 +94,21 @@ EXPORT_SYMBOL(pxa_free_dma);
static irqreturn_t dma_irq_handler(int irq, void *dev_id) static irqreturn_t dma_irq_handler(int irq, void *dev_id)
{ {
int i, dint = DINT; int i, dint = DINT;
struct dma_channel *channel;
for (i = 0; i < num_dma_channels; i++) { while (dint) {
if (dint & (1 << i)) { i = __ffs(dint);
struct dma_channel *channel = &dma_channels[i]; dint &= (dint - 1);
if (channel->name && channel->irq_handler) { channel = &dma_channels[i];
channel->irq_handler(i, channel->data); if (channel->name && channel->irq_handler) {
} else { channel->irq_handler(i, channel->data);
/* } else {
* IRQ for an unregistered DMA channel: /*
* let's clear the interrupts and disable it. * 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; printk (KERN_WARNING "spurious IRQ for DMA channel %d\n", i);
} DCSR(i) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR;
} }
} }
return IRQ_HANDLED; return IRQ_HANDLED;