USB: expand autosuspend/autoresume API
This patch (as814) adds usb_autopm_set_interface() to the autosuspend API. It also provides convenient wrapper routines, usb_autopm_enable() and usb_autopm_disable(), for drivers that want to specify directly whether autosuspend should be allowed. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
af4f76066d
Коммит
692a186c9d
|
@ -1322,6 +1322,28 @@ int usb_autopm_get_interface(struct usb_interface *intf)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(usb_autopm_get_interface);
|
EXPORT_SYMBOL_GPL(usb_autopm_get_interface);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* usb_autopm_set_interface - set a USB interface's autosuspend state
|
||||||
|
* @intf: the usb_interface whose state should be set
|
||||||
|
*
|
||||||
|
* This routine sets the autosuspend state of @intf's device according
|
||||||
|
* to @intf's usage counter, which the caller must have set previously.
|
||||||
|
* If the counter is <= 0, the device is autosuspended (if it isn't
|
||||||
|
* already suspended and if nothing else prevents the autosuspend). If
|
||||||
|
* the counter is > 0, the device is autoresumed (if it isn't already
|
||||||
|
* awake).
|
||||||
|
*/
|
||||||
|
int usb_autopm_set_interface(struct usb_interface *intf)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = usb_autopm_do_interface(intf, 0);
|
||||||
|
// dev_dbg(&intf->dev, "%s: status %d cnt %d\n",
|
||||||
|
// __FUNCTION__, status, intf->pm_usage_cnt);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(usb_autopm_set_interface);
|
||||||
|
|
||||||
#endif /* CONFIG_USB_SUSPEND */
|
#endif /* CONFIG_USB_SUSPEND */
|
||||||
|
|
||||||
static int usb_suspend(struct device *dev, pm_message_t message)
|
static int usb_suspend(struct device *dev, pm_message_t message)
|
||||||
|
|
|
@ -415,14 +415,37 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);
|
||||||
|
|
||||||
/* USB autosuspend and autoresume */
|
/* USB autosuspend and autoresume */
|
||||||
#ifdef CONFIG_USB_SUSPEND
|
#ifdef CONFIG_USB_SUSPEND
|
||||||
|
extern int usb_autopm_set_interface(struct usb_interface *intf);
|
||||||
extern int usb_autopm_get_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 void usb_autopm_put_interface(struct usb_interface *intf);
|
||||||
|
|
||||||
#else
|
static inline void usb_autopm_enable(struct usb_interface *intf)
|
||||||
#define usb_autopm_get_interface(intf) 0
|
{
|
||||||
#define usb_autopm_put_interface(intf) do {} while (0)
|
intf->pm_usage_cnt = 0;
|
||||||
#endif
|
usb_autopm_set_interface(intf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void usb_autopm_disable(struct usb_interface *intf)
|
||||||
|
{
|
||||||
|
intf->pm_usage_cnt = 1;
|
||||||
|
usb_autopm_set_interface(intf);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline int usb_autopm_set_interface(struct usb_interface *intf)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
|
static inline int usb_autopm_get_interface(struct usb_interface *intf)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
|
static inline void usb_autopm_put_interface(struct usb_interface *intf)
|
||||||
|
{ }
|
||||||
|
static inline void usb_autopm_enable(struct usb_interface *intf)
|
||||||
|
{ }
|
||||||
|
static inline void usb_autopm_disable(struct usb_interface *intf)
|
||||||
|
{ }
|
||||||
|
#endif
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче