summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-14 10:18:39 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-14 10:18:39 -0700
commitba8d400ec8b29d8783d5e11980084b6071f607f6 (patch)
treed4b1366fe93932c2ee4d3c04ec3ff802d21d5166
parent5d931288afe971c4018222681456226264e6a7c1 (diff)
downloadlwn-ba8d400ec8b29d8783d5e11980084b6071f607f6.tar.gz
lwn-ba8d400ec8b29d8783d5e11980084b6071f607f6.zip
Revert "USB: OHCI: Properly handle ohci-s3c2410 suspend"
This reverts commit 19d339430403336f2f3c9d502db5f4e51fa21729. 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>
-rw-r--r--drivers/usb/host/ohci-s3c2410.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c
index b5bf9b7a54fc..be3429e08d90 100644
--- a/drivers/usb/host/ohci-s3c2410.c
+++ b/drivers/usb/host/ohci-s3c2410.c
@@ -426,15 +426,28 @@ static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev)
static int ohci_hcd_s3c2410_drv_suspend(struct device *dev)
{
struct usb_hcd *hcd = dev_get_drvdata(dev);
+ 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) {
+ rc = -EINVAL;
+ goto bail;
+ }
+
+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
s3c2410_stop_hc(pdev);
+bail:
+ spin_unlock_irqrestore(&ohci->lock, flags);
return rc;
}