]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX fields in case of...
authorKerem Karabay <kekrby@gmail.com>
Tue, 27 May 2025 16:43:13 +0000 (22:13 +0530)
committerJiri Kosina <jkosina@suse.com>
Wed, 11 Jun 2025 09:25:26 +0000 (11:25 +0200)
In Apple Touch Bar, the contact ID is contained in fields with the
HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
from the HID spec. Add a quirk for the same.

Acked-by: Benjamin Tissoires <bentiss@kernel.org>
Signed-off-by: Kerem Karabay <kekrby@gmail.com>
Co-developed-by: Aditya Garg <gargaditya08@live.com>
Signed-off-by: Aditya Garg <gargaditya08@live.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-multitouch.c

index ded0fef7d8c7be85c0711102b8e6e390182c7d0c..849344b0ee57691b54da6447b92406a80f440826 100644 (file)
@@ -73,6 +73,7 @@ MODULE_LICENSE("GPL");
 #define MT_QUIRK_FORCE_MULTI_INPUT     BIT(20)
 #define MT_QUIRK_DISABLE_WAKEUP                BIT(21)
 #define MT_QUIRK_ORIENTATION_INVERT    BIT(22)
+#define MT_QUIRK_APPLE_TOUCHBAR                BIT(23)
 
 #define MT_INPUTMODE_TOUCHSCREEN       0x02
 #define MT_INPUTMODE_TOUCHPAD          0x03
@@ -625,6 +626,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
 static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
                                                      struct hid_report *report)
 {
+       struct mt_class *cls = &td->mtclass;
        struct mt_report_data *rdata;
        struct hid_field *field;
        int r, n;
@@ -649,7 +651,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
 
                if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
                        for (n = 0; n < field->report_count; n++) {
-                               if (field->usage[n].hid == HID_DG_CONTACTID) {
+                               unsigned int hid = field->usage[n].hid;
+
+                               if (hid == HID_DG_CONTACTID ||
+                                  (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
+                                  hid == HID_DG_TRANSDUCER_INDEX)) {
                                        rdata->is_mt_collection = true;
                                        break;
                                }
@@ -827,6 +833,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
                                                     EV_KEY, BTN_TOUCH);
                        MT_STORE_FIELD(tip_state);
                        return 1;
+               case HID_DG_TRANSDUCER_INDEX:
+                       /*
+                        * Contact ID in case of Apple Touch Bars is contained
+                        * in fields with HID_DG_TRANSDUCER_INDEX usage.
+                        */
+                       if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
+                               return 0;
+                       fallthrough;
                case HID_DG_CONTACTID:
                        MT_STORE_FIELD(contactid);
                        app->touches_by_report++;