Revert "mmc: sdhci: Fix voltage switch delay"
This reverts commit 1061bf5d01
which is
commit c981cdfb9925f64a364f13c2b4f98f877308a408 upstream.
It breaks the Android ABI so revert it for now. If this is needed in
the future, it can be brought back in an ABI safe way.
Bug: 161946584
Change-Id: Ia5d24c9adcb06166546c42810759b9193d4eaceb
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
b0e3bda187
commit
94bdbb0042
@ -332,7 +332,6 @@ static void sdhci_init(struct sdhci_host *host, int soft)
|
|||||||
if (soft) {
|
if (soft) {
|
||||||
/* force clock reconfiguration */
|
/* force clock reconfiguration */
|
||||||
host->clock = 0;
|
host->clock = 0;
|
||||||
host->reinit_uhs = true;
|
|
||||||
mmc->ops->set_ios(mmc, &mmc->ios);
|
mmc->ops->set_ios(mmc, &mmc->ios);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2015,46 +2014,11 @@ void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(sdhci_set_uhs_signaling);
|
EXPORT_SYMBOL_GPL(sdhci_set_uhs_signaling);
|
||||||
|
|
||||||
static bool sdhci_timing_has_preset(unsigned char timing)
|
|
||||||
{
|
|
||||||
switch (timing) {
|
|
||||||
case MMC_TIMING_UHS_SDR12:
|
|
||||||
case MMC_TIMING_UHS_SDR25:
|
|
||||||
case MMC_TIMING_UHS_SDR50:
|
|
||||||
case MMC_TIMING_UHS_SDR104:
|
|
||||||
case MMC_TIMING_UHS_DDR50:
|
|
||||||
case MMC_TIMING_MMC_DDR52:
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool sdhci_preset_needed(struct sdhci_host *host, unsigned char timing)
|
|
||||||
{
|
|
||||||
return !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN) &&
|
|
||||||
sdhci_timing_has_preset(timing);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool sdhci_presetable_values_change(struct sdhci_host *host, struct mmc_ios *ios)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Preset Values are: Driver Strength, Clock Generator and SDCLK/RCLK
|
|
||||||
* Frequency. Check if preset values need to be enabled, or the Driver
|
|
||||||
* Strength needs updating. Note, clock changes are handled separately.
|
|
||||||
*/
|
|
||||||
return !host->preset_enabled &&
|
|
||||||
(sdhci_preset_needed(host, ios->timing) || host->drv_type != ios->drv_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
||||||
{
|
{
|
||||||
struct sdhci_host *host = mmc_priv(mmc);
|
struct sdhci_host *host = mmc_priv(mmc);
|
||||||
bool reinit_uhs = host->reinit_uhs;
|
|
||||||
bool turning_on_clk = false;
|
|
||||||
u8 ctrl;
|
u8 ctrl;
|
||||||
|
|
||||||
host->reinit_uhs = false;
|
|
||||||
|
|
||||||
if (ios->power_mode == MMC_POWER_UNDEFINED)
|
if (ios->power_mode == MMC_POWER_UNDEFINED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -2080,8 +2044,6 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||||||
sdhci_enable_preset_value(host, false);
|
sdhci_enable_preset_value(host, false);
|
||||||
|
|
||||||
if (!ios->clock || ios->clock != host->clock) {
|
if (!ios->clock || ios->clock != host->clock) {
|
||||||
turning_on_clk = ios->clock && !host->clock;
|
|
||||||
|
|
||||||
host->ops->set_clock(host, ios->clock);
|
host->ops->set_clock(host, ios->clock);
|
||||||
host->clock = ios->clock;
|
host->clock = ios->clock;
|
||||||
|
|
||||||
@ -2108,17 +2070,6 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||||||
|
|
||||||
host->ops->set_bus_width(host, ios->bus_width);
|
host->ops->set_bus_width(host, ios->bus_width);
|
||||||
|
|
||||||
/*
|
|
||||||
* Special case to avoid multiple clock changes during voltage
|
|
||||||
* switching.
|
|
||||||
*/
|
|
||||||
if (!reinit_uhs &&
|
|
||||||
turning_on_clk &&
|
|
||||||
host->timing == ios->timing &&
|
|
||||||
host->version >= SDHCI_SPEC_300 &&
|
|
||||||
!sdhci_presetable_values_change(host, ios))
|
|
||||||
return;
|
|
||||||
|
|
||||||
ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
|
ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
|
||||||
|
|
||||||
if (!(host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)) {
|
if (!(host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)) {
|
||||||
@ -2162,7 +2113,6 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
|
sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
|
||||||
host->drv_type = ios->drv_type;
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* According to SDHC Spec v3.00, if the Preset Value
|
* According to SDHC Spec v3.00, if the Preset Value
|
||||||
@ -2190,14 +2140,19 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||||||
host->ops->set_uhs_signaling(host, ios->timing);
|
host->ops->set_uhs_signaling(host, ios->timing);
|
||||||
host->timing = ios->timing;
|
host->timing = ios->timing;
|
||||||
|
|
||||||
if (sdhci_preset_needed(host, ios->timing)) {
|
if (!(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN) &&
|
||||||
|
((ios->timing == MMC_TIMING_UHS_SDR12) ||
|
||||||
|
(ios->timing == MMC_TIMING_UHS_SDR25) ||
|
||||||
|
(ios->timing == MMC_TIMING_UHS_SDR50) ||
|
||||||
|
(ios->timing == MMC_TIMING_UHS_SDR104) ||
|
||||||
|
(ios->timing == MMC_TIMING_UHS_DDR50) ||
|
||||||
|
(ios->timing == MMC_TIMING_MMC_DDR52))) {
|
||||||
u16 preset;
|
u16 preset;
|
||||||
|
|
||||||
sdhci_enable_preset_value(host, true);
|
sdhci_enable_preset_value(host, true);
|
||||||
preset = sdhci_get_preset_value(host);
|
preset = sdhci_get_preset_value(host);
|
||||||
ios->drv_type = FIELD_GET(SDHCI_PRESET_DRV_MASK,
|
ios->drv_type = FIELD_GET(SDHCI_PRESET_DRV_MASK,
|
||||||
preset);
|
preset);
|
||||||
host->drv_type = ios->drv_type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Re-enable SD Clock */
|
/* Re-enable SD Clock */
|
||||||
@ -3497,7 +3452,6 @@ int sdhci_resume_host(struct sdhci_host *host)
|
|||||||
sdhci_init(host, 0);
|
sdhci_init(host, 0);
|
||||||
host->pwr = 0;
|
host->pwr = 0;
|
||||||
host->clock = 0;
|
host->clock = 0;
|
||||||
host->reinit_uhs = true;
|
|
||||||
mmc->ops->set_ios(mmc, &mmc->ios);
|
mmc->ops->set_ios(mmc, &mmc->ios);
|
||||||
} else {
|
} else {
|
||||||
sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER));
|
sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER));
|
||||||
@ -3560,7 +3514,6 @@ int sdhci_runtime_resume_host(struct sdhci_host *host, int soft_reset)
|
|||||||
/* Force clock and power re-program */
|
/* Force clock and power re-program */
|
||||||
host->pwr = 0;
|
host->pwr = 0;
|
||||||
host->clock = 0;
|
host->clock = 0;
|
||||||
host->reinit_uhs = true;
|
|
||||||
mmc->ops->start_signal_voltage_switch(mmc, &mmc->ios);
|
mmc->ops->start_signal_voltage_switch(mmc, &mmc->ios);
|
||||||
mmc->ops->set_ios(mmc, &mmc->ios);
|
mmc->ops->set_ios(mmc, &mmc->ios);
|
||||||
|
|
||||||
|
@ -527,8 +527,6 @@ struct sdhci_host {
|
|||||||
|
|
||||||
unsigned int clock; /* Current clock (MHz) */
|
unsigned int clock; /* Current clock (MHz) */
|
||||||
u8 pwr; /* Current voltage */
|
u8 pwr; /* Current voltage */
|
||||||
u8 drv_type; /* Current UHS-I driver type */
|
|
||||||
bool reinit_uhs; /* Force UHS-related re-initialization */
|
|
||||||
|
|
||||||
bool runtime_suspended; /* Host is runtime suspended */
|
bool runtime_suspended; /* Host is runtime suspended */
|
||||||
bool bus_on; /* Bus power prevents runtime suspend */
|
bool bus_on; /* Bus power prevents runtime suspend */
|
||||||
|
Loading…
Reference in New Issue
Block a user