From d72d507ae9c1e576e8b0e78d12db2a08fae35107 Mon Sep 17 00:00:00 2001 From: Benoit Goby Date: Tue, 18 Jan 2011 16:57:48 -0800 Subject: [PATCH] ARM: tegra: usb_phy: Program DPDM_OBSERVE depending on the device speed Low speed devices require a K-state resume signaling instead of J. Change-Id: Ic06011f45c2b0f4cd969d018f2783acea57cb510 Signed-off-by: Benoit Goby --- arch/arm/mach-tegra/include/mach/usb_phy.h | 11 ++--------- arch/arm/mach-tegra/usb_phy.c | 15 ++++++++++----- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/arch/arm/mach-tegra/include/mach/usb_phy.h b/arch/arm/mach-tegra/include/mach/usb_phy.h index bb16019256ec..cc42e7b044b4 100644 --- a/arch/arm/mach-tegra/include/mach/usb_phy.h +++ b/arch/arm/mach-tegra/include/mach/usb_phy.h @@ -43,13 +43,6 @@ enum tegra_usb_phy_port_speed { TEGRA_USB_PHY_PORT_HIGH, }; -struct tegra_utmip_context { - bool valid; - u32 regs[USB_PHY_MAX_CONTEXT_REGS]; - int regs_count; - enum tegra_usb_phy_port_speed port_speed; -}; - enum tegra_usb_phy_mode { TEGRA_USB_PHY_MODE_DEVICE, TEGRA_USB_PHY_MODE_HOST, @@ -65,7 +58,6 @@ struct tegra_usb_phy { struct clk *pad_clk; enum tegra_usb_phy_mode mode; void *config; - struct tegra_utmip_context context; }; struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, @@ -83,7 +75,8 @@ int tegra_usb_phy_preresume(struct tegra_usb_phy *phy); int tegra_usb_phy_postresume(struct tegra_usb_phy *phy); -int tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy); +int tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy, + enum tegra_usb_phy_port_speed port_speed); int tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy); diff --git a/arch/arm/mach-tegra/usb_phy.c b/arch/arm/mach-tegra/usb_phy.c index 3dc3aed4c915..13e502cd0490 100644 --- a/arch/arm/mach-tegra/usb_phy.c +++ b/arch/arm/mach-tegra/usb_phy.c @@ -505,13 +505,18 @@ static void utmi_phy_postresume(struct tegra_usb_phy *phy) writel(val, base + UTMIP_TX_CFG0); } -static void utmi_phy_restore_start(struct tegra_usb_phy *phy) +static void utmi_phy_restore_start(struct tegra_usb_phy *phy, + enum tegra_usb_phy_port_speed port_speed) { unsigned long val; void __iomem *base = phy->regs; val = readl(base + UTMIP_MISC_CFG0); - val |= UTMIP_DPDM_OBSERVE_SEL_FS_J; + val &= ~UTMIP_DPDM_OBSERVE_SEL(~0); + if (port_speed == TEGRA_USB_PHY_PORT_SPEED_LOW) + val |= UTMIP_DPDM_OBSERVE_SEL_FS_K; + else + val |= UTMIP_DPDM_OBSERVE_SEL_FS_J; writel(val, base + UTMIP_MISC_CFG0); udelay(1); @@ -643,7 +648,6 @@ struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, phy->instance = instance; phy->regs = regs; phy->config = config; - phy->context.valid = false; phy->mode = phy_mode; if (!phy->config) { @@ -737,10 +741,11 @@ int tegra_usb_phy_postresume(struct tegra_usb_phy *phy) return 0; } -int tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy) +int tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy, + enum tegra_usb_phy_port_speed port_speed) { if (phy->instance != 1) - utmi_phy_restore_start(phy); + utmi_phy_restore_start(phy, port_speed); return 0; } -- 2.34.1