From: Mika Westerberg Date: Thu, 10 May 2012 10:01:22 +0000 (+0300) Subject: gpio/langwell: re-read the IRQ status register after each iteration X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=c8f925b69fec7d147cb22cbeec50fbcb2ec5580b;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git 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 --- 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,