aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorVikram Pandita <vikram.pandita@ti.com>2011-07-14 16:25:20 -0700
committerBenoit Goby <benoit@android.com>2011-07-27 12:19:54 -0700
commit33a2170896e4f52b504b1fb06e885b4505c69f05 (patch)
treede293984e594fb3176d6e72576f3c59ad874359b /drivers/usb
parent8e9aaf5c4051a8051a87d5fde67141ae062a2f04 (diff)
downloadkernel_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.c6
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)