diff options
author | Seshendra Gadagottu <sgadagottu@nvidia.com> | 2011-07-13 10:40:14 +0530 |
---|---|---|
committer | Ryan Wong <ryanw@nvidia.com> | 2011-07-28 17:42:34 -0700 |
commit | 5b3a748c3c3667ff237929edaf264086cc5cc860 (patch) | |
tree | caf678bc21ea23d697c53ff221a44e494375f8ac /drivers | |
parent | a8fe6e4b9dfa086ba29fba85494ae56c8a8e3af9 (diff) |
usb: ehci: tegra: Fixing the issues in hsic resume path DO NOT MERGE
Removed unused legacy code related to "tegra_ehci_recover_rx_error"
Correting the sequencing of hsic resume steps.
BUG 793840
Change-Id: Ibcbd08bcbd53ce07d4340275932da9989ceedb4f
Reviewed-on: http://git-master/r/43748
Reviewed-by: Thomas Cherry <tcherry@nvidia.com>
Tested-by: Thomas Cherry <tcherry@nvidia.com>
Reviewed-by: Ryan Wong <ryanw@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/host/ehci-tegra.c | 93 |
1 files changed, 5 insertions, 88 deletions
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 359c3036bdb5..5d543072846b 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -386,15 +386,11 @@ static int tegra_usb_resume(struct usb_hcd *hcd, bool is_dpd) hsic = (tegra->phy->usb_phy_type == TEGRA_USB_PHY_TYPE_HSIC); - set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); 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) { - /* Wait for the phy to detect new devices - * before we restart the controller */ - msleep(10); + if ((tegra->port_speed > TEGRA_USB_PHY_PORT_SPEED_HIGH) || (hsic)) goto restart; - } /* Force the phy to keep data lines in suspend state */ tegra_ehci_phy_restore_start(tegra->phy, tegra->port_speed); @@ -470,7 +466,7 @@ static int tegra_usb_resume(struct usb_hcd *hcd, bool is_dpd) return 0; restart: - if (tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH) + if ((tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH) && (!hsic)) tegra_ehci_phy_restore_end(tegra->phy); if (hsic) { val = readl(&hw->port_status[0]); @@ -569,6 +565,8 @@ static int tegra_ehci_bus_suspend(struct usb_hcd *hcd) tegra_usb_suspend(hcd, false); tegra->bus_suspended = 1; } + tegra_usb_phy_postsuspend(tegra->phy, false); + return error_status; } @@ -740,87 +738,6 @@ static inline void remove_ehci_sys_file(struct ehci_hcd *ehci) &dev_attr_ehci_power); } -static int ehci_tegra_wait_register(void __iomem *reg, u32 mask, u32 result) -{ - unsigned long timeout = 50000; - - do { - if ((readl(reg) & mask) == result) - return 0; - udelay(1); - timeout--; - } while (timeout); - return -1; -} - - -void tegra_ehci_recover_rx_error(void) -{ - struct ehci_hcd *ehci; - unsigned long val; - struct usb_hcd *hcd = ehci_handle; - - if (hcd) { - ehci = hcd_to_ehci(ehci_handle); - pr_info("{ RX_ERR_HANDLING_START \n"); - /* (0) set CLK_RST_..._LVL2_CLK_GATE_OVRB_0 USB2_CLK_OVR_ON = 1 */ - val = readl((IO_ADDRESS(TEGRA_CLK_RESET_BASE) + TEGRA_LVL2_CLK_GATE_OVRB)); - val |= TEGRA_USB2_CLK_OVR_ON; - writel(val, (IO_ADDRESS(TEGRA_CLK_RESET_BASE) + TEGRA_LVL2_CLK_GATE_OVRB)); - /* (1) set PORTSC SUSP = 1 */ - val = ehci_readl(ehci, &ehci->regs->port_status[0]); - ehci_writel(ehci, val | PORT_SUSPEND, &ehci->regs->port_status[0]); - /* (2) wait until PORTSC SUSP = 1 */ - if (handshake(ehci, &ehci->regs->port_status[0], PORT_SUSPEND, - PORT_SUSPEND, 5000)) { - pr_err("%s: timeout waiting for PORT_SUSPEND = 1\n", __func__); - return; - } - /* (3) set PORTSC PHCD = 1 */ - val = ehci_readl(ehci, &ehci->regs->port_status[0]); - ehci_writel(ehci, val | TEGRA_USB_PORTSC_PHCD, &ehci->regs->port_status[0]); - /* (4) wait until SUSP_CTRL PHY_VALID = 0 */ - if (ehci_tegra_wait_register(hcd->regs + TEGRA_USB_SUSP_CTRL_OFFSET, - TEGRA_USB_PHY_CLK_VALID, 0) < 0) { - pr_err("%s: timeout waiting for TEGRA_USB_PHY_CLK_VALID = 0\n", __func__); - return; - } - /* (5) set SUSP_CTRL SUSP_CLR = 1 */ - val = readl(hcd->regs + TEGRA_USB_SUSP_CTRL_OFFSET); - writel((val | TEGRA_USB_SUSP_CLR), - (hcd->regs + TEGRA_USB_SUSP_CTRL_OFFSET)); - /* (6) set SUSP_CTRL SUSP_CLR = 0 */ - val = readl(hcd->regs + TEGRA_USB_SUSP_CTRL_OFFSET); - val &= ~(TEGRA_USB_SUSP_CLR); - writel(val, (hcd->regs + TEGRA_USB_SUSP_CTRL_OFFSET)); - /* (7) wait until SUSP_CTRL PHY_VALID = 1 */ - if (ehci_tegra_wait_register(hcd->regs + TEGRA_USB_SUSP_CTRL_OFFSET, - TEGRA_USB_PHY_CLK_VALID, TEGRA_USB_PHY_CLK_VALID) < 0) { - pr_err("%s: timeout waiting for TEGRA_USB_PHY_CLK_VALID = 1\n", __func__); - return; - } - /* (8) set PORTSC SRT = 1 */ - val = ehci_readl(ehci, &ehci->regs->port_status[0]); - ehci_writel(ehci, val | TEGRA_USB_SRT, &ehci->regs->port_status[0]); - /* (9) set PORTSC FPR = 1 */ - val = ehci_readl(ehci, &ehci->regs->port_status[0]); - ehci_writel(ehci, val | PORT_RESUME, &ehci->regs->port_status[0]); - /* (10) wait until PORTSC FPR = 0 */ - if (handshake(ehci, &ehci->regs->port_status[0], PORT_RESUME, - 0, 5000)) { - pr_err("%s: timeout waiting for PORT_RESUME = 1\n", __func__); - return; - } - /* (11) set PORTSC SRT = 0 */ - val = ehci_readl(ehci, &ehci->regs->port_status[0]); - val &= ~(TEGRA_USB_SRT); - ehci_writel(ehci, val, &ehci->regs->port_status[0]); - pr_info("} \n"); - } -} - -EXPORT_SYMBOL(tegra_ehci_recover_rx_error); - #endif void clk_timer_callback(unsigned long data) |