|
@@ -12,6 +12,7 @@
|
|
|
* published by the Free Software Foundation.
|
|
|
*/
|
|
|
|
|
|
+#include <linux/cpu_pm.h>
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/errno.h>
|
|
@@ -30,6 +31,7 @@
|
|
|
#include "prcm44xx.h"
|
|
|
#include "prminst44xx.h"
|
|
|
#include "powerdomain.h"
|
|
|
+#include "pm.h"
|
|
|
|
|
|
/* Static data */
|
|
|
|
|
@@ -768,6 +770,22 @@ void prm_restore_context(void)
|
|
|
omap4_prcm_irq_setup.pm_ctrl);
|
|
|
}
|
|
|
|
|
|
+static int cpu_notifier(struct notifier_block *nb, unsigned long cmd, void *v)
|
|
|
+{
|
|
|
+ switch (cmd) {
|
|
|
+ case CPU_CLUSTER_PM_ENTER:
|
|
|
+ if (enable_off_mode)
|
|
|
+ prm_save_context();
|
|
|
+ break;
|
|
|
+ case CPU_CLUSTER_PM_EXIT:
|
|
|
+ if (enable_off_mode)
|
|
|
+ prm_restore_context();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return NOTIFY_OK;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* XXX document
|
|
|
*/
|
|
@@ -788,6 +806,7 @@ static const struct omap_prcm_init_data *prm_init_data;
|
|
|
|
|
|
int __init omap44xx_prm_init(const struct omap_prcm_init_data *data)
|
|
|
{
|
|
|
+ static struct notifier_block nb;
|
|
|
omap_prm_base_init();
|
|
|
|
|
|
prm_init_data = data;
|
|
@@ -809,6 +828,12 @@ int __init omap44xx_prm_init(const struct omap_prcm_init_data *data)
|
|
|
omap4_prcm_irq_setup.mask = AM43XX_PRM_IRQENABLE_MPU_OFFSET;
|
|
|
}
|
|
|
|
|
|
+ /* Only AM43XX can lose prm context during rtc-ddr suspend */
|
|
|
+ if (soc_is_am43xx()) {
|
|
|
+ nb.notifier_call = cpu_notifier;
|
|
|
+ cpu_pm_register_notifier(&nb);
|
|
|
+ }
|
|
|
+
|
|
|
return prm_register(&omap44xx_prm_ll_data);
|
|
|
}
|
|
|
|