Input: matrix_keypad - fix race when disabling interrupts
authorZhang Bo <zbsdta@126.com>
Mon, 5 Feb 2018 22:56:21 +0000 (14:56 -0800)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 31 May 2018 23:30:14 +0000 (00:30 +0100)
commit37ecb938a4cd48d87492c16ea3e7d843a9513b38
tree6ae69644c70210e5315eeaf37d6f3cae8b1574f4
parent7aa2c8a3d19e27d8913b66e4f0e09ee86d56095e
Input: matrix_keypad - fix race when disabling interrupts

commit ea4f7bd2aca9f68470e9aac0fc9432fd180b1fe7 upstream.

If matrix_keypad_stop() is executing and the keypad interrupt is triggered,
disable_row_irqs() may be called by both matrix_keypad_interrupt() and
matrix_keypad_stop() at the same time, causing interrupts to be disabled
twice and the keypad being "stuck" after resuming.

Take lock when setting keypad->stopped to ensure that ISR will not race
with matrix_keypad_stop() disabling interrupts.

Signed-off-by: Zhang Bo <zbsdta@126.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/input/keyboard/matrix_keypad.c