aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/core/driver.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index affbfb53eb5..a5d11461f5a 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -761,8 +761,12 @@ static int suspend_device(struct usb_device *udev, pm_message_t msg)
udev->state == USB_STATE_SUSPENDED)
goto done;
- if (udev->dev.driver == NULL)
+ /* For devices that don't have a driver, we do a standard suspend. */
+ if (udev->dev.driver == NULL) {
+ status = usb_port_suspend(udev);
goto done;
+ }
+
udriver = to_usb_device_driver(udev->dev.driver);
status = udriver->suspend(udev, msg);
@@ -782,8 +786,12 @@ static int resume_device(struct usb_device *udev)
udev->state != USB_STATE_SUSPENDED)
goto done;
- if (udev->dev.driver == NULL)
+ /* Can't resume it if it doesn't have a driver. */
+ if (udev->dev.driver == NULL) {
+ status = -ENOTCONN;
goto done;
+ }
+
udriver = to_usb_device_driver(udev->dev.driver);
status = udriver->resume(udev);
@@ -804,7 +812,7 @@ static int suspend_interface(struct usb_interface *intf, pm_message_t msg)
!is_active(intf))
goto done;
- if (intf->dev.driver == NULL)
+ if (intf->dev.driver == NULL) /* This can't happen */
goto done;
driver = to_usb_driver(intf->dev.driver);
@@ -838,8 +846,11 @@ static int resume_interface(struct usb_interface *intf)
is_active(intf))
goto done;
- if (intf->dev.driver == NULL)
+ /* Can't resume it if it doesn't have a driver. */
+ if (intf->dev.driver == NULL) {
+ status = -ENOTCONN;
goto done;
+ }
driver = to_usb_driver(intf->dev.driver);
if (driver->resume) {