diff options
| author | Olof Johansson <olof@lixom.net> | 2013-04-28 15:06:56 -0700 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-04-28 15:06:56 -0700 | 
| commit | e0d20b69d3fa74a21ec363989612bddd58b930b8 (patch) | |
| tree | 8ed7c390f99c4d40f59f5dc49e39b077fbb9947f /drivers/irqchip/irq-gic.c | |
| parent | 128673b3646beba4f5a41f50a7a21c3c2f3455ca (diff) | |
| parent | bc895b5987dd5fad89c0e9693b38104679b647c4 (diff) | |
| download | olio-linux-3.10-e0d20b69d3fa74a21ec363989612bddd58b930b8.tar.xz olio-linux-3.10-e0d20b69d3fa74a21ec363989612bddd58b930b8.zip  | |
Merge branch 'gic/cleanup' into next/soc
Merge in the gic cleanup since it has a handful of annoying internal conflicts
with soc development branches. All of them are delete/delete conflicts.
* gic/cleanup:
  irqchip: vic: add include of linux/irq.h
  irqchip: gic: Perform the gic_secondary_init() call via CPU notifier
  irqchip: gic: Call handle_bad_irq() directly
  arm: Move chained_irq_(enter|exit) to a generic file
  arm: Move the set_handle_irq and handle_arch_irq declarations to asm/irq.h
Signed-off-by: Olof Johansson <olof@lixom.net>
Conflicts:
	arch/arm/mach-shmobile/smp-emev2.c
	arch/arm/mach-shmobile/smp-r8a7779.c
	arch/arm/mach-shmobile/smp-sh73a0.c
	arch/arm/mach-socfpga/platsmp.c
Diffstat (limited to 'drivers/irqchip/irq-gic.c')
| -rw-r--r-- | drivers/irqchip/irq-gic.c | 32 | 
1 files changed, 23 insertions, 9 deletions
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index a32e0d5aa45..add1fd84fc4 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -28,6 +28,7 @@  #include <linux/module.h>  #include <linux/list.h>  #include <linux/smp.h> +#include <linux/cpu.h>  #include <linux/cpu_pm.h>  #include <linux/cpumask.h>  #include <linux/io.h> @@ -38,12 +39,12 @@  #include <linux/interrupt.h>  #include <linux/percpu.h>  #include <linux/slab.h> +#include <linux/irqchip/chained_irq.h>  #include <linux/irqchip/arm-gic.h>  #include <asm/irq.h>  #include <asm/exception.h>  #include <asm/smp_plat.h> -#include <asm/mach/irq.h>  #include "irqchip.h" @@ -323,7 +324,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)  	cascade_irq = irq_find_mapping(chip_data->domain, gic_irq);  	if (unlikely(gic_irq < 32 || gic_irq > 1020)) -		do_bad_IRQ(cascade_irq, desc); +		handle_bad_irq(cascade_irq, desc);  	else  		generic_handle_irq(cascade_irq); @@ -699,6 +700,25 @@ static int gic_irq_domain_xlate(struct irq_domain *d,  	return 0;  } +#ifdef CONFIG_SMP +static int __cpuinit gic_secondary_init(struct notifier_block *nfb, +					unsigned long action, void *hcpu) +{ +	if (action == CPU_STARTING) +		gic_cpu_init(&gic_data[0]); +	return NOTIFY_OK; +} + +/* + * Notifier for enabling the GIC CPU interface. Set an arbitrarily high + * priority because the GIC needs to be up before the ARM generic timers. + */ +static struct notifier_block __cpuinitdata gic_cpu_notifier = { +	.notifier_call = gic_secondary_init, +	.priority = 100, +}; +#endif +  const struct irq_domain_ops gic_irq_domain_ops = {  	.map = gic_irq_domain_map,  	.xlate = gic_irq_domain_xlate, @@ -789,6 +809,7 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,  #ifdef CONFIG_SMP  	set_smp_cross_call(gic_raise_softirq); +	register_cpu_notifier(&gic_cpu_notifier);  #endif  	set_handle_irq(gic_handle_irq); @@ -799,13 +820,6 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,  	gic_pm_init(gic);  } -void __cpuinit gic_secondary_init(unsigned int gic_nr) -{ -	BUG_ON(gic_nr >= MAX_GIC_NR); - -	gic_cpu_init(&gic_data[gic_nr]); -} -  #ifdef CONFIG_OF  static int gic_cnt __initdata = 0;  |