summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorOliver Neukum <oliver@neukum.org>2009-02-18 11:46:45 +0100
committerJiri Kosina <jkosina@suse.cz>2009-03-25 17:57:58 +0100
commit378a0ede126a2c59ab9ea1771de624521db5053e (patch)
tree08c81d94b190309c78cfc8a627edab0884d69a6c /drivers
parentHID: do not try to compile PM code with CONFIG_PM unset (diff)
downloadlinux-378a0ede126a2c59ab9ea1771de624521db5053e.tar.xz
linux-378a0ede126a2c59ab9ea1771de624521db5053e.zip
HID: fix USB HID devices after STD with autosuspend
This patch fixes a bug caused by reset_resume not changing the internal status flags for a device that is resumed via reset_resume. To do so the reset handlers, which correctly assume that a device is awake, can no longer do all the work of reset_resume handling. Signed-off-by: Oliver Neukum <oneukum@suse.de> Tested-by: Laurent Riffard <laurent.riffard@free.fr> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hid/usbhid/hid-core.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index d8799a18a422..d79100a01b05 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1330,6 +1330,15 @@ static int hid_post_reset(struct usb_interface *intf)
return 0;
}
+static int hid_reset_resume(struct usb_interface *intf)
+{
+ struct hid_device *hid = usb_get_intfdata(intf);
+ struct usbhid_device *usbhid = hid->driver_data;
+
+ clear_bit(HID_REPORTED_IDLE, &usbhid->iofl);
+ return hid_post_reset(intf);
+}
+
int usbhid_get_power(struct hid_device *hid)
{
struct usbhid_device *usbhid = hid->driver_data;
@@ -1359,7 +1368,7 @@ static struct usb_driver hid_driver = {
#ifdef CONFIG_PM
.suspend = hid_suspend,
.resume = hid_resume,
- .reset_resume = hid_post_reset,
+ .reset_resume = hid_reset_resume,
#endif
.pre_reset = hid_pre_reset,
.post_reset = hid_post_reset,