diff options
author | Manjunath Goudar <manjunath.goudar@linaro.org> | 2013-10-04 00:28:12 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-10-05 20:56:41 -0400 |
commit | fea0896fd36cff487685970bfc36ddd96352d95b (patch) | |
tree | 7fc79a7ef20f07073d125ca45af54b06993ab27a /drivers/usb/host/ohci-exynos.c | |
parent | 018258b4360b99b41c50ece917111f138e2314e7 (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.c | 20 |
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 | ||
231 | fail: | ||
232 | spin_unlock_irqrestore(&ohci->lock, flags); | 222 | spin_unlock_irqrestore(&ohci->lock, flags); |
233 | 223 | ||
234 | return rc; | 224 | return rc; |