diff options
Diffstat (limited to 'drivers/usb/core')
-rw-r--r-- | drivers/usb/core/driver.c | 19 |
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) { |