commit 7d0d20a25c6f477fb198b85510c78156d7d7c5af Author: Matthew Garrett Date: Tue Jun 9 20:11:47 2009 +0100 usb: Allow drivers to enable USB autosuspend on a per-device basis USB autosuspend is currently only enabled by default for hubs. On other hardware the decision is made by userspace. This is unnecessary in cases where we know that the hardware supports autosuspend, so this patch adds a function to allow drivers to enable it at probe time. Signed-off-by: Matthew Garrett --- drivers/usb/core/driver.c | 16 ++++++++++++++++ include/linux/usb.h | 4 ++++ 2 files changed, 20 insertions(+), 0 deletions(-) diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 60a45f1..03e0228 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -1648,6 +1648,21 @@ void usb_autopm_put_interface_async(struct usb_interface *intf) EXPORT_SYMBOL_GPL(usb_autopm_put_interface_async); /** + * usb_device_autosuspend_enable - enable autosuspend on a device + * @udev: the usb_device to be autosuspended + * + * This routine should be called by an interface driver when it knows that + * the device in question supports USB autosuspend. + * + */ +void usb_device_autosuspend_enable(struct usb_device *udev) +{ + udev->autosuspend_disabled = 0; + usb_external_suspend_device(udev, PMSG_USER_SUSPEND); +} +EXPORT_SYMBOL_GPL(usb_device_autosuspend_enable); + +/** * usb_autopm_get_interface - increment a USB interface's PM-usage counter * @intf: the usb_interface whose counter should be incremented * diff --git a/include/linux/usb.h b/include/linux/usb.h index e101a2d..dd47590 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -540,6 +540,7 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); /* USB autosuspend and autoresume */ #ifdef CONFIG_USB_SUSPEND +extern void usb_device_autosuspend_enable(struct usb_device *udev); extern int usb_autopm_get_interface(struct usb_interface *intf); extern void usb_autopm_put_interface(struct usb_interface *intf); extern int usb_autopm_get_interface_async(struct usb_interface *intf); @@ -563,6 +564,9 @@ static inline void usb_mark_last_busy(struct usb_device *udev) #else +static inline void usb_device_autosuspend_enable(struct usb_device *udev) +{ } + static inline int usb_autopm_get_interface(struct usb_interface *intf) { return 0; } static inline int usb_autopm_get_interface_async(struct usb_interface *intf) -- 1.6.5.2