diff options
Diffstat (limited to 'arch/mips/kernel/irq.c')
-rw-r--r-- | arch/mips/kernel/irq.c | 74 |
1 files changed, 42 insertions, 32 deletions
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index dd24434392b6..b339798b3172 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -26,6 +26,48 @@ | |||
26 | #include <asm/system.h> | 26 | #include <asm/system.h> |
27 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
28 | 28 | ||
29 | static unsigned long irq_map[NR_IRQS / BITS_PER_LONG]; | ||
30 | |||
31 | int __devinit allocate_irqno(void) | ||
32 | { | ||
33 | int irq; | ||
34 | |||
35 | again: | ||
36 | irq = find_first_zero_bit(irq_map, NR_IRQS); | ||
37 | |||
38 | if (irq >= NR_IRQS) | ||
39 | return -ENOSPC; | ||
40 | |||
41 | if (test_and_set_bit(irq, irq_map)) | ||
42 | goto again; | ||
43 | |||
44 | return irq; | ||
45 | } | ||
46 | |||
47 | EXPORT_SYMBOL_GPL(allocate_irqno); | ||
48 | |||
49 | /* | ||
50 | * Allocate the 16 legacy interrupts for i8259 devices. This happens early | ||
51 | * in the kernel initialization so treating allocation failure as BUG() is | ||
52 | * ok. | ||
53 | */ | ||
54 | void __init alloc_legacy_irqno(void) | ||
55 | { | ||
56 | int i; | ||
57 | |||
58 | for (i = 0; i <= 16; i++) | ||
59 | BUG_ON(test_and_set_bit(i, irq_map)); | ||
60 | } | ||
61 | |||
62 | void __devinit free_irqno(unsigned int irq) | ||
63 | { | ||
64 | smp_mb__before_clear_bit(); | ||
65 | clear_bit(irq, irq_map); | ||
66 | smp_mb__after_clear_bit(); | ||
67 | } | ||
68 | |||
69 | EXPORT_SYMBOL_GPL(free_irqno); | ||
70 | |||
29 | /* | 71 | /* |
30 | * 'what should we do if we get a hw irq event on an illegal vector'. | 72 | * 'what should we do if we get a hw irq event on an illegal vector'. |
31 | * each architecture has to answer this themselves. | 73 | * each architecture has to answer this themselves. |
@@ -46,25 +88,6 @@ atomic_t irq_err_count; | |||
46 | unsigned long irq_hwmask[NR_IRQS]; | 88 | unsigned long irq_hwmask[NR_IRQS]; |
47 | #endif /* CONFIG_MIPS_MT_SMTC */ | 89 | #endif /* CONFIG_MIPS_MT_SMTC */ |
48 | 90 | ||
49 | #undef do_IRQ | ||
50 | |||
51 | /* | ||
52 | * do_IRQ handles all normal device IRQ's (the special | ||
53 | * SMP cross-CPU interrupts have their own specific | ||
54 | * handlers). | ||
55 | */ | ||
56 | asmlinkage unsigned int do_IRQ(unsigned int irq) | ||
57 | { | ||
58 | irq_enter(); | ||
59 | |||
60 | __DO_IRQ_SMTC_HOOK(); | ||
61 | __do_IRQ(irq); | ||
62 | |||
63 | irq_exit(); | ||
64 | |||
65 | return 1; | ||
66 | } | ||
67 | |||
68 | /* | 91 | /* |
69 | * Generic, controller-independent functions: | 92 | * Generic, controller-independent functions: |
70 | */ | 93 | */ |
@@ -130,19 +153,6 @@ __setup("nokgdb", nokgdb); | |||
130 | 153 | ||
131 | void __init init_IRQ(void) | 154 | void __init init_IRQ(void) |
132 | { | 155 | { |
133 | int i; | ||
134 | |||
135 | for (i = 0; i < NR_IRQS; i++) { | ||
136 | irq_desc[i].status = IRQ_DISABLED; | ||
137 | irq_desc[i].action = NULL; | ||
138 | irq_desc[i].depth = 1; | ||
139 | irq_desc[i].chip = &no_irq_chip; | ||
140 | spin_lock_init(&irq_desc[i].lock); | ||
141 | #ifdef CONFIG_MIPS_MT_SMTC | ||
142 | irq_hwmask[i] = 0; | ||
143 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
144 | } | ||
145 | |||
146 | arch_init_irq(); | 156 | arch_init_irq(); |
147 | 157 | ||
148 | #ifdef CONFIG_KGDB | 158 | #ifdef CONFIG_KGDB |