diff options
author | Vikram Pandita <vikram.pandita@ti.com> | 2011-07-14 16:25:20 -0700 |
---|---|---|
committer | Benoit Goby <benoit@android.com> | 2011-07-27 12:19:54 -0700 |
commit | 33a2170896e4f52b504b1fb06e885b4505c69f05 (patch) | |
tree | de293984e594fb3176d6e72576f3c59ad874359b /drivers/usb | |
parent | 8e9aaf5c4051a8051a87d5fde67141ae062a2f04 (diff) | |
download | kernel_samsung_tuna-33a2170896e4f52b504b1fb06e885b4505c69f05.zip kernel_samsung_tuna-33a2170896e4f52b504b1fb06e885b4505c69f05.tar.gz kernel_samsung_tuna-33a2170896e4f52b504b1fb06e885b4505c69f05.tar.bz2 |
usb: ehci-omap: fix clock enabling in shutdown path
On software reboot of the system, one needs to enable
clocks before any ehci register access.
This patch prevents this crash on attempting soft reboot:
Panic path:
[<c02c2620>] (ehci_halt+0x0/0xa4) from [<c02c26d8>] (ehci_silence_controller+0x14/0x94)
[<c02c26c4>] (ehci_silence_controller+0x0/0x94) from [<c02c2ea4>] (ehci_shutdown+0x38/0x44)
[<c02c2e6c>] (ehci_shutdown+0x0/0x44) from [<c02c2410>] (ehci_hcd_omap_shutdown+0x28/0x2c)
[<c02c23e8>] (ehci_hcd_omap_shutdown+0x0/0x2c) from [<c026631c>] (platform_drv_shutdown+0x20/0x24)
[<c02662fc>] (platform_drv_shutdown+0x0/0x24) from [<c0261918>] (device_shutdown+0x80/0xd8)
[<c0261898>] (device_shutdown+0x0/0xd8) from [<c0097fc0>] (kernel_restart_prepare+0x38/0x40)
[<c0097f88>] (kernel_restart_prepare+0x0/0x40) from [<c0098010>] (kernel_restart+0x14/0x60)
[<c0097ffc>] (kernel_restart+0x0/0x60) from [<c0098200>] (sys_reboot+0x18c/0x1d4)
Change-Id: I5ffe066f7581a6b53c8f193be43410e3101741aa
Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/host/ehci-omap.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index a02a684..1c2b330 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c @@ -253,10 +253,14 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev) static void ehci_hcd_omap_shutdown(struct platform_device *pdev) { + struct device *dev = &pdev->dev; struct usb_hcd *hcd = dev_get_drvdata(&pdev->dev); - if (hcd->driver->shutdown) + if (hcd->driver->shutdown) { + pm_runtime_get_sync(dev->parent); hcd->driver->shutdown(hcd); + pm_runtime_put(dev->parent); + } } static int omap_ehci_resume(struct device *dev) |