summaryrefslogtreecommitdiff
path: root/drivers/usb/host/ehci-tegra.c
diff options
context:
space:
mode:
authorSteve Lin <stlin@nvidia.com>2011-10-17 14:22:21 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:49:36 -0800
commit1ad27c08ef987c15ed7e0cf26945b69285eb9b80 (patch)
treec54ac2c6d9c36235e4e3bec80f6ccf8abf94787a /drivers/usb/host/ehci-tegra.c
parent9f911ec2a67b3b7caca97f9d10619a89932adcaa (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.c30
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) {