Commit c8000deb authored by Dmitry Savin's avatar Dmitry Savin Committed by Jiri Kosina
Browse files

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: default avatarDmitry Savin <envelsavinds@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.com>
parent 97155021
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -521,6 +521,8 @@
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100

#define I2C_VENDOR_ID_GOODIX		0x27c6
#define I2C_DEVICE_ID_GOODIX_01E8	0x01e8
#define I2C_DEVICE_ID_GOODIX_01E9	0x01e9
#define I2C_DEVICE_ID_GOODIX_01F0	0x01f0

#define USB_VENDOR_ID_GOODTOUCH		0x1aad
+33 −0
Original line number Diff line number Diff line
@@ -1441,6 +1441,30 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
	return 0;
}

static __u8 *mt_report_fixup(struct hid_device *hdev, __u8 *rdesc,
			     unsigned int *size)
{
	if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
	    (hdev->product == I2C_DEVICE_ID_GOODIX_01E8 ||
	     hdev->product == I2C_DEVICE_ID_GOODIX_01E9)) {
		if (rdesc[607] == 0x15) {
			rdesc[607] = 0x25;
			dev_info(
				&hdev->dev,
				"GT7868Q report descriptor fixup is applied.\n");
		} else {
			dev_info(
				&hdev->dev,
				"The byte is not expected for fixing the report descriptor. \
It's possible that the touchpad firmware is not suitable for applying the fix. \
got: %x\n",
				rdesc[607]);
		}
	}

	return rdesc;
}

static void mt_report(struct hid_device *hid, struct hid_report *report)
{
	struct mt_device *td = hid_get_drvdata(hid);
@@ -2035,6 +2059,14 @@ static const struct hid_device_id mt_devices[] = {
		MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
			USB_DEVICE_ID_GAMETEL_MT_MODE) },

	/* Goodix GT7868Q devices */
	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
		     I2C_DEVICE_ID_GOODIX_01E8) },
	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
	  HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
		     I2C_DEVICE_ID_GOODIX_01E8) },

	/* GoodTouch panels */
	{ .driver_data = MT_CLS_NSMU,
		MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
@@ -2270,6 +2302,7 @@ static struct hid_driver mt_driver = {
	.feature_mapping = mt_feature_mapping,
	.usage_table = mt_grabbed_usages,
	.event = mt_event,
	.report_fixup = mt_report_fixup,
	.report = mt_report,
	.suspend = pm_ptr(mt_suspend),
	.reset_resume = pm_ptr(mt_reset_resume),