aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ohci-exynos.c
diff options
context:
space:
mode:
authorManjunath Goudar <manjunath.goudar@linaro.org>2013-10-04 00:28:12 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-05 20:56:41 -0400
commitfea0896fd36cff487685970bfc36ddd96352d95b (patch)
tree7fc79a7ef20f07073d125ca45af54b06993ab27a /drivers/usb/host/ohci-exynos.c
parent018258b4360b99b41c50ece917111f138e2314e7 (diff)
USB: OHCI: Properly handle ohci-exynos suspend
Suspend scenario in case of ohci-exynos glue was not properly handled as it was not suspending generic part of ohci controller. Alan Stern suggested, properly handle ohci-exynos suspend scenario. Calling explicitly the ohci_suspend() routine in exynos_ohci_suspend() will ensure proper handling of suspend scenario. Signed-off-by: Manjunath Goudar <manjunath.goudar@linaro.org> Signed-off-by: Manjunath Goudar <csmanjuvijay@gmail.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/host/ohci-exynos.c')
-rw-r--r--drivers/usb/host/ohci-exynos.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c
index 3e4bc74f76ab..f5f372e02a99 100644
--- a/drivers/usb/host/ohci-exynos.c
+++ b/drivers/usb/host/ohci-exynos.c
@@ -203,24 +203,15 @@ static int exynos_ohci_suspend(struct device *dev)
203 struct exynos_ohci_hcd *exynos_ohci = to_exynos_ohci(hcd); 203 struct exynos_ohci_hcd *exynos_ohci = to_exynos_ohci(hcd);
204 struct ohci_hcd *ohci = hcd_to_ohci(hcd); 204 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
205 struct platform_device *pdev = to_platform_device(dev); 205 struct platform_device *pdev = to_platform_device(dev);
206 bool do_wakeup = device_may_wakeup(dev);
206 unsigned long flags; 207 unsigned long flags;
207 int rc = 0; 208 int rc = 0;
208 209
209 /* 210 rc = ohci_suspend(hcd, do_wakeup);
210 * Root hub was already suspended. Disable irq emission and 211 if (rc)
211 * mark HW unaccessible, bail out if RH has been resumed. Use 212 return rc;
212 * the spinlock to properly synchronize with possible pending
213 * RH suspend or resume activity.
214 */
215 spin_lock_irqsave(&ohci->lock, flags);
216 if (ohci->rh_state != OHCI_RH_SUSPENDED &&
217 ohci->rh_state != OHCI_RH_HALTED) {
218 rc = -EINVAL;
219 goto fail;
220 }
221
222 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
223 213
214 spin_lock_irqsave(&ohci->lock, flags);
224 if (exynos_ohci->otg) 215 if (exynos_ohci->otg)
225 exynos_ohci->otg->set_host(exynos_ohci->otg, &hcd->self); 216 exynos_ohci->otg->set_host(exynos_ohci->otg, &hcd->self);
226 217
@@ -228,7 +219,6 @@ static int exynos_ohci_suspend(struct device *dev)
228 219
229 clk_disable_unprepare(exynos_ohci->clk); 220 clk_disable_unprepare(exynos_ohci->clk);
230 221
231fail:
232 spin_unlock_irqrestore(&ohci->lock, flags); 222 spin_unlock_irqrestore(&ohci->lock, flags);
233 223
234 return rc; 224 return rc;