]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
HID: fix generic desktop D-Pad controls
authorTerry Tritton <terry.tritton@linaro.org>
Fri, 20 Dec 2024 19:23:18 +0000 (19:23 +0000)
committerJiri Kosina <jkosina@suse.com>
Thu, 9 Jan 2025 09:06:14 +0000 (10:06 +0100)
The addition of the "System Do Not Disturb" event code caused the Generic
Desktop D-Pad configuration to be skipped. This commit allows both to be
configured without conflicting with each other.

Fixes: 22d6d060ac77 ("input: Add support for "Do Not Disturb"")
Signed-off-by: Terry Tritton <terry.tritton@linaro.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: Carlos Llamas <cmllamas@google.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-input.c
include/linux/hid.h

index fda9dce3da99808e04ce66dd7beec6731173e75f..9d80635a91ebd8d8bdafaac07b5f85693b179cb4 100644 (file)
@@ -810,10 +810,23 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                        break;
                }
 
-               if ((usage->hid & 0xf0) == 0x90) { /* SystemControl*/
-                       switch (usage->hid & 0xf) {
-                       case 0xb: map_key_clear(KEY_DO_NOT_DISTURB); break;
-                       default: goto ignore;
+               if ((usage->hid & 0xf0) == 0x90) { /* SystemControl & D-pad */
+                       switch (usage->hid) {
+                       case HID_GD_UP:    usage->hat_dir = 1; break;
+                       case HID_GD_DOWN:  usage->hat_dir = 5; break;
+                       case HID_GD_RIGHT: usage->hat_dir = 3; break;
+                       case HID_GD_LEFT:  usage->hat_dir = 7; break;
+                       case HID_GD_DO_NOT_DISTURB:
+                               map_key_clear(KEY_DO_NOT_DISTURB); break;
+                       default: goto unknown;
+                       }
+
+                       if (usage->hid <= HID_GD_LEFT) {
+                               if (field->dpad) {
+                                       map_abs(field->dpad);
+                                       goto ignore;
+                               }
+                               map_abs(ABS_HAT0X);
                        }
                        break;
                }
@@ -844,22 +857,6 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                if (field->application == HID_GD_SYSTEM_CONTROL)
                        goto ignore;
 
-               if ((usage->hid & 0xf0) == 0x90) {      /* D-pad */
-                       switch (usage->hid) {
-                       case HID_GD_UP:    usage->hat_dir = 1; break;
-                       case HID_GD_DOWN:  usage->hat_dir = 5; break;
-                       case HID_GD_RIGHT: usage->hat_dir = 3; break;
-                       case HID_GD_LEFT:  usage->hat_dir = 7; break;
-                       default: goto unknown;
-                       }
-                       if (field->dpad) {
-                               map_abs(field->dpad);
-                               goto ignore;
-                       }
-                       map_abs(ABS_HAT0X);
-                       break;
-               }
-
                switch (usage->hid) {
                /* These usage IDs map directly to the usage codes. */
                case HID_GD_X: case HID_GD_Y: case HID_GD_Z:
index d11e9c9a5f1592cd299104020a06bf3c4e9bacf6..cdc0dc13c87fed201a3a348d1e8c8ff34bcf40dc 100644 (file)
@@ -218,6 +218,7 @@ struct hid_item {
 #define HID_GD_DOWN            0x00010091
 #define HID_GD_RIGHT           0x00010092
 #define HID_GD_LEFT            0x00010093
+#define HID_GD_DO_NOT_DISTURB  0x0001009b
 /* Microsoft Win8 Wireless Radio Controls CA usage codes */
 #define HID_GD_RFKILL_BTN      0x000100c6
 #define HID_GD_RFKILL_LED      0x000100c7