[PATCH] HID: i2c-hid: reset Synaptics SYNA32A4 on resume
DORMANTno replies
From: Matt Ervin <hidden>
Date: 2026-10-10 21:45:53
Subsystem:
hid core layer, the rest · Maintainers:
Jiri Kosina, Benjamin Tissoires, Linus Torvalds
On the HP OMEN Laptop 15-ek0xxx (board 878B), the Synaptics SYNA32A4
touchpad (06CB:CE17, hid-multitouch via i2c_hid_acpi) is quiet before
suspend but starts asserting its interrupt continuously within a few
seconds of resuming, at a steady ~590 interrupts/s, while producing no
input events. The storm does not stop on its own; it persists until the
device is reset.
The pad sits behind i2c_designware.1, which shares its IRQ with idma64
and snd_hda_intel, so each spurious report also costs ~58 interrupts on
the shared line:
irq17 (i2c_designware.1): 33968/s irq63 (SYNA32A4:00): 588/s
irq17 (i2c_designware.1): 34116/s irq63 (SYNA32A4:00): 588/s
That keeps CPU0 at ~40% hardirq and denies it deep C-states, measured
as 3.5x less C3 residency than a sibling core. Unbinding and rebinding
the i2c_hid_acpi driver, which resets the device, takes both rates to
zero and the touchpad keeps working normally afterwards.
This is the same failure mode that I2C_HID_QUIRK_RESET_ON_RESUME was
added for in commit 538f67407e2c ("HID: i2c-hid: reset Synaptics
SYNA2393 on resume"): spurious interrupts after resume until the device
is reset. Add the SYNA32A4 to the quirk table so it is reset on resume.
Tested on a 7.2.8 kernel with this change applied to the i2c-hid module:
with the stock module a suspend/resume cycle brought the touchpad IRQ to
585/s within ten seconds of resume; with the quirk, two consecutive
suspend/resume cycles stayed at 0/s and the touchpad kept working.
Signed-off-by: Matt Ervin <redacted>
---
drivers/hid/hid-ids.h | 1 +
drivers/hid/i2c-hid/i2c-hid-core.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index a9537b7..10e694f 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h@@ -1444,6 +1444,7 @@ #define I2C_VENDOR_ID_SYNAPTICS 0x06cb #define I2C_PRODUCT_ID_SYNAPTICS_SYNA2393 0x7a13 +#define I2C_PRODUCT_ID_SYNAPTICS_SYNA32A4 0xce17 #define USB_VENDOR_ID_SYNAPTICS 0x06cb #define USB_DEVICE_ID_SYNAPTICS_TP 0x0001
diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
index a8a9854..8ab7677 100644
--- a/drivers/hid/i2c-hid/i2c-hid-core.c
+++ b/drivers/hid/i2c-hid/i2c-hid-core.c@@ -134,6 +134,8 @@ static const struct i2c_hid_quirks { I2C_HID_QUIRK_RESET_ON_RESUME }, { I2C_VENDOR_ID_SYNAPTICS, I2C_PRODUCT_ID_SYNAPTICS_SYNA2393, I2C_HID_QUIRK_RESET_ON_RESUME }, + { I2C_VENDOR_ID_SYNAPTICS, I2C_PRODUCT_ID_SYNAPTICS_SYNA32A4, + I2C_HID_QUIRK_RESET_ON_RESUME }, { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, I2C_HID_QUIRK_BAD_INPUT_SIZE }, { I2C_VENDOR_ID_CIRQUE, I2C_PRODUCT_ID_CIRQUE_1063,
base-commit: 145c2b2e9a5c0f794fb4009bcb072ab19f8ccfcd -- 2.56.0