1#ifndef _M68K_IRQ_H_
2#define _M68K_IRQ_H_
3
4#include <linux/linkage.h>
5#include <linux/hardirq.h>
6#include <linux/spinlock_types.h>
7
8/*
9 * This should be the same as the max(NUM_X_SOURCES) for all the
10 * different m68k hosts compiled into the kernel.
11 * Currently the Atari has 72 and the Amiga 24, but if both are
12 * supported in the kernel it is better to make room for 72.
13 */
14#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
15#define NR_IRQS 200
16#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC)
17#define NR_IRQS 72
18#elif defined(CONFIG_Q40)
19#define NR_IRQS	43
20#elif defined(CONFIG_AMIGA)
21#define NR_IRQS	32
22#elif defined(CONFIG_APOLLO)
23#define NR_IRQS	24
24#elif defined(CONFIG_HP300)
25#define NR_IRQS	8
26#else
27#error unknown nr of irqs
28#endif
29
30/*
31 * The hardirq mask has to be large enough to have
32 * space for potentially all IRQ sources in the system
33 * nesting on a single CPU:
34 */
35#if (1 << HARDIRQ_BITS) < NR_IRQS
36# error HARDIRQ_BITS is too low!
37#endif
38
39/*
40 * Interrupt source definitions
41 * General interrupt sources are the level 1-7.
42 * Adding an interrupt service routine for one of these sources
43 * results in the addition of that routine to a chain of routines.
44 * Each one is called in succession.  Each individual interrupt
45 * service routine should determine if the device associated with
46 * that routine requires service.
47 */
48
49#define IRQ_SPURIOUS	0
50
51#define IRQ_AUTO_1	1	/* level 1 interrupt */
52#define IRQ_AUTO_2	2	/* level 2 interrupt */
53#define IRQ_AUTO_3	3	/* level 3 interrupt */
54#define IRQ_AUTO_4	4	/* level 4 interrupt */
55#define IRQ_AUTO_5	5	/* level 5 interrupt */
56#define IRQ_AUTO_6	6	/* level 6 interrupt */
57#define IRQ_AUTO_7	7	/* level 7 interrupt (non-maskable) */
58
59#define IRQ_USER	8
60
61extern unsigned int irq_canonicalize(unsigned int irq);
62extern void enable_irq(unsigned int);
63extern void disable_irq(unsigned int);
64#define disable_irq_nosync	disable_irq
65
66struct pt_regs;
67
68/*
69 * various flags for request_irq() - the Amiga now uses the standard
70 * mechanism like all other architectures - IRQF_DISABLED and
71 * IRQF_SHARED are your friends.
72 */
73#ifndef MACH_AMIGA_ONLY
74#define IRQ_FLG_LOCK	(0x0001)	/* handler is not replaceable	*/
75#define IRQ_FLG_REPLACE	(0x0002)	/* replace existing handler	*/
76#define IRQ_FLG_FAST	(0x0004)
77#define IRQ_FLG_SLOW	(0x0008)
78#define IRQ_FLG_STD	(0x8000)	/* internally used		*/
79#endif
80
81/*
82 * This structure is used to chain together the ISRs for a particular
83 * interrupt source (if it supports chaining).
84 */
85typedef struct irq_node {
86	int		(*handler)(int, void *);
87	void		*dev_id;
88	struct irq_node *next;
89	unsigned long	flags;
90	const char	*devname;
91} irq_node_t;
92
93/*
94 * This structure has only 4 elements for speed reasons
95 */
96struct irq_handler {
97	int		(*handler)(int, void *);
98	unsigned long	flags;
99	void		*dev_id;
100	const char	*devname;
101};
102
103struct irq_controller {
104	const char *name;
105	spinlock_t lock;
106	int (*startup)(unsigned int irq);
107	void (*shutdown)(unsigned int irq);
108	void (*enable)(unsigned int irq);
109	void (*disable)(unsigned int irq);
110};
111
112extern int m68k_irq_startup(unsigned int);
113extern void m68k_irq_shutdown(unsigned int);
114
115/*
116 * This function returns a new irq_node_t
117 */
118extern irq_node_t *new_irq_node(void);
119
120extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *));
121extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
122				      void (*handler)(unsigned int, struct pt_regs *));
123extern void m68k_setup_irq_controller(struct irq_controller *, unsigned int, unsigned int);
124
125asmlinkage void m68k_handle_int(unsigned int);
126asmlinkage void __m68k_handle_int(unsigned int, struct pt_regs *);
127
128#endif /* _M68K_IRQ_H_ */
129