6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
12 #include <linux/config.h>
13 #include <linux/threads.h>
16 * Maximum number of interrupt sources that we can handle.
20 extern void disable_irq(unsigned int);
21 extern void disable_irq_nosync(unsigned int);
22 extern void enable_irq(unsigned int);
24 /* this number is used when no interrupt has been assigned */
27 #define get_irq_desc(irq) (&irq_desc[(irq)])
29 /* Define a way to iterate across irqs. */
30 #define for_each_irq(i) \
31 for ((i) = 0; (i) < NR_IRQS; ++(i))
33 /* Interrupt numbers are virtual in case they are sparsely
34 * distributed by the hardware.
36 extern unsigned int virt_irq_to_real_map[NR_IRQS];
38 /* Create a mapping for a real_irq if it doesn't already exist.
39 * Return the virtual irq as a convenience.
41 int virt_irq_create_mapping(unsigned int real_irq);
42 void virt_irq_init(void);
44 static inline unsigned int virt_irq_to_real(unsigned int virt_irq)
46 return virt_irq_to_real_map[virt_irq];
49 extern unsigned int real_irq_to_virt_slowpath(unsigned int real_irq);
52 * Because many systems have two overlapping names spaces for
53 * interrupts (ISA and XICS for example), and the ISA interrupts
54 * have historically not been easy to renumber, we allow ISA
55 * interrupts to take values 0 - 15, and shift up the remaining
58 #define NUM_ISA_INTERRUPTS 0x10
59 extern int __irq_offset_value;
61 static inline int irq_offset_up(int irq)
63 return(irq + __irq_offset_value);
66 static inline int irq_offset_down(int irq)
68 return(irq - __irq_offset_value);
71 static inline int irq_offset_value(void)
73 return __irq_offset_value;
76 static __inline__ int irq_canonicalize(int irq)
83 int handle_irq_event(int, struct pt_regs *, struct irqaction *);
85 #ifdef CONFIG_IRQSTACKS
87 * Per-cpu stacks for handling hard and soft interrupts.
89 extern struct thread_info *hardirq_ctx[NR_CPUS];
90 extern struct thread_info *softirq_ctx[NR_CPUS];
92 extern void irq_ctx_init(void);
93 extern void call_do_softirq(struct thread_info *tp);
94 extern int call_handle_irq_event(int irq, struct pt_regs *regs,
95 struct irqaction *action, struct thread_info *tp);
97 #define __ARCH_HAS_DO_SOFTIRQ
100 #define irq_ctx_init()
102 #endif /* CONFIG_IRQSTACKS */
104 #endif /* _ASM_IRQ_H */
105 #endif /* __KERNEL__ */