diff options
Diffstat (limited to 'arch/mips/kernel/irq.c')
-rw-r--r-- | arch/mips/kernel/irq.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index 7b845ba9dff4..c6345f579a8a 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -15,13 +15,13 @@ | |||
15 | #include <linux/kernel_stat.h> | 15 | #include <linux/kernel_stat.h> |
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/proc_fs.h> | 17 | #include <linux/proc_fs.h> |
18 | #include <linux/slab.h> | ||
19 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
20 | #include <linux/random.h> | 19 | #include <linux/random.h> |
21 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
22 | #include <linux/seq_file.h> | 21 | #include <linux/seq_file.h> |
23 | #include <linux/kallsyms.h> | 22 | #include <linux/kallsyms.h> |
24 | #include <linux/kgdb.h> | 23 | #include <linux/kgdb.h> |
24 | #include <linux/ftrace.h> | ||
25 | 25 | ||
26 | #include <asm/atomic.h> | 26 | #include <asm/atomic.h> |
27 | #include <asm/system.h> | 27 | #include <asm/system.h> |
@@ -99,7 +99,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
99 | } | 99 | } |
100 | 100 | ||
101 | if (i < NR_IRQS) { | 101 | if (i < NR_IRQS) { |
102 | spin_lock_irqsave(&irq_desc[i].lock, flags); | 102 | raw_spin_lock_irqsave(&irq_desc[i].lock, flags); |
103 | action = irq_desc[i].action; | 103 | action = irq_desc[i].action; |
104 | if (!action) | 104 | if (!action) |
105 | goto skip; | 105 | goto skip; |
@@ -118,7 +118,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
118 | 118 | ||
119 | seq_putc(p, '\n'); | 119 | seq_putc(p, '\n'); |
120 | skip: | 120 | skip: |
121 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | 121 | raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); |
122 | } else if (i == NR_IRQS) { | 122 | } else if (i == NR_IRQS) { |
123 | seq_putc(p, '\n'); | 123 | seq_putc(p, '\n'); |
124 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); | 124 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); |
@@ -150,3 +150,32 @@ void __init init_IRQ(void) | |||
150 | kgdb_early_setup = 1; | 150 | kgdb_early_setup = 1; |
151 | #endif | 151 | #endif |
152 | } | 152 | } |
153 | |||
154 | /* | ||
155 | * do_IRQ handles all normal device IRQ's (the special | ||
156 | * SMP cross-CPU interrupts have their own specific | ||
157 | * handlers). | ||
158 | */ | ||
159 | void __irq_entry do_IRQ(unsigned int irq) | ||
160 | { | ||
161 | irq_enter(); | ||
162 | __DO_IRQ_SMTC_HOOK(irq); | ||
163 | generic_handle_irq(irq); | ||
164 | irq_exit(); | ||
165 | } | ||
166 | |||
167 | #ifdef CONFIG_MIPS_MT_SMTC_IRQAFF | ||
168 | /* | ||
169 | * To avoid inefficient and in some cases pathological re-checking of | ||
170 | * IRQ affinity, we have this variant that skips the affinity check. | ||
171 | */ | ||
172 | |||
173 | void __irq_entry do_IRQ_no_affinity(unsigned int irq) | ||
174 | { | ||
175 | irq_enter(); | ||
176 | __NO_AFFINITY_IRQ_SMTC_HOOK(irq); | ||
177 | generic_handle_irq(irq); | ||
178 | irq_exit(); | ||
179 | } | ||
180 | |||
181 | #endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */ | ||