aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/memory
diff options
context:
space:
mode:
authorDave Gerlach <d-gerlach@ti.com>2018-06-26 13:05:17 -0400
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>2018-06-26 13:05:17 -0400
commit38853979e6dce8466a1f611cadebc0f00adb901b (patch)
tree4e760c4ad3ecc722ab87448128e55cf2008920a9 /drivers/memory
parentce397d215ccd07b8ae3f71db689aedb85d56ab40 (diff)
memory: ti-emif-sram: Add resume function to recopy sram code
After an RTC+DDR cycle we lose sram context so emif pm functions present in sram are lost. We can check if the first byte of the original code in DDR contains the same first byte as the code in sram, and if they do not match we know we have lost context and must recopy the functions to the previous address to maintain PM functionality. Signed-off-by: Dave Gerlach <d-gerlach@ti.com> Signed-off-by: Keerthy <j-keerthy@ti.com> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Diffstat (limited to 'drivers/memory')
-rw-r--r--drivers/memory/ti-emif-pm.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/memory/ti-emif-pm.c b/drivers/memory/ti-emif-pm.c
index 632651f4b6e8..2250d03ea17f 100644
--- a/drivers/memory/ti-emif-pm.c
+++ b/drivers/memory/ti-emif-pm.c
@@ -249,6 +249,34 @@ static const struct of_device_id ti_emif_of_match[] = {
249}; 249};
250MODULE_DEVICE_TABLE(of, ti_emif_of_match); 250MODULE_DEVICE_TABLE(of, ti_emif_of_match);
251 251
252#ifdef CONFIG_PM_SLEEP
253static int ti_emif_resume(struct device *dev)
254{
255 unsigned long tmp =
256 __raw_readl((void *)emif_instance->ti_emif_sram_virt);
257
258 /*
259 * Check to see if what we are copying is already present in the
260 * first byte at the destination, only copy if it is not which
261 * indicates we have lost context and sram no longer contains
262 * the PM code
263 */
264 if (tmp != ti_emif_sram)
265 ti_emif_push_sram(dev, emif_instance);
266
267 return 0;
268}
269
270static int ti_emif_suspend(struct device *dev)
271{
272 /*
273 * The contents will be present in DDR hence no need to
274 * explicitly save
275 */
276 return 0;
277}
278#endif /* CONFIG_PM_SLEEP */
279
252static int ti_emif_probe(struct platform_device *pdev) 280static int ti_emif_probe(struct platform_device *pdev)
253{ 281{
254 int ret; 282 int ret;
@@ -308,12 +336,17 @@ static int ti_emif_remove(struct platform_device *pdev)
308 return 0; 336 return 0;
309} 337}
310 338
339static const struct dev_pm_ops ti_emif_pm_ops = {
340 SET_SYSTEM_SLEEP_PM_OPS(ti_emif_suspend, ti_emif_resume)
341};
342
311static struct platform_driver ti_emif_driver = { 343static struct platform_driver ti_emif_driver = {
312 .probe = ti_emif_probe, 344 .probe = ti_emif_probe,
313 .remove = ti_emif_remove, 345 .remove = ti_emif_remove,
314 .driver = { 346 .driver = {
315 .name = KBUILD_MODNAME, 347 .name = KBUILD_MODNAME,
316 .of_match_table = of_match_ptr(ti_emif_of_match), 348 .of_match_table = of_match_ptr(ti_emif_of_match),
349 .pm = &ti_emif_pm_ops,
317 }, 350 },
318}; 351};
319module_platform_driver(ti_emif_driver); 352module_platform_driver(ti_emif_driver);