diff options
author | Peter Chen <peter.chen@freescale.com> | 2013-04-03 16:36:45 +0800 |
---|---|---|
committer | Peter Chen <peter.chen@freescale.com> | 2013-04-11 13:09:04 +0800 |
commit | 6f38091c907ff8bda8e0cea62edca2c0a44d2119 (patch) | |
tree | fc20b21bbd4a7cb63d935131a95ce733ad00fb0e | |
parent | 8d937d8500adf52ffffeca7a146f614a6cd5d09c (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-x | drivers/usb/host/ehci-arc.c | 8 |
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)) { |