]> git.dujemihanovic.xyz Git - linux.git/commit
Input: cyttsp5 - fix bitmask for touch buttons
authorRichard Kjerstadius <kjerstadius@gmail.com>
Sat, 4 Feb 2023 00:57:05 +0000 (16:57 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 4 Feb 2023 00:59:15 +0000 (16:59 -0800)
commit0424931431b5d593e602ec9c3ed35a34811d30d2
treee5d5074baa587ce464cc08e6886a54cdee74736b
parent79c81d137d36f9635bbcbc3916c0cccb418a61dd
Input: cyttsp5 - fix bitmask for touch buttons

Prior to this patch, the bitmask ends up being 0x3, as opposed to 0x1
which likely was the intention. The erroneous bit results in the driver
reporting 2 different button activations in designs with 2 or more
buttons.

To detect which button has been pressed, cyttsp5_btn_attention() uses a
for loop to iterate through the input buffer, while shifting and
applying a bitmask to determine the state for each button.
Unfortunately, when the bitmask is 0x3 and there are multiple buttons,
this procedure falls apart.

Consider a design with 3 buttons. Pressing the third button will result
in a call to cyttsp5_btn_attention() with the input buffer containing
0x4 (binary 0100). In the first iteration of the for loop cur_btn_state
will be:

(0x4 >> 0 * 1) & 0x3 = 0x4 & 0x3 = 0x0

This is correct. However, in the next iteration this happens:

(0x4 >> 1 * 1) & 0x3 = 0x2 & 0x3 = 0x2

Which means that a key event for key 1 is generated, even though it's
not really active. In the third iteration, the loop detects the button
that was actually pressed:

(0x4 >> 2 * 1) & 0x3 = 0x1 & 0x3 = 0x1

This key event is the only one that should have been detected, but it is
accompanied by the preceding key. Ensuring the applied mask is 0x1
solves this problem.

Signed-off-by: Richard Kjerstadius <richard.kjerstadius@teledyne.com>
Reviewed-by: Alistair Francis <alistair@alistair23.me>
Link: https://lore.kernel.org/r/20230127102903.3317089-1-richard.kjerstadius@teledyne.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/cyttsp5.c