blob: 957ab58e1c007d4687b2bd62995af94d438fd168 [file] [log] [blame]
Ralf Baechlecb2224d2015-06-09 15:04:38 +02001/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 */
6#include <linux/init.h>
7#include <linux/irq.h>
8#include <linux/types.h>
9
10#include <asm/barrier.h>
11
12static DECLARE_BITMAP(irq_map, NR_IRQS);
13
14int allocate_irqno(void)
15{
16 int irq;
17
18again:
19 irq = find_first_zero_bit(irq_map, NR_IRQS);
20
21 if (irq >= NR_IRQS)
22 return -ENOSPC;
23
24 if (test_and_set_bit(irq, irq_map))
25 goto again;
26
27 return irq;
28}
29
30/*
31 * Allocate the 16 legacy interrupts for i8259 devices. This happens early
32 * in the kernel initialization so treating allocation failure as BUG() is
33 * ok.
34 */
35void __init alloc_legacy_irqno(void)
36{
37 int i;
38
39 for (i = 0; i <= 16; i++)
40 BUG_ON(test_and_set_bit(i, irq_map));
41}
42
43void free_irqno(unsigned int irq)
44{
45 smp_mb__before_atomic();
46 clear_bit(irq, irq_map);
47 smp_mb__after_atomic();
48}