diff options
author | Colin Cross <ccross@android.com> | 2011-04-08 17:36:20 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:41:34 -0800 |
commit | 3ac6e2e8106ac304c56b9435c907b2b3bda27a09 (patch) | |
tree | 73f994a3a953331c70b738150117e2d4392470ac | |
parent | 561a7216660a3beebf7981c647db3c2a63d5cf09 (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.c | 55 |
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 |