mirror of
https://github.com/torvalds/linux.git
synced 2026-06-09 07:03:37 +02:00
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>
This commit is contained in:
parent
e7b269e317
commit
2311937725
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user