summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJC Kuo <jckuo@nvidia.com>2013-10-04 19:26:27 +0800
committerHarry Hong <hhong@nvidia.com>2014-01-23 23:52:07 -0800
commit3ab0d8dc099dc3429af1025b684131120078b873 (patch)
treebba7a63deb33b9b5cef6f705078e9074f309e469
parentcf54221b42efdc07eff77449ae420bf2c5514e81 (diff)
xhci: tegra: support override fused hs_curr_level
This change add the capability to override hs_curr_level value read from usb_calib0 fuse register. Some board designs need different hs_curr_level value to optimize USB 2.0 signals. bug 1340062 Change-Id: Ic2435dc1b8c85bea507144558267b8bd29c2dad0 Reviewed-on: http://git-master/r/281745 (cherry picked from commit 938d7343c0f835772aa0f50c9df6cb32ba6b0345) Conflicts: arch/arm/mach-tegra/include/mach/xusb.h Change-Id: I611dc365c27caad14d17cb95e4e0d469ec03cc62 Signed-off-by: JC Kuo <jckuo@nvidia.com> Reviewed-on: http://git-master/r/358216 Reviewed-by: WK Tsai <wtsai@nvidia.com> Reviewed-by: Joy Wang <joyw@nvidia.com> Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Henry Lin <henryl@nvidia.com> Reviewed-by: Ashutosh Jha <ajha@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/include/mach/xusb.h12
-rw-r--r--drivers/usb/host/xhci-tegra.c10
2 files changed, 18 insertions, 4 deletions
diff --git a/arch/arm/mach-tegra/include/mach/xusb.h b/arch/arm/mach-tegra/include/mach/xusb.h
index e304bb47ce8a..8270e3a6c6f5 100644
--- a/arch/arm/mach-tegra/include/mach/xusb.h
+++ b/arch/arm/mach-tegra/include/mach/xusb.h
@@ -30,8 +30,10 @@
#define TEGRA_XUSB_SS_P0 (1 << 0)
#define TEGRA_XUSB_SS_P1 (1 << 1)
#define XUSB_SS_PORT_COUNT (2)
-#define TEGRA_XUSB_USB2_P0 (1 << 8)
-#define TEGRA_XUSB_USB2_P1 (1 << 9)
+#define XUSB_UTMI_COUNT (2)
+#define XUSB_UTMI_INDEX (8)
+#define TEGRA_XUSB_USB2_P0 BIT(XUSB_UTMI_INDEX)
+#define TEGRA_XUSB_USB2_P1 BIT(XUSB_UTMI_INDEX + 1)
#define TEGRA_XUSB_HSIC_P0 (1 << 16)
#define TEGRA_XUSB_HSIC_P1 (1 << 17)
#define TEGRA_XUSB_ULPI_P0 (1 << 24)
@@ -42,6 +44,11 @@
#define TEGRA_XUSB_ULPI_PORT_CAP_MASTER (0x0)
#define TEGRA_XUSB_ULPI_PORT_CAP_PHY (0x1)
+struct tegra_xusb_utmi_config {
+ u8 hs_curr_level;
+ bool hs_curr_level_override; /* override value from usb_calib0 fuse */
+};
+
struct tegra_xusb_board_data {
u32 portmap;
/*
@@ -51,6 +58,7 @@ struct tegra_xusb_board_data {
u8 ss_portmap;
u8 ulpicap;
void (*set_vbus_en1_tristate)(bool on);
+ struct tegra_xusb_utmi_config utmi[XUSB_UTMI_COUNT];
};
struct tegra_xusb_platform_data {
diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c
index f7efbce73077..e76b85931320 100644
--- a/drivers/usb/host/xhci-tegra.c
+++ b/drivers/usb/host/xhci-tegra.c
@@ -1581,8 +1581,14 @@ static void tegra_xhci_program_utmip_pad(struct tegra_xhci_hcd *tegra,
USB2_OTG_PD | USB2_OTG_PD2 | USB2_OTG_PD_ZI);
reg |= tegra->pdata->hs_slew;
reg |= port ? 0 : tegra->pdata->ls_rslew;
- reg |= port ? tegra->pdata->hs_curr_level_pad1 :
- tegra->pdata->hs_curr_level_pad0;
+
+ reg &= ~HS_CURR_LEVEL(~0);
+ if (tegra->bdata->utmi[port].hs_curr_level_override)
+ reg |= HS_CURR_LEVEL(tegra->bdata->utmi[port].hs_curr_level);
+ else {
+ reg |= port ? tegra->pdata->hs_curr_level_pad1 :
+ tegra->pdata->hs_curr_level_pad0;
+ }
writel(reg, tegra->padctl_base + ctl0_offset);
reg = readl(tegra->padctl_base + ctl1_offset);