|
@@ -14,6 +14,7 @@
|
|
#include <linux/device.h>
|
|
#include <linux/device.h>
|
|
#include <linux/err.h>
|
|
#include <linux/err.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
|
|
+#include <linux/pm_runtime.h>
|
|
|
|
|
|
#include <linux/mmc/card.h>
|
|
#include <linux/mmc/card.h>
|
|
#include <linux/mmc/host.h>
|
|
#include <linux/mmc/host.h>
|
|
@@ -141,6 +142,41 @@ static int mmc_bus_resume(struct device *dev)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PM_RUNTIME
|
|
|
|
+
|
|
|
|
+static int mmc_runtime_suspend(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ struct mmc_card *card = mmc_dev_to_card(dev);
|
|
|
|
+
|
|
|
|
+ return mmc_power_save_host(card->host);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mmc_runtime_resume(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ struct mmc_card *card = mmc_dev_to_card(dev);
|
|
|
|
+
|
|
|
|
+ return mmc_power_restore_host(card->host);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mmc_runtime_idle(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ return pm_runtime_suspend(dev);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct dev_pm_ops mmc_bus_pm_ops = {
|
|
|
|
+ .runtime_suspend = mmc_runtime_suspend,
|
|
|
|
+ .runtime_resume = mmc_runtime_resume,
|
|
|
|
+ .runtime_idle = mmc_runtime_idle,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define MMC_PM_OPS_PTR (&mmc_bus_pm_ops)
|
|
|
|
+
|
|
|
|
+#else /* !CONFIG_PM_RUNTIME */
|
|
|
|
+
|
|
|
|
+#define MMC_PM_OPS_PTR NULL
|
|
|
|
+
|
|
|
|
+#endif /* !CONFIG_PM_RUNTIME */
|
|
|
|
+
|
|
static struct bus_type mmc_bus_type = {
|
|
static struct bus_type mmc_bus_type = {
|
|
.name = "mmc",
|
|
.name = "mmc",
|
|
.dev_attrs = mmc_dev_attrs,
|
|
.dev_attrs = mmc_dev_attrs,
|
|
@@ -150,6 +186,7 @@ static struct bus_type mmc_bus_type = {
|
|
.remove = mmc_bus_remove,
|
|
.remove = mmc_bus_remove,
|
|
.suspend = mmc_bus_suspend,
|
|
.suspend = mmc_bus_suspend,
|
|
.resume = mmc_bus_resume,
|
|
.resume = mmc_bus_resume,
|
|
|
|
+ .pm = MMC_PM_OPS_PTR,
|
|
};
|
|
};
|
|
|
|
|
|
int mmc_register_bus(void)
|
|
int mmc_register_bus(void)
|