|
@@ -627,15 +627,27 @@ static int mmc_sdio_suspend(struct mmc_host *host)
|
|
|
|
|
|
static int mmc_sdio_resume(struct mmc_host *host)
|
|
|
{
|
|
|
- int i, err;
|
|
|
+ int i, err = 0;
|
|
|
|
|
|
BUG_ON(!host);
|
|
|
BUG_ON(!host->card);
|
|
|
|
|
|
/* Basic card reinitialization. */
|
|
|
mmc_claim_host(host);
|
|
|
- err = mmc_sdio_init_card(host, host->ocr, host->card,
|
|
|
+
|
|
|
+ /* No need to reinitialize powered-resumed nonremovable cards */
|
|
|
+ if (mmc_card_is_removable(host) || !mmc_card_is_powered_resumed(host))
|
|
|
+ err = mmc_sdio_init_card(host, host->ocr, host->card,
|
|
|
(host->pm_flags & MMC_PM_KEEP_POWER));
|
|
|
+ else if (mmc_card_is_powered_resumed(host)) {
|
|
|
+ /* We may have switched to 1-bit mode during suspend */
|
|
|
+ err = sdio_enable_4bit_bus(host->card);
|
|
|
+ if (err > 0) {
|
|
|
+ mmc_set_bus_width(host, MMC_BUS_WIDTH_4);
|
|
|
+ err = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (!err && host->sdio_irqs)
|
|
|
mmc_signal_sdio_irq(host);
|
|
|
mmc_release_host(host);
|