mmc: sdhci: ignore restoring the I/O state if MMC_POWER_OFF
authorZhoujie Wu <zjwu@marvell.com>
Thu, 3 Aug 2017 19:28:40 +0000 (12:28 -0700)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 30 Aug 2017 12:01:50 +0000 (14:01 +0200)
One issue was found on a removable high speed sd card with
runtime pm enabled.
When SD card is unplugged, it keep printing "Switching to 3.3V
signalling voltage failed".
And found below sequence triggers the error.

mmc_rescan
-> mmc_sd_detect
-> mmc_power_off  -- mmc->ios.vdd is updated to 0.
-> mmc_claim_host
-> sdhci_runtime_resume_host
-> sdhci_start_signal_voltage_switch
-> mmc_regulator_set_vqmmc
-> mmc_ocrbitnum_to_vdd

When mmc_ocrbitnum_to_vdd is called, the mmc->ios.vdd is 0, so it
always return -EINVAL. The signal switch will always fail and
print out warning.
Ignore restoring the I/O state when runtime resume if MMC_POWER_OFF.

Signed-off-by: Zhoujie Wu <zjwu@marvell.com>
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c

index cf2166e4190dd81853a24ab0ce8a120a87fde999..4a70f2f765b653898f014676fa727a8421a796ea 100644 (file)
@@ -2934,7 +2934,8 @@ int sdhci_runtime_resume_host(struct sdhci_host *host)
 
        sdhci_init(host, 0);
 
-       if (mmc->ios.power_mode != MMC_POWER_UNDEFINED) {
+       if (mmc->ios.power_mode != MMC_POWER_UNDEFINED &&
+           mmc->ios.power_mode != MMC_POWER_OFF) {
                /* Force clock and power re-program */
                host->pwr = 0;
                host->clock = 0;