aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlof Johansson <olof@lixom.net>2013-04-28 18:06:56 -0400
committerOlof Johansson <olof@lixom.net>2013-04-28 18:06:56 -0400
commite0d20b69d3fa74a21ec363989612bddd58b930b8 (patch)
tree8ed7c390f99c4d40f59f5dc49e39b077fbb9947f
parent128673b3646beba4f5a41f50a7a21c3c2f3455ca (diff)
parentbc895b5987dd5fad89c0e9693b38104679b647c4 (diff)
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
-rw-r--r--arch/arm/include/asm/irq.h5
-rw-r--r--arch/arm/include/asm/mach/irq.h36
-rw-r--r--arch/arm/mach-at91/gpio.c3
-rw-r--r--arch/arm/mach-exynos/common.c1
-rw-r--r--arch/arm/mach-exynos/platsmp.c8
-rw-r--r--arch/arm/mach-highbank/platsmp.c7
-rw-r--r--arch/arm/mach-imx/platsmp.c12
-rw-r--r--arch/arm/mach-msm/platsmp.c8
-rw-r--r--arch/arm/mach-omap2/omap-smp.c7
-rw-r--r--arch/arm/mach-prima2/platsmp.c8
-rw-r--r--arch/arm/mach-s3c24xx/irq.c1
-rw-r--r--arch/arm/mach-shmobile/smp-emev2.c7
-rw-r--r--arch/arm/mach-shmobile/smp-r8a7779.c7
-rw-r--r--arch/arm/mach-shmobile/smp-sh73a0.c7
-rw-r--r--arch/arm/mach-socfpga/platsmp.c12
-rw-r--r--arch/arm/mach-spear13xx/platsmp.c8
-rw-r--r--arch/arm/mach-tegra/platsmp.c8
-rw-r--r--arch/arm/mach-ux500/platsmp.c8
-rw-r--r--arch/arm/mach-virt/platsmp.c8
-rw-r--r--arch/arm/plat-samsung/irq-vic-timer.c3
-rw-r--r--arch/arm/plat-samsung/s5p-irq-gpioint.c3
-rw-r--r--arch/arm/plat-versatile/platsmp.c8
-rw-r--r--drivers/gpio/gpio-msm-v2.c3
-rw-r--r--drivers/gpio/gpio-mxc.c2
-rw-r--r--drivers/gpio/gpio-omap.c3
-rw-r--r--drivers/gpio/gpio-pl061.c2
-rw-r--r--drivers/gpio/gpio-pxa.c3
-rw-r--r--drivers/gpio/gpio-tegra.c3
-rw-r--r--drivers/irqchip/exynos-combiner.c1
-rw-r--r--drivers/irqchip/irq-gic.c32
-rw-r--r--drivers/irqchip/irq-vic.c3
-rw-r--r--drivers/pinctrl/pinctrl-at91.c3
-rw-r--r--drivers/pinctrl/pinctrl-exynos.c3
-rw-r--r--drivers/pinctrl/pinctrl-nomadik.c2
-rw-r--r--drivers/pinctrl/pinctrl-sirf.c2
-rw-r--r--drivers/pinctrl/spear/pinctrl-plgpio.c2
-rw-r--r--drivers/staging/imx-drm/ipu-v3/ipu-common.c2
-rw-r--r--include/linux/irqchip/arm-gic.h1
-rw-r--r--include/linux/irqchip/chained_irq.h52
39 files changed, 100 insertions, 194 deletions
diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h
index 35c21c375d81..53c15dec7af6 100644
--- a/arch/arm/include/asm/irq.h
+++ b/arch/arm/include/asm/irq.h
@@ -30,6 +30,11 @@ extern void asm_do_IRQ(unsigned int, struct pt_regs *);
30void handle_IRQ(unsigned int, struct pt_regs *); 30void handle_IRQ(unsigned int, struct pt_regs *);
31void init_IRQ(void); 31void init_IRQ(void);
32 32
33#ifdef CONFIG_MULTI_IRQ_HANDLER
34extern void (*handle_arch_irq)(struct pt_regs *);
35extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
36#endif
37
33#endif 38#endif
34 39
35#endif 40#endif
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h
index 18c883023339..2092ee1e1300 100644
--- a/arch/arm/include/asm/mach/irq.h
+++ b/arch/arm/include/asm/mach/irq.h
@@ -20,11 +20,6 @@ struct seq_file;
20extern void init_FIQ(int); 20extern void init_FIQ(int);
21extern int show_fiq_list(struct seq_file *, int); 21extern int show_fiq_list(struct seq_file *, int);
22 22
23#ifdef CONFIG_MULTI_IRQ_HANDLER
24extern void (*handle_arch_irq)(struct pt_regs *);
25extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
26#endif
27
28/* 23/*
29 * This is for easy migration, but should be changed in the source 24 * This is for easy migration, but should be changed in the source
30 */ 25 */
@@ -35,35 +30,4 @@ do { \
35 raw_spin_unlock(&desc->lock); \ 30 raw_spin_unlock(&desc->lock); \
36} while(0) 31} while(0)
37 32
38#ifndef __ASSEMBLY__
39/*
40 * Entry/exit functions for chained handlers where the primary IRQ chip
41 * may implement either fasteoi or level-trigger flow control.
42 */
43static inline void chained_irq_enter(struct irq_chip *chip,
44 struct irq_desc *desc)
45{
46 /* FastEOI controllers require no action on entry. */
47 if (chip->irq_eoi)
48 return;
49
50 if (chip->irq_mask_ack) {
51 chip->irq_mask_ack(&desc->irq_data);
52 } else {
53 chip->irq_mask(&desc->irq_data);
54 if (chip->irq_ack)
55 chip->irq_ack(&desc->irq_data);
56 }
57}
58
59static inline void chained_irq_exit(struct irq_chip *chip,
60 struct irq_desc *desc)
61{
62 if (chip->irq_eoi)
63 chip->irq_eoi(&desc->irq_data);
64 else
65 chip->irq_unmask(&desc->irq_data);
66}
67#endif
68
69#endif 33#endif
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
index c5d7e1e9d757..a5afcf76550e 100644
--- a/arch/arm/mach-at91/gpio.c
+++ b/arch/arm/mach-at91/gpio.c
@@ -22,10 +22,9 @@
22#include <linux/module.h> 22#include <linux/module.h>
23#include <linux/io.h> 23#include <linux/io.h>
24#include <linux/irqdomain.h> 24#include <linux/irqdomain.h>
25#include <linux/irqchip/chained_irq.h>
25#include <linux/of_address.h> 26#include <linux/of_address.h>
26 27
27#include <asm/mach/irq.h>
28
29#include <mach/hardware.h> 28#include <mach/hardware.h>
30#include <mach/at91_pio.h> 29#include <mach/at91_pio.h>
31 30
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
index 789d4e66c950..99b7f1cbbb8b 100644
--- a/arch/arm/mach-exynos/common.c
+++ b/arch/arm/mach-exynos/common.c
@@ -26,6 +26,7 @@
26#include <linux/irqchip.h> 26#include <linux/irqchip.h>
27#include <linux/of_address.h> 27#include <linux/of_address.h>
28#include <linux/irqchip/arm-gic.h> 28#include <linux/irqchip/arm-gic.h>
29#include <linux/irqchip/chained_irq.h>
29 30
30#include <asm/proc-fns.h> 31#include <asm/proc-fns.h>
31#include <asm/exception.h> 32#include <asm/exception.h>
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c
index 60f7c5be057d..95e04bd5813f 100644
--- a/arch/arm/mach-exynos/platsmp.c
+++ b/arch/arm/mach-exynos/platsmp.c
@@ -20,7 +20,6 @@
20#include <linux/jiffies.h> 20#include <linux/jiffies.h>
21#include <linux/smp.h> 21#include <linux/smp.h>
22#include <linux/io.h> 22#include <linux/io.h>
23#include <linux/irqchip/arm-gic.h>
24 23
25#include <asm/cacheflush.h> 24#include <asm/cacheflush.h>
26#include <asm/smp_plat.h> 25#include <asm/smp_plat.h>
@@ -76,13 +75,6 @@ static DEFINE_SPINLOCK(boot_lock);
76static void __cpuinit exynos_secondary_init(unsigned int cpu) 75static void __cpuinit exynos_secondary_init(unsigned int cpu)
77{ 76{
78 /* 77 /*
79 * if any interrupts are already enabled for the primary
80 * core (e.g. timer irq), then they will not have been enabled
81 * for us: do so
82 */
83 gic_secondary_init(0);
84
85 /*
86 * let the primary processor know we're out of the 78 * let the primary processor know we're out of the
87 * pen, then head off into the C entry point 79 * pen, then head off into the C entry point
88 */ 80 */
diff --git a/arch/arm/mach-highbank/platsmp.c b/arch/arm/mach-highbank/platsmp.c
index 8797a7001720..a984573e0d02 100644
--- a/arch/arm/mach-highbank/platsmp.c
+++ b/arch/arm/mach-highbank/platsmp.c
@@ -17,7 +17,6 @@
17#include <linux/init.h> 17#include <linux/init.h>
18#include <linux/smp.h> 18#include <linux/smp.h>
19#include <linux/io.h> 19#include <linux/io.h>
20#include <linux/irqchip/arm-gic.h>
21 20
22#include <asm/smp_scu.h> 21#include <asm/smp_scu.h>
23 22
@@ -25,11 +24,6 @@
25 24
26extern void secondary_startup(void); 25extern void secondary_startup(void);
27 26
28static void __cpuinit highbank_secondary_init(unsigned int cpu)
29{
30 gic_secondary_init(0);
31}
32
33static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle) 27static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle)
34{ 28{
35 highbank_set_cpu_jump(cpu, secondary_startup); 29 highbank_set_cpu_jump(cpu, secondary_startup);
@@ -67,7 +61,6 @@ static void __init highbank_smp_prepare_cpus(unsigned int max_cpus)
67struct smp_operations highbank_smp_ops __initdata = { 61struct smp_operations highbank_smp_ops __initdata = {
68 .smp_init_cpus = highbank_smp_init_cpus, 62 .smp_init_cpus = highbank_smp_init_cpus,
69 .smp_prepare_cpus = highbank_smp_prepare_cpus, 63 .smp_prepare_cpus = highbank_smp_prepare_cpus,
70 .smp_secondary_init = highbank_secondary_init,
71 .smp_boot_secondary = highbank_boot_secondary, 64 .smp_boot_secondary = highbank_boot_secondary,
72#ifdef CONFIG_HOTPLUG_CPU 65#ifdef CONFIG_HOTPLUG_CPU
73 .cpu_die = highbank_cpu_die, 66 .cpu_die = highbank_cpu_die,
diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c
index 7c0b03f67b05..77e9a25ed0f6 100644
--- a/arch/arm/mach-imx/platsmp.c
+++ b/arch/arm/mach-imx/platsmp.c
@@ -12,7 +12,6 @@
12 12
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/smp.h> 14#include <linux/smp.h>
15#include <linux/irqchip/arm-gic.h>
16#include <asm/page.h> 15#include <asm/page.h>
17#include <asm/smp_scu.h> 16#include <asm/smp_scu.h>
18#include <asm/mach/map.h> 17#include <asm/mach/map.h>
@@ -52,16 +51,6 @@ void imx_scu_standby_enable(void)
52 writel_relaxed(val, scu_base); 51 writel_relaxed(val, scu_base);
53} 52}
54 53
55static void __cpuinit imx_secondary_init(unsigned int cpu)
56{
57 /*
58 * if any interrupts are already enabled for the primary
59 * core (e.g. timer irq), then they will not have been enabled
60 * for us: do so
61 */
62 gic_secondary_init(0);
63}
64
65static int __cpuinit imx_boot_secondary(unsigned int cpu, struct task_struct *idle) 54static int __cpuinit imx_boot_secondary(unsigned int cpu, struct task_struct *idle)
66{ 55{
67 imx_set_cpu_jump(cpu, v7_secondary_startup); 56 imx_set_cpu_jump(cpu, v7_secondary_startup);
@@ -96,7 +85,6 @@ static void __init imx_smp_prepare_cpus(unsigned int max_cpus)
96struct smp_operations imx_smp_ops __initdata = { 85struct smp_operations imx_smp_ops __initdata = {
97 .smp_init_cpus = imx_smp_init_cpus, 86 .smp_init_cpus = imx_smp_init_cpus,
98 .smp_prepare_cpus = imx_smp_prepare_cpus, 87 .smp_prepare_cpus = imx_smp_prepare_cpus,
99 .smp_secondary_init = imx_secondary_init,
100 .smp_boot_secondary = imx_boot_secondary, 88 .smp_boot_secondary = imx_boot_secondary,
101#ifdef CONFIG_HOTPLUG_CPU 89#ifdef CONFIG_HOTPLUG_CPU
102 .cpu_die = imx_cpu_die, 90 .cpu_die = imx_cpu_die,
diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c
index 42932865416a..00cdb0a5dac8 100644
--- a/arch/arm/mach-msm/platsmp.c
+++ b/arch/arm/mach-msm/platsmp.c
@@ -15,7 +15,6 @@
15#include <linux/jiffies.h> 15#include <linux/jiffies.h>
16#include <linux/smp.h> 16#include <linux/smp.h>
17#include <linux/io.h> 17#include <linux/io.h>
18#include <linux/irqchip/arm-gic.h>
19 18
20#include <asm/cacheflush.h> 19#include <asm/cacheflush.h>
21#include <asm/cputype.h> 20#include <asm/cputype.h>
@@ -42,13 +41,6 @@ static inline int get_core_count(void)
42static void __cpuinit msm_secondary_init(unsigned int cpu) 41static void __cpuinit msm_secondary_init(unsigned int cpu)
43{ 42{
44 /* 43 /*
45 * if any interrupts are already enabled for the primary
46 * core (e.g. timer irq), then they will not have been enabled
47 * for us: do so
48 */
49 gic_secondary_init(0);
50
51 /*
52 * let the primary processor know we're out of the 44 * let the primary processor know we're out of the
53 * pen, then head off into the C entry point 45 * pen, then head off into the C entry point
54 */ 46 */
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c
index d9727218dd0a..e7a449758ab5 100644
--- a/arch/arm/mach-omap2/omap-smp.c
+++ b/arch/arm/mach-omap2/omap-smp.c
@@ -67,13 +67,6 @@ static void __cpuinit omap4_secondary_init(unsigned int cpu)
67 4, 0, 0, 0, 0, 0); 67 4, 0, 0, 0, 0, 0);
68 68
69 /* 69 /*
70 * If any interrupts are already enabled for the primary
71 * core (e.g. timer irq), then they will not have been enabled
72 * for us: do so
73 */
74 gic_secondary_init(0);
75
76 /*
77 * Synchronise with the boot thread. 70 * Synchronise with the boot thread.
78 */ 71 */
79 spin_lock(&boot_lock); 72 spin_lock(&boot_lock);
diff --git a/arch/arm/mach-prima2/platsmp.c b/arch/arm/mach-prima2/platsmp.c
index 4b788310f6a6..c7c92e78f0cf 100644
--- a/arch/arm/mach-prima2/platsmp.c
+++ b/arch/arm/mach-prima2/platsmp.c
@@ -11,7 +11,6 @@
11#include <linux/delay.h> 11#include <linux/delay.h>
12#include <linux/of.h> 12#include <linux/of.h>
13#include <linux/of_address.h> 13#include <linux/of_address.h>
14#include <linux/irqchip/arm-gic.h>
15#include <asm/page.h> 14#include <asm/page.h>
16#include <asm/mach/map.h> 15#include <asm/mach/map.h>
17#include <asm/smp_plat.h> 16#include <asm/smp_plat.h>
@@ -49,13 +48,6 @@ void __init sirfsoc_map_scu(void)
49static void __cpuinit sirfsoc_secondary_init(unsigned int cpu) 48static void __cpuinit sirfsoc_secondary_init(unsigned int cpu)
50{ 49{
51 /* 50 /*
52 * if any interrupts are already enabled for the primary
53 * core (e.g. timer irq), then they will not have been enabled
54 * for us: do so
55 */
56 gic_secondary_init(0);
57
58 /*
59 * let the primary processor know we're out of the 51 * let the primary processor know we're out of the
60 * pen, then head off into the C entry point 52 * pen, then head off into the C entry point
61 */ 53 */
diff --git a/arch/arm/mach-s3c24xx/irq.c b/arch/arm/mach-s3c24xx/irq.c
index cb9f5e011e73..b6fac28a0034 100644
--- a/arch/arm/mach-s3c24xx/irq.c
+++ b/arch/arm/mach-s3c24xx/irq.c
@@ -25,6 +25,7 @@
25#include <linux/ioport.h> 25#include <linux/ioport.h>
26#include <linux/device.h> 26#include <linux/device.h>
27#include <linux/irqdomain.h> 27#include <linux/irqdomain.h>
28#include <linux/irqchip/chained_irq.h>
28 29
29#include <asm/mach/irq.h> 30#include <asm/mach/irq.h>
30 31
diff --git a/arch/arm/mach-shmobile/smp-emev2.c b/arch/arm/mach-shmobile/smp-emev2.c
index 8225c16b371b..e38691b4d0dd 100644
--- a/arch/arm/mach-shmobile/smp-emev2.c
+++ b/arch/arm/mach-shmobile/smp-emev2.c
@@ -23,7 +23,6 @@
23#include <linux/spinlock.h> 23#include <linux/spinlock.h>
24#include <linux/io.h> 24#include <linux/io.h>
25#include <linux/delay.h> 25#include <linux/delay.h>
26#include <linux/irqchip/arm-gic.h>
27#include <mach/common.h> 26#include <mach/common.h>
28#include <mach/emev2.h> 27#include <mach/emev2.h>
29#include <asm/smp_plat.h> 28#include <asm/smp_plat.h>
@@ -31,11 +30,6 @@
31 30
32#define EMEV2_SCU_BASE 0x1e000000 31#define EMEV2_SCU_BASE 0x1e000000
33 32
34static void __cpuinit emev2_secondary_init(unsigned int cpu)
35{
36 gic_secondary_init(0);
37}
38
39static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle) 33static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
40{ 34{
41 arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu))); 35 arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu)));
@@ -69,6 +63,5 @@ static void __init emev2_smp_init_cpus(void)
69struct smp_operations emev2_smp_ops __initdata = { 63struct smp_operations emev2_smp_ops __initdata = {
70 .smp_init_cpus = emev2_smp_init_cpus, 64 .smp_init_cpus = emev2_smp_init_cpus,
71 .smp_prepare_cpus = emev2_smp_prepare_cpus, 65 .smp_prepare_cpus = emev2_smp_prepare_cpus,
72 .smp_secondary_init = emev2_secondary_init,
73 .smp_boot_secondary = emev2_boot_secondary, 66 .smp_boot_secondary = emev2_boot_secondary,
74}; 67};
diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c
index ea4535a5c4e2..a853bf182ed5 100644
--- a/arch/arm/mach-shmobile/smp-r8a7779.c
+++ b/arch/arm/mach-shmobile/smp-r8a7779.c
@@ -23,7 +23,6 @@
23#include <linux/spinlock.h> 23#include <linux/spinlock.h>
24#include <linux/io.h> 24#include <linux/io.h>
25#include <linux/delay.h> 25#include <linux/delay.h>
26#include <linux/irqchip/arm-gic.h>
27#include <mach/common.h> 26#include <mach/common.h>
28#include <mach/r8a7779.h> 27#include <mach/r8a7779.h>
29#include <asm/cacheflush.h> 28#include <asm/cacheflush.h>
@@ -82,11 +81,6 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu)
82 return ret ? ret : 1; 81 return ret ? ret : 1;
83} 82}
84 83
85static void __cpuinit r8a7779_secondary_init(unsigned int cpu)
86{
87 gic_secondary_init(0);
88}
89
90static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle) 84static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle)
91{ 85{
92 struct r8a7779_pm_ch *ch = NULL; 86 struct r8a7779_pm_ch *ch = NULL;
@@ -181,7 +175,6 @@ static int r8a7779_cpu_disable(unsigned int cpu)
181struct smp_operations r8a7779_smp_ops __initdata = { 175struct smp_operations r8a7779_smp_ops __initdata = {
182 .smp_init_cpus = r8a7779_smp_init_cpus, 176 .smp_init_cpus = r8a7779_smp_init_cpus,
183 .smp_prepare_cpus = r8a7779_smp_prepare_cpus, 177 .smp_prepare_cpus = r8a7779_smp_prepare_cpus,
184 .smp_secondary_init = r8a7779_secondary_init,
185 .smp_boot_secondary = r8a7779_boot_secondary, 178 .smp_boot_secondary = r8a7779_boot_secondary,
186#ifdef CONFIG_HOTPLUG_CPU 179#ifdef CONFIG_HOTPLUG_CPU
187 .cpu_kill = r8a7779_cpu_kill, 180 .cpu_kill = r8a7779_cpu_kill,
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c
index 5ae502b16437..bf79626ee5a4 100644
--- a/arch/arm/mach-shmobile/smp-sh73a0.c
+++ b/arch/arm/mach-shmobile/smp-sh73a0.c
@@ -23,7 +23,6 @@
23#include <linux/spinlock.h> 23#include <linux/spinlock.h>
24#include <linux/io.h> 24#include <linux/io.h>
25#include <linux/delay.h> 25#include <linux/delay.h>
26#include <linux/irqchip/arm-gic.h>
27#include <mach/common.h> 26#include <mach/common.h>
28#include <asm/cacheflush.h> 27#include <asm/cacheflush.h>
29#include <asm/smp_plat.h> 28#include <asm/smp_plat.h>
@@ -49,11 +48,6 @@ void __init sh73a0_register_twd(void)
49} 48}
50#endif 49#endif
51 50
52static void __cpuinit sh73a0_secondary_init(unsigned int cpu)
53{
54 gic_secondary_init(0);
55}
56
57static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle) 51static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle)
58{ 52{
59 cpu = cpu_logical_map(cpu); 53 cpu = cpu_logical_map(cpu);
@@ -134,7 +128,6 @@ static int sh73a0_cpu_disable(unsigned int cpu)
134struct smp_operations sh73a0_smp_ops __initdata = { 128struct smp_operations sh73a0_smp_ops __initdata = {
135 .smp_init_cpus = sh73a0_smp_init_cpus, 129 .smp_init_cpus = sh73a0_smp_init_cpus,
136 .smp_prepare_cpus = sh73a0_smp_prepare_cpus, 130 .smp_prepare_cpus = sh73a0_smp_prepare_cpus,
137 .smp_secondary_init = sh73a0_secondary_init,
138 .smp_boot_secondary = sh73a0_boot_secondary, 131 .smp_boot_secondary = sh73a0_boot_secondary,
139#ifdef CONFIG_HOTPLUG_CPU 132#ifdef CONFIG_HOTPLUG_CPU
140 .cpu_kill = sh73a0_cpu_kill, 133 .cpu_kill = sh73a0_cpu_kill,
diff --git a/arch/arm/mach-socfpga/platsmp.c b/arch/arm/mach-socfpga/platsmp.c
index b907fb986d9e..b51ce8c7929d 100644
--- a/arch/arm/mach-socfpga/platsmp.c
+++ b/arch/arm/mach-socfpga/platsmp.c
@@ -22,7 +22,6 @@
22#include <linux/io.h> 22#include <linux/io.h>
23#include <linux/of.h> 23#include <linux/of.h>
24#include <linux/of_address.h> 24#include <linux/of_address.h>
25#include <linux/irqchip/arm-gic.h>
26 25
27#include <asm/cacheflush.h> 26#include <asm/cacheflush.h>
28#include <asm/smp_scu.h> 27#include <asm/smp_scu.h>
@@ -30,16 +29,6 @@
30 29
31#include "core.h" 30#include "core.h"
32 31
33static void __cpuinit socfpga_secondary_init(unsigned int cpu)
34{
35 /*
36 * if any interrupts are already enabled for the primary
37 * core (e.g. timer irq), then they will not have been enabled
38 * for us: do so
39 */
40 gic_secondary_init(0);
41}
42
43static int __cpuinit socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle) 32static int __cpuinit socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
44{ 33{
45 int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; 34 int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
@@ -106,7 +95,6 @@ static void socfpga_cpu_die(unsigned int cpu)
106struct smp_operations socfpga_smp_ops __initdata = { 95struct smp_operations socfpga_smp_ops __initdata = {
107 .smp_init_cpus = socfpga_smp_init_cpus, 96 .smp_init_cpus = socfpga_smp_init_cpus,
108 .smp_prepare_cpus = socfpga_smp_prepare_cpus, 97 .smp_prepare_cpus = socfpga_smp_prepare_cpus,
109 .smp_secondary_init = socfpga_secondary_init,
110 .smp_boot_secondary = socfpga_boot_secondary, 98 .smp_boot_secondary = socfpga_boot_secondary,
111#ifdef CONFIG_HOTPLUG_CPU 99#ifdef CONFIG_HOTPLUG_CPU
112 .cpu_die = socfpga_cpu_die, 100 .cpu_die = socfpga_cpu_die,
diff --git a/arch/arm/mach-spear13xx/platsmp.c b/arch/arm/mach-spear13xx/platsmp.c
index af4ade61cd95..551c69c9a228 100644
--- a/arch/arm/mach-spear13xx/platsmp.c
+++ b/arch/arm/mach-spear13xx/platsmp.c
@@ -15,7 +15,6 @@
15#include <linux/jiffies.h> 15#include <linux/jiffies.h>
16#include <linux/io.h> 16#include <linux/io.h>
17#include <linux/smp.h> 17#include <linux/smp.h>
18#include <linux/irqchip/arm-gic.h>
19#include <asm/cacheflush.h> 18#include <asm/cacheflush.h>
20#include <asm/smp_scu.h> 19#include <asm/smp_scu.h>
21#include <mach/spear.h> 20#include <mach/spear.h>
@@ -28,13 +27,6 @@ static void __iomem *scu_base = IOMEM(VA_SCU_BASE);
28static void __cpuinit spear13xx_secondary_init(unsigned int cpu) 27static void __cpuinit spear13xx_secondary_init(unsigned int cpu)
29{ 28{
30 /* 29 /*
31 * if any interrupts are already enabled for the primary
32 * core (e.g. timer irq), then they will not have been enabled
33 * for us: do so
34 */
35 gic_secondary_init(0);
36
37 /*
38 * let the primary processor know we're out of the 30 * let the primary processor know we're out of the
39 * pen, then head off into the C entry point 31 * pen, then head off into the C entry point
40 */ 32 */
diff --git a/arch/arm/mach-tegra/platsmp.c b/arch/arm/mach-tegra/platsmp.c
index 516aab28fe34..0c4963bd4b44 100644
--- a/arch/arm/mach-tegra/platsmp.c
+++ b/arch/arm/mach-tegra/platsmp.c
@@ -18,7 +18,6 @@
18#include <linux/jiffies.h> 18#include <linux/jiffies.h>
19#include <linux/smp.h> 19#include <linux/smp.h>
20#include <linux/io.h> 20#include <linux/io.h>
21#include <linux/irqchip/arm-gic.h>
22#include <linux/clk/tegra.h> 21#include <linux/clk/tegra.h>
23 22
24#include <asm/cacheflush.h> 23#include <asm/cacheflush.h>
@@ -38,13 +37,6 @@ static cpumask_t tegra_cpu_init_mask;
38 37
39static void __cpuinit tegra_secondary_init(unsigned int cpu) 38static void __cpuinit tegra_secondary_init(unsigned int cpu)
40{ 39{
41 /*
42 * if any interrupts are already enabled for the primary
43 * core (e.g. timer irq), then they will not have been enabled
44 * for us: do so
45 */
46 gic_secondary_init(0);
47
48 cpumask_set_cpu(cpu, &tegra_cpu_init_mask); 40 cpumask_set_cpu(cpu, &tegra_cpu_init_mask);
49} 41}
50 42
diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c
index 18f7af339dc9..152b1309b9af 100644
--- a/arch/arm/mach-ux500/platsmp.c
+++ b/arch/arm/mach-ux500/platsmp.c
@@ -16,7 +16,6 @@
16#include <linux/device.h> 16#include <linux/device.h>
17#include <linux/smp.h> 17#include <linux/smp.h>
18#include <linux/io.h> 18#include <linux/io.h>
19#include <linux/irqchip/arm-gic.h>
20 19
21#include <asm/cacheflush.h> 20#include <asm/cacheflush.h>
22#include <asm/smp_plat.h> 21#include <asm/smp_plat.h>
@@ -58,13 +57,6 @@ static DEFINE_SPINLOCK(boot_lock);
58static void __cpuinit ux500_secondary_init(unsigned int cpu) 57static void __cpuinit ux500_secondary_init(unsigned int cpu)
59{ 58{
60 /* 59 /*
61 * if any interrupts are already enabled for the primary
62 * core (e.g. timer irq), then they will not have been enabled
63 * for us: do so
64 */
65 gic_secondary_init(0);
66
67 /*
68 * let the primary processor know we're out of the 60 * let the primary processor know we're out of the
69 * pen, then head off into the C entry point 61 * pen, then head off into the C entry point
70 */ 62 */
diff --git a/arch/arm/mach-virt/platsmp.c b/arch/arm/mach-virt/platsmp.c
index 8badaabe70a1..f4143f5bfa5b 100644
--- a/arch/arm/mach-virt/platsmp.c
+++ b/arch/arm/mach-virt/platsmp.c
@@ -21,8 +21,6 @@
21#include <linux/smp.h> 21#include <linux/smp.h>
22#include <linux/of.h> 22#include <linux/of.h>
23 23
24#include <linux/irqchip/arm-gic.h>
25
26#include <asm/psci.h> 24#include <asm/psci.h>
27#include <asm/smp_plat.h> 25#include <asm/smp_plat.h>
28 26
@@ -45,14 +43,8 @@ static int __cpuinit virt_boot_secondary(unsigned int cpu,
45 return -ENODEV; 43 return -ENODEV;
46} 44}
47 45
48static void __cpuinit virt_secondary_init(unsigned int cpu)
49{
50 gic_secondary_init(0);
51}
52
53struct smp_operations __initdata virt_smp_ops = { 46struct smp_operations __initdata virt_smp_ops = {
54 .smp_init_cpus = virt_smp_init_cpus, 47 .smp_init_cpus = virt_smp_init_cpus,
55 .smp_prepare_cpus = virt_smp_prepare_cpus, 48 .smp_prepare_cpus = virt_smp_prepare_cpus,
56 .smp_secondary_init = virt_secondary_init,
57 .smp_boot_secondary = virt_boot_secondary, 49 .smp_boot_secondary = virt_boot_secondary,
58}; 50};
diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c
index f980cf3d2baa..5d205e74e495 100644
--- a/arch/arm/plat-samsung/irq-vic-timer.c
+++ b/arch/arm/plat-samsung/irq-vic-timer.c
@@ -16,6 +16,7 @@
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/interrupt.h> 17#include <linux/interrupt.h>
18#include <linux/irq.h> 18#include <linux/irq.h>
19#include <linux/irqchip/chained_irq.h>
19#include <linux/io.h> 20#include <linux/io.h>
20 21
21#include <mach/map.h> 22#include <mach/map.h>
@@ -23,8 +24,6 @@
23#include <plat/irq-vic-timer.h> 24#include <plat/irq-vic-timer.h>
24#include <plat/regs-timer.h> 25#include <plat/regs-timer.h>
25 26
26#include <asm/mach/irq.h>
27
28static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc) 27static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc)
29{ 28{
30 struct irq_chip *chip = irq_get_chip(irq); 29 struct irq_chip *chip = irq_get_chip(irq);
diff --git a/arch/arm/plat-samsung/s5p-irq-gpioint.c b/arch/arm/plat-samsung/s5p-irq-gpioint.c
index bae56131a50a..fafdb059043a 100644
--- a/arch/arm/plat-samsung/s5p-irq-gpioint.c
+++ b/arch/arm/plat-samsung/s5p-irq-gpioint.c
@@ -14,6 +14,7 @@
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/interrupt.h> 15#include <linux/interrupt.h>
16#include <linux/irq.h> 16#include <linux/irq.h>
17#include <linux/irqchip/chained_irq.h>
17#include <linux/io.h> 18#include <linux/io.h>
18#include <linux/gpio.h> 19#include <linux/gpio.h>
19#include <linux/slab.h> 20#include <linux/slab.h>
@@ -22,8 +23,6 @@
22#include <plat/gpio-core.h> 23#include <plat/gpio-core.h>
23#include <plat/gpio-cfg.h> 24#include <plat/gpio-cfg.h>
24 25
25#include <asm/mach/irq.h>
26
27#define GPIO_BASE(chip) ((void __iomem *)((unsigned long)((chip)->base) & 0xFFFFF000u)) 26#define GPIO_BASE(chip) ((void __iomem *)((unsigned long)((chip)->base) & 0xFFFFF000u))
28 27
29#define CON_OFFSET 0x700 28#define CON_OFFSET 0x700
diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c
index f2ac15561778..1e1b2d769748 100644
--- a/arch/arm/plat-versatile/platsmp.c
+++ b/arch/arm/plat-versatile/platsmp.c
@@ -14,7 +14,6 @@
14#include <linux/device.h> 14#include <linux/device.h>
15#include <linux/jiffies.h> 15#include <linux/jiffies.h>
16#include <linux/smp.h> 16#include <linux/smp.h>
17#include <linux/irqchip/arm-gic.h>
18 17
19#include <asm/cacheflush.h> 18#include <asm/cacheflush.h>
20#include <asm/smp_plat.h> 19#include <asm/smp_plat.h>
@@ -37,13 +36,6 @@ static DEFINE_SPINLOCK(boot_lock);
37void __cpuinit versatile_secondary_init(unsigned int cpu) 36void __cpuinit versatile_secondary_init(unsigned int cpu)
38{ 37{
39 /* 38 /*
40 * if any interrupts are already enabled for the primary
41 * core (e.g. timer irq), then they will not have been enabled
42 * for us: do so
43 */
44 gic_secondary_init(0);
45
46 /*
47 * let the primary processor know we're out of the 39 * let the primary processor know we're out of the
48 * pen, then head off into the C entry point 40 * pen, then head off into the C entry point
49 */ 41 */
diff --git a/drivers/gpio/gpio-msm-v2.c b/drivers/gpio/gpio-msm-v2.c
index 55a7e7769af6..dd2eddeb1e0c 100644
--- a/drivers/gpio/gpio-msm-v2.c
+++ b/drivers/gpio/gpio-msm-v2.c
@@ -23,13 +23,12 @@
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/interrupt.h> 24#include <linux/interrupt.h>
25#include <linux/io.h> 25#include <linux/io.h>
26#include <linux/irqchip/chained_irq.h>
26#include <linux/irq.h> 27#include <linux/irq.h>
27#include <linux/module.h> 28#include <linux/module.h>
28#include <linux/platform_device.h> 29#include <linux/platform_device.h>
29#include <linux/spinlock.h> 30#include <linux/spinlock.h>
30 31
31#include <asm/mach/irq.h>
32
33#include <mach/msm_gpiomux.h> 32#include <mach/msm_gpiomux.h>
34#include <mach/msm_iomap.h> 33#include <mach/msm_iomap.h>
35 34
diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c
index 7877335c4cc8..7176743915d3 100644
--- a/drivers/gpio/gpio-mxc.c
+++ b/drivers/gpio/gpio-mxc.c
@@ -24,6 +24,7 @@
24#include <linux/io.h> 24#include <linux/io.h>
25#include <linux/irq.h> 25#include <linux/irq.h>
26#include <linux/irqdomain.h> 26#include <linux/irqdomain.h>
27#include <linux/irqchip/chained_irq.h>
27#include <linux/gpio.h> 28#include <linux/gpio.h>
28#include <linux/platform_device.h> 29#include <linux/platform_device.h>
29#include <linux/slab.h> 30#include <linux/slab.h>
@@ -32,7 +33,6 @@
32#include <linux/of_device.h> 33#include <linux/of_device.h>
33#include <linux/module.h> 34#include <linux/module.h>
34#include <asm-generic/bug.h> 35#include <asm-generic/bug.h>
35#include <asm/mach/irq.h>
36 36
37enum mxc_gpio_hwtype { 37enum mxc_gpio_hwtype {
38 IMX1_GPIO, /* runs on i.mx1 */ 38 IMX1_GPIO, /* runs on i.mx1 */
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 159f5c57eb45..a612ea1c53cb 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -25,11 +25,10 @@
25#include <linux/of.h> 25#include <linux/of.h>
26#include <linux/of_device.h> 26#include <linux/of_device.h>
27#include <linux/irqdomain.h> 27#include <linux/irqdomain.h>
28#include <linux/irqchip/chained_irq.h>
28#include <linux/gpio.h> 29#include <linux/gpio.h>
29#include <linux/platform_data/gpio-omap.h> 30#include <linux/platform_data/gpio-omap.h>
30 31
31#include <asm/mach/irq.h>
32
33#define OFF_MODE 1 32#define OFF_MODE 1
34 33
35static LIST_HEAD(omap_gpio_list); 34static LIST_HEAD(omap_gpio_list);
diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c
index b820869ca93c..29763361d13c 100644
--- a/drivers/gpio/gpio-pl061.c
+++ b/drivers/gpio/gpio-pl061.c
@@ -15,6 +15,7 @@
15#include <linux/io.h> 15#include <linux/io.h>
16#include <linux/ioport.h> 16#include <linux/ioport.h>
17#include <linux/irq.h> 17#include <linux/irq.h>
18#include <linux/irqchip/chained_irq.h>
18#include <linux/bitops.h> 19#include <linux/bitops.h>
19#include <linux/workqueue.h> 20#include <linux/workqueue.h>
20#include <linux/gpio.h> 21#include <linux/gpio.h>
@@ -23,7 +24,6 @@
23#include <linux/amba/pl061.h> 24#include <linux/amba/pl061.h>
24#include <linux/slab.h> 25#include <linux/slab.h>
25#include <linux/pm.h> 26#include <linux/pm.h>
26#include <asm/mach/irq.h>
27 27
28#define GPIODIR 0x400 28#define GPIODIR 0x400
29#define GPIOIS 0x404 29#define GPIOIS 0x404
diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c
index 9cc108d2b770..7523b6d108d0 100644
--- a/drivers/gpio/gpio-pxa.c
+++ b/drivers/gpio/gpio-pxa.c
@@ -19,6 +19,7 @@
19#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/irq.h> 20#include <linux/irq.h>
21#include <linux/irqdomain.h> 21#include <linux/irqdomain.h>
22#include <linux/irqchip/chained_irq.h>
22#include <linux/io.h> 23#include <linux/io.h>
23#include <linux/of.h> 24#include <linux/of.h>
24#include <linux/of_device.h> 25#include <linux/of_device.h>
@@ -26,8 +27,6 @@
26#include <linux/syscore_ops.h> 27#include <linux/syscore_ops.h>
27#include <linux/slab.h> 28#include <linux/slab.h>
28 29
29#include <asm/mach/irq.h>
30
31#include <mach/irqs.h> 30#include <mach/irqs.h>
32 31
33/* 32/*
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c
index e3956359202c..dde0656ea951 100644
--- a/drivers/gpio/gpio-tegra.c
+++ b/drivers/gpio/gpio-tegra.c
@@ -27,11 +27,10 @@
27#include <linux/platform_device.h> 27#include <linux/platform_device.h>
28#include <linux/module.h> 28#include <linux/module.h>
29#include <linux/irqdomain.h> 29#include <linux/irqdomain.h>
30#include <linux/irqchip/chained_irq.h>
30#include <linux/pinctrl/consumer.h> 31#include <linux/pinctrl/consumer.h>
31#include <linux/pm.h> 32#include <linux/pm.h>
32 33
33#include <asm/mach/irq.h>
34
35#define GPIO_BANK(x) ((x) >> 5) 34#define GPIO_BANK(x) ((x) >> 5)
36#define GPIO_PORT(x) (((x) >> 3) & 0x3) 35#define GPIO_PORT(x) (((x) >> 3) & 0x3)
37#define GPIO_BIT(x) ((x) & 0x7) 36#define GPIO_BIT(x) ((x) & 0x7)
diff --git a/drivers/irqchip/exynos-combiner.c b/drivers/irqchip/exynos-combiner.c
index 04d86a9803f4..6a5201351507 100644
--- a/drivers/irqchip/exynos-combiner.c
+++ b/drivers/irqchip/exynos-combiner.c
@@ -13,6 +13,7 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/io.h> 14#include <linux/io.h>
15#include <linux/irqdomain.h> 15#include <linux/irqdomain.h>
16#include <linux/irqchip/chained_irq.h>
16#include <linux/of_address.h> 17#include <linux/of_address.h>
17#include <linux/of_irq.h> 18#include <linux/of_irq.h>
18#include <asm/mach/irq.h> 19#include <asm/mach/irq.h>
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index a32e0d5aa45f..add1fd84fc4b 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -28,6 +28,7 @@
28#include <linux/module.h> 28#include <linux/module.h>
29#include <linux/list.h> 29#include <linux/list.h>
30#include <linux/smp.h> 30#include <linux/smp.h>
31#include <linux/cpu.h>
31#include <linux/cpu_pm.h> 32#include <linux/cpu_pm.h>
32#include <linux/cpumask.h> 33#include <linux/cpumask.h>
33#include <linux/io.h> 34#include <linux/io.h>
@@ -38,12 +39,12 @@
38#include <linux/interrupt.h> 39#include <linux/interrupt.h>
39#include <linux/percpu.h> 40#include <linux/percpu.h>
40#include <linux/slab.h> 41#include <linux/slab.h>
42#include <linux/irqchip/chained_irq.h>
41#include <linux/irqchip/arm-gic.h> 43#include <linux/irqchip/arm-gic.h>
42 44
43#include <asm/irq.h> 45#include <asm/irq.h>
44#include <asm/exception.h> 46#include <asm/exception.h>
45#include <asm/smp_plat.h> 47#include <asm/smp_plat.h>
46#include <asm/mach/irq.h>
47 48
48#include "irqchip.h" 49#include "irqchip.h"
49 50
@@ -323,7 +324,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
323 324
324 cascade_irq = irq_find_mapping(chip_data->domain, gic_irq); 325 cascade_irq = irq_find_mapping(chip_data->domain, gic_irq);
325 if (unlikely(gic_irq < 32 || gic_irq > 1020)) 326 if (unlikely(gic_irq < 32 || gic_irq > 1020))
326 do_bad_IRQ(cascade_irq, desc); 327 handle_bad_irq(cascade_irq, desc);
327 else 328 else
328 generic_handle_irq(cascade_irq); 329 generic_handle_irq(cascade_irq);
329 330
@@ -699,6 +700,25 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
699 return 0; 700 return 0;
700} 701}
701 702
703#ifdef CONFIG_SMP
704static int __cpuinit gic_secondary_init(struct notifier_block *nfb,
705 unsigned long action, void *hcpu)
706{
707 if (action == CPU_STARTING)
708 gic_cpu_init(&gic_data[0]);
709 return NOTIFY_OK;
710}
711
712/*
713 * Notifier for enabling the GIC CPU interface. Set an arbitrarily high
714 * priority because the GIC needs to be up before the ARM generic timers.
715 */
716static struct notifier_block __cpuinitdata gic_cpu_notifier = {
717 .notifier_call = gic_secondary_init,
718 .priority = 100,
719};
720#endif
721
702const struct irq_domain_ops gic_irq_domain_ops = { 722const struct irq_domain_ops gic_irq_domain_ops = {
703 .map = gic_irq_domain_map, 723 .map = gic_irq_domain_map,
704 .xlate = gic_irq_domain_xlate, 724 .xlate = gic_irq_domain_xlate,
@@ -789,6 +809,7 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
789 809
790#ifdef CONFIG_SMP 810#ifdef CONFIG_SMP
791 set_smp_cross_call(gic_raise_softirq); 811 set_smp_cross_call(gic_raise_softirq);
812 register_cpu_notifier(&gic_cpu_notifier);
792#endif 813#endif
793 814
794 set_handle_irq(gic_handle_irq); 815 set_handle_irq(gic_handle_irq);
@@ -799,13 +820,6 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
799 gic_pm_init(gic); 820 gic_pm_init(gic);
800} 821}
801 822
802void __cpuinit gic_secondary_init(unsigned int gic_nr)
803{
804 BUG_ON(gic_nr >= MAX_GIC_NR);
805
806 gic_cpu_init(&gic_data[gic_nr]);
807}
808
809#ifdef CONFIG_OF 823#ifdef CONFIG_OF
810static int gic_cnt __initdata = 0; 824static int gic_cnt __initdata = 0;
811 825
diff --git a/drivers/irqchip/irq-vic.c b/drivers/irqchip/irq-vic.c
index 3cf97aaebe40..884d11c7355f 100644
--- a/drivers/irqchip/irq-vic.c
+++ b/drivers/irqchip/irq-vic.c
@@ -23,6 +23,7 @@
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/list.h> 24#include <linux/list.h>
25#include <linux/io.h> 25#include <linux/io.h>
26#include <linux/irq.h>
26#include <linux/irqdomain.h> 27#include <linux/irqdomain.h>
27#include <linux/of.h> 28#include <linux/of.h>
28#include <linux/of_address.h> 29#include <linux/of_address.h>
@@ -33,7 +34,7 @@
33#include <linux/irqchip/arm-vic.h> 34#include <linux/irqchip/arm-vic.h>
34 35
35#include <asm/exception.h> 36#include <asm/exception.h>
36#include <asm/mach/irq.h> 37#include <asm/irq.h>
37 38
38#include "irqchip.h" 39#include "irqchip.h"
39 40
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index efb7f10e902a..b141a28473b5 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -18,6 +18,7 @@
18#include <linux/interrupt.h> 18#include <linux/interrupt.h>
19#include <linux/irq.h> 19#include <linux/irq.h>
20#include <linux/irqdomain.h> 20#include <linux/irqdomain.h>
21#include <linux/irqchip/chained_irq.h>
21#include <linux/io.h> 22#include <linux/io.h>
22#include <linux/gpio.h> 23#include <linux/gpio.h>
23#include <linux/pinctrl/machine.h> 24#include <linux/pinctrl/machine.h>
@@ -27,8 +28,6 @@
27/* Since we request GPIOs from ourself */ 28/* Since we request GPIOs from ourself */
28#include <linux/pinctrl/consumer.h> 29#include <linux/pinctrl/consumer.h>
29 30
30#include <asm/mach/irq.h>
31
32#include <mach/hardware.h> 31#include <mach/hardware.h>
33#include <mach/at91_pio.h> 32#include <mach/at91_pio.h>
34 33
diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c
index 538b9ddaadf7..7265e551dddb 100644
--- a/drivers/pinctrl/pinctrl-exynos.c
+++ b/drivers/pinctrl/pinctrl-exynos.c
@@ -23,13 +23,12 @@
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/irqdomain.h> 24#include <linux/irqdomain.h>
25#include <linux/irq.h> 25#include <linux/irq.h>
26#include <linux/irqchip/chained_irq.h>
26#include <linux/of_irq.h> 27#include <linux/of_irq.h>
27#include <linux/io.h> 28#include <linux/io.h>
28#include <linux/slab.h> 29#include <linux/slab.h>
29#include <linux/err.h> 30#include <linux/err.h>
30 31
31#include <asm/mach/irq.h>
32
33#include "pinctrl-samsung.h" 32#include "pinctrl-samsung.h"
34#include "pinctrl-exynos.h" 33#include "pinctrl-exynos.h"
35 34
diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c
index 36d20293de5c..93eba9715e62 100644
--- a/drivers/pinctrl/pinctrl-nomadik.c
+++ b/drivers/pinctrl/pinctrl-nomadik.c
@@ -23,6 +23,7 @@
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/irq.h> 24#include <linux/irq.h>
25#include <linux/irqdomain.h> 25#include <linux/irqdomain.h>
26#include <linux/irqchip/chained_irq.h>
26#include <linux/slab.h> 27#include <linux/slab.h>
27#include <linux/of_device.h> 28#include <linux/of_device.h>
28#include <linux/of_address.h> 29#include <linux/of_address.h>
@@ -33,7 +34,6 @@
33/* Since we request GPIOs from ourself */ 34/* Since we request GPIOs from ourself */
34#include <linux/pinctrl/consumer.h> 35#include <linux/pinctrl/consumer.h>
35#include <linux/platform_data/pinctrl-nomadik.h> 36#include <linux/platform_data/pinctrl-nomadik.h>
36#include <asm/mach/irq.h>
37#include "pinctrl-nomadik.h" 37#include "pinctrl-nomadik.h"
38#include "core.h" 38#include "core.h"
39 39
diff --git a/drivers/pinctrl/pinctrl-sirf.c b/drivers/pinctrl/pinctrl-sirf.c
index d02498b30c6e..ab26b4b669d5 100644
--- a/drivers/pinctrl/pinctrl-sirf.c
+++ b/drivers/pinctrl/pinctrl-sirf.c
@@ -14,6 +14,7 @@
14#include <linux/slab.h> 14#include <linux/slab.h>
15#include <linux/err.h> 15#include <linux/err.h>
16#include <linux/irqdomain.h> 16#include <linux/irqdomain.h>
17#include <linux/irqchip/chained_irq.h>
17#include <linux/pinctrl/pinctrl.h> 18#include <linux/pinctrl/pinctrl.h>
18#include <linux/pinctrl/pinmux.h> 19#include <linux/pinctrl/pinmux.h>
19#include <linux/pinctrl/consumer.h> 20#include <linux/pinctrl/consumer.h>
@@ -25,7 +26,6 @@
25#include <linux/bitops.h> 26#include <linux/bitops.h>
26#include <linux/gpio.h> 27#include <linux/gpio.h>
27#include <linux/of_gpio.h> 28#include <linux/of_gpio.h>
28#include <asm/mach/irq.h>
29 29
30#define DRIVER_NAME "pinmux-sirf" 30#define DRIVER_NAME "pinmux-sirf"
31 31
diff --git a/drivers/pinctrl/spear/pinctrl-plgpio.c b/drivers/pinctrl/spear/pinctrl-plgpio.c
index 295b349a05cf..a4908ecd74fb 100644
--- a/drivers/pinctrl/spear/pinctrl-plgpio.c
+++ b/drivers/pinctrl/spear/pinctrl-plgpio.c
@@ -15,12 +15,12 @@
15#include <linux/io.h> 15#include <linux/io.h>
16#include <linux/irq.h> 16#include <linux/irq.h>
17#include <linux/irqdomain.h> 17#include <linux/irqdomain.h>
18#include <linux/irqchip/chained_irq.h>
18#include <linux/module.h> 19#include <linux/module.h>
19#include <linux/pinctrl/consumer.h> 20#include <linux/pinctrl/consumer.h>
20#include <linux/platform_device.h> 21#include <linux/platform_device.h>
21#include <linux/pm.h> 22#include <linux/pm.h>
22#include <linux/spinlock.h> 23#include <linux/spinlock.h>
23#include <asm/mach/irq.h>
24 24
25#define MAX_GPIO_PER_REG 32 25#define MAX_GPIO_PER_REG 32
26#define PIN_OFFSET(pin) (pin % MAX_GPIO_PER_REG) 26#define PIN_OFFSET(pin) (pin % MAX_GPIO_PER_REG)
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c
index 366f259e3756..6efe4e1b499f 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c
+++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c
@@ -25,8 +25,8 @@
25#include <linux/clk.h> 25#include <linux/clk.h>
26#include <linux/list.h> 26#include <linux/list.h>
27#include <linux/irq.h> 27#include <linux/irq.h>
28#include <linux/irqchip/chained_irq.h>
28#include <linux/of_device.h> 29#include <linux/of_device.h>
29#include <asm/mach/irq.h>
30 30
31#include "imx-ipu-v3.h" 31#include "imx-ipu-v3.h"
32#include "ipu-prv.h" 32#include "ipu-prv.h"
diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h
index 3fd8e4290a1c..3e203eb23cc7 100644
--- a/include/linux/irqchip/arm-gic.h
+++ b/include/linux/irqchip/arm-gic.h
@@ -65,7 +65,6 @@ extern struct irq_chip gic_arch_extn;
65 65
66void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, 66void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *,
67 u32 offset, struct device_node *); 67 u32 offset, struct device_node *);
68void gic_secondary_init(unsigned int);
69void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); 68void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
70 69
71static inline void gic_init(unsigned int nr, int start, 70static inline void gic_init(unsigned int nr, int start,
diff --git a/include/linux/irqchip/chained_irq.h b/include/linux/irqchip/chained_irq.h
new file mode 100644
index 000000000000..adf4c30f3af6
--- /dev/null
+++ b/include/linux/irqchip/chained_irq.h
@@ -0,0 +1,52 @@
1/*
2 * Chained IRQ handlers support.
3 *
4 * Copyright (C) 2011 ARM Ltd.
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18#ifndef __IRQCHIP_CHAINED_IRQ_H
19#define __IRQCHIP_CHAINED_IRQ_H
20
21#include <linux/irq.h>
22
23/*
24 * Entry/exit functions for chained handlers where the primary IRQ chip
25 * may implement either fasteoi or level-trigger flow control.
26 */
27static inline void chained_irq_enter(struct irq_chip *chip,
28 struct irq_desc *desc)
29{
30 /* FastEOI controllers require no action on entry. */
31 if (chip->irq_eoi)
32 return;
33
34 if (chip->irq_mask_ack) {
35 chip->irq_mask_ack(&desc->irq_data);
36 } else {
37 chip->irq_mask(&desc->irq_data);
38 if (chip->irq_ack)
39 chip->irq_ack(&desc->irq_data);
40 }
41}
42
43static inline void chained_irq_exit(struct irq_chip *chip,
44 struct irq_desc *desc)
45{
46 if (chip->irq_eoi)
47 chip->irq_eoi(&desc->irq_data);
48 else
49 chip->irq_unmask(&desc->irq_data);
50}
51
52#endif /* __IRQCHIP_CHAINED_IRQ_H */