Hi,

some drivers'll need a lockless method to alter the pm count in order
to take locks by themselves in correct order.

        Regards
                Oliver

Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]>
-- 

--- a/include/linux/usb.h       2007-04-24 14:12:23.000000000 +0200
+++ b/include/linux/usb.h       2007-04-24 14:25:13.000000000 +0200
@@ -424,6 +424,8 @@ extern struct usb_device *usb_find_devic
 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);
+extern int usb_autopm_do_interface(struct usb_interface *intf, int 
inc_usage_cnt);
+extern int __usb_autopm_do_interface(struct usb_interface *intf, int 
inc_usage_cnt);
 
 static inline void usb_autopm_enable(struct usb_interface *intf)
 {
@@ -451,6 +453,11 @@ static inline void usb_autopm_enable(str
 { }
 static inline void usb_autopm_disable(struct usb_interface *intf)
 { }
+extern int usb_autopm_do_interface(struct usb_interface *intf, int 
inc_usage_cnt);
+{ return 0; }
+extern int __usb_autopm_do_interface(struct usb_interface *intf, int 
inc_usage_cnt);
+{ return 0; }
+
 #endif
 
 /*-------------------------------------------------------------------------*/
--- a/drivers/usb/core/driver.c 2007-04-24 13:48:42.000000000 +0200
+++ b/drivers/usb/core/driver.c 2007-04-24 14:20:45.000000000 +0200
@@ -1276,13 +1276,12 @@ int usb_autoresume_device(struct usb_dev
 /* Internal routine to adjust an interface's usage counter and change
  * its device's autosuspend state.
  */
-static int usb_autopm_do_interface(struct usb_interface *intf,
+int __usb_autopm_do_interface(struct usb_interface *intf,
                int inc_usage_cnt)
 {
        struct usb_device       *udev = interface_to_usbdev(intf);
        int                     status = 0;
 
-       usb_pm_lock(udev);
        if (intf->condition == USB_INTERFACE_UNBOUND)
                status = -ENODEV;
        else {
@@ -1296,10 +1295,23 @@ static int usb_autopm_do_interface(struc
                        queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend,
                                        udev->autosuspend_delay);
        }
-       usb_pm_unlock(udev);
        return status;
 }
+EXPORT_SYMBOL_GPL(__usb_autopm_do_interface);
+
+int usb_autopm_do_interface(struct usb_interface *intf,
+               int inc_usage_cnt)
+{
+       int r;
+       struct usb_device       *udev = interface_to_usbdev(intf);
 
+       usb_pm_lock(udev);
+       r = __usb_autopm_do_interface(intf, inc_usage_cnt);
+       usb_pm_unlock(udev);
+
+       return r;
+}
+EXPORT_SYMBOL_GPL(usb_autopm_do_interface);
 /**
  * usb_autopm_put_interface - decrement a USB interface's PM-usage counter
  * @intf: the usb_interface whose counter should be decremented


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to