diff options
Diffstat (limited to 'kernel/irq/handle.c')
-rw-r--r-- | kernel/irq/handle.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 6d8b30114961..fc4e906aedbd 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -16,10 +16,6 @@ | |||
16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
17 | #include <linux/kernel_stat.h> | 17 | #include <linux/kernel_stat.h> |
18 | 18 | ||
19 | #if defined(CONFIG_NO_IDLE_HZ) && defined(CONFIG_ARM) | ||
20 | #include <asm/dyntick.h> | ||
21 | #endif | ||
22 | |||
23 | #include "internals.h" | 19 | #include "internals.h" |
24 | 20 | ||
25 | /** | 21 | /** |
@@ -133,17 +129,10 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs, | |||
133 | irqreturn_t ret, retval = IRQ_NONE; | 129 | irqreturn_t ret, retval = IRQ_NONE; |
134 | unsigned int status = 0; | 130 | unsigned int status = 0; |
135 | 131 | ||
136 | #if defined(CONFIG_NO_IDLE_HZ) && defined(CONFIG_ARM) | 132 | handle_dynamic_tick(action); |
137 | if (!(action->flags & SA_TIMER) && system_timer->dyn_tick != NULL) { | ||
138 | write_seqlock(&xtime_lock); | ||
139 | if (system_timer->dyn_tick->state & DYN_TICK_ENABLED) | ||
140 | system_timer->dyn_tick->handler(irq, 0, regs); | ||
141 | write_sequnlock(&xtime_lock); | ||
142 | } | ||
143 | #endif | ||
144 | 133 | ||
145 | if (!(action->flags & IRQF_DISABLED)) | 134 | if (!(action->flags & IRQF_DISABLED)) |
146 | local_irq_enable(); | 135 | local_irq_enable_in_hardirq(); |
147 | 136 | ||
148 | do { | 137 | do { |
149 | ret = action->handler(irq, action->dev_id, regs); | 138 | ret = action->handler(irq, action->dev_id, regs); |
@@ -260,3 +249,19 @@ out: | |||
260 | return 1; | 249 | return 1; |
261 | } | 250 | } |
262 | 251 | ||
252 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
253 | |||
254 | /* | ||
255 | * lockdep: we want to handle all irq_desc locks as a single lock-class: | ||
256 | */ | ||
257 | static struct lock_class_key irq_desc_lock_class; | ||
258 | |||
259 | void early_init_irq_lock_class(void) | ||
260 | { | ||
261 | int i; | ||
262 | |||
263 | for (i = 0; i < NR_IRQS; i++) | ||
264 | lockdep_set_class(&irq_desc[i].lock, &irq_desc_lock_class); | ||
265 | } | ||
266 | |||
267 | #endif | ||