summaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
authorScott Liu2012-08-15 11:21:55 +0200
committerJiri Kosina2012-08-15 11:37:27 +0200
commitdfeefd108ab2ae2975abb126be7cef449a691e9e (patch)
treed3761ad95829d3cd7d31bd873e7195f38cd79f93 /drivers/hid
parentHID: multitouch: Add support for eGalax 0x73f7 (diff)
downloadkernel-qcow2-linux-dfeefd108ab2ae2975abb126be7cef449a691e9e.tar.gz
kernel-qcow2-linux-dfeefd108ab2ae2975abb126be7cef449a691e9e.tar.xz
kernel-qcow2-linux-dfeefd108ab2ae2975abb126be7cef449a691e9e.zip
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: Scott Liu <scott.liu@emc.com.tw> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/hid-multitouch.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 4a8048d3e9dd..e170112e2b84 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -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
};