#include <linux/scatterlist.h>
 #include <linux/log2.h>
 #include <linux/regulator/consumer.h>
+#include <linux/pm_runtime.h>
 
 #include <linux/mmc/card.h>
 #include <linux/mmc/host.h>
                if (!(host->pm_flags & MMC_PM_KEEP_POWER)) {
                        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);
 
 
 #ifdef CONFIG_PM_RUNTIME
 
-static int sdio_bus_pm_prepare(struct device *dev)
-{
-       struct sdio_func *func = dev_to_sdio_func(dev);
-
-       /*
-        * Resume an SDIO device which was suspended at run time at this
-        * point, in order to allow standard SDIO suspend/resume paths
-        * to keep working as usual.
-        *
-        * Ultimately, the SDIO driver itself will decide (in its
-        * suspend handler, or lack thereof) whether the card should be
-        * removed or kept, and if kept, at what power state.
-        *
-        * At this point, PM core have increased our use count, so it's
-        * safe to directly resume the device. After system is resumed
-        * again, PM core will drop back its runtime PM use count, and if
-        * needed device will be suspended again.
-        *
-        * The end result is guaranteed to be a power state that is
-        * coherent with the device's runtime PM use count.
-        *
-        * The return value of pm_runtime_resume is deliberately unchecked
-        * since there is little point in failing system suspend if a
-        * device can't be resumed.
-        */
-       if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD)
-               pm_runtime_resume(dev);
-
-       return 0;
-}
-
 static const struct dev_pm_ops sdio_bus_pm_ops = {
        SET_RUNTIME_PM_OPS(
                pm_generic_runtime_suspend,
                pm_generic_runtime_resume,
                pm_generic_runtime_idle
        )
-       .prepare = sdio_bus_pm_prepare,
 };
 
 #define SDIO_PM_OPS_PTR        (&sdio_bus_pm_ops)