| From 84ca64aa8b5eb6bf856bcc2c94cd7215325320f0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 8 Feb 2022 09:59:16 -0800 |
| Subject: Input: clear BTN_RIGHT/MIDDLE on buttonpads |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: José Expósito <jose.exposito89@gmail.com> |
| |
| [ Upstream commit 37ef4c19b4c659926ce65a7ac709ceaefb211c40 ] |
| |
| Buttonpads are expected to map the INPUT_PROP_BUTTONPAD property bit |
| and the BTN_LEFT key bit. |
| |
| As explained in the specification, where a device has a button type |
| value of 0 (click-pad) or 1 (pressure-pad) there should not be |
| discrete buttons: |
| https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/touchpad-windows-precision-touchpad-collection#device-capabilities-feature-report |
| |
| However, some drivers map the BTN_RIGHT and/or BTN_MIDDLE key bits even |
| though the device is a buttonpad and therefore does not have those |
| buttons. |
| |
| This behavior has forced userspace applications like libinput to |
| implement different workarounds and quirks to detect buttonpads and |
| offer to the user the right set of features and configuration options. |
| For more information: |
| https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/726 |
| |
| In order to avoid this issue clear the BTN_RIGHT and BTN_MIDDLE key |
| bits when the input device is register if the INPUT_PROP_BUTTONPAD |
| property bit is set. |
| |
| Notice that this change will not affect udev because it does not check |
| for buttons. See systemd/src/udev/udev-builtin-input_id.c. |
| |
| List of known affected hardware: |
| |
| - Chuwi AeroBook Plus |
| - Chuwi Gemibook |
| - Framework Laptop |
| - GPD Win Max |
| - Huawei MateBook 2020 |
| - Prestigio Smartbook 141 C2 |
| - Purism Librem 14v1 |
| - StarLite Mk II - AMI firmware |
| - StarLite Mk II - Coreboot firmware |
| - StarLite Mk III - AMI firmware |
| - StarLite Mk III - Coreboot firmware |
| - StarLabTop Mk IV - AMI firmware |
| - StarLabTop Mk IV - Coreboot firmware |
| - StarBook Mk V |
| |
| Acked-by: Peter Hutterer <peter.hutterer@who-t.net> |
| Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| Acked-by: Jiri Kosina <jkosina@suse.cz> |
| Signed-off-by: José Expósito <jose.exposito89@gmail.com> |
| Link: https://lore.kernel.org/r/20220208174806.17183-1-jose.exposito89@gmail.com |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/input/input.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| diff --git a/drivers/input/input.c b/drivers/input/input.c |
| index e2eb9b9b8363d..f7398b996bacf 100644 |
| --- a/drivers/input/input.c |
| +++ b/drivers/input/input.c |
| @@ -2181,6 +2181,12 @@ int input_register_device(struct input_dev *dev) |
| /* KEY_RESERVED is not supposed to be transmitted to userspace. */ |
| __clear_bit(KEY_RESERVED, dev->keybit); |
| |
| + /* Buttonpads should not map BTN_RIGHT and/or BTN_MIDDLE. */ |
| + if (test_bit(INPUT_PROP_BUTTONPAD, dev->propbit)) { |
| + __clear_bit(BTN_RIGHT, dev->keybit); |
| + __clear_bit(BTN_MIDDLE, dev->keybit); |
| + } |
| + |
| /* Make sure that bitmasks not mentioned in dev->evbit are clean. */ |
| input_cleanse_bitmasks(dev); |
| |
| -- |
| 2.34.1 |
| |