diff options
Diffstat (limited to 'arch/arm/common')
-rw-r--r-- | arch/arm/common/Kconfig | 9 | ||||
-rw-r--r-- | arch/arm/common/fiq_glue_setup.c | 55 | ||||
-rw-r--r-- | arch/arm/common/timer-sp.c | 2 |
3 files changed, 65 insertions, 1 deletions
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index ce01364a96e3..709d85388621 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig @@ -21,3 +21,12 @@ config SHARP_SCOOP config FIQ_GLUE bool select FIQ + +config GIC_SET_MULTIPLE_CPUS + bool "Use affinity hint to allow multiple CPUs for IRQ" + depends on ARM_GIC && SMP + default n + help + IRQ affinity is always set by gic to the 1st cpu in the requested + mask. If this option is enabled, affinity is also set to all cpus + present in affinity_hint and requested masks. diff --git a/arch/arm/common/fiq_glue_setup.c b/arch/arm/common/fiq_glue_setup.c index 8cb1b611c6d5..04c018647d13 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 <linux/cpu_pm.h> #include <asm/fiq.h> #include <asm/fiq_glue.h> @@ -145,3 +147,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 diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index ddc740769601..023ee63827a2 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c @@ -28,8 +28,8 @@ #include <linux/of.h> #include <linux/of_address.h> #include <linux/of_irq.h> +#include <linux/sched_clock.h> -#include <asm/sched_clock.h> #include <asm/hardware/arm_timer.h> #include <asm/hardware/timer-sp.h> |