input: gpio_event: make driver be more robust against incorrectly configured lvl...
authorDima Zavin <dima@android.com>
Sat, 10 Apr 2010 06:26:09 +0000 (23:26 -0700)
committermgross <mark.gross@intel.com>
Wed, 9 Nov 2011 20:05:51 +0000 (12:05 -0800)
Change-Id: Ie378600668500dcffeaaddeaba3628e5c2141aa4
Signed-off-by: Dima Zavin <dima@android.com>
drivers/input/misc/gpio_matrix.c

index 08b8813..227eb8f 100644 (file)
@@ -31,6 +31,7 @@ struct gpio_kp {
        unsigned int key_state_changed:1;
        unsigned int last_key_state_changed:1;
        unsigned int some_keys_pressed:2;
+       unsigned int disabled_irq:1;
        unsigned long keys_pressed[0];
 };
 
@@ -216,8 +217,12 @@ static irqreturn_t gpio_keypad_irq_handler(int irq_in, void *dev_id)
        struct gpio_event_matrix_info *mi = kp->keypad_info;
        unsigned gpio_keypad_flags = mi->flags;
 
-       if (!kp->use_irq) /* ignore interrupt while registering the handler */
+       if (!kp->use_irq) {
+               /* ignore interrupt while registering the handler */
+               kp->disabled_irq = 1;
+               disable_irq_nosync(irq_in);
                return IRQ_HANDLED;
+       }
 
        for (i = 0; i < mi->ninputs; i++)
                disable_irq_nosync(gpio_to_irq(mi->input_gpios[i]));
@@ -273,6 +278,10 @@ static int gpio_keypad_request_irqs(struct gpio_kp *kp)
                                "irq %d\n", mi->input_gpios[i], irq);
                }
                disable_irq(irq);
+               if (kp->disabled_irq) {
+                       kp->disabled_irq = 0;
+                       enable_irq(irq);
+               }
        }
        return 0;