From 463100c1cedd5684188c8d5ece84c4af6dd42090 Mon Sep 17 00:00:00 2001 From: Benoit Goby Date: Mon, 22 Nov 2010 14:46:05 -0800 Subject: [PATCH] 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 --- drivers/usb/core/driver.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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); -- 2.34.1