USB: OHCI: Properly handle OHCI controller suspend
authorMajunath Goudar <csmanjuvijay@gmail.com>
Wed, 13 Nov 2013 12:10:16 +0000 (17:40 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Dec 2013 01:53:17 +0000 (17:53 -0800)
Suspend scenario in case of OHCI was not properly
handled in ochi_suspend()routine. Alan Stern
suggested, properly handle OHCI suspend scenario.

This does generic proper handling of suspend
scenario to all OHCI SOC.

Signed-off-by: Manjunath Goudar <csmanjuvijay@gmail.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Cc: linux-usb@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ohci-hcd.c

index c8e0e7637b7bc6c51ac615933dc846cd8fc71aa5..3586460fb2a10afb38489401ab01a23bff2f262a 100644 (file)
@@ -1026,6 +1026,7 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup)
 {
        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
        unsigned long   flags;
+       int             rc = 0;
 
        /* Disable irq emission and mark HW unaccessible. Use
         * the spinlock to properly synchronize with possible pending
@@ -1038,7 +1039,13 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup)
        clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
        spin_unlock_irqrestore (&ohci->lock, flags);
 
-       return 0;
+       synchronize_irq(hcd->irq);
+
+       if (do_wakeup && HCD_WAKEUP_PENDING(hcd)) {
+               ohci_resume(hcd, false);
+               rc = -EBUSY;
+       }
+       return rc;
 }
 EXPORT_SYMBOL_GPL(ohci_suspend);