diff mbox series

HID: wacom: Fix logic used for 3rd barrel switch emulation

Message ID 20221103173304.128651-1-jason.gerecke@wacom.com (mailing list archive)
State Mainlined
Commit f77810f744139572a63e5a85ab6a8c10c2d44fb1
Delegated to: Jiri Kosina
Headers show
Series HID: wacom: Fix logic used for 3rd barrel switch emulation | expand

Commit Message

Gerecke, Jason Nov. 3, 2022, 5:33 p.m. UTC
From: Jason Gerecke <killertofu@gmail.com>

When support was added for devices using an explicit 3rd barrel switch,
the logic used by devices emulating this feature was broken. The 'if'
statement / block that was introduced only handles the case where the
button is pressed (i.e. 'barrelswitch' and 'barrelswitch2' are both set)
but not the case where it is released (i.e. one or both being cleared).
This results in a BTN_STYLUS3 "down" event being sent when the button
is pressed, but no "up" event ever being sent afterwards.

This patch restores the previously-used logic for determining button
states in the emulated case so that switches are reported correctly
again.

Link: https://github.com/linuxwacom/xf86-input-wacom/issues/292
Fixes: 6d09085b38e5 ("HID: wacom: Adding Support for new usages")
CC: stable@vger.kernel.org #v5.19+
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Tested-by: Joshua Dickens <joshua.dickens@wacom.com>
Reviewed-by: Ping Cheng <ping.cheng@wacom.com>
---
 drivers/hid/wacom_wac.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

Comments

Jiri Kosina Nov. 4, 2022, 8:35 a.m. UTC | #1
On Thu, 3 Nov 2022, Jason Gerecke wrote:

> From: Jason Gerecke <killertofu@gmail.com>
> 
> When support was added for devices using an explicit 3rd barrel switch,
> the logic used by devices emulating this feature was broken. The 'if'
> statement / block that was introduced only handles the case where the
> button is pressed (i.e. 'barrelswitch' and 'barrelswitch2' are both set)
> but not the case where it is released (i.e. one or both being cleared).
> This results in a BTN_STYLUS3 "down" event being sent when the button
> is pressed, but no "up" event ever being sent afterwards.
> 
> This patch restores the previously-used logic for determining button
> states in the emulated case so that switches are reported correctly
> again.
> 
> Link: https://github.com/linuxwacom/xf86-input-wacom/issues/292
> Fixes: 6d09085b38e5 ("HID: wacom: Adding Support for new usages")
> CC: stable@vger.kernel.org #v5.19+
> Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
> Tested-by: Joshua Dickens <joshua.dickens@wacom.com>
> Reviewed-by: Ping Cheng <ping.cheng@wacom.com>

Applied, thank you.
diff mbox series

Patch

diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 77486962a773f..0f3d57b426846 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -2520,11 +2520,12 @@  static void wacom_wac_pen_report(struct hid_device *hdev,
 
 	if (!delay_pen_events(wacom_wac) && wacom_wac->tool[0]) {
 		int id = wacom_wac->id[0];
-		if (wacom_wac->features.quirks & WACOM_QUIRK_PEN_BUTTON3 &&
-		    wacom_wac->hid_data.barrelswitch & wacom_wac->hid_data.barrelswitch2) {
-			wacom_wac->hid_data.barrelswitch = 0;
-			wacom_wac->hid_data.barrelswitch2 = 0;
-			wacom_wac->hid_data.barrelswitch3 = 1;
+		if (wacom_wac->features.quirks & WACOM_QUIRK_PEN_BUTTON3) {
+			int sw_state = wacom_wac->hid_data.barrelswitch |
+				       (wacom_wac->hid_data.barrelswitch2 << 1);
+			wacom_wac->hid_data.barrelswitch = sw_state == 1;
+			wacom_wac->hid_data.barrelswitch2 = sw_state == 2;
+			wacom_wac->hid_data.barrelswitch3 = sw_state == 3;
 		}
 		input_report_key(input, BTN_STYLUS, wacom_wac->hid_data.barrelswitch);
 		input_report_key(input, BTN_STYLUS2, wacom_wac->hid_data.barrelswitch2);