1 #ifndef _M68K_IRQ_H_
2 #define _M68K_IRQ_H_
3
4 extern void disable_irq(unsigned int);
5 extern void enable_irq(unsigned int);
6
7 #include <linux/config.h>
8
9 /*
10 * This should be the same as the max(NUM_X_SOURCES) for all the
11 * different m68k hosts compiled into the kernel.
12 * Currently the Atari has 72 and the Amiga 24, but if both are
13 * supported in the kernel it is better to make room for 72.
14 */
15 #if defined(CONFIG_ATARI)
16 #define NR_IRQS 72
17 #else
18 #define NR_IRQS 24
19 #endif
20
21 /*
22 * Interrupt source definitions
23 * General interrupt sources are the level 1-7.
24 * Adding an interrupt service routine for one of these sources
25 * results in the addition of that routine to a chain of routines.
26 * Each one is called in succession. Each individual interrupt
27 * service routine should determine if the device associated with
28 * that routine requires service.
29 */
30
31 #define IRQ1 (1) /* level 1 interrupt */
32 #define IRQ2 (2) /* level 2 interrupt */
33 #define IRQ3 (3) /* level 3 interrupt */
34 #define IRQ4 (4) /* level 4 interrupt */
35 #define IRQ5 (5) /* level 5 interrupt */
36 #define IRQ6 (6) /* level 6 interrupt */
37 #define IRQ7 (7) /* level 7 interrupt (non-maskable) */
38
39 /*
40 * "Generic" interrupt sources
41 */
42
43 #define IRQ_SCHED_TIMER (8) /* interrupt source for scheduling timer */
44
45 /*
46 * Machine specific interrupt sources.
47 *
48 * Adding an interrupt service routine for a source with this bit
49 * set indicates a special machine specific interrupt source.
50 * The machine specific files define these sources.
51 */
52
53 #define IRQ_MACHSPEC (0x10000000L)
54
55 #ifndef ISRFUNC_T
56 struct pt_regs;
57 typedef void (*isrfunc) (int irq, struct pt_regs * regs, void *data);
58 #define ISRFUNC_T
59 #endif /* ISRFUNC_T */
60
61 /*
62 * This structure is used to chain together the ISRs for a particular
63 * interrupt source (if it supports chaining).
64 */
65 typedef struct isr_node {
66 isrfunc isr;
67 int pri;
68 void *data;
69 char *name;
70 struct isr_node *next;
71 } isr_node_t;
72
73 /* count of spurious interrupts */
74 extern volatile unsigned long num_spurious;
75
76 /*
77 * This function returns a new isr_node_t
78 */
79 extern isr_node_t *new_isr_node(void);
80
81 /*
82 * This function is used to add a specific interrupt service routine
83 * for the specified interrupt source.
84 *
85 * If the source is machine specific, it will be passed along to the
86 * machine specific routine.
87 *
88 * "data" is user specified data which will be passed to the isr routine.
89 *
90 * (isrfunc is defined in linux/config.h)
91 */
92 extern int add_isr (unsigned long source, isrfunc isr, int pri, void
93 *data, char *name);
94
95 /*
96 * This routine will remove an isr for the specified interrupt source.
97 */
98 extern int remove_isr (unsigned long source, isrfunc isr);
99
100 /*
101 * This routine will insert an isr_node_t into a chain of nodes, using
102 * the priority stored in the node.
103 */
104 extern void insert_isr (isr_node_t **listp, isr_node_t *node);
105
106 /*
107 * This routine will delete the isr node for isr from a chain of nodes
108 */
109 extern void delete_isr (isr_node_t **listp, isrfunc isr);
110
111 /*
112 * This routine may be used to call the isr routines in the passed list.
113 */
114 extern void call_isr_list (int irq, isr_node_t *p, struct pt_regs *fp);
115
116 #endif /* _M68K_IRQ_H_ */