From c8f925b69fec7d147cb22cbeec50fbcb2ec5580b Mon Sep 17 00:00:00 2001 From: Mika Westerberg Date: Thu, 10 May 2012 13:01:22 +0300 Subject: [PATCH] gpio/langwell: re-read the IRQ status register after each iteration The IRQ status register should be re-read after each iteration. Otherwise the loop misses the interrupt if it gets raised immediately after handled. Reported-by: Grant Likely Signed-off-by: Mika Westerberg Acked-by: Linus Walleij Signed-off-by: Grant Likely --- drivers/gpio/gpio-langwell.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/gpio/gpio-langwell.c b/drivers/gpio/gpio-langwell.c index b0673574dc70..a1c8754f52cf 100644 --- a/drivers/gpio/gpio-langwell.c +++ b/drivers/gpio/gpio-langwell.c @@ -250,11 +250,9 @@ static void lnw_irq_handler(unsigned irq, struct irq_desc *desc) /* 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); - pending = readl(gedr); - while (pending) { + while ((pending = readl(gedr))) { gpio = __ffs(pending); mask = BIT(gpio); - pending &= ~mask; /* Clear before handling so we can't lose an edge */ writel(mask, gedr); generic_handle_irq(irq_find_mapping(lnw->domain, -- 2.30.2