summaryrefslogtreecommitdiff
path: root/drivers/input
diff options
context:
space:
mode:
authorDima Zavin <dima@android.com>2010-04-09 23:26:09 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:38:19 -0800
commit84084cb6dd0e3d6e5f1c19054e27e810d3ce7ad6 (patch)
tree8cace2be074ddd68cb7ec8bd91d7b6e80fe0f8d6 /drivers/input
parent88b6f69d91dc18d6000a6bf95ba4f4bc5803eeed (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.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/input/misc/gpio_matrix.c b/drivers/input/misc/gpio_matrix.c
index 08b881325eac..227eb8fe3c09 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;