Blob Blame Raw
commit 7d0d20a25c6f477fb198b85510c78156d7d7c5af
Author: Matthew Garrett <mjg@redhat.com>
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 <mjg@redhat.com>

diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index 4f86447..f7caf00 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -1575,6 +1575,22 @@ 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;
+	udev->autoresume_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 a34fa89..0c22c64 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -543,6 +543,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_set_interface(struct usb_interface *intf);
 extern int usb_autopm_get_interface(struct usb_interface *intf);
 extern void usb_autopm_put_interface(struct usb_interface *intf);
@@ -568,6 +569,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_set_interface(struct usb_interface *intf)
 { return 0; }