From 848d0054a015487af275edfa504795aa4d032945 Mon Sep 17 00:00:00 2001 From: Dima Zavin Date: Fri, 9 Apr 2010 23:26:09 -0700 Subject: [PATCH] input: gpio_event: make driver be more robust against incorrectly configured lvl trigger irqs Change-Id: Ie378600668500dcffeaaddeaba3628e5c2141aa4 Signed-off-by: Dima Zavin --- drivers/input/misc/gpio_matrix.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 @@ 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; -- 2.7.4