[PATCH v3] hid/hid-multitouch: Keep latency normal on deactivate for reactivation gesture

Werner Sembach posted 1 patch 1 month, 1 week ago
drivers/hid/hid-multitouch.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
[PATCH v3] hid/hid-multitouch: Keep latency normal on deactivate for reactivation gesture
Posted by Werner Sembach 1 month, 1 week ago
Uniwill devices have a built in gesture in the touchpad to de- and
reactivate it by double taping the upper left corner. This gesture stops
working when latency is set to high, so this patch keeps the latency on
normal.

Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
Cc: stable@vger.kernel.org
---
V1->V2: Use a quirk to narrow down the devices this is applied to.
V2->V3: Fix this patch breaking touchpads on some devices.
        Add another device ID.

I have three Uniwill devices at hand right now that have at least two
physically different touchpads, but same Vendor + Product ID combination.
Maybe the vendor uses this product ID for all i2c connected touchpads, or
it is used as some kind of subvendor ID to indicate Uniwill?

To be able to really narrow it down to Uniwill only devices I would need to
check DMI strings, but then I will probably narrow it down to much as I
only know what we at TUXEDO use there.

 drivers/hid/hid-multitouch.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 179dc316b4b51..ed9eb4e0d5038 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -76,6 +76,7 @@ MODULE_LICENSE("GPL");
 #define MT_QUIRK_DISABLE_WAKEUP		BIT(21)
 #define MT_QUIRK_ORIENTATION_INVERT	BIT(22)
 #define MT_QUIRK_APPLE_TOUCHBAR		BIT(23)
+#define MT_QUIRK_KEEP_LATENCY_ON_CLOSE	BIT(24)
 
 #define MT_INPUTMODE_TOUCHSCREEN	0x02
 #define MT_INPUTMODE_TOUCHPAD		0x03
@@ -211,6 +212,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app);
 #define MT_CLS_WIN_8_DISABLE_WAKEUP		0x0016
 #define MT_CLS_WIN_8_NO_STICKY_FINGERS		0x0017
 #define MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU	0x0018
+#define MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE	0x0019
 
 /* vendor specific classes */
 #define MT_CLS_3M				0x0101
@@ -330,6 +332,15 @@ static const struct mt_class mt_classes[] = {
 			MT_QUIRK_CONTACT_CNT_ACCURATE |
 			MT_QUIRK_WIN8_PTP_BUTTONS,
 		.export_all_inputs = true },
