{
        int err = 0;
 
-       cancel_delayed_work(&host->detect);
-       mmc_flush_scheduled_work();
-
        mmc_bus_get(host);
        if (host->bus_ops && !host->bus_dead) {
                if (host->bus_ops->suspend)
        }
        mmc_bus_put(host);
 
-       if (!err && !mmc_card_keep_power(host))
-               mmc_power_off(host);
-
        return err;
 }
 EXPORT_SYMBOL(mmc_suspend_host);
  */
 int mmc_resume_host(struct mmc_host *host)
 {
-       int err = 0;
+       int err;
 
        mmc_bus_get(host);
        if (host->bus_ops && !host->bus_dead) {
-               if (!mmc_card_keep_power(host)) {
-                       mmc_power_up(host);
-                       mmc_select_voltage(host, host->ocr);
-                       /*
-                        * Tell runtime PM core we just powered up the card,
-                        * since it still believes the card is powered off.
-                        * Note that currently runtime PM is only enabled
-                        * for SDIO cards that are MMC_CAP_POWER_OFF_CARD
-                        */
-                       if (mmc_card_sdio(host->card) &&
-                           (host->caps & MMC_CAP_POWER_OFF_CARD)) {
-                               pm_runtime_disable(&host->card->dev);
-                               pm_runtime_set_active(&host->card->dev);
-                               pm_runtime_enable(&host->card->dev);
-                       }
-               }
                BUG_ON(!host->bus_ops->resume);
                err = host->bus_ops->resume(host);
-               if (err) {
+               if (err)
                        pr_warning("%s: error %d during resume "
                                            "(card was removed?)\n",
                                            mmc_hostname(host), err);
-                       err = 0;
-               }
        }
-       host->pm_flags &= ~MMC_PM_KEEP_POWER;
        mmc_bus_put(host);
 
-       return err;
+       return 0;
 }
 EXPORT_SYMBOL(mmc_resume_host);
 
 
                err = mmc_deselect_cards(host);
        host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200);
 
+       if (!err)
+               mmc_power_off(host);
 out:
        mmc_release_host(host);
        return err;
        BUG_ON(!host->card);
 
        mmc_claim_host(host);
+       mmc_power_up(host);
+       mmc_select_voltage(host, host->ocr);
        err = mmc_init_card(host, host->ocr, host->card);
        mmc_release_host(host);
 
 
        if (!mmc_host_is_spi(host))
                err = mmc_deselect_cards(host);
        host->card->state &= ~MMC_STATE_HIGHSPEED;
+       if (!err)
+               mmc_power_off(host);
        mmc_release_host(host);
 
        return err;
        BUG_ON(!host->card);
 
        mmc_claim_host(host);
+       mmc_power_up(host);
+       mmc_select_voltage(host, host->ocr);
        err = mmc_sd_init_card(host, host->ocr, host->card);
        mmc_release_host(host);
 
 
                mmc_release_host(host);
        }
 
+       if (!err && !mmc_card_keep_power(host))
+               mmc_power_off(host);
+
        return err;
 }
 
        /* Basic card reinitialization. */
        mmc_claim_host(host);
 
+       /* Restore power if needed */
+       if (!mmc_card_keep_power(host)) {
+               mmc_power_up(host);
+               mmc_select_voltage(host, host->ocr);
+               /*
+                * Tell runtime PM core we just powered up the card,
+                * since it still believes the card is powered off.
+                * Note that currently runtime PM is only enabled
+                * for SDIO cards that are MMC_CAP_POWER_OFF_CARD
+                */
+               if (host->caps & MMC_CAP_POWER_OFF_CARD) {
+                       pm_runtime_disable(&host->card->dev);
+                       pm_runtime_set_active(&host->card->dev);
+                       pm_runtime_enable(&host->card->dev);
+               }
+       }
+
        /* No need to reinitialize powered-resumed nonremovable cards */
        if (mmc_card_is_removable(host) || !mmc_card_keep_power(host)) {
                sdio_reset(host);
                }
        }
 
+       host->pm_flags &= ~MMC_PM_KEEP_POWER;
        return err;
 }