|
@@ -249,6 +249,34 @@ static const struct of_device_id ti_emif_of_match[] = {
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(of, ti_emif_of_match);
|
|
|
|
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
|
+static int ti_emif_resume(struct device *dev)
|
|
|
+{
|
|
|
+ unsigned long tmp =
|
|
|
+ __raw_readl((void *)emif_instance->ti_emif_sram_virt);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Check to see if what we are copying is already present in the
|
|
|
+ * first byte at the destination, only copy if it is not which
|
|
|
+ * indicates we have lost context and sram no longer contains
|
|
|
+ * the PM code
|
|
|
+ */
|
|
|
+ if (tmp != ti_emif_sram)
|
|
|
+ ti_emif_push_sram(dev, emif_instance);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int ti_emif_suspend(struct device *dev)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * The contents will be present in DDR hence no need to
|
|
|
+ * explicitly save
|
|
|
+ */
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif /* CONFIG_PM_SLEEP */
|
|
|
+
|
|
|
static int ti_emif_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
int ret;
|
|
@@ -308,12 +336,17 @@ static int ti_emif_remove(struct platform_device *pdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static const struct dev_pm_ops ti_emif_pm_ops = {
|
|
|
+ SET_SYSTEM_SLEEP_PM_OPS(ti_emif_suspend, ti_emif_resume)
|
|
|
+};
|
|
|
+
|
|
|
static struct platform_driver ti_emif_driver = {
|
|
|
.probe = ti_emif_probe,
|
|
|
.remove = ti_emif_remove,
|
|
|
.driver = {
|
|
|
.name = KBUILD_MODNAME,
|
|
|
.of_match_table = of_match_ptr(ti_emif_of_match),
|
|
|
+ .pm = &ti_emif_pm_ops,
|
|
|
},
|
|
|
};
|
|
|
module_platform_driver(ti_emif_driver);
|