aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/kernel/irq.c')
-rw-r--r--arch/mips/kernel/irq.c35
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');
120skip: 120skip:
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 */
159void __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
173void __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 */