Blame view

include/asm-m68k/irq.h 3.48 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _M68K_IRQ_H_
  #define _M68K_IRQ_H_
68387c448   Roman Zippel   [PATCH] m68k: con...
3
  #include <linux/linkage.h>
b5dc7840b   Roman Zippel   [PATCH] m68k: int...
4
5
  #include <linux/hardirq.h>
  #include <linux/spinlock_types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
12
   * This should be the same as the max(NUM_X_SOURCES) for all the
   * different m68k hosts compiled into the kernel.
   * Currently the Atari has 72 and the Amiga 24, but if both are
   * supported in the kernel it is better to make room for 72.
   */
68387c448   Roman Zippel   [PATCH] m68k: con...
13
14
15
16
17
18
19
20
21
22
23
24
  #if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
  #define NR_IRQS 200
  #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC)
  #define NR_IRQS 72
  #elif defined(CONFIG_Q40)
  #define NR_IRQS	43
  #elif defined(CONFIG_AMIGA)
  #define NR_IRQS	32
  #elif defined(CONFIG_APOLLO)
  #define NR_IRQS	24
  #elif defined(CONFIG_HP300)
  #define NR_IRQS	8
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  #else
68387c448   Roman Zippel   [PATCH] m68k: con...
26
  #error unknown nr of irqs
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
  #endif
  
  /*
85b07cd1a   Al Viro   [PATCH] m68k: com...
30
31
32
33
34
35
36
37
38
   * The hardirq mask has to be large enough to have
   * space for potentially all IRQ sources in the system
   * nesting on a single CPU:
   */
  #if (1 << HARDIRQ_BITS) < NR_IRQS
  # error HARDIRQ_BITS is too low!
  #endif
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
43
44
45
46
   * Interrupt source definitions
   * General interrupt sources are the level 1-7.
   * Adding an interrupt service routine for one of these sources
   * results in the addition of that routine to a chain of routines.
   * Each one is called in succession.  Each individual interrupt
   * service routine should determine if the device associated with
   * that routine requires service.
   */
4facfde9f   Roman Zippel   [PATCH] m68k: cle...
47
  #define IRQ_SPURIOUS	0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48

4facfde9f   Roman Zippel   [PATCH] m68k: cle...
49
50
51
52
53
54
55
  #define IRQ_AUTO_1	1	/* level 1 interrupt */
  #define IRQ_AUTO_2	2	/* level 2 interrupt */
  #define IRQ_AUTO_3	3	/* level 3 interrupt */
  #define IRQ_AUTO_4	4	/* level 4 interrupt */
  #define IRQ_AUTO_5	5	/* level 5 interrupt */
  #define IRQ_AUTO_6	6	/* level 6 interrupt */
  #define IRQ_AUTO_7	7	/* level 7 interrupt (non-maskable) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56

4facfde9f   Roman Zippel   [PATCH] m68k: cle...
57
  #define IRQ_USER	8
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58

68387c448   Roman Zippel   [PATCH] m68k: con...
59
  extern unsigned int irq_canonicalize(unsigned int irq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
  
  struct pt_regs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
  /*
   * various flags for request_irq() - the Amiga now uses the standard
b0b9fdc12   Thomas Gleixner   [PATCH] irq-flags...
64
65
   * mechanism like all other architectures - IRQF_DISABLED and
   * IRQF_SHARED are your friends.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
72
73
74
75
76
77
78
79
   */
  #ifndef MACH_AMIGA_ONLY
  #define IRQ_FLG_LOCK	(0x0001)	/* handler is not replaceable	*/
  #define IRQ_FLG_REPLACE	(0x0002)	/* replace existing handler	*/
  #define IRQ_FLG_FAST	(0x0004)
  #define IRQ_FLG_SLOW	(0x0008)
  #define IRQ_FLG_STD	(0x8000)	/* internally used		*/
  #endif
  
  /*
   * This structure is used to chain together the ISRs for a particular
   * interrupt source (if it supports chaining).
   */
  typedef struct irq_node {
2850bc273   Al Viro   [PATCH] m68k pt_r...
80
  	int		(*handler)(int, void *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  	void		*dev_id;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
  	struct irq_node *next;
b5dc7840b   Roman Zippel   [PATCH] m68k: int...
83
84
  	unsigned long	flags;
  	const char	*devname;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
88
89
  } irq_node_t;
  
  /*
   * This structure has only 4 elements for speed reasons
   */
2850bc273   Al Viro   [PATCH] m68k pt_r...
90
91
  struct irq_handler {
  	int		(*handler)(int, void *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
  	unsigned long	flags;
  	void		*dev_id;
  	const char	*devname;
2850bc273   Al Viro   [PATCH] m68k pt_r...
95
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96

b5dc7840b   Roman Zippel   [PATCH] m68k: int...
97
98
99
100
101
102
103
104
105
106
107
  struct irq_controller {
  	const char *name;
  	spinlock_t lock;
  	int (*startup)(unsigned int irq);
  	void (*shutdown)(unsigned int irq);
  	void (*enable)(unsigned int irq);
  	void (*disable)(unsigned int irq);
  };
  
  extern int m68k_irq_startup(unsigned int);
  extern void m68k_irq_shutdown(unsigned int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
111
  /*
   * This function returns a new irq_node_t
   */
  extern irq_node_t *new_irq_node(void);
68387c448   Roman Zippel   [PATCH] m68k: con...
112
113
114
115
  extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *));
  extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
  				      void (*handler)(unsigned int, struct pt_regs *));
  extern void m68k_setup_irq_controller(struct irq_controller *, unsigned int, unsigned int);
2850bc273   Al Viro   [PATCH] m68k pt_r...
116
117
  asmlinkage void m68k_handle_int(unsigned int);
  asmlinkage void __m68k_handle_int(unsigned int, struct pt_regs *);
68387c448   Roman Zippel   [PATCH] m68k: con...
118

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  #endif /* _M68K_IRQ_H_ */