]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
irqchip: spear_shirq: Simplify chained handler
authorThomas Gleixner <tglx@linutronix.de>
Thu, 19 Jun 2014 21:34:42 +0000 (21:34 +0000)
committerJason Cooper <jason@lakedaemon.net>
Tue, 24 Jun 2014 12:38:17 +0000 (12:38 +0000)
I don't know if there are less efficient ways to code that. Get rid of
the loop mess and use efficient code.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/20140619212713.662897061@linutronix.de
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
drivers/irqchip/spear-shirq.c

index 2a33129c4f4b7b544a2f393de3e1e5024766e416..8521a7295b0209c79d8e1ff6ed8d737f84462cd1 100644 (file)
@@ -224,23 +224,20 @@ static void shirq_handler(unsigned irq, struct irq_desc *desc)
        struct spear_shirq *shirq = irq_get_handler_data(irq);
        struct irq_data *idata = irq_desc_get_irq_data(desc);
        struct irq_chip *chip = irq_data_get_irq_chip(idata);
-       u32 i, j, val, mask;
+       u32 pend;
 
        chip->irq_ack(idata);
 
-       mask = shirq->mask;
-       while ((val = readl(shirq->base + shirq->regs.status_reg) &
-                               mask)) {
+       pend = readl(shirq->base + shirq->regs.status_reg) & shirq->mask;
+       pend >>= shirq->offset;
 
-               val >>= shirq->offset;
-               for (i = 0, j = 1; i < shirq->nr_irqs; i++, j <<= 1) {
+       while (pend) {
+               int irq = __ffs(pend);
 
-                       if (!(j & val))
-                               continue;
-
-                       generic_handle_irq(shirq->virq_base + i);
-               }
+               pend &= ~(0x1 << irq);
+               generic_handle_irq(shirq->virq_base + irq);
        }
+
        chip->irq_unmask(idata);
 }