/* Select SDR50 UHS mode for host if the device runs at SDR50 mode on T210 */
#define NVQUIRK2_SELECT_SDR50_MODE BIT(4)
#define NVQUIRK2_ADD_DELAY_AUTO_CALIBRATION BIT(5)
+#define NVQUIRK2_SET_PAD_E_INPUT_3_v_3 BIT(6)
/* Common subset of quirks for Tegra3 and later sdmmc controllers */
#define TEGRA_SDHCI_NVQUIRKS (NVQUIRK_ENABLE_PADPIPE_CLKEN | \
}
}
+static void tegra_sdhci_configure_e_input(struct sdhci_host *sdhci, bool enable)
+{
+ unsigned int val;
+
+ val = sdhci_readl(sdhci, SDMMC_SDMEMCOMPPADCTRL);
+ if (enable)
+ val |= SDMMC_SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD_MASK;
+ else
+ val &= ~SDMMC_SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD_MASK;
+ sdhci_writel(sdhci, val, SDMMC_SDMEMCOMPPADCTRL);
+
+}
+
static void tegra_sdhci_do_calibration(struct sdhci_host *sdhci,
unsigned char signal_voltage)
{
if (!timeout)
dev_err(mmc_dev(sdhci->mmc), "Auto calibration failed\n");
- if (soc_data->nvquirks & NVQUIRK_SET_PAD_E_INPUT_OR_E_PWRD) {
- val = sdhci_readl(sdhci, SDMMC_SDMEMCOMPPADCTRL);
- val &= ~SDMMC_SDMEMCOMPPADCTRL_PAD_E_INPUT_OR_E_PWRD_MASK;
- sdhci_writel(sdhci, val, SDMMC_SDMEMCOMPPADCTRL);
- }
+ if (soc_data->nvquirks & NVQUIRK_SET_PAD_E_INPUT_OR_E_PWRD)
+ tegra_sdhci_configure_e_input(sdhci, false);
if (unlikely(soc_data->nvquirks & NVQUIRK_SET_DRIVE_STRENGTH)) {
/* Disable Auto calibration */
}
}
+
static int tegra_sdhci_signal_voltage_switch(struct sdhci_host *sdhci,
unsigned int signal_voltage)
{
min_uV = SDHOST_LOW_VOLT_MIN;
max_uV = SDHOST_LOW_VOLT_MAX;
} else if (signal_voltage == MMC_SIGNAL_VOLTAGE_330) {
+ if (soc_data->nvquirks & NVQUIRK2_SET_PAD_E_INPUT_3_v_3)
+ tegra_sdhci_configure_e_input(sdhci, true);
if (ctrl & SDHCI_CTRL_VDD_180)
ctrl &= ~SDHCI_CTRL_VDD_180;
}
dev_err(mmc_dev(sdhci->mmc),
"setting 1.8V failed %d. Revert to 3.3V\n", rc);
signal_voltage = MMC_SIGNAL_VOLTAGE_330;
+ if (soc_data->nvquirks & NVQUIRK2_SET_PAD_E_INPUT_3_v_3)
+ tegra_sdhci_configure_e_input(sdhci, true);
rc = tegra_sdhci_configure_regulators(tegra_host,
CONFIG_REG_SET_VOLT, tegra_host->vddio_min_uv,
tegra_host->vddio_max_uv);
NVQUIRK2_BROKEN_SD2_0_SUPPORT |
NVQUIRK2_SELECT_SDR50_MODE |
NVQUIRK2_ADD_DELAY_AUTO_CALIBRATION |
+ NVQUIRK2_SET_PAD_E_INPUT_3_v_3 |
NVQUIRK2_DYNAMIC_TRIM_SUPPLY_SWITCH,
};