[ARM] 3348/1: Disable GPIO interrupts
authorAndrew Victor <andrew@sanpeople.com>
Fri, 24 Feb 2006 22:27:50 +0000 (22:27 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 24 Feb 2006 22:27:50 +0000 (22:27 +0000)
Patch from Andrew Victor

disable_irq() lazily disables the interrupt, so the IRQ is only disabled
once the interrupt occurs again.  The GPIO interrupt handler therefore
must first check disable_depth to see if the IRQ needs to be disabled.

Orignal patch by Bill Gatliff.

Signed-off-by: Andrew Victor <andrew@sanpeople.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-at91rm9200/gpio.c

index a9f718bf8ba873f064d4f58c10a8884378670ddf..0e396feec4686d9b4a3a8376e187df03aded439f 100644 (file)
@@ -274,8 +274,18 @@ static void gpio_irq_handler(unsigned irq, struct irqdesc *desc, struct pt_regs
                gpio = &irq_desc[pin];
 
                while (isr) {
-                       if (isr & 1)
-                               gpio->handle(pin, gpio, regs);
+                       if (isr & 1) {
+                               if (unlikely(gpio->disable_depth)) {
+                                       /*
+                                        * The core ARM interrupt handler lazily disables IRQs so
+                                        * another IRQ must be generated before it actually gets
+                                        * here to be disabled on the GPIO controller.
+                                        */
+                                       gpio_irq_mask(pin);
+                               }
+                               else
+                                       gpio->handle(pin, gpio, regs);
+                       }
                        pin++;
                        gpio++;
                        isr >>= 1;