memory: ti-emif-sram: Add resume function to recopy sram code
[linux-2.6-microblaze.git] / drivers / memory / ti-emif-pm.c
index 632651f..2250d03 100644 (file)
@@ -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);