summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Lin <stlin@nvidia.com>2010-03-05 17:28:14 -0800
committerGary King <gking@nvidia.com>2010-03-11 11:48:48 -0800
commitdf55060db23f1b246488c3007133f2bf35a7436f (patch)
tree77c3ef7bfe190598e8587f565f5f6d9f86dfba00
parent62e64856d6a025c068e2bdc81319d62801d7f948 (diff)
tegra ODM: Moving the board specific USB trimmer values to odm_query.
The usb ddk will use these trimmer values if they are specified in the NvOdmUsbProperty. Otherwise, it will use the default values specified inside NvDDK. Bug 657479: USB trimmer values should not be hardcoded in the DDK Change-Id: Idd819dc6faba63831ba5164c6c2ebd1a99567a1c Reviewed-on: http://git-master/r/786 Tested-by: Szming Lin <stlin@nvidia.com> Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Reviewed-by: Udaykumar Rameshchan Raval <uraval@nvidia.com> Reviewed-by: Gary King <gking@nvidia.com>
-rw-r--r--[-rwxr-xr-x]arch/arm/mach-tegra/include/nvodm_query.h23
-rw-r--r--arch/arm/mach-tegra/nvddk/nvddk_usbphy_ap20.c25
-rwxr-xr-xarch/arm/mach-tegra/odm_kit/query/whistler/nvodm_query.c27
3 files changed, 65 insertions, 10 deletions
diff --git a/arch/arm/mach-tegra/include/nvodm_query.h b/arch/arm/mach-tegra/include/nvodm_query.h
index 3cd5e135b5d9..a7656cfc7cae 100755..100644
--- a/arch/arm/mach-tegra/include/nvodm_query.h
+++ b/arch/arm/mach-tegra/include/nvodm_query.h
@@ -977,6 +977,25 @@ typedef enum
NvOdmUsbConnectorsMuxType_Force32 = 0x7FFFFFFF,
} NvOdmUsbConnectorsMuxType;
+/**
+ * Defines the USB trimmer control values. Keep all values zero unless the
+ * default trimmer values programmed in DDK do not work on the customer board.
+ */
+typedef struct NvOdmUsbTrimmerCtrlRec
+{
+ /// Programmable delay on the Shadow ULPI Clock (0 ~ 31)
+ NvU8 UlpiShadowClkDelay;
+
+ /// Programmable delay on the ULPI Clock out (0 ~ 31)
+ NvU8 UlpiClockOutDelay;
+
+ /// ULPI Data Trimmer Value (0 ~ 7)
+ NvU8 UlpiDataTrimmerSel;
+
+ /// ULPI STP/DIR/NXT Trimmer Value (0 ~ 7)
+ NvU8 UlpiStpDirNxtTrimmerSel;
+} NvOdmUsbTrimmerCtrl;
+
/** Defines USB interface properties. */
typedef struct NvOdmUsbPropertyRec
{
@@ -1014,6 +1033,10 @@ typedef struct NvOdmUsbPropertyRec
/// Set to NV_TRUE to specify usb rail power off in the deep sleep
/// Set to NV_FALSE to specify usb rail can not be power off in the deep sleep
NvBool UsbRailPoweOffInDeepSleep;
+
+ /// Specifies the USB trimmer values. The default value will be used if all values are zeros.
+ /// @see NvOdmUsbTrimmerCtrl
+ NvOdmUsbTrimmerCtrl TrimmerCtrl;
} NvOdmUsbProperty;
/** Defines wakeup sources. */
diff --git a/arch/arm/mach-tegra/nvddk/nvddk_usbphy_ap20.c b/arch/arm/mach-tegra/nvddk/nvddk_usbphy_ap20.c
index 83e807cd2324..57a72b625d6a 100644
--- a/arch/arm/mach-tegra/nvddk/nvddk_usbphy_ap20.c
+++ b/arch/arm/mach-tegra/nvddk/nvddk_usbphy_ap20.c
@@ -45,7 +45,7 @@
#include "ap20/arapb_misc.h"
#include "nvrm_hardware_access.h"
#include "nvddk_usbphy_priv.h"
-
+#include "nvodm_query.h"
/* Defines for USB register read and writes */
#define USB_REG_RD(reg)\
@@ -553,6 +553,17 @@ static void
Ap20UsbPhyUlpiNullModeConfigure(
NvDdkUsbPhy *pUsbPhy)
{
+ // default trimmer values for ap20
+ NvOdmUsbTrimmerCtrl trimmerCtrl = {0, 0, 4, 4};
+
+ if (pUsbPhy->pProperty->TrimmerCtrl.UlpiShadowClkDelay ||
+ pUsbPhy->pProperty->TrimmerCtrl.UlpiClockOutDelay ||
+ pUsbPhy->pProperty->TrimmerCtrl.UlpiDataTrimmerSel ||
+ pUsbPhy->pProperty->TrimmerCtrl.UlpiStpDirNxtTrimmerSel)
+ {
+ // update the trimmer values if they are specified in nvodm_query
+ NvOsMemcpy(&trimmerCtrl, &pUsbPhy->pProperty->TrimmerCtrl, sizeof(NvOdmUsbTrimmerCtrl));
+ }
// Put the UHSIC in the reset
USB_IF_REG_UPDATE_DEF(SUSP_CTRL, UHSIC_RESET, ENABLE);
@@ -574,8 +585,8 @@ Ap20UsbPhyUlpiNullModeConfigure(
ULPI_IF_DRF_DEF(TIMING_CTRL_0, ULPI_OUTPUT_PINMUX_BYP, ENABLE) |
ULPI_IF_DRF_DEF(TIMING_CTRL_0, ULPI_CLKOUT_PINMUX_BYP, ENABLE) |
ULPI_IF_DRF_DEF(TIMING_CTRL_0, ULPI_LBK_PAD_EN, OUTPUT) |
- ULPI_IF_DRF_NUM(TIMING_CTRL_0, ULPI_SHADOW_CLK_DELAY, 0) |
- ULPI_IF_DRF_NUM(TIMING_CTRL_0, ULPI_CLOCK_OUT_DELAY, 0) |
+ ULPI_IF_DRF_NUM(TIMING_CTRL_0, ULPI_SHADOW_CLK_DELAY, trimmerCtrl.UlpiShadowClkDelay) |
+ ULPI_IF_DRF_NUM(TIMING_CTRL_0, ULPI_CLOCK_OUT_DELAY, trimmerCtrl.UlpiClockOutDelay) |
ULPI_IF_DRF_NUM(TIMING_CTRL_0, ULPI_LBK_PAD_E_INPUT_OR, 0));
// Set all the trimmers to 0 at the start
@@ -613,9 +624,9 @@ Ap20UsbPhyUlpiNullModeConfigure(
// Set the trimmer values
ULPI_IF_REG_WR(TIMING_CTRL_1,
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DATA_TRIMMER_LOAD, 0) |
- ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DATA_TRIMMER_SEL, 4) |
+ ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DATA_TRIMMER_SEL, trimmerCtrl.UlpiDataTrimmerSel) |
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_STPDIRNXT_TRIMMER_LOAD, 0) |
- ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_STPDIRNXT_TRIMMER_SEL, 4) |
+ ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_STPDIRNXT_TRIMMER_SEL, trimmerCtrl.UlpiStpDirNxtTrimmerSel) |
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DIR_TRIMMER_LOAD, 0) |
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DIR_TRIMMER_SEL, 4));
@@ -625,9 +636,9 @@ Ap20UsbPhyUlpiNullModeConfigure(
//Load the trimmers by toggling the load bits
ULPI_IF_REG_WR(TIMING_CTRL_1,
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DATA_TRIMMER_LOAD, 1) |
- ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DATA_TRIMMER_SEL, 4) |
+ ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DATA_TRIMMER_SEL, trimmerCtrl.UlpiDataTrimmerSel) |
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_STPDIRNXT_TRIMMER_LOAD, 1) |
- ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_STPDIRNXT_TRIMMER_SEL, 4) |
+ ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_STPDIRNXT_TRIMMER_SEL, trimmerCtrl.UlpiStpDirNxtTrimmerSel) |
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DIR_TRIMMER_LOAD, 1) |
ULPI_IF_DRF_NUM(TIMING_CTRL_1, ULPI_DIR_TRIMMER_SEL, 4));
diff --git a/arch/arm/mach-tegra/odm_kit/query/whistler/nvodm_query.c b/arch/arm/mach-tegra/odm_kit/query/whistler/nvodm_query.c
index 7bbdba7f9d2d..73f477e24e39 100755
--- a/arch/arm/mach-tegra/odm_kit/query/whistler/nvodm_query.c
+++ b/arch/arm/mach-tegra/odm_kit/query/whistler/nvodm_query.c
@@ -1208,8 +1208,8 @@ NvOdmQueryGetUsbProperty(NvOdmIoModule OdmIoModule,
NV_FALSE
};
- static const NvOdmUsbProperty Usb2Property =
- {
+ static const NvOdmUsbProperty Usb2Property =
+ {
NvOdmUsbInterfaceType_UlpiExternalPhy,
NvOdmUsbChargerType_UsbHost,
20,
@@ -1220,6 +1220,19 @@ NvOdmQueryGetUsbProperty(NvOdmIoModule OdmIoModule,
NV_FALSE
};
+ static const NvOdmUsbProperty Usb2NullPhyProperty =
+ {
+ NvOdmUsbInterfaceType_UlpiNullPhy,
+ NvOdmUsbChargerType_UsbHost,
+ 20,
+ NV_TRUE,
+ NvOdmUsbModeType_Host,
+ NvOdmUsbIdPinType_None,
+ NvOdmUsbConnectorsMuxType_None,
+ NV_FALSE,
+ {10, 1, 1, 1}
+ };
+
static const NvOdmUsbProperty Usb3Property =
{
NvOdmUsbInterfaceType_Utmi,
@@ -1236,7 +1249,15 @@ NvOdmQueryGetUsbProperty(NvOdmIoModule OdmIoModule,
return &(Usb1Property);
if (OdmIoModule == NvOdmIoModule_Usb && Instance == 1)
- return &(Usb2Property);
+ {
+ NvU32 CustOpt = GetBctKeyValue();
+
+ if (NV_DRF_VAL(TEGRA_DEVKIT, BCT_CUSTOPT, RIL, CustOpt) ==
+ TEGRA_DEVKIT_BCT_CUSTOPT_0_RIL_EMP_RAINBOW_ULPI)
+ return &(Usb2NullPhyProperty);
+ else
+ return &(Usb2Property);
+ }
if (OdmIoModule == NvOdmIoModule_Usb && Instance == 2)
return &(Usb3Property);