If matrix_keypad_stop() is calling and the keypad interrupt is triggered,
disable_row_irqs() is called by both matrix_keypad_interrupt() and
matrix_keypad_stop() at the same time. then disable_row_irqs() is called
twice, and the device enter suspend state before keypad->work is executed.
At this condition the device will start keypad and enable irq once after
resume. and then irqs are disabled yet because irqs are disabled twice and
only enable once.
Take lock around keypad->stopped to ensure irqs operation is in atomic
operation.
Signed-off-by: Zhang Bo <redacted>
---
Changes in v3:
- delete no needed lock protection, only add lock in matrix_keypad_stop().
Changes in v2:
- Change commit message and full name in the signed-off-by tag.
drivers/input/keyboard/matrix_keypad.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
On Sun, Feb 04, 2018 at 08:19:22AM +0800, Zhang Bo wrote:
If matrix_keypad_stop() is calling and the keypad interrupt is triggered,
disable_row_irqs() is called by both matrix_keypad_interrupt() and
matrix_keypad_stop() at the same time. then disable_row_irqs() is called
twice, and the device enter suspend state before keypad->work is executed.
At this condition the device will start keypad and enable irq once after
resume. and then irqs are disabled yet because irqs are disabled twice and
only enable once.
Take lock around keypad->stopped to ensure irqs operation is in atomic
operation.
Signed-off-by: Zhang Bo <redacted>
Applied, thank you.
quoted hunk
---
Changes in v3:
- delete no needed lock protection, only add lock in matrix_keypad_stop().
Changes in v2:
- Change commit message and full name in the signed-off-by tag.
drivers/input/keyboard/matrix_keypad.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)