input: gpio_event: make driver be more robust against incorrectly configured lvl trigger irqs

Change-Id: Ie378600668500dcffeaaddeaba3628e5c2141aa4
Signed-off-by: Dima Zavin <dima@android.com>
diff --git a/drivers/input/misc/gpio_matrix.c b/drivers/input/misc/gpio_matrix.c
index 08b8813..227eb8f 100644
--- a/drivers/input/misc/gpio_matrix.c
+++ b/drivers/input/misc/gpio_matrix.c
@@ -31,6 +31,7 @@
 	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 @@
 	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 @@
 				"irq %d\n", mi->input_gpios[i], irq);
 		}
 		disable_irq(irq);
+		if (kp->disabled_irq) {
+			kp->disabled_irq = 0;
+			enable_irq(irq);
+		}
 	}
 	return 0;