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/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel