diff options
Diffstat (limited to 'arch/mips/kernel/irq.c')
| -rw-r--r-- | arch/mips/kernel/irq.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index dd24434392b6..9b0e49d63d7b 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. |
