Commit 98d9a82e authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman

USB: cleanup the handling of the PM complete call

This eliminates the last instance of a function's behavior
controlled by a parameter as Linus hates such things.
Signed-off-by: default avatarOliver Neukum <oneukum@suse.de>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 1493138a
...@@ -1336,34 +1336,37 @@ int usb_suspend(struct device *dev, pm_message_t msg) ...@@ -1336,34 +1336,37 @@ int usb_suspend(struct device *dev, pm_message_t msg)
} }
/* The device lock is held by the PM core */ /* The device lock is held by the PM core */
int usb_resume(struct device *dev, pm_message_t msg) int usb_resume_complete(struct device *dev)
{ {
struct usb_device *udev = to_usb_device(dev); struct usb_device *udev = to_usb_device(dev);
int status;
/* For PM complete calls, all we do is rebind interfaces /* For PM complete calls, all we do is rebind interfaces
* whose needs_binding flag is set * whose needs_binding flag is set
*/ */
if (msg.event == PM_EVENT_ON) { if (udev->state != USB_STATE_NOTATTACHED)
if (udev->state != USB_STATE_NOTATTACHED) do_rebind_interfaces(udev);
do_rebind_interfaces(udev); return 0;
status = 0; }
/* For all other calls, take the device back to full power and /* The device lock is held by the PM core */
int usb_resume(struct device *dev, pm_message_t msg)
{
struct usb_device *udev = to_usb_device(dev);
int status;
/* For all calls, take the device back to full power and
* tell the PM core in case it was autosuspended previously. * tell the PM core in case it was autosuspended previously.
* Unbind the interfaces that will need rebinding later, * Unbind the interfaces that will need rebinding later,
* because they fail to support reset_resume. * because they fail to support reset_resume.
* (This can't be done in usb_resume_interface() * (This can't be done in usb_resume_interface()
* above because it doesn't own the right set of locks.) * above because it doesn't own the right set of locks.)
*/ */
} else { status = usb_resume_both(udev, msg);
status = usb_resume_both(udev, msg); if (status == 0) {
if (status == 0) { pm_runtime_disable(dev);
pm_runtime_disable(dev); pm_runtime_set_active(dev);
pm_runtime_set_active(dev); pm_runtime_enable(dev);
pm_runtime_enable(dev); unbind_no_reset_resume_drivers_interfaces(udev);
unbind_no_reset_resume_drivers_interfaces(udev);
}
} }
/* Avoid PM error messages for devices disconnected while suspended /* Avoid PM error messages for devices disconnected while suspended
......
...@@ -274,7 +274,7 @@ static int usb_dev_prepare(struct device *dev) ...@@ -274,7 +274,7 @@ static int usb_dev_prepare(struct device *dev)
static void usb_dev_complete(struct device *dev) static void usb_dev_complete(struct device *dev)
{ {
/* Currently used only for rebinding interfaces */ /* Currently used only for rebinding interfaces */
usb_resume(dev, PMSG_ON); /* FIXME: change to PMSG_COMPLETE */ usb_resume_complete(dev);
} }
static int usb_dev_suspend(struct device *dev) static int usb_dev_suspend(struct device *dev)
......
...@@ -56,6 +56,7 @@ extern void usb_major_cleanup(void); ...@@ -56,6 +56,7 @@ extern void usb_major_cleanup(void);
extern int usb_suspend(struct device *dev, pm_message_t msg); extern int usb_suspend(struct device *dev, pm_message_t msg);
extern int usb_resume(struct device *dev, pm_message_t msg); extern int usb_resume(struct device *dev, pm_message_t msg);
extern int usb_resume_complete(struct device *dev);
extern int usb_port_suspend(struct usb_device *dev, pm_message_t msg); 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_port_resume(struct usb_device *dev, pm_message_t msg);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment