diff options
| -rw-r--r-- | drivers/usb/core/driver.c | 37 | ||||
| -rw-r--r-- | drivers/usb/core/usb.c | 2 | ||||
| -rw-r--r-- | drivers/usb/core/usb.h | 1 | 
3 files changed, 22 insertions, 18 deletions
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index b7dfdecc7fd..d77daf3683d 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -1336,34 +1336,37 @@ int usb_suspend(struct device *dev, pm_message_t msg)  }  /* 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); -	int			status; +	struct usb_device *udev = to_usb_device(dev);  	/* For PM complete calls, all we do is rebind interfaces  	 * whose needs_binding flag is set  	 */ -	if (msg.event == PM_EVENT_ON) { -		if (udev->state != USB_STATE_NOTATTACHED) -			do_rebind_interfaces(udev); -		status = 0; +	if (udev->state != USB_STATE_NOTATTACHED) +		do_rebind_interfaces(udev); +	return 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.  	 * Unbind the interfaces that will need rebinding later,  	 * because they fail to support reset_resume.  	 * (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); -		if (status == 0) { -			pm_runtime_disable(dev); -			pm_runtime_set_active(dev); -			pm_runtime_enable(dev); -			unbind_no_reset_resume_drivers_interfaces(udev); -		} +	status = usb_resume_both(udev, msg); +	if (status == 0) { +		pm_runtime_disable(dev); +		pm_runtime_set_active(dev); +		pm_runtime_enable(dev); +		unbind_no_reset_resume_drivers_interfaces(udev);  	}  	/* Avoid PM error messages for devices disconnected while suspended diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 8ca9f994a28..c74ba7bbc74 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -274,7 +274,7 @@ static int usb_dev_prepare(struct device *dev)  static void usb_dev_complete(struct device *dev)  {  	/* 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) diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 45e8479c377..71648dcbe43 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h @@ -56,6 +56,7 @@ extern void usb_major_cleanup(void);  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_complete(struct 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);  |