diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2008-11-25 16:39:18 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-01-07 13:00:03 -0500 |
commit | 65bfd2967c906ca322a4bb69a285fe0de8916ac6 (patch) | |
tree | ddd3293f945613d0d27ec1dbd36030c079fb9492 /drivers/usb/core/generic.c | |
parent | 4ec06d629628b6e5c7ff50d349a26ef5c35696e3 (diff) |
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>
Diffstat (limited to 'drivers/usb/core/generic.c')
-rw-r--r-- | drivers/usb/core/generic.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c index 7e912f21fd3..30ecac3af15 100644 --- a/drivers/usb/core/generic.c +++ b/drivers/usb/core/generic.c | |||
@@ -200,18 +200,18 @@ static int generic_suspend(struct usb_device *udev, pm_message_t msg) | |||
200 | * interfaces manually by doing a bus (or "global") suspend. | 200 | * interfaces manually by doing a bus (or "global") suspend. |
201 | */ | 201 | */ |
202 | if (!udev->parent) | 202 | if (!udev->parent) |
203 | rc = hcd_bus_suspend(udev); | 203 | rc = hcd_bus_suspend(udev, msg); |
204 | 204 | ||
205 | /* Non-root devices don't need to do anything for FREEZE or PRETHAW */ | 205 | /* Non-root devices don't need to do anything for FREEZE or PRETHAW */ |
206 | else if (msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_PRETHAW) | 206 | else if (msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_PRETHAW) |
207 | rc = 0; | 207 | rc = 0; |
208 | else | 208 | else |
209 | rc = usb_port_suspend(udev); | 209 | rc = usb_port_suspend(udev, msg); |
210 | 210 | ||
211 | return rc; | 211 | return rc; |
212 | } | 212 | } |
213 | 213 | ||
214 | static int generic_resume(struct usb_device *udev) | 214 | static int generic_resume(struct usb_device *udev, pm_message_t msg) |
215 | { | 215 | { |
216 | int rc; | 216 | int rc; |
217 | 217 | ||
@@ -221,9 +221,9 @@ static int generic_resume(struct usb_device *udev) | |||
221 | * interfaces manually by doing a bus (or "global") resume. | 221 | * interfaces manually by doing a bus (or "global") resume. |
222 | */ | 222 | */ |
223 | if (!udev->parent) | 223 | if (!udev->parent) |
224 | rc = hcd_bus_resume(udev); | 224 | rc = hcd_bus_resume(udev, msg); |
225 | else | 225 | else |
226 | rc = usb_port_resume(udev); | 226 | rc = usb_port_resume(udev, msg); |
227 | return rc; | 227 | return rc; |
228 | } | 228 | } |
229 | 229 | ||