aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/usb/host/ohci-exynos.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-14 10:16:58 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-14 10:16:58 -0700
commit066ba8e0617754f47b7bec068ebe6789f8c6cac6 (patch)
tree447e432c1d0c4c376cc9ffc420a555917017807d /drivers/usb/host/ohci-exynos.c
parentRevert "USB: OHCI: Properly handle ohci-spear suspend" (diff)
downloadwireguard-linux-066ba8e0617754f47b7bec068ebe6789f8c6cac6.tar.xz
wireguard-linux-066ba8e0617754f47b7bec068ebe6789f8c6cac6.zip
Revert "USB: OHCI: Properly handle ohci-exynos suspend"
This reverts commit fea0896fd36cff487685970bfc36ddd96352d95b. Manjunath is no longer at Linaro, the email address bounces. Given that, and the fact that others have reported problems with these patches, I'm reverting them until someone from Linaro who can SUPPORT THEM submits them. I will no longer accept patches from linaro.com developers unless a senior Linaro developer has signed off on them, which did not happen with this patch set. Reported-by: Olof Johansson <olof@lixom.net> Cc: Manjunath Goudar <manjunath.goudar@linaro.org> Cc: Manjunath Goudar <csmanjuvijay@gmail.com> Cc: Alan Stern <stern@rowland.harvard.edu> Cc: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'drivers/usb/host/ohci-exynos.c')
-rw-r--r--drivers/usb/host/ohci-exynos.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c
index 122e52e88a40..17f46fbf047d 100644
--- a/drivers/usb/host/ohci-exynos.c
+++ b/drivers/usb/host/ohci-exynos.c
@@ -204,15 +204,24 @@ static int exynos_ohci_suspend(struct device *dev)
struct exynos_ohci_hcd *exynos_ohci = to_exynos_ohci(hcd);
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
struct platform_device *pdev = to_platform_device(dev);
- bool do_wakeup = device_may_wakeup(dev);
unsigned long flags;
int rc = 0;
- rc = ohci_suspend(hcd, do_wakeup);
- if (rc)
- return rc;
-
+ /*
+ * Root hub was already suspended. Disable irq emission and
+ * mark HW unaccessible, bail out if RH has been resumed. Use
+ * the spinlock to properly synchronize with possible pending
+ * RH suspend or resume activity.
+ */
spin_lock_irqsave(&ohci->lock, flags);
+ if (ohci->rh_state != OHCI_RH_SUSPENDED &&
+ ohci->rh_state != OHCI_RH_HALTED) {
+ rc = -EINVAL;
+ goto fail;
+ }
+
+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+
if (exynos_ohci->otg)
exynos_ohci->otg->set_host(exynos_ohci->otg, &hcd->self);
@@ -220,6 +229,7 @@ static int exynos_ohci_suspend(struct device *dev)
clk_disable_unprepare(exynos_ohci->clk);
+fail:
spin_unlock_irqrestore(&ohci->lock, flags);
return rc;