From 94b5f3cd29b193aecf208a8d4b46d881fc05b5e4 Mon Sep 17 00:00:00 2001
From: Benoit Goby <benoit@android.com>
Date: Mon, 13 Dec 2010 20:42:16 -0800
Subject: [PATCH] Revert "Revert "usb: core: Temporary workaround for usb
 auto-suspend issue""

This reverts commit b26b14ee87f00806ef24a0d7442d5ef9c7fd8531.
---
 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