Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dfeefd10 authored by Scott Liu's avatar Scott Liu Committed by Jiri Kosina
Browse files

HID: multitouch: Add ELAN production request when resume.



Add ELAN production request when resume.

Some Elan legacy devices require SET_IDLE to be set on resume.
It should be safe to send it to other devices too.
Tested on 3M, Stantum, Cypress, Zytronic, eGalax, and Elan panels.

Suggested by Benjamin Tissoires <benjamin.tissoires@enac.fr>

Signed-off-by: default avatarScott Liu <scott.liu@emc.com.tw>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent ae01c9e5
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -765,6 +765,32 @@ static int mt_reset_resume(struct hid_device *hdev)
	mt_set_input_mode(hdev);
	return 0;
}

static int mt_resume(struct hid_device *hdev)
{
	struct usb_interface *intf;
	struct usb_host_interface *interface;
	struct usb_device *dev;

	if (hdev->bus != BUS_USB)
		return 0;

	intf = to_usb_interface(hdev->dev.parent);
	interface = intf->cur_altsetting;
	dev = hid_to_usb_dev(hdev);

	/* Some Elan legacy devices require SET_IDLE to be set on resume.
	 * It should be safe to send it to other devices too.
	 * Tested on 3M, Stantum, Cypress, Zytronic, eGalax, and Elan panels. */

	usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
			HID_REQ_SET_IDLE,
			USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			0, interface->desc.bInterfaceNumber,
			NULL, 0, USB_CTRL_SET_TIMEOUT);

	return 0;
}
#endif

static void mt_remove(struct hid_device *hdev)
@@ -1102,6 +1128,7 @@ static struct hid_driver mt_driver = {
	.event = mt_event,
#ifdef CONFIG_PM
	.reset_resume = mt_reset_resume,
	.resume = mt_resume,
#endif
};