[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:
parent
43c6342b15
commit
d46f5e4a20
1 changed files with 14 additions and 13 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue