diff options
author | Steve Lin <stlin@nvidia.com> | 2010-03-05 17:28:14 -0800 |
---|---|---|
committer | Gary King <gking@nvidia.com> | 2010-03-11 11:48:48 -0800 |
commit | df55060db23f1b246488c3007133f2bf35a7436f (patch) | |
tree | 77c3ef7bfe190598e8587f565f5f6d9f86dfba00 /arch/arm/mach-tegra | |
parent | 62e64856d6a025c068e2bdc81319d62801d7f948 (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>
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r--[-rwxr-xr-x] | arch/arm/mach-tegra/include/nvodm_query.h | 23 | ||||
-rw-r--r-- | arch/arm/mach-tegra/nvddk/nvddk_usbphy_ap20.c | 25 | ||||
-rwxr-xr-x | arch/arm/mach-tegra/odm_kit/query/whistler/nvodm_query.c | 27 |
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); |