diff options
author | Dima Zavin <dima@android.com> | 2011-12-13 01:19:43 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-01-09 10:46:24 +0800 |
commit | 2d423ce05336318af635dde42e0ee593a9e54efb (patch) | |
tree | ddada66add5d2a3525864dda5f95f57330f420cc /drivers/input | |
parent | bd0f56f939fc264f579191c092433b406e186b61 (diff) |
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>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/misc/gpio_matrix.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/input/misc/gpio_matrix.c b/drivers/input/misc/gpio_matrix.c index 08b881325ea..227eb8fe3c0 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; |