Commit 927bc916 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

PM: Allow USB devices to suspend/resume asynchronously

Set power.async_suspend for USB devices, endpoints and interfaces,
allowing them to be suspended and resumed asynchronously during
system sleep transitions.

The power.async_suspend flag is also set for devices that don't have
suspend or resume callbacks, because otherwise they would make the
main suspend/resume thread wait for their "asynchronous" children
(during suspend) or parents (during resume), effectively negating the
possible gains from executing these devices' suspend and resume
callbacks asynchronously.
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent 6d19c009
...@@ -186,6 +186,7 @@ int usb_create_ep_devs(struct device *parent, ...@@ -186,6 +186,7 @@ int usb_create_ep_devs(struct device *parent,
ep_dev->dev.parent = parent; ep_dev->dev.parent = parent;
ep_dev->dev.release = ep_device_release; ep_dev->dev.release = ep_device_release;
dev_set_name(&ep_dev->dev, "ep_%02x", endpoint->desc.bEndpointAddress); dev_set_name(&ep_dev->dev, "ep_%02x", endpoint->desc.bEndpointAddress);
device_enable_async_suspend(&ep_dev->dev);
retval = device_register(&ep_dev->dev); retval = device_register(&ep_dev->dev);
if (retval) if (retval)
......
...@@ -1817,6 +1817,7 @@ int usb_new_device(struct usb_device *udev) ...@@ -1817,6 +1817,7 @@ int usb_new_device(struct usb_device *udev)
/* Tell the world! */ /* Tell the world! */
announce_device(udev); announce_device(udev);
device_enable_async_suspend(&udev->dev);
/* Register the device. The device driver is responsible /* Register the device. The device driver is responsible
* for configuring the device and invoking the add-device * for configuring the device and invoking the add-device
* notifier chain (used by usbfs and possibly others). * notifier chain (used by usbfs and possibly others).
......
...@@ -1867,6 +1867,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration) ...@@ -1867,6 +1867,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
"adding %s (config #%d, interface %d)\n", "adding %s (config #%d, interface %d)\n",
dev_name(&intf->dev), configuration, dev_name(&intf->dev), configuration,
intf->cur_altsetting->desc.bInterfaceNumber); intf->cur_altsetting->desc.bInterfaceNumber);
device_enable_async_suspend(&intf->dev);
ret = device_add(&intf->dev); ret = device_add(&intf->dev);
if (ret != 0) { if (ret != 0) {
dev_err(&dev->dev, "device_add(%s) --> %d\n", dev_err(&dev->dev, "device_add(%s) --> %d\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment