diff options
40 files changed, 100 insertions, 210 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 *); | |||
30 | void handle_IRQ(unsigned int, struct pt_regs *); | 30 | void handle_IRQ(unsigned int, struct pt_regs *); |
31 | void init_IRQ(void); | 31 | void init_IRQ(void); |
32 | 32 | ||
33 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
34 | extern void (*handle_arch_irq)(struct pt_regs *); | ||
35 | extern 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; | |||
20 | extern void init_FIQ(int); | 20 | extern void init_FIQ(int); |
21 | extern int show_fiq_list(struct seq_file *, int); | 21 | extern int show_fiq_list(struct seq_file *, int); |
22 | 22 | ||
23 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
24 | extern void (*handle_arch_irq)(struct pt_regs *); | ||
25 | extern 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 | */ | ||
43 | static 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 | |||
59 | static 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 d63d399c7bae..7bc0f9aa8b33 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); | |||
76 | static void __cpuinit exynos_secondary_init(unsigned int cpu) | 75 | static 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 | ||
26 | extern void secondary_startup(void); | 25 | extern void secondary_startup(void); |
27 | 26 | ||
28 | static void __cpuinit highbank_secondary_init(unsigned int cpu) | ||
29 | { | ||
30 | gic_secondary_init(0); | ||
31 | } | ||
32 | |||
33 | static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle) | 27 | static 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) | |||
67 | struct smp_operations highbank_smp_ops __initdata = { | 61 | struct 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 | ||
55 | static 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 | |||
65 | static int __cpuinit imx_boot_secondary(unsigned int cpu, struct task_struct *idle) | 54 | static 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) | |||
96 | struct smp_operations imx_smp_ops __initdata = { | 85 | struct 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) | |||
42 | static void __cpuinit msm_secondary_init(unsigned int cpu) | 41 | static 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) | |||
49 | static void __cpuinit sirfsoc_secondary_init(unsigned int cpu) | 48 | static 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 | ||
34 | static void __cpuinit emev2_secondary_init(unsigned int cpu) | ||
35 | { | ||
36 | gic_secondary_init(0); | ||
37 | } | ||
38 | |||
39 | static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle) | 33 | static 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) | |||
69 | struct smp_operations emev2_smp_ops __initdata = { | 63 | struct 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 | ||
85 | static void __cpuinit r8a7779_secondary_init(unsigned int cpu) | ||
86 | { | ||
87 | gic_secondary_init(0); | ||
88 | } | ||
89 | |||
90 | static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle) | 84 | static 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) | |||
181 | struct smp_operations r8a7779_smp_ops __initdata = { | 175 | struct 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 | ||
52 | static void __cpuinit sh73a0_secondary_init(unsigned int cpu) | ||
53 | { | ||
54 | gic_secondary_init(0); | ||
55 | } | ||
56 | |||
57 | static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle) | 51 | static 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) | |||
134 | struct smp_operations sh73a0_smp_ops __initdata = { | 128 | struct 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 84c60fa8daa0..ca14d1d5ac7f 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> |
@@ -33,16 +32,6 @@ | |||
33 | extern void __iomem *sys_manager_base_addr; | 32 | extern void __iomem *sys_manager_base_addr; |
34 | extern void __iomem *rst_manager_base_addr; | 33 | extern void __iomem *rst_manager_base_addr; |
35 | 34 | ||
36 | static void __cpuinit socfpga_secondary_init(unsigned int cpu) | ||
37 | { | ||
38 | /* | ||
39 | * if any interrupts are already enabled for the primary | ||
40 | * core (e.g. timer irq), then they will not have been enabled | ||
41 | * for us: do so | ||
42 | */ | ||
43 | gic_secondary_init(0); | ||
44 | } | ||
45 | |||
46 | static int __cpuinit socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle) | 35 | static int __cpuinit socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle) |
47 | { | 36 | { |
48 | int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; | 37 | int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; |
@@ -109,7 +98,6 @@ static void socfpga_cpu_die(unsigned int cpu) | |||
109 | struct smp_operations socfpga_smp_ops __initdata = { | 98 | struct smp_operations socfpga_smp_ops __initdata = { |
110 | .smp_init_cpus = socfpga_smp_init_cpus, | 99 | .smp_init_cpus = socfpga_smp_init_cpus, |
111 | .smp_prepare_cpus = socfpga_smp_prepare_cpus, | 100 | .smp_prepare_cpus = socfpga_smp_prepare_cpus, |
112 | .smp_secondary_init = socfpga_secondary_init, | ||
113 | .smp_boot_secondary = socfpga_boot_secondary, | 101 | .smp_boot_secondary = socfpga_boot_secondary, |
114 | #ifdef CONFIG_HOTPLUG_CPU | 102 | #ifdef CONFIG_HOTPLUG_CPU |
115 | .cpu_die = socfpga_cpu_die, | 103 | .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); | |||
28 | static void __cpuinit spear13xx_secondary_init(unsigned int cpu) | 27 | static 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 2c6b3d55213b..9348d3c496a9 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> |
@@ -44,13 +43,6 @@ static cpumask_t tegra_cpu_init_mask; | |||
44 | 43 | ||
45 | static void __cpuinit tegra_secondary_init(unsigned int cpu) | 44 | static void __cpuinit tegra_secondary_init(unsigned int cpu) |
46 | { | 45 | { |
47 | /* | ||
48 | * if any interrupts are already enabled for the primary | ||
49 | * core (e.g. timer irq), then they will not have been enabled | ||
50 | * for us: do so | ||
51 | */ | ||
52 | gic_secondary_init(0); | ||
53 | |||
54 | cpumask_set_cpu(cpu, &tegra_cpu_init_mask); | 46 | cpumask_set_cpu(cpu, &tegra_cpu_init_mask); |
55 | } | 47 | } |
56 | 48 | ||
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); | |||
58 | static void __cpuinit ux500_secondary_init(unsigned int cpu) | 57 | static 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 | ||
48 | static void __cpuinit virt_secondary_init(unsigned int cpu) | ||
49 | { | ||
50 | gic_secondary_init(0); | ||
51 | } | ||
52 | |||
53 | struct smp_operations __initdata virt_smp_ops = { | 46 | struct 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/mach-zynq/platsmp.c b/arch/arm/mach-zynq/platsmp.c index 3072cbd7ec6f..5fc167e07619 100644 --- a/arch/arm/mach-zynq/platsmp.c +++ b/arch/arm/mach-zynq/platsmp.c | |||
@@ -34,21 +34,6 @@ | |||
34 | */ | 34 | */ |
35 | static int ncores; | 35 | static int ncores; |
36 | 36 | ||
37 | /* Secondary CPU kernel startup is a 2 step process. The primary CPU | ||
38 | * starts the secondary CPU by giving it the address of the kernel and | ||
39 | * then sending it an event to wake it up. The secondary CPU then | ||
40 | * starts the kernel and tells the primary CPU it's up and running. | ||
41 | */ | ||
42 | static void __cpuinit zynq_secondary_init(unsigned int cpu) | ||
43 | { | ||
44 | /* | ||
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 | int __cpuinit zynq_cpun_start(u32 address, int cpu) | 37 | int __cpuinit zynq_cpun_start(u32 address, int cpu) |
53 | { | 38 | { |
54 | u32 trampoline_code_size = &zynq_secondary_trampoline_end - | 39 | u32 trampoline_code_size = &zynq_secondary_trampoline_end - |
@@ -144,7 +129,6 @@ static void __init zynq_smp_prepare_cpus(unsigned int max_cpus) | |||
144 | struct smp_operations zynq_smp_ops __initdata = { | 129 | struct smp_operations zynq_smp_ops __initdata = { |
145 | .smp_init_cpus = zynq_smp_init_cpus, | 130 | .smp_init_cpus = zynq_smp_init_cpus, |
146 | .smp_prepare_cpus = zynq_smp_prepare_cpus, | 131 | .smp_prepare_cpus = zynq_smp_prepare_cpus, |
147 | .smp_secondary_init = zynq_secondary_init, | ||
148 | .smp_boot_secondary = zynq_boot_secondary, | 132 | .smp_boot_secondary = zynq_boot_secondary, |
149 | #ifdef CONFIG_HOTPLUG_CPU | 133 | #ifdef CONFIG_HOTPLUG_CPU |
150 | .cpu_die = zynq_platform_cpu_die, | 134 | .cpu_die = zynq_platform_cpu_die, |
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 | |||
28 | static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc) | 27 | static 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); | |||
37 | void __cpuinit versatile_secondary_init(unsigned int cpu) | 36 | void __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 | ||
37 | enum mxc_gpio_hwtype { | 37 | enum 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 | ||
35 | static LIST_HEAD(omap_gpio_list); | 34 | static LIST_HEAD(omap_gpio_list); |
diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c index 06ed257c5d31..5c06f3062599 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/irqdomain.h> | 19 | #include <linux/irqdomain.h> |
19 | #include <linux/bitops.h> | 20 | #include <linux/bitops.h> |
20 | #include <linux/workqueue.h> | 21 | #include <linux/workqueue.h> |
@@ -25,7 +26,6 @@ | |||
25 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
26 | #include <linux/pinctrl/consumer.h> | 27 | #include <linux/pinctrl/consumer.h> |
27 | #include <linux/pm.h> | 28 | #include <linux/pm.h> |
28 | #include <asm/mach/irq.h> | ||
29 | 29 | ||
30 | #define GPIODIR 0x400 | 30 | #define GPIODIR 0x400 |
31 | #define GPIOIS 0x404 | 31 | #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 414ad912232f..8e2155548888 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 | ||
704 | static 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 | */ | ||
716 | static struct notifier_block __cpuinitdata gic_cpu_notifier = { | ||
717 | .notifier_call = gic_secondary_init, | ||
718 | .priority = 100, | ||
719 | }; | ||
720 | #endif | ||
721 | |||
702 | const struct irq_domain_ops gic_irq_domain_ops = { | 722 | const 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 | ||
802 | void __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 |
810 | static int gic_cnt __initdata = 0; | 824 | static 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 bddd1dd9efdf..49bdc4410075 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 2328baaa86bf..3fc8b9941963 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 0990a721758e..08582fecdf1b 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 | ||
66 | void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, | 66 | void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, |
67 | u32 offset, struct device_node *); | 67 | u32 offset, struct device_node *); |
68 | void gic_secondary_init(unsigned int); | ||
69 | void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); | 68 | void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); |
70 | 69 | ||
71 | static inline void gic_init(unsigned int nr, int start, | 70 | static 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 | */ | ||
27 | static 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 | |||
43 | static 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 */ | ||