aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/core
diff options
context:
space:
mode:
authorAaron Lu <aaron.lu@amd.com>2012-07-10 04:55:37 -0400
committerChris Ball <cjb@laptop.org>2012-07-22 15:25:53 -0400
commit108ecc4cf9c46a4caabaf18efc42d19818c95b70 (patch)
treeb28bc7b718318b54fcdb22fd3c58833a971ac9c9 /drivers/mmc/core
parent55c4665ea0a42fd6427826bfce96eb4b0389262a (diff)
mmc: core: reset signal voltage on power up
Add a call to mmc_set_signal_voltage() to set signal voltage to 3.3v in mmc_power_up so that we do not need to touch signal voltage setting in mmc/sd/sdio init functions and rescan function. For mmc/sd cards, when doing a suspend/resume cycle, consider the unsafe resume case, the card will lose its power and when powered on again, we will set signal voltage to 3.3v in mmc_power_up before its resume function gets called, which will re-init the card. And for sdio cards, when doing a suspend/resume cycle, consider the unsafe resume case, the card will either lose its power or not depending on if it wants to wakeup the host. If power is not maintained, it is the same case as mmc/sd cards. If power is maintained, mmc_power_up will not be called and the card's signal voltage will remain at the last setting. Signed-off-by: Aaron Lu <aaron.lu@amd.com> Tested-by: Venkatraman S <svenkatr@ti.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc/core')
-rw-r--r--drivers/mmc/core/core.c6
-rw-r--r--drivers/mmc/core/mmc.c3
-rw-r--r--drivers/mmc/core/sd.c3
-rw-r--r--drivers/mmc/core/sdio.c7
4 files changed, 3 insertions, 16 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 9503cabc96f..8ac5246e2ab 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1212,6 +1212,9 @@ static void mmc_power_up(struct mmc_host *host)
1212 host->ios.timing = MMC_TIMING_LEGACY; 1212 host->ios.timing = MMC_TIMING_LEGACY;
1213 mmc_set_ios(host); 1213 mmc_set_ios(host);
1214 1214
1215 /* Set signal voltage to 3.3V */
1216 mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, false);
1217
1215 /* 1218 /*
1216 * This delay should be sufficient to allow the power supply 1219 * This delay should be sufficient to allow the power supply
1217 * to reach the minimum voltage. 1220 * to reach the minimum voltage.
@@ -1963,9 +1966,6 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq)
1963 */ 1966 */
1964 mmc_hw_reset_for_init(host); 1967 mmc_hw_reset_for_init(host);
1965 1968
1966 /* Initialization should be done at 3.3 V I/O voltage. */
1967 mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
1968
1969 /* 1969 /*
1970 * sdio_reset sends CMD52 to reset card. Since we do not know 1970 * sdio_reset sends CMD52 to reset card. Since we do not know
1971 * if the card is being re-initialized, just send it. CMD52 1971 * if the card is being re-initialized, just send it. CMD52
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 4f4489aa6ba..396b25891bb 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -818,9 +818,6 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
818 if (!mmc_host_is_spi(host)) 818 if (!mmc_host_is_spi(host))
819 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); 819 mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
820 820
821 /* Initialization should be done at 3.3 V I/O voltage. */
822 mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
823
824 /* 821 /*
825 * Since we're changing the OCR value, we seem to 822 * Since we're changing the OCR value, we seem to
826 * need to tell some cards to go back to the idle 823 * need to tell some cards to go back to the idle
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 441bdf472c9..74972c241df 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -901,9 +901,6 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
901 BUG_ON(!host); 901 BUG_ON(!host);
902 WARN_ON(!host->claimed); 902 WARN_ON(!host->claimed);
903 903
904 /* The initialization should be done at 3.3 V I/O voltage. */
905 mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
906
907 err = mmc_sd_get_cid(host, ocr, cid, &rocr); 904 err = mmc_sd_get_cid(host, ocr, cid, &rocr);
908 if (err) 905 if (err)
909 return err; 906 return err;
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
index 41c5fd8848f..d4619e2ec03 100644
--- a/drivers/mmc/core/sdio.c
+++ b/drivers/mmc/core/sdio.c
@@ -591,9 +591,6 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,
591 * Inform the card of the voltage 591 * Inform the card of the voltage
592 */ 592 */
593 if (!powered_resume) { 593 if (!powered_resume) {
594 /* The initialization should be done at 3.3 V I/O voltage. */
595 mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
596
597 err = mmc_send_io_op_cond(host, host->ocr, &ocr); 594 err = mmc_send_io_op_cond(host, host->ocr, &ocr);
598 if (err) 595 if (err)
599 goto err; 596 goto err;
@@ -1006,10 +1003,6 @@ static int mmc_sdio_power_restore(struct mmc_host *host)
1006 * restore the correct voltage setting of the card. 1003 * restore the correct voltage setting of the card.
1007 */ 1004 */
1008 1005
1009 /* The initialization should be done at 3.3 V I/O voltage. */
1010 if (!mmc_card_keep_power(host))
1011 mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
1012
1013 sdio_reset(host); 1006 sdio_reset(host);
1014 mmc_go_idle(host); 1007 mmc_go_idle(host);
1015 mmc_send_if_cond(host, host->ocr_avail); 1008 mmc_send_if_cond(host, host->ocr_avail);