70 lines
2.5 KiB
Diff
70 lines
2.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Kerem Karabay <kekrby@gmail.com>
|
|
Date: Tue, 27 May 2025 22:13:13 +0530
|
|
Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
|
|
fields in case of Apple Touch Bar
|
|
|
|
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>
|
|
---
|
|
drivers/hid/hid-multitouch.c | 16 +++++++++-
|
|
1 file changed, 15 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/hid/hid-multitouch.c
|
|
+++ b/drivers/hid/hid-multitouch.c
|
|
@@ -72,6 +72,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
|
|
@@ -620,6 +621,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;
|
|
@@ -644,7 +646,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;
|
|
}
|
|
@@ -822,6 +828,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++;
|
|
--
|
|
Armbian
|
|
|