mmc: core: reset sdio card properly on resume.
authorNeilBrown <neilb@suse.de>
Wed, 12 Nov 2014 03:55:19 +0000 (14:55 +1100)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 26 Nov 2014 13:30:59 +0000 (14:30 +0100)
mmc_sdio_power_restore() calls
mmc_send_if_cond(host, host->card->ocr);

ret = mmc_send_io_op_cond(host, 0, NULL);

between mmc_go_idle() and mmc_sdio_init_card().
mmc_sdio_resume() needs to as well, else my libertas sdio wifi
device doesn't resume properly from suspend.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/sdio.c

index f0ddb0d2853645257b6c0fdc5f4bc815c299a649..fd0750b5a6343a2f196d14078c2e998c9f80985f 100644 (file)
@@ -980,8 +980,12 @@ 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->card->ocr, host->card,
-                                       mmc_card_keep_power(host));
+               mmc_send_if_cond(host, host->card->ocr);
+               err = mmc_send_io_op_cond(host, 0, NULL);
+               if (!err)
+                       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 */
                err = sdio_enable_4bit_bus(host->card);