|
@@ -594,6 +594,7 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,
|
|
|
int err;
|
|
|
int retries = 10;
|
|
|
u32 rocr = 0;
|
|
|
+ u32 ocr_card = ocr;
|
|
|
|
|
|
BUG_ON(!host);
|
|
|
WARN_ON(!host->claimed);
|
|
@@ -762,6 +763,7 @@ try_again:
|
|
|
|
|
|
card = oldcard;
|
|
|
}
|
|
|
+ card->ocr = ocr_card;
|
|
|
mmc_fixup_device(card, NULL);
|
|
|
|
|
|
if (card->type == MMC_TYPE_SD_COMBO) {
|
|
@@ -984,8 +986,8 @@ static int mmc_sdio_resume(struct mmc_host *host)
|
|
|
|
|
|
/* Restore power if needed */
|
|
|
if (!mmc_card_keep_power(host)) {
|
|
|
- mmc_power_up(host, host->ocr);
|
|
|
- mmc_select_voltage(host, host->ocr);
|
|
|
+ mmc_power_up(host, host->card->ocr);
|
|
|
+ mmc_select_voltage(host, host->card->ocr);
|
|
|
/*
|
|
|
* Tell runtime PM core we just powered up the card,
|
|
|
* since it still believes the card is powered off.
|
|
@@ -1003,7 +1005,7 @@ static int mmc_sdio_resume(struct mmc_host *host)
|
|
|
if (mmc_card_is_removable(host) || !mmc_card_keep_power(host)) {
|
|
|
sdio_reset(host);
|
|
|
mmc_go_idle(host);
|
|
|
- err = mmc_sdio_init_card(host, host->ocr, host->card,
|
|
|
+ err = mmc_sdio_init_card(host, host->card->ocr, host->card,
|
|
|
mmc_card_keep_power(host));
|
|
|
} else if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) {
|
|
|
/* We may have switched to 1-bit mode during suspend */
|
|
@@ -1043,7 +1045,7 @@ static int mmc_sdio_resume(struct mmc_host *host)
|
|
|
static int mmc_sdio_power_restore(struct mmc_host *host)
|
|
|
{
|
|
|
int ret;
|
|
|
- u32 ocr;
|
|
|
+ u32 ocr, rocr;
|
|
|
|
|
|
BUG_ON(!host);
|
|
|
BUG_ON(!host->card);
|
|
@@ -1080,13 +1082,13 @@ static int mmc_sdio_power_restore(struct mmc_host *host)
|
|
|
if (host->ocr_avail_sdio)
|
|
|
host->ocr_avail = host->ocr_avail_sdio;
|
|
|
|
|
|
- host->ocr = mmc_select_voltage(host, ocr & ~0x7F);
|
|
|
- if (!host->ocr) {
|
|
|
+ rocr = mmc_select_voltage(host, ocr & ~0x7F);
|
|
|
+ if (!rocr) {
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- ret = mmc_sdio_init_card(host, host->ocr, host->card,
|
|
|
+ ret = mmc_sdio_init_card(host, rocr, host->card,
|
|
|
mmc_card_keep_power(host));
|
|
|
if (!ret && host->sdio_irqs)
|
|
|
mmc_signal_sdio_irq(host);
|
|
@@ -1107,7 +1109,7 @@ static int mmc_sdio_runtime_suspend(struct mmc_host *host)
|
|
|
static int mmc_sdio_runtime_resume(struct mmc_host *host)
|
|
|
{
|
|
|
/* Restore power and re-initialize. */
|
|
|
- mmc_power_up(host, host->ocr);
|
|
|
+ mmc_power_up(host, host->card->ocr);
|
|
|
return mmc_sdio_power_restore(host);
|
|
|
}
|
|
|
|
|
@@ -1130,7 +1132,7 @@ static const struct mmc_bus_ops mmc_sdio_ops = {
|
|
|
int mmc_attach_sdio(struct mmc_host *host)
|
|
|
{
|
|
|
int err, i, funcs;
|
|
|
- u32 ocr;
|
|
|
+ u32 ocr, rocr;
|
|
|
struct mmc_card *card;
|
|
|
|
|
|
BUG_ON(!host);
|
|
@@ -1155,12 +1157,12 @@ int mmc_attach_sdio(struct mmc_host *host)
|
|
|
ocr &= ~0x7F;
|
|
|
}
|
|
|
|
|
|
- host->ocr = mmc_select_voltage(host, ocr);
|
|
|
+ rocr = mmc_select_voltage(host, ocr);
|
|
|
|
|
|
/*
|
|
|
* Can we support the voltage(s) of the card(s)?
|
|
|
*/
|
|
|
- if (!host->ocr) {
|
|
|
+ if (!rocr) {
|
|
|
err = -EINVAL;
|
|
|
goto err;
|
|
|
}
|
|
@@ -1168,7 +1170,7 @@ int mmc_attach_sdio(struct mmc_host *host)
|
|
|
/*
|
|
|
* Detect and init the card.
|
|
|
*/
|
|
|
- err = mmc_sdio_init_card(host, host->ocr, NULL, 0);
|
|
|
+ err = mmc_sdio_init_card(host, rocr, NULL, 0);
|
|
|
if (err)
|
|
|
goto err;
|
|
|
|