diff options
-rw-r--r-- | arch/arm/Kconfig | 5 | ||||
-rw-r--r-- | arch/arm/include/asm/mach/arch.h | 3 | ||||
-rw-r--r-- | arch/arm/include/asm/mach/irq.h | 4 | ||||
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 17 | ||||
-rw-r--r-- | arch/arm/kernel/setup.c | 3 |
5 files changed, 30 insertions, 2 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index fd0e21be5e44..47694865018c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1022,6 +1022,11 @@ config CPU_HAS_PMU | |||
1022 | default y | 1022 | default y |
1023 | bool | 1023 | bool |
1024 | 1024 | ||
1025 | config MULTI_IRQ_HANDLER | ||
1026 | bool | ||
1027 | help | ||
1028 | Allow each machine to specify it's own IRQ handler at run time. | ||
1029 | |||
1025 | if !MMU | 1030 | if !MMU |
1026 | source "arch/arm/Kconfig-nommu" | 1031 | source "arch/arm/Kconfig-nommu" |
1027 | endif | 1032 | endif |
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index d97a964207fa..7d55356110d4 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
@@ -40,6 +40,9 @@ struct machine_desc { | |||
40 | void (*init_irq)(void); | 40 | void (*init_irq)(void); |
41 | struct sys_timer *timer; /* system tick timer */ | 41 | struct sys_timer *timer; /* system tick timer */ |
42 | void (*init_machine)(void); | 42 | void (*init_machine)(void); |
43 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
44 | void (*handle_irq)(struct pt_regs *); | ||
45 | #endif | ||
43 | }; | 46 | }; |
44 | 47 | ||
45 | /* | 48 | /* |
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index ce3eee9fe26c..6ecdad9a5c42 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h | |||
@@ -22,6 +22,10 @@ extern void (*init_arch_irq)(void); | |||
22 | extern void init_FIQ(void); | 22 | extern void init_FIQ(void); |
23 | extern int show_fiq_list(struct seq_file *, void *); | 23 | extern int show_fiq_list(struct seq_file *, void *); |
24 | 24 | ||
25 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
26 | extern void (*handle_arch_irq)(struct pt_regs *); | ||
27 | #endif | ||
28 | |||
25 | /* | 29 | /* |
26 | * This is for easy migration, but should be changed in the source | 30 | * This is for easy migration, but should be changed in the source |
27 | */ | 31 | */ |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 35f3f20d6731..caa6c396ec78 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -30,6 +30,14 @@ | |||
30 | * Interrupt handling. Preserves r7, r8, r9 | 30 | * Interrupt handling. Preserves r7, r8, r9 |
31 | */ | 31 | */ |
32 | .macro irq_handler | 32 | .macro irq_handler |
33 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
34 | ldr r5, =handle_arch_irq | ||
35 | mov r0, sp | ||
36 | ldr r5, [r5] | ||
37 | adr lr, BSYM(9997f) | ||
38 | teq r5, #0 | ||
39 | movne pc, r5 | ||
40 | #endif | ||
33 | get_irqnr_preamble r5, lr | 41 | get_irqnr_preamble r5, lr |
34 | 1: get_irqnr_and_base r0, r6, r5, lr | 42 | 1: get_irqnr_and_base r0, r6, r5, lr |
35 | movne r1, sp | 43 | movne r1, sp |
@@ -58,9 +66,8 @@ | |||
58 | adrne lr, BSYM(1b) | 66 | adrne lr, BSYM(1b) |
59 | bne do_local_timer | 67 | bne do_local_timer |
60 | #endif | 68 | #endif |
61 | 9997: | ||
62 | #endif | 69 | #endif |
63 | 70 | 9997: | |
64 | .endm | 71 | .endm |
65 | 72 | ||
66 | #ifdef CONFIG_KPROBES | 73 | #ifdef CONFIG_KPROBES |
@@ -1245,3 +1252,9 @@ cr_alignment: | |||
1245 | .space 4 | 1252 | .space 4 |
1246 | cr_no_alignment: | 1253 | cr_no_alignment: |
1247 | .space 4 | 1254 | .space 4 |
1255 | |||
1256 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
1257 | .globl handle_arch_irq | ||
1258 | handle_arch_irq: | ||
1259 | .space 4 | ||
1260 | #endif | ||
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 8075e592f902..0826f36330c4 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -875,6 +875,9 @@ void __init setup_arch(char **cmdline_p) | |||
875 | init_arch_irq = mdesc->init_irq; | 875 | init_arch_irq = mdesc->init_irq; |
876 | system_timer = mdesc->timer; | 876 | system_timer = mdesc->timer; |
877 | init_machine = mdesc->init_machine; | 877 | init_machine = mdesc->init_machine; |
878 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
879 | handle_arch_irq = mdesc->handle_irq; | ||
880 | #endif | ||
878 | 881 | ||
879 | #ifdef CONFIG_VT | 882 | #ifdef CONFIG_VT |
880 | #if defined(CONFIG_VGA_CONSOLE) | 883 | #if defined(CONFIG_VGA_CONSOLE) |