[PATCH] HID: multitouch: use Win8 class for ELAN 04F3:3358 (Surface Laptop Ultra)

DORMANTno replies

From: Teo Casares via B4 Relay <devnull+teo.nakora.fi@kernel.org>
Date: 2026-10-18 23:56:52
Also in: b4-sent, lkml
Subsystem: hid core layer, the rest · Maintainers: Jiri Kosina, Benjamin Tissoires, Linus Torvalds

From: Teo Casares <redacted>

The Surface Laptop Ultra touchpad declares its PTPHQA blob on the
Digitizers usage page (0x000d00c5) instead of the vendor page
(0xff0000c5), so it is not detected as a Win8 device and gets the
generic class, which ignores Confidence. Palms are then reported as
fingers.

Add a device entry with MT_CLS_WIN_8 so Confidence maps to
MT_TOOL_PALM. The entry matches HID_GROUP_MULTITOUCH on purpose: if
the firmware is ever fixed, the generic Win8 entry takes over.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Teo Casares <redacted>
---
Report descriptor excerpt (MSHW0734, 1129 bytes):

  836: 06 00 ff      Usage Page (Vendor 0xff00)
  839: 05 0d         Usage Page (Digitizers)
  ...
  1060: 85 06        Report ID (6)
  1062: 09 c5        Usage (0xc5)
  ...
  1072: 75 08 96 00 01 b1 02   Report Size (8), Report Count (256), Feature

The device stays in the generic group, so HID_QUIRK_MULTI_INPUT is
still set; as with other PTPs, MT_CLS_WIN_8 also exports the legacy
Mouse collection as an extra input node. Haptics are unaffected: the
descriptor has no Auto Trigger usage.

Tested on a Surface Laptop Ultra running 7.2.8 with the same hunk:
the touchpad reports MT_TOOL_PALM for palm contacts, and clicks,
click-and-drag and long stationary contacts behave as before.
Build-tested on hid.git for-next.

Root-cause analysis, patch and changelog were drafted with an LLM coding
assistant (Claude Opus 5.5 via Claude Code); I reviewed the change and
tested it on the hardware. A HID-BPF descriptor fixup restoring the
vendor usage page should also work; happy to send that instead or in
addition if preferred.
---
 drivers/hid/hid-multitouch.c | 5 +++++
 1 file changed, 5 insertions(+)
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 4e19a0c4d2..4e969438b2 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -2425,6 +2425,11 @@ static const struct hid_device_id mt_devices[] = {
 		HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
 			USB_VENDOR_ID_ELAN, 0x32ae) },
 
+	/* Surface Laptop Ultra: PTPHQA blob not on the vendor page */
+	{ .driver_data = MT_CLS_WIN_8,
+		HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH,
+			USB_VENDOR_ID_ELAN, 0x3358) },
+
 	/* Elitegroup panel */
 	{ .driver_data = MT_CLS_SERIAL,
 		MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP,
---
base-commit: ae6927c533a4454570950125ca8ba909c45f20f9
change-id: 20261018-elan-3358-dfe4d6890ee4

Best regards,
--  
Teo Casares [off-list ref]

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help