commit 0f592e33934bf6108e33e34f00b425f98ee833ef
Author: Matthew Garrett <mjg@redhat.com>
Date:   Wed Jul 8 19:04:23 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 <mjg@redhat.com>

diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index 60a45f1..06d24df 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -1648,6 +1648,20 @@ 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;
+}
+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)
