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
@@ -1573,14 +1573,14 @@ int usb_hcd_get_frame_number (struct usb_device *udev)
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
int hcd_bus_suspend(struct usb_device *rhdev)
|
||||
int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg)
|
||||
{
|
||||
struct usb_hcd *hcd = container_of(rhdev->bus, struct usb_hcd, self);
|
||||
int status;
|
||||
int old_state = hcd->state;
|
||||
|
||||
dev_dbg(&rhdev->dev, "bus %s%s\n",
|
||||
rhdev->auto_pm ? "auto-" : "", "suspend");
|
||||
(msg.event & PM_EVENT_AUTO ? "auto-" : ""), "suspend");
|
||||
if (!hcd->driver->bus_suspend) {
|
||||
status = -ENOENT;
|
||||
} else {
|
||||
@@ -1598,14 +1598,14 @@ int hcd_bus_suspend(struct usb_device *rhdev)
|
||||
return status;
|
||||
}
|
||||
|
||||
int hcd_bus_resume(struct usb_device *rhdev)
|
||||
int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)
|
||||
{
|
||||
struct usb_hcd *hcd = container_of(rhdev->bus, struct usb_hcd, self);
|
||||
int status;
|
||||
int old_state = hcd->state;
|
||||
|
||||
dev_dbg(&rhdev->dev, "usb %s%s\n",
|
||||
rhdev->auto_pm ? "auto-" : "", "resume");
|
||||
(msg.event & PM_EVENT_AUTO ? "auto-" : ""), "resume");
|
||||
if (!hcd->driver->bus_resume)
|
||||
return -ENOENT;
|
||||
if (hcd->state == HC_STATE_RUNNING)
|
||||
@@ -1638,7 +1638,7 @@ static void hcd_resume_work(struct work_struct *work)
|
||||
|
||||
usb_lock_device(udev);
|
||||
usb_mark_last_busy(udev);
|
||||
usb_external_resume_device(udev);
|
||||
usb_external_resume_device(udev, PMSG_REMOTE_RESUME);
|
||||
usb_unlock_device(udev);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user