From: Benoit Goby Date: Mon, 22 Nov 2010 22:46:05 +0000 (-0800) Subject: usb: core: Temporary workaround for usb auto-suspend issue X-Git-Tag: firefly_0821_release~9834^2~319 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=463100c1cedd5684188c8d5ece84c4af6dd42090;p=firefly-linux-kernel-4.4.55.git usb: core: Temporary workaround for usb auto-suspend issue If a device aborts suspend, usb_resume may be called on a device whose parent has been auto-suspended. Recursively resume its parents and change their runtime pm state. Change-Id: I8f96482bdafae3888a0df9cb30422236a001e17d Signed-off-by: Benoit Goby --- diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index d7a4401ef019..ffa3e22083c2 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -1324,6 +1324,20 @@ int usb_resume(struct device *dev, pm_message_t msg) * Unbind the interfaces that will need rebinding later. */ } else { + /* If a device aborts suspend, usb_resume may be called on a + * device whose parent has been auto-suspended. Recursively + * resume its parents and change their runtime pm state. + */ + if (udev->parent && msg.event == PM_EVENT_RESUME + && udev->parent->state == USB_STATE_SUSPENDED) { + status = usb_resume(&udev->parent->dev, msg); + if (status) { + dev_err(dev, "%s: failed to resume parent\n", + __func__); + return status; + } + } + status = usb_resume_both(udev, msg); if (status == 0) { pm_runtime_disable(dev);