summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2011-04-08 17:36:20 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:41:34 -0800
commit3ac6e2e8106ac304c56b9435c907b2b3bda27a09 (patch)
tree73f994a3a953331c70b738150117e2d4392470ac
parent561a7216660a3beebf7981c647db3c2a63d5cf09 (diff)
ARM: common: fiq_glue: Convert suspend and idle hooks to syscore_ops and cpu_pm
Change-Id: I6df2158d2972b40d314f0045bc36080e1a9342e9 Signed-off-by: Colin Cross <ccross@android.com>
-rw-r--r--arch/arm/common/fiq_glue_setup.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/arch/arm/common/fiq_glue_setup.c b/arch/arm/common/fiq_glue_setup.c
index 4044c7db95c8..59586861a636 100644
--- a/arch/arm/common/fiq_glue_setup.c
+++ b/arch/arm/common/fiq_glue_setup.c
@@ -14,6 +14,8 @@
#include <linux/kernel.h>
#include <linux/percpu.h>
#include <linux/slab.h>
+#include <linux/syscore_ops.h>
+#include <asm/cpu_pm.h>
#include <asm/fiq.h>
#include <asm/fiq_glue.h>
@@ -98,3 +100,56 @@ void fiq_glue_resume(void)
current_handler->resume(current_handler);
}
+static int fiq_glue_cpu_pm_notify(struct notifier_block *self, unsigned long cmd,
+ void *v)
+{
+ switch (cmd) {
+ case CPU_PM_ENTER:
+ //pr_info("cpu pm enter %d\n", smp_processor_id());
+ local_fiq_disable();
+ break;
+ case CPU_PM_ENTER_FAILED:
+ case CPU_PM_EXIT:
+ fiq_glue_resume();
+ local_fiq_enable();
+ //pr_info("cpu pm exit %d\n", smp_processor_id());
+ break;
+ }
+ return NOTIFY_OK;
+}
+
+static struct notifier_block fiq_glue_cpu_pm_notifier = {
+ .notifier_call = fiq_glue_cpu_pm_notify,
+};
+
+static int __init fiq_glue_cpu_pm_init(void)
+{
+ return cpu_pm_register_notifier(&fiq_glue_cpu_pm_notifier);
+}
+core_initcall(fiq_glue_cpu_pm_init);
+
+#ifdef CONFIG_PM
+static int fiq_glue_syscore_suspend(void)
+{
+ local_fiq_disable();
+ return 0;
+}
+
+static void fiq_glue_syscore_resume(void)
+{
+ fiq_glue_resume();
+ local_fiq_enable();
+}
+
+static struct syscore_ops fiq_glue_syscore_ops = {
+ .suspend = fiq_glue_syscore_suspend,
+ .resume = fiq_glue_syscore_resume,
+};
+
+static int __init fiq_glue_syscore_init(void)
+{
+ register_syscore_ops(&fiq_glue_syscore_ops);
+ return 0;
+}
+late_initcall(fiq_glue_syscore_init);
+#endif