diff options
author | Steve Lin <stlin@nvidia.com> | 2011-10-17 14:22:21 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:49:36 -0800 |
commit | 1ad27c08ef987c15ed7e0cf26945b69285eb9b80 (patch) | |
tree | c54ac2c6d9c36235e4e3bec80f6ccf8abf94787a /drivers/usb/host/ehci-tegra.c | |
parent | 9f911ec2a67b3b7caca97f9d10619a89932adcaa (diff) |
arm: tegra: usb: Adding phy_restore functions for null ULPI
Adding phy_restore_start and phy_restore_end functions for null ULPI.
Forcing ehci_restart after LP0 for null ULPI.
Bug 863224
Reviewed-on: http://git-master/r/58474
(cherry picked from commit 5f5e7961c8a6a5be853fcdba4ae10d0bd6efc5f3)
Change-Id: I635f456548674113a4e0e94ee22bd162d5bab04f
Reviewed-on: http://git-master/r/60703
Reviewed-by: Sheshagiri Shenoy <sshenoy@nvidia.com>
Tested-by: Sheshagiri Shenoy <sshenoy@nvidia.com>
Reviewed-by: Steve Lin <stlin@nvidia.com>
Tested-by: Steve Lin <stlin@nvidia.com>
Rebase-Id: R14132d927d965c6716c200c8f7ced640587cf01f
Diffstat (limited to 'drivers/usb/host/ehci-tegra.c')
-rw-r--r-- | drivers/usb/host/ehci-tegra.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 1df169df3602..799bd1baae2e 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -513,14 +513,17 @@ static int tegra_usb_resume(struct usb_hcd *hcd, bool is_dpd) struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_regs __iomem *hw = ehci->regs; unsigned long val; - int hsic = 0; + bool hsic; + bool null_ulpi; + null_ulpi = (tegra->phy->usb_phy_type == TEGRA_USB_PHY_TYPE_NULL_ULPI); hsic = (tegra->phy->usb_phy_type == TEGRA_USB_PHY_TYPE_HSIC); tegra_ehci_power_up(hcd, is_dpd); set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - if ((tegra->port_speed > TEGRA_USB_PHY_PORT_SPEED_HIGH) || (hsic)) + if ((tegra->port_speed > TEGRA_USB_PHY_PORT_SPEED_HIGH) || (hsic) || + (null_ulpi)) goto restart; /* Force the phy to keep data lines in suspend state */ @@ -617,6 +620,29 @@ static int tegra_usb_resume(struct usb_hcd *hcd, bool is_dpd) return 0; restart: + if (null_ulpi) { + bool LP0 = !readl(&hw->async_next); + + if (LP0) { + static int cnt = 1; + + pr_info("LP0 restart %d\n", cnt++); + tegra_ehci_phy_restore_start(tegra->phy, + tegra->port_speed); + } + + val = readl(&hw->port_status[0]); + if (!((val & PORT_POWER) && (val & PORT_PE))) { + tegra_ehci_restart(hcd); + usb_set_device_state(udev, USB_STATE_CONFIGURED); + } + + if (LP0) + tegra_ehci_phy_restore_end(tegra->phy); + + return 0; + } + if ((tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH) && (!hsic)) tegra_ehci_phy_restore_end(tegra->phy); if (hsic) { |