USB: Enhance usage of pm_message_t
This patch (as1177) modifies the USB core suspend and resume routines. The resume functions now will take a pm_message_t argument, so they will know what sort of resume is occurring. The new argument is also passed to the port suspend/resume and bus suspend/resume routines (although they don't use it for anything but debugging). In addition, special pm_message_t values are used for user-initiated, device-initiated (i.e., remote wakeup), and automatic suspend/resume. By testing these values, drivers can tell whether or not a particular suspend was an autosuspend. Unfortunately, they can't do the same for resumes -- not until the pm_message_t argument is also passed to the drivers' resume methods. That will require a bigger change. IMO, the whole Power Management framework should have been set up this way in the first place. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
4ec06d6296
commit
65bfd2967c
@@ -1,3 +1,5 @@
|
||||
#include <linux/pm.h>
|
||||
|
||||
/* Functions local to drivers/usb/core/ */
|
||||
|
||||
extern int usb_create_sysfs_dev_files(struct usb_device *dev);
|
||||
@@ -42,15 +44,16 @@ extern void usb_host_cleanup(void);
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
extern int usb_suspend(struct device *dev, pm_message_t msg);
|
||||
extern int usb_resume(struct device *dev);
|
||||
extern int usb_resume(struct device *dev, pm_message_t msg);
|
||||
|
||||
extern void usb_autosuspend_work(struct work_struct *work);
|
||||
extern void usb_autoresume_work(struct work_struct *work);
|
||||
extern int usb_port_suspend(struct usb_device *dev);
|
||||
extern int usb_port_resume(struct usb_device *dev);
|
||||
extern int usb_port_suspend(struct usb_device *dev, pm_message_t msg);
|
||||
extern int usb_port_resume(struct usb_device *dev, pm_message_t msg);
|
||||
extern int usb_external_suspend_device(struct usb_device *udev,
|
||||
pm_message_t msg);
|
||||
extern int usb_external_resume_device(struct usb_device *udev);
|
||||
extern int usb_external_resume_device(struct usb_device *udev,
|
||||
pm_message_t msg);
|
||||
|
||||
static inline void usb_pm_lock(struct usb_device *udev)
|
||||
{
|
||||
@@ -64,12 +67,12 @@ static inline void usb_pm_unlock(struct usb_device *udev)
|
||||
|
||||
#else
|
||||
|
||||
static inline int usb_port_suspend(struct usb_device *udev)
|
||||
static inline int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int usb_port_resume(struct usb_device *udev)
|
||||
static inline int usb_port_resume(struct usb_device *udev, pm_message_t msg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user