From: Mika Westerberg <mika.westerberg@linux.intel.com>
Date: Thu, 10 May 2012 10:01:22 +0000 (+0300)
Subject: gpio/langwell: re-read the IRQ status register after each iteration
X-Git-Tag: v3.5-rc1~93^2~15
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c8f925b69fec7d147cb22cbeec50fbcb2ec5580b;p=users%2Fjedix%2Flinux-maple.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 <grant.likely@secretlab.ca>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---

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,