SDMMC_VENDOR_ERR_INTR_STATUS_0));
}
+static bool tegra_sdhci_is_tuning_done(struct sdhci_host *sdhci)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
+ struct sdhci_tegra *tegra_host = pltfm_host->priv;
+
+ if (tegra_host->tuning_status == TUNING_STATUS_DONE) {
+ dev_info(mmc_dev(sdhci->mmc),
+ "Tuning already done, restoring the best tap value : %u\n",
+ tegra_host->tuned_tap_delay);
+ sdhci_tegra_set_tap_delay(sdhci, tegra_host->tuned_tap_delay);
+ return true;
+ }
+ return false;
+}
+
static int sdhci_tegra_get_max_tuning_loop_counter(struct sdhci_host *sdhci)
{
u16 hw_tuning_iterations;
.dump_host_cust_regs = tegra_sdhci_dumpregs,
.get_max_tuning_loop_counter = sdhci_tegra_get_max_tuning_loop_counter,
.config_tap_delay = tegra_sdhci_config_tap,
+ .is_tuning_done = tegra_sdhci_is_tuning_done,
.get_max_pio_transfer_limits = tegra_sdhci_set_max_pio_transfer_limits,
};
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
SDHCI_QUIRK2_NON_STD_VOLTAGE_SWITCHING |
SDHCI_QUIRK2_NON_STD_TUNING_LOOP_CNTR |
+ SDHCI_QUIRK2_SKIP_TUNING |
SDHCI_QUIRK2_NO_CALC_MAX_DISCARD_TO |
SDHCI_QUIRK2_REG_ACCESS_REQ_HOST_CLK |
SDHCI_QUIRK2_HOST_OFF_CARD_ON |
return err;
}
+ if ((host->quirks2 & SDHCI_QUIRK2_SKIP_TUNING) &&
+ host->ops->is_tuning_done) {
+ if(host->ops->is_tuning_done(host)) {
+ enable_irq(host->irq);
+ sdhci_runtime_pm_put(host);
+ return 0;
+ }
+ }
+
if ((host->quirks2 & SDHCI_QUIRK2_NON_STD_TUNING_LOOP_CNTR) &&
(host->ops->get_max_tuning_loop_counter))
tuning_loop_counter =
void (*dump_host_cust_regs)(struct sdhci_host *host);
int (*get_max_tuning_loop_counter)(struct sdhci_host *sdhci);
void (*config_tap_delay)(struct sdhci_host *host, u8 option);
+ bool (*is_tuning_done)(struct sdhci_host *sdhci);
int (*validate_sd2_0)(struct sdhci_host *sdhci);
void (*get_max_pio_transfer_limits)(struct sdhci_host *sdhci);
};
#define SDHCI_QUIRK2_NON_STD_TUNING_LOOP_CNTR (1<<14)
#define SDHCI_QUIRK2_NON_STD_RTPM (1<<15)
#define SDHCI_QUIRK2_PERIODIC_CALIBRATION (1<<16)
+/*Controller skips tuning if it is already done*/
+#define SDHCI_QUIRK2_SKIP_TUNING (1<<17)
unsigned int acmd12_ctrl;
unsigned int ier;