diff options
author | Tomeu Vizoso <tomeu.vizoso@collabora.com> | 2016-01-07 16:46:15 +0100 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-01-08 01:12:06 +0100 |
commit | e3345db85068ddb937fc0ba40dfc39c293dad977 (patch) | |
tree | 24fe5f14eb28739158b33a453ee5f7fe828e620d /drivers/usb/core | |
parent | aa8e54b559479d0cb7eb632ba443b8cacd20cd4b (diff) | |
download | talos-obmc-linux-e3345db85068ddb937fc0ba40dfc39c293dad977.tar.gz talos-obmc-linux-e3345db85068ddb937fc0ba40dfc39c293dad977.zip |
USB / PM: Allow USB devices to remain runtime-suspended when sleeping
Have dev_pm_ops.prepare return 1 for USB devices and ports so that USB
devices can remain runtime-suspended when the system goes to a sleep
state, if their wakeup state is correct and they have runtime PM enabled.
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/usb/core')
-rw-r--r-- | drivers/usb/core/port.c | 6 | ||||
-rw-r--r-- | drivers/usb/core/usb.c | 8 |
2 files changed, 13 insertions, 1 deletions
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index 210618319f10..f49707d73b5a 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -168,12 +168,18 @@ static int usb_port_runtime_suspend(struct device *dev) return retval; } + +static int usb_port_prepare(struct device *dev) +{ + return 1; +} #endif static const struct dev_pm_ops usb_port_pm_ops = { #ifdef CONFIG_PM .runtime_suspend = usb_port_runtime_suspend, .runtime_resume = usb_port_runtime_resume, + .prepare = usb_port_prepare, #endif }; diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index f8bbd0b6d9fe..cafc11902794 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -316,7 +316,13 @@ static int usb_dev_uevent(struct device *dev, struct kobj_uevent_env *env) static int usb_dev_prepare(struct device *dev) { - return 0; /* Implement eventually? */ + struct usb_device *udev = to_usb_device(dev); + + /* Return 0 if the current wakeup setting is wrong, otherwise 1 */ + if (udev->do_remote_wakeup != device_may_wakeup(dev)) + return 0; + + return 1; } static void usb_dev_complete(struct device *dev) |