]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
HID: multitouch: Keep latency normal on deactivate for reactivation gesture
authorWerner Sembach <wse@tuxedocomputers.com>
Thu, 8 Jan 2026 16:09:54 +0000 (17:09 +0100)
committerJiri Kosina <jkosina@suse.com>
Thu, 26 Feb 2026 16:10:22 +0000 (17:10 +0100)
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.

Cc: stable@vger.kernel.org
Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
[jkosina@suse.com: change bit from 24 to 25]
[jkosina@suse.com: update shortlog]
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-multitouch.c

index 8052b35bfd7dfdd2b5b476bed977236f52452b05..b8a748bbf0fd8f031022a961360971cc39576044 100644 (file)
@@ -77,6 +77,7 @@ MODULE_LICENSE("GPL");
 #define MT_QUIRK_ORIENTATION_INVERT    BIT(22)
 #define MT_QUIRK_APPLE_TOUCHBAR                BIT(23)
 #define MT_QUIRK_YOGABOOK9I            BIT(24)
+#define MT_QUIRK_KEEP_LATENCY_ON_CLOSE BIT(25)
 
 #define MT_INPUTMODE_TOUCHSCREEN       0x02
 #define MT_INPUTMODE_TOUCHPAD          0x03
@@ -214,6 +215,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
@@ -335,6 +337,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
@@ -855,7 +866,8 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
                        if ((cls->name == MT_CLS_WIN_8 ||
                             cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT ||
                             cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU ||
-                            cls->name == MT_CLS_WIN_8_DISABLE_WAKEUP) &&
+                            cls->name == MT_CLS_WIN_8_DISABLE_WAKEUP ||
+                            cls->name == MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE) &&
                                (field->application == HID_DG_TOUCHPAD ||
                                 field->application == HID_DG_TOUCHSCREEN))
                                app->quirks |= MT_QUIRK_CONFIDENCE;
@@ -1768,7 +1780,8 @@ static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
        int ret;
 
        if (td->is_haptic_touchpad && (td->mtclass.name == MT_CLS_WIN_8 ||
-           td->mtclass.name == MT_CLS_WIN_8_FORCE_MULTI_INPUT)) {
+           td->mtclass.name == MT_CLS_WIN_8_FORCE_MULTI_INPUT ||
+           td->mtclass.name == MT_CLS_WIN_8_KEEP_LATENCY_ON_CLOSE)) {
                if (hid_haptic_input_configured(hdev, td->haptic, hi) == 0)
                        td->is_haptic_touchpad = false;
        } else {
@@ -2081,7 +2094,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);
 }
 
 /*
@@ -2468,6 +2486,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,