+	{ .name = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
+		.quirks = MT_QUIRK_ALWAYS_VALID |
+			MT_QUIRK_IGNORE_DUPLICATES |
+			MT_QUIRK_HOVERING |
+			MT_QUIRK_CONTACT_CNT_ACCURATE |
+			MT_QUIRK_STICKY_FINGERS |
+			MT_QUIRK_WIN8_PTP_BUTTONS |
+			MT_QUIRK_KEEP_LATENCY_ON_CLOSE,
+		.export_all_inputs = true },
 
 	/*
 	 * vendor specific classes
@@ -1998,7 +2009,12 @@ static void mt_on_hid_hw_open(struct hid_device *hdev)
 
 static void mt_on_hid_hw_close(struct hid_device *hdev)
 {
-	mt_set_modes(hdev, HID_LATENCY_HIGH, TOUCHPAD_REPORT_NONE);
+	struct mt_device *td = hid_get_drvdata(hdev);
+
+	if (td->mtclass.quirks & MT_QUIRK_KEEP_LATENCY_ON_CLOSE)
+		mt_set_modes(hdev, HID_LATENCY_NORMAL, TOUCHPAD_REPORT_NONE);
+	else
+		mt_set_modes(hdev, HID_LATENCY_HIGH, TOUCHPAD_REPORT_NONE);
 }
 
 /*
@@ -2375,6 +2391,14 @@ static const struct hid_device_id mt_devices[] = {
 		MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
 			USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
 
+	/* Uniwill touchpads */
+	{ .driver_data = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
+		HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
+			USB_VENDOR_ID_PIXART, 0x0255) },
+	{ .driver_data = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
+		HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
+			USB_VENDOR_ID_PIXART, 0x0274) },
+
 	/* VTL panels */
 	{ .driver_data = MT_CLS_VTL,
 		MT_USB_DEVICE(USB_VENDOR_ID_VTL,
-- 
2.43.0
Re: [PATCH v3] hid/hid-multitouch: Keep latency normal on deactivate for reactivation gesture
Posted by Werner Sembach 1 month ago
Am 12.11.25 um 15:47 schrieb Werner Sembach:
> Uniwill devices have a built in gesture in the touchpad to de- and
> reactivate it by double taping the upper left corner. This gesture stops
> working when latency is set to high, so this patch keeps the latency on
> normal.
>
> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
> Cc: stable@vger.kernel.org
> ---
> V1->V2: Use a quirk to narrow down the devices this is applied to.
> V2->V3: Fix this patch breaking touchpads on some devices.
>          Add another device ID.
>
> I have three Uniwill devices at hand right now that have at least two
> physically different touchpads, but same Vendor + Product ID combination.
> Maybe the vendor uses this product ID for all i2c connected touchpads, or
> it is used as some kind of subvendor ID to indicate Uniwill?
>
> To be able to really narrow it down to Uniwill only devices I would need to
> check DMI strings, but then I will probably narrow it down to much as I
> only know what we at TUXEDO use there.
>
>   drivers/hid/hid-multitouch.c | 26 +++++++++++++++++++++++++-
>   1 file changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
> index 179dc316b4b51..ed9eb4e0d5038 100644
> --- a/drivers/hid/hid-multitouch.c
> +++ b/drivers/hid/hid-multitouch.c
> @@ -76,6 +76,7 @@ MODULE_LICENSE("GPL");
>   #define MT_QUIRK_DISABLE_WAKEUP		BIT(21)
>   #define MT_QUIRK_ORIENTATION_INVERT	BIT(22)
>   #define MT_QUIRK_APPLE_TOUCHBAR		BIT(23)
> +#define MT_QUIRK_KEEP_LATENCY_ON_CLOSE	BIT(24)
>   
>   #define MT_INPUTMODE_TOUCHSCREEN	0x02
>   #define MT_INPUTMODE_TOUCHPAD		0x03
> @@ -211,6 +212,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app);
>   #define MT_CLS_WIN_8_DISABLE_WAKEUP		0x0016
>   #define MT_CLS_WIN_8_NO_STICKY_FINGERS		0x0017
>   #define MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU	0x0018
> +#define MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE	0x0019
A college realized that at some points in the code some, but not all, of the 
MT_CLS_WIN_8* classes are checked for directly. Should I add my new class there 
too?
>   
>   /* vendor specific classes */
>   #define MT_CLS_3M				0x0101
> @@ -330,6 +332,15 @@ static const struct mt_class mt_classes[] = {
>   			MT_QUIRK_CONTACT_CNT_ACCURATE |
>   			MT_QUIRK_WIN8_PTP_BUTTONS,
>   		.export_all_inputs = true },
> +	{ .name = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
> +		.quirks = MT_QUIRK_ALWAYS_VALID |
> +			MT_QUIRK_IGNORE_DUPLICATES |
> +			MT_QUIRK_HOVERING |
> +			MT_QUIRK_CONTACT_CNT_ACCURATE |
> +			MT_QUIRK_STICKY_FINGERS |
> +			MT_QUIRK_WIN8_PTP_BUTTONS |
> +			MT_QUIRK_KEEP_LATENCY_ON_CLOSE,
> +		.export_all_inputs = true },
>   
>   	/*
>   	 * vendor specific classes
> @@ -1998,7 +2009,12 @@ static void mt_on_hid_hw_open(struct hid_device *hdev)
>   
>   static void mt_on_hid_hw_close(struct hid_device *hdev)
>   {
> -	mt_set_modes(hdev, HID_LATENCY_HIGH, TOUCHPAD_REPORT_NONE);
> +	struct mt_device *td = hid_get_drvdata(hdev);
> +
> +	if (td->mtclass.quirks & MT_QUIRK_KEEP_LATENCY_ON_CLOSE)
> +		mt_set_modes(hdev, HID_LATENCY_NORMAL, TOUCHPAD_REPORT_NONE);
> +	else
> +		mt_set_modes(hdev, HID_LATENCY_HIGH, TOUCHPAD_REPORT_NONE);
>   }
>   
>   /*
> @@ -2375,6 +2391,14 @@ static const struct hid_device_id mt_devices[] = {
>   		MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
>   			USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
>   
> +	/* Uniwill touchpads */
> +	{ .driver_data = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
> +		HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
> +			USB_VENDOR_ID_PIXART, 0x0255) },
> +	{ .driver_data = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
> +		HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
> +			USB_VENDOR_ID_PIXART, 0x0274) },
> +
>   	/* VTL panels */
>   	{ .driver_data = MT_CLS_VTL,
>   		MT_USB_DEVICE(USB_VENDOR_ID_VTL,
Re: [PATCH v3] hid/hid-multitouch: Keep latency normal on deactivate for reactivation gesture
Posted by Benjamin Tissoires 2 hours ago
On Nov 12 2025, Werner Sembach wrote:
> 
> Am 12.11.25 um 15:47 schrieb Werner Sembach:
> > Uniwill devices have a built in gesture in the touchpad to de- and
> > reactivate it by double taping the upper left corner. This gesture stops
> > working when latency is set to high, so this patch keeps the latency on
> > normal.
> > 
> > Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
> > Cc: stable@vger.kernel.org
> > ---
> > V1->V2: Use a quirk to narrow down the devices this is applied to.
> > V2->V3: Fix this patch breaking touchpads on some devices.
> >          Add another device ID.
> > 
> > I have three Uniwill devices at hand right now that have at least two
> > physically different touchpads, but same Vendor + Product ID combination.
> > Maybe the vendor uses this product ID for all i2c connected touchpads, or
> > it is used as some kind of subvendor ID to indicate Uniwill?
> > 
> > To be able to really narrow it down to Uniwill only devices I would need to
> > check DMI strings, but then I will probably narrow it down to much as I
> > only know what we at TUXEDO use there.
> > 
> >   drivers/hid/hid-multitouch.c | 26 +++++++++++++++++++++++++-
> >   1 file changed, 25 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
> > index 179dc316b4b51..ed9eb4e0d5038 100644
> > --- a/drivers/hid/hid-multitouch.c
> > +++ b/drivers/hid/hid-multitouch.c
> > @@ -76,6 +76,7 @@ MODULE_LICENSE("GPL");
> >   #define MT_QUIRK_DISABLE_WAKEUP		BIT(21)
> >   #define MT_QUIRK_ORIENTATION_INVERT	BIT(22)
> >   #define MT_QUIRK_APPLE_TOUCHBAR		BIT(23)
> > +#define MT_QUIRK_KEEP_LATENCY_ON_CLOSE	BIT(24)
> >   #define MT_INPUTMODE_TOUCHSCREEN	0x02
> >   #define MT_INPUTMODE_TOUCHPAD		0x03
> > @@ -211,6 +212,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app);
> >   #define MT_CLS_WIN_8_DISABLE_WAKEUP		0x0016
> >   #define MT_CLS_WIN_8_NO_STICKY_FINGERS		0x0017
> >   #define MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU	0x0018
> > +#define MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE	0x0019
> A college realized that at some points in the code some, but not all, of the
> MT_CLS_WIN_8* classes are checked for directly. Should I add my new class
> there too?

It depends. If it's truely a WIN_8 touchpad then I guess those checks
are here for a reason, but if this particular device works without them,
then it's your call in the end.

Cheers,
Benjamin
Re: [PATCH v3] hid/hid-multitouch: Keep latency normal on deactivate for reactivation gesture
Posted by Werner Sembach 1 week, 2 days ago
Hi,

Am 12.11.25 um 16:51 schrieb Werner Sembach:
>
> Am 12.11.25 um 15:47 schrieb Werner Sembach:
>> Uniwill devices have a built in gesture in the touchpad to de- and
>> reactivate it by double taping the upper left corner. This gesture stops
>> working when latency is set to high, so this patch keeps the latency on
>> normal.
Just wanna make sure this doesn't get missed for the 6.19 cycle.
>>
>> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
>> Cc: stable@vger.kernel.org
>> ---
>> V1->V2: Use a quirk to narrow down the devices this is applied to.
>> V2->V3: Fix this patch breaking touchpads on some devices.
>>          Add another device ID.
>>
>> I have three Uniwill devices at hand right now that have at least two
>> physically different touchpads, but same Vendor + Product ID combination.
>> Maybe the vendor uses this product ID for all i2c connected touchpads, or
>> it is used as some kind of subvendor ID to indicate Uniwill?
>>
>> To be able to really narrow it down to Uniwill only devices I would need to
>> check DMI strings, but then I will probably narrow it down to much as I
>> only know what we at TUXEDO use there.
>>
>>   drivers/hid/hid-multitouch.c | 26 +++++++++++++++++++++++++-
>>   1 file changed, 25 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
>> index 179dc316b4b51..ed9eb4e0d5038 100644
>> --- a/drivers/hid/hid-multitouch.c
>> +++ b/drivers/hid/hid-multitouch.c
>> @@ -76,6 +76,7 @@ MODULE_LICENSE("GPL");
>>   #define MT_QUIRK_DISABLE_WAKEUP        BIT(21)
>>   #define MT_QUIRK_ORIENTATION_INVERT    BIT(22)
>>   #define MT_QUIRK_APPLE_TOUCHBAR        BIT(23)
>> +#define MT_QUIRK_KEEP_LATENCY_ON_CLOSE    BIT(24)
>>     #define MT_INPUTMODE_TOUCHSCREEN    0x02
>>   #define MT_INPUTMODE_TOUCHPAD        0x03
>> @@ -211,6 +212,7 @@ static void mt_post_parse(struct mt_device *td, struct 
>> mt_application *app);
>>   #define MT_CLS_WIN_8_DISABLE_WAKEUP        0x0016
>>   #define MT_CLS_WIN_8_NO_STICKY_FINGERS        0x0017
>>   #define MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU    0x0018
>> +#define MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE    0x0019
> A college realized that at some points in the code some, but not all, of the 
> MT_CLS_WIN_8* classes are checked for directly. Should I add my new class 
> there too?
>>     /* vendor specific classes */
>>   #define MT_CLS_3M                0x0101
>> @@ -330,6 +332,15 @@ static const struct mt_class mt_classes[] = {
>>               MT_QUIRK_CONTACT_CNT_ACCURATE |
>>               MT_QUIRK_WIN8_PTP_BUTTONS,
>>           .export_all_inputs = true },
>> +    { .name = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
>> +        .quirks = MT_QUIRK_ALWAYS_VALID |
>> +            MT_QUIRK_IGNORE_DUPLICATES |
>> +            MT_QUIRK_HOVERING |
>> +            MT_QUIRK_CONTACT_CNT_ACCURATE |
>> +            MT_QUIRK_STICKY_FINGERS |
>> +            MT_QUIRK_WIN8_PTP_BUTTONS |
>> +            MT_QUIRK_KEEP_LATENCY_ON_CLOSE,
>> +        .export_all_inputs = true },
>>         /*
>>        * vendor specific classes
>> @@ -1998,7 +2009,12 @@ static void mt_on_hid_hw_open(struct hid_device *hdev)
>>     static void mt_on_hid_hw_close(struct hid_device *hdev)
>>   {
>> -    mt_set_modes(hdev, HID_LATENCY_HIGH, TOUCHPAD_REPORT_NONE);
>> +    struct mt_device *td = hid_get_drvdata(hdev);
>> +
>> +    if (td->mtclass.quirks & MT_QUIRK_KEEP_LATENCY_ON_CLOSE)
>> +        mt_set_modes(hdev, HID_LATENCY_NORMAL, TOUCHPAD_REPORT_NONE);
>> +    else
>> +        mt_set_modes(hdev, HID_LATENCY_HIGH, TOUCHPAD_REPORT_NONE);
>>   }
>>     /*
>> @@ -2375,6 +2391,14 @@ static const struct hid_device_id mt_devices[] = {
>>           MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
>>               USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
>>   +    /* Uniwill touchpads */
>> +    { .driver_data = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
>> +        HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
>> +            USB_VENDOR_ID_PIXART, 0x0255) },
>> +    { .driver_data = MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE,
>> +        HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
>> +            USB_VENDOR_ID_PIXART, 0x0274) },
>> +
>>       /* VTL panels */
>>       { .driver_data = MT_CLS_VTL,
>>           MT_USB_DEVICE(USB_VENDOR_ID_VTL,