struct lnw_gpio *lnw = irq_data_get_irq_handler_data(data);
        struct irq_chip *chip = irq_data_get_irq_chip(data);
        u32 base, gpio, gedr_v;
+       unsigned long pending;
        void __iomem *gedr;
 
        /* check GPIO controller to check which pin triggered the interrupt */
        for (base = 0; base < lnw->chip.ngpio; base += 32) {
                gedr = gpio_reg(&lnw->chip, base, GEDR);
-               gedr_v = readl(gedr);
+               gedr_v = pending = readl(gedr);
                if (!gedr_v)
                        continue;
-               for (gpio = base; gpio < base + 32; gpio++)
-                       if (gedr_v & BIT(gpio % 32)) {
-                               pr_debug("pin %d triggered\n", gpio);
-                               generic_handle_irq(lnw->irq_base + gpio);
-                       }
+               while (pending) {
+                       gpio = __ffs(pending) - 1;
+                       pending &= ~BIT(gpio);
+                       generic_handle_irq(lnw->irq_base + base + gpio);
+               }
                /* clear the edge detect status bit */
                writel(gedr_v, gedr);
        }