ARM: tegra: usb_phy: Program DPDM_OBSERVE depending on the device speed
authorBenoit Goby <benoit@android.com>
Wed, 19 Jan 2011 00:57:48 +0000 (16:57 -0800)
committerBenoit Goby <benoit@android.com>
Wed, 19 Jan 2011 01:13:53 +0000 (17:13 -0800)
Low speed devices require a K-state resume signaling instead of J.

Change-Id: Ic06011f45c2b0f4cd969d018f2783acea57cb510
Signed-off-by: Benoit Goby <benoit@android.com>
arch/arm/mach-tegra/include/mach/usb_phy.h
arch/arm/mach-tegra/usb_phy.c

index bb16019256ecf5cab97d85837f010e3805406497..cc42e7b044b4ce22c0a036c6e112711e5b3b9fa5 100644 (file)
@@ -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);
 
index 3dc3aed4c915acef1cb4257ef0cfb38a35c75d4b..13e502cd04903838085ee4d317573d7b72a33da5 100644 (file)
@@ -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;
 }