Skip to content

Commit c8000de

Browse files
madenvelJiri Kosina
authored andcommitted
HID: multitouch: Add support for GT7868Q
GT7868Q has incorrect data in the report and needs a fixup. The change enables haptic touchpad on Lenovo ThinkBook 13x Gen 4 and has been tested on the device. Signed-off-by: Dmitry Savin <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 9715502 commit c8000de

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

drivers/hid/hid-ids.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,8 @@
521521
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
522522

523523
#define I2C_VENDOR_ID_GOODIX 0x27c6
524+
#define I2C_DEVICE_ID_GOODIX_01E8 0x01e8
525+
#define I2C_DEVICE_ID_GOODIX_01E9 0x01e9
524526
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
525527

526528
#define USB_VENDOR_ID_GOODTOUCH 0x1aad

drivers/hid/hid-multitouch.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,6 +1441,30 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
14411441
return 0;
14421442
}
14431443

1444+
static __u8 *mt_report_fixup(struct hid_device *hdev, __u8 *rdesc,
1445+
unsigned int *size)
1446+
{
1447+
if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
1448+
(hdev->product == I2C_DEVICE_ID_GOODIX_01E8 ||
1449+
hdev->product == I2C_DEVICE_ID_GOODIX_01E9)) {
1450+
if (rdesc[607] == 0x15) {
1451+
rdesc[607] = 0x25;
1452+
dev_info(
1453+
&hdev->dev,
1454+
"GT7868Q report descriptor fixup is applied.\n");
1455+
} else {
1456+
dev_info(
1457+
&hdev->dev,
1458+
"The byte is not expected for fixing the report descriptor. \
1459+
It's possible that the touchpad firmware is not suitable for applying the fix. \
1460+
got: %x\n",
1461+
rdesc[607]);
1462+
}
1463+
}
1464+
1465+
return rdesc;
1466+
}
1467+
14441468
static void mt_report(struct hid_device *hid, struct hid_report *report)
14451469
{
14461470
struct mt_device *td = hid_get_drvdata(hid);
@@ -2035,6 +2059,14 @@ static const struct hid_device_id mt_devices[] = {
20352059
MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
20362060
USB_DEVICE_ID_GAMETEL_MT_MODE) },
20372061

2062+
/* Goodix GT7868Q devices */
2063+
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
2064+
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
2065+
I2C_DEVICE_ID_GOODIX_01E8) },
2066+
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
2067+
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
2068+
I2C_DEVICE_ID_GOODIX_01E8) },
2069+
20382070
/* GoodTouch panels */
20392071
{ .driver_data = MT_CLS_NSMU,
20402072
MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
@@ -2270,6 +2302,7 @@ static struct hid_driver mt_driver = {
22702302
.feature_mapping = mt_feature_mapping,
22712303
.usage_table = mt_grabbed_usages,
22722304
.event = mt_event,
2305+
.report_fixup = mt_report_fixup,
22732306
.report = mt_report,
22742307
.suspend = pm_ptr(mt_suspend),
22752308
.reset_resume = pm_ptr(mt_reset_resume),

0 commit comments

Comments
 (0)