diff options
| -rw-r--r-- | include/asm-arm/hw_irq.h | 11 | ||||
| -rw-r--r-- | include/asm-arm/mach/time.h | 1 | ||||
| -rw-r--r-- | include/linux/irq.h | 4 | ||||
| -rw-r--r-- | kernel/irq/handle.c | 13 |
4 files changed, 17 insertions, 12 deletions
diff --git a/include/asm-arm/hw_irq.h b/include/asm-arm/hw_irq.h index f1a08a500604..275b574fd1a5 100644 --- a/include/asm-arm/hw_irq.h +++ b/include/asm-arm/hw_irq.h | |||
| @@ -6,4 +6,15 @@ | |||
| 6 | 6 | ||
| 7 | #include <asm/mach/irq.h> | 7 | #include <asm/mach/irq.h> |
| 8 | 8 | ||
| 9 | #if defined(CONFIG_NO_IDLE_HZ) | ||
| 10 | # include <asm/dyntick.h> | ||
| 11 | # define handle_dynamic_tick(action) \ | ||
| 12 | if (!(action->flags & SA_TIMER) && system_timer->dyn_tick) { \ | ||
| 13 | write_seqlock(&xtime_lock); \ | ||
| 14 | if (system_timer->dyn_tick->state & DYN_TICK_ENABLED) \ | ||
| 15 | system_timer->dyn_tick->handler(irq, 0, regs); \ | ||
| 16 | write_sequnlock(&xtime_lock); \ | ||
| 17 | } | ||
| 18 | #endif | ||
| 19 | |||
| 9 | #endif | 20 | #endif |
diff --git a/include/asm-arm/mach/time.h b/include/asm-arm/mach/time.h index 9f28073559e8..dee0bc336fe8 100644 --- a/include/asm-arm/mach/time.h +++ b/include/asm-arm/mach/time.h | |||
| @@ -69,6 +69,7 @@ extern void timer_tick(struct pt_regs *); | |||
| 69 | /* | 69 | /* |
| 70 | * Kernel time keeping support. | 70 | * Kernel time keeping support. |
| 71 | */ | 71 | */ |
| 72 | struct timespec; | ||
| 72 | extern int (*set_rtc)(void); | 73 | extern int (*set_rtc)(void); |
| 73 | extern void save_time_delta(struct timespec *delta, struct timespec *rtc); | 74 | extern void save_time_delta(struct timespec *delta, struct timespec *rtc); |
| 74 | extern void restore_time_delta(struct timespec *delta, struct timespec *rtc); | 75 | extern void restore_time_delta(struct timespec *delta, struct timespec *rtc); |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 95d7aa7954d2..b48eae32dc61 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -182,6 +182,10 @@ extern int setup_irq(unsigned int irq, struct irqaction *new); | |||
| 182 | 182 | ||
| 183 | #ifdef CONFIG_GENERIC_HARDIRQS | 183 | #ifdef CONFIG_GENERIC_HARDIRQS |
| 184 | 184 | ||
| 185 | #ifndef handle_dynamic_tick | ||
| 186 | # define handle_dynamic_tick(a) do { } while (0) | ||
| 187 | #endif | ||
| 188 | |||
| 185 | #ifdef CONFIG_SMP | 189 | #ifdef CONFIG_SMP |
| 186 | static inline void set_native_irq_info(int irq, cpumask_t mask) | 190 | static inline void set_native_irq_info(int irq, cpumask_t mask) |
| 187 | { | 191 | { |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 6d8b30114961..aeb6e391276c 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,14 +129,7 @@ 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(); |
