Hi,
this is a simpler interface for autosuspend on interfaces. It
is needed for autosuspending in the HID driver.
Regards
Oliver
Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]>
commit d4ce896e300c18d3696255ed0a50095dc3e2b547
Author: Oliver Neukum <[EMAIL PROTECTED]>
Date: Sun Oct 15 11:17:56 2006 +0200
simplified autosuspend management
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index 113e484..aaa1bac 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -1228,6 +1228,67 @@ void usb_autopm_put_interface(struct usb
EXPORT_SYMBOL_GPL(usb_autopm_put_interface);
/**
+ * usb_autopm_enable - allow the USB subsystem to use autosuspend on your
interface
+ * @intf: the usb_interface autosuspend is activated for
+ *
+ * This routine may be called by an interface driver when it is
+ * finished using @intf and wants to allow it to autosuspend.
+ *
+ * If the driver has set @intf->needs_remote_wakeup then autosuspend will
+ * take place only if the device's remote-wakeup facility is enabled.
+ *
+ * Suspend method calls queued by this routine can arrive at any time
+ * while @intf is resumed and its usage counter is equal to 0. They are
+ * not protected by the usb_device's lock but only by its pm_mutex.
+ * Drivers must provide their own synchronization.
+ *
+ * This routine can run only in process context.
+ */
+void usb_autopm_enable(struct usb_interface *intf)
+{
+ struct usb_device *udev = interface_to_usbdev(intf);
+
+ usb_pm_lock(udev);
+ intf->pm_usage_cnt = 0;
+ if (intf->condition != USB_INTERFACE_UNBOUND) {
+ queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend,
+ USB_AUTOSUSPEND_DELAY);
+ }
+ usb_pm_unlock(udev);
+ // dev_dbg(&intf->dev, "%s: cnt %d\n",
+ // __FUNCTION__, intf->pm_usage_cnt);
+}
+EXPORT_SYMBOL_GPL(usb_autopm_enable);
+
+/**
+ * usb_autopm_disable - disallow the USB subsystem from autosuspending your
interface
+ * @intf: the usb_interface whose autosuspend is to be disallowed
+ *
+ * This routine can run only in process context.
+ */
+
+int usb_autopm_disable(struct usb_interface *intf)
+{
+ struct usb_device *udev = interface_to_usbdev(intf);
+ int status;
+
+ usb_pm_lock(udev);
+ if (intf->condition == USB_INTERFACE_UNBOUND)
+ status = -ENODEV;
+ else {
+ intf->pm_usage_cnt = 1;
+ udev->auto_pm = 1;
+ status = usb_resume_both(udev);
+ if (status != 0)
+ --intf->pm_usage_cnt;
+ }
+ usb_pm_unlock(udev);
+ // dev_dbg(&intf->dev, "%s: status %d cnt %d\n",
+ // __FUNCTION__, status, intf->pm_usage_cnt);
+ return status;
+}
+EXPORT_SYMBOL_GPL(usb_autopm_disable);
+/**
* usb_autopm_get_interface - increment a USB interface's PM-usage counter
* @intf: the usb_interface whose counter should be incremented
*
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel