Commit ec3070f0 authored by Werner Sembach's avatar Werner Sembach Committed by Jiri Kosina
Browse files

HID: multitouch: Keep latency normal on deactivate for reactivation gesture



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: default avatarWerner Sembach <wse@tuxedocomputers.com>
[jkosina@suse.com: change bit from 24 to 25]
[jkosina@suse.com: update shortlog]
Signed-off-by: default avatarJiri Kosina <jkosina@suse.com>
parent 7c698de0
Loading
Loading
Loading
Loading
+29 −3
Original line number Diff line number Diff line
@@ -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,6 +2094,11 @@ static void mt_on_hid_hw_open(struct hid_device *hdev)

static void mt_on_hid_hw_close(struct hid_device *hdev)
{
	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,