Jesse Keating 2f82dda
commit 7d0d20a25c6f477fb198b85510c78156d7d7c5af
Jesse Keating 2f82dda
Author: Matthew Garrett <mjg@redhat.com>
Jesse Keating 2f82dda
Date:   Tue Jun 9 20:11:47 2009 +0100
Jesse Keating 2f82dda
Jesse Keating 2f82dda
    usb: Allow drivers to enable USB autosuspend on a per-device basis
Jesse Keating 2f82dda
    
Jesse Keating 2f82dda
    USB autosuspend is currently only enabled by default for hubs. On other
Jesse Keating 2f82dda
    hardware the decision is made by userspace. This is unnecessary in cases
Jesse Keating 2f82dda
    where we know that the hardware supports autosuspend, so this patch adds
Jesse Keating 2f82dda
    a function to allow drivers to enable it at probe time.
Jesse Keating 2f82dda
    
Jesse Keating 2f82dda
    Signed-off-by: Matthew Garrett <mjg@redhat.com>
Jesse Keating 2f82dda
Jesse Keating 2f82dda
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
Jesse Keating 2f82dda
index 4f86447..f7caf00 100644
Jesse Keating 2f82dda
--- a/drivers/usb/core/driver.c
Jesse Keating 2f82dda
+++ b/drivers/usb/core/driver.c
Jesse Keating 2f82dda
@@ -1575,6 +1575,22 @@ void usb_autopm_put_interface_async(struct usb_interface *intf)
Jesse Keating 2f82dda
 EXPORT_SYMBOL_GPL(usb_autopm_put_interface_async);
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 /**
Jesse Keating 2f82dda
+ * usb_device_autosuspend_enable - enable autosuspend on a device
Jesse Keating 2f82dda
+ * @udev: the usb_device to be autosuspended
Jesse Keating 2f82dda
+ *
Jesse Keating 2f82dda
+ * This routine should be called by an interface driver when it knows that
Jesse Keating 2f82dda
+ * the device in question supports USB autosuspend.
Jesse Keating 2f82dda
+ *
Jesse Keating 2f82dda
+ */
Jesse Keating 2f82dda
+void usb_device_autosuspend_enable(struct usb_device *udev)
Jesse Keating 2f82dda
+{
Jesse Keating 2f82dda
+	udev->autosuspend_disabled = 0;
Jesse Keating 2f82dda
+	udev->autoresume_disabled = 0;
Jesse Keating 2f82dda
+	usb_external_suspend_device(udev, PMSG_USER_SUSPEND);
Jesse Keating 2f82dda
+}
Jesse Keating 2f82dda
+EXPORT_SYMBOL_GPL(usb_device_autosuspend_enable);
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+/**
Jesse Keating 2f82dda
  * usb_autopm_get_interface - increment a USB interface's PM-usage counter
Jesse Keating 2f82dda
  * @intf: the usb_interface whose counter should be incremented
Jesse Keating 2f82dda
  *
Jesse Keating 2f82dda
diff --git a/include/linux/usb.h b/include/linux/usb.h
Jesse Keating 2f82dda
index a34fa89..0c22c64 100644
Jesse Keating 2f82dda
--- a/include/linux/usb.h
Jesse Keating 2f82dda
+++ b/include/linux/usb.h
Jesse Keating 2f82dda
@@ -543,6 +543,7 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 /* USB autosuspend and autoresume */
Jesse Keating 2f82dda
 #ifdef CONFIG_USB_SUSPEND
Jesse Keating 2f82dda
+extern void usb_device_autosuspend_enable(struct usb_device *udev);
Jesse Keating 2f82dda
 extern int usb_autopm_set_interface(struct usb_interface *intf);
Jesse Keating 2f82dda
 extern int usb_autopm_get_interface(struct usb_interface *intf);
Jesse Keating 2f82dda
 extern void usb_autopm_put_interface(struct usb_interface *intf);
Jesse Keating 2f82dda
@@ -568,6 +569,9 @@ static inline void usb_mark_last_busy(struct usb_device *udev)
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 #else
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
+static inline void usb_device_autosuspend_enable(struct usb_device *udev)
Jesse Keating 2f82dda
+{ }
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
 static inline int usb_autopm_set_interface(struct usb_interface *intf)
Jesse Keating 2f82dda
 { return 0; }
Jesse Keating 2f82dda