diff options
| -rw-r--r-- | arch/frv/Kconfig | 4 | ||||
| -rw-r--r-- | include/linux/irq.h | 6 | ||||
| -rw-r--r-- | kernel/irq/handle.c | 2 |
3 files changed, 12 insertions, 0 deletions
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index 5833808fb823..f7b171b92ea2 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig | |||
| @@ -29,6 +29,10 @@ config GENERIC_HARDIRQS | |||
| 29 | bool | 29 | bool |
| 30 | default y | 30 | default y |
| 31 | 31 | ||
| 32 | config GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 33 | bool | ||
| 34 | default y | ||
| 35 | |||
| 32 | config GENERIC_TIME | 36 | config GENERIC_TIME |
| 33 | bool | 37 | bool |
| 34 | default y | 38 | default y |
diff --git a/include/linux/irq.h b/include/linux/irq.h index fbf6d901e9c2..48d3cb3b6a47 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -320,7 +320,9 @@ handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *, | |||
| 320 | * Monolithic do_IRQ implementation. | 320 | * Monolithic do_IRQ implementation. |
| 321 | * (is an explicit fastcall, because i386 4KSTACKS calls it from assembly) | 321 | * (is an explicit fastcall, because i386 4KSTACKS calls it from assembly) |
| 322 | */ | 322 | */ |
| 323 | #ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 323 | extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); | 324 | extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); |
| 325 | #endif | ||
| 324 | 326 | ||
| 325 | /* | 327 | /* |
| 326 | * Architectures call this to let the generic IRQ layer | 328 | * Architectures call this to let the generic IRQ layer |
| @@ -332,10 +334,14 @@ static inline void generic_handle_irq(unsigned int irq, struct pt_regs *regs) | |||
| 332 | { | 334 | { |
| 333 | struct irq_desc *desc = irq_desc + irq; | 335 | struct irq_desc *desc = irq_desc + irq; |
| 334 | 336 | ||
| 337 | #ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 338 | desc->handle_irq(irq, desc, regs); | ||
| 339 | #else | ||
| 335 | if (likely(desc->handle_irq)) | 340 | if (likely(desc->handle_irq)) |
| 336 | desc->handle_irq(irq, desc, regs); | 341 | desc->handle_irq(irq, desc, regs); |
| 337 | else | 342 | else |
| 338 | __do_IRQ(irq, regs); | 343 | __do_IRQ(irq, regs); |
| 344 | #endif | ||
| 339 | } | 345 | } |
| 340 | 346 | ||
| 341 | /* Handling of unhandled and spurious interrupts: */ | 347 | /* Handling of unhandled and spurious interrupts: */ |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 48a53f68af96..4c6cdbaed661 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
| @@ -154,6 +154,7 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs, | |||
| 154 | return retval; | 154 | return retval; |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | #ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 157 | /** | 158 | /** |
| 158 | * __do_IRQ - original all in one highlevel IRQ handler | 159 | * __do_IRQ - original all in one highlevel IRQ handler |
| 159 | * @irq: the interrupt number | 160 | * @irq: the interrupt number |
| @@ -253,6 +254,7 @@ out: | |||
| 253 | 254 | ||
| 254 | return 1; | 255 | return 1; |
| 255 | } | 256 | } |
| 257 | #endif | ||
| 256 | 258 | ||
| 257 | #ifdef CONFIG_TRACE_IRQFLAGS | 259 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 258 | 260 | ||
