Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1729127
| From | Dmitry Torokhov <dmitry.torokhov@gmail.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH] HID: usbhid: get/put around clearing needs_remote_wakeup |
| Date | 2017-09-08 19:50 +0200 |
| Message-ID | <unvzI-1IV-3@gated-at.bofh.it> (permalink) |
| Organization | linux.* mail to news gateway |
From: Benson Leung <bleung@chromium.org>
usbhid->intf->needs_remote_wakeup is set when a device is opened, and is
cleared when a device is closed.
In usbhid_open, usb_autopm_get_interface is called before setting the
needs_remote_wakeup flag, and usb_autopm_put_interface is called after
hid_start_in. However, when the device is closed in usbhid_close, we
simply reset the flag and the device stays awake even though it could be
suspended.
This patch adds calls to usb_autopm_get_interface and
usb_autopm_put_interface when we reset usbhid->intf->needs_remote_wakeup
flag, giving the system chance to put the device to sleep.
Signed-off-by: Benson Leung <bleung@chromium.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/hid/usbhid/hid-core.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 089bad8a9a21..174d87f0e3e6 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -729,6 +729,7 @@ static int usbhid_open(struct hid_device *hid)
static void usbhid_close(struct hid_device *hid)
{
struct usbhid_device *usbhid = hid->driver_data;
+ int autopm_error;
/*
* Make sure we don't restart data acquisition due to
@@ -745,8 +746,14 @@ static void usbhid_close(struct hid_device *hid)
return;
hid_cancel_delayed_stuff(usbhid);
+
+ autopm_error = usb_autopm_get_interface(usbhid->intf);
+
usb_kill_urb(usbhid->urbin);
usbhid->intf->needs_remote_wakeup = 0;
+
+ if (!autopm_error)
+ usb_autopm_put_interface(usbhid->intf);
}
/*
@@ -1176,13 +1183,18 @@ static int usbhid_start(struct hid_device *hid)
static void usbhid_stop(struct hid_device *hid)
{
struct usbhid_device *usbhid = hid->driver_data;
+ int autopm_error;
if (WARN_ON(!usbhid))
return;
if (hid->quirks & HID_QUIRK_ALWAYS_POLL) {
clear_bit(HID_IN_POLLING, &usbhid->iofl);
+
+ autopm_error = usb_autopm_get_interface(usbhid->intf);
usbhid->intf->needs_remote_wakeup = 0;
+ if (!autopm_error)
+ usb_autopm_put_interface(usbhid->intf);
}
clear_bit(HID_STARTED, &usbhid->iofl);
--
2.14.1.581.gf28d330327-goog
--
Dmitry
Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread
[PATCH] HID: usbhid: get/put around clearing needs_remote_wakeup Dmitry Torokhov <dmitry.torokhov@gmail.com> - 2017-09-08 19:50 +0200 Re: [PATCH] HID: usbhid: get/put around clearing needs_remote_wakeup Oliver Neukum <oneukum@suse.com> - 2017-09-09 09:40 +0200
csiph-web