summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Chen <peter.chen@freescale.com>2013-04-03 16:36:45 +0800
committerPeter Chen <peter.chen@freescale.com>2013-04-11 13:09:04 +0800
commit6f38091c907ff8bda8e0cea62edca2c0a44d2119 (patch)
treefc20b21bbd4a7cb63d935131a95ce733ad00fb0e
parent8d937d8500adf52ffffeca7a146f614a6cd5d09c (diff)
ENGR00257130-3 usb: host: open the PHY when changing wakeup setting
- Disable irq when we change wakeup setting as there is unexpected interrupt when we power PHY but enables wakeup. - Power PHY when we need to change wakeup setting, as some wakeup settings at PHY domain. Signed-off-by: Peter Chen <peter.chen@freescale.com>
-rwxr-xr-xdrivers/usb/host/ehci-arc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-arc.c b/drivers/usb/host/ehci-arc.c
index c79eea2bf25c..4c774b608319 100755
--- a/drivers/usb/host/ehci-arc.c
+++ b/drivers/usb/host/ehci-arc.c
@@ -676,17 +676,21 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev,
/* Only handles OTG mode switch event, system suspend event will be done in bus suspend */
if (pdata->pmflags == 0) {
printk(KERN_DEBUG "%s, pm event \n", __func__);
+ disable_irq(hcd->irq);
if (!host_can_wakeup_system(pdev)) {
/* Need open clock for register access */
fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
+ fsl_usb_lowpower_mode(pdata, false);
usb_host_set_wakeup(hcd->self.controller, false);
+ fsl_usb_lowpower_mode(pdata, true);
fsl_usb_clk_gate(hcd->self.controller->platform_data, false);
} else {
if (pdata->platform_phy_power_on)
pdata->platform_phy_power_on();
}
+ enable_irq(hcd->irq);
printk(KERN_DEBUG "host suspend ends\n");
return 0;
@@ -772,9 +776,11 @@ static int ehci_fsl_drv_resume(struct platform_device *pdev)
if (pdata->pmflags == 0) {
printk(KERN_DEBUG "%s,pm event, wait for wakeup irq if needed\n", __func__);
wait_event_interruptible(wake_up_pdata->wq, !wake_up_pdata->usb_wakeup_is_pending);
+ disable_irq(hcd->irq);
if (!host_can_wakeup_system(pdev)) {
/* Need open clock for register access */
fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
+ fsl_usb_lowpower_mode(pdata, false);
usb_host_set_wakeup(hcd->self.controller, true);
@@ -793,8 +799,10 @@ static int ehci_fsl_drv_resume(struct platform_device *pdev)
&ehci->regs->port_status[0]);
}
#endif
+ fsl_usb_lowpower_mode(pdata, true);
fsl_usb_clk_gate(hcd->self.controller->platform_data, false);
}
+ enable_irq(hcd->irq);
return 0;
}
if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {