1#ifndef _LINUX_IRQ_H
2#define _LINUX_IRQ_H
3
4
5
6
7
8
9
10
11
12#include <linux/smp.h>
13
14#ifndef CONFIG_S390
15
16#include <linux/linkage.h>
17#include <linux/cache.h>
18#include <linux/spinlock.h>
19#include <linux/cpumask.h>
20#include <linux/irqreturn.h>
21#include <linux/errno.h>
22
23#include <asm/irq.h>
24#include <asm/ptrace.h>
25#include <asm/irq_regs.h>
26
27struct irq_desc;
28typedef void fastcall (*irq_flow_handler_t)(unsigned int irq,
29 struct irq_desc *desc);
30
31
32
33
34
35
36
37
38
39#define IRQ_TYPE_NONE 0x00000000
40#define IRQ_TYPE_EDGE_RISING 0x00000001
41#define IRQ_TYPE_EDGE_FALLING 0x00000002
42#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
43#define IRQ_TYPE_LEVEL_HIGH 0x00000004
44#define IRQ_TYPE_LEVEL_LOW 0x00000008
45#define IRQ_TYPE_SENSE_MASK 0x0000000f
46#define IRQ_TYPE_PROBE 0x00000010
47
48
49#define IRQ_INPROGRESS 0x00000100
50#define IRQ_DISABLED 0x00000200
51#define IRQ_PENDING 0x00000400
52#define IRQ_REPLAY 0x00000800
53#define IRQ_AUTODETECT 0x00001000
54#define IRQ_WAITING 0x00002000
55#define IRQ_LEVEL 0x00004000
56#define IRQ_MASKED 0x00008000
57#define IRQ_PER_CPU 0x00010000
58#define IRQ_NOPROBE 0x00020000
59#define IRQ_NOREQUEST 0x00040000
60#define IRQ_NOAUTOEN 0x00080000
61#define IRQ_WAKEUP 0x00100000
62#define IRQ_MOVE_PENDING 0x00200000
63#define IRQ_NO_BALANCING 0x00400000
64
65#ifdef CONFIG_IRQ_PER_CPU
66# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
67# define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
68#else
69# define CHECK_IRQ_PER_CPU(var) 0
70# define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING
71#endif
72
73struct proc_dir_entry;
74struct msi_desc;
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98struct irq_chip {
99 const char *name;
100 unsigned int (*startup)(unsigned int irq);
101 void (*shutdown)(unsigned int irq);
102 void (*enable)(unsigned int irq);
103 void (*disable)(unsigned int irq);
104
105 void (*ack)(unsigned int irq);
106 void (*mask)(unsigned int irq);
107 void (*mask_ack)(unsigned int irq);
108 void (*unmask)(unsigned int irq);
109 void (*eoi)(unsigned int irq);
110
111 void (*end)(unsigned int irq);
112 void (*set_affinity)(unsigned int irq, cpumask_t dest);
113 int (*retrigger)(unsigned int irq);
114 int (*set_type)(unsigned int irq, unsigned int flow_type);
115 int (*set_wake)(unsigned int irq, unsigned int on);
116
117
118#ifdef CONFIG_IRQ_RELEASE_METHOD
119 void (*release)(unsigned int irq, void *dev_id);
120#endif
121
122
123
124
125 const char *typename;
126};
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151struct irq_desc {
152 irq_flow_handler_t handle_irq;
153 struct irq_chip *chip;
154 struct msi_desc *msi_desc;
155 void *handler_data;
156 void *chip_data;
157 struct irqaction *action;
158 unsigned int status;
159
160 unsigned int depth;
161 unsigned int wake_depth;
162 unsigned int irq_count;
163 unsigned int irqs_unhandled;
164 spinlock_t lock;
165#ifdef CONFIG_SMP
166 cpumask_t affinity;
167 unsigned int cpu;
168#endif
169#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
170 cpumask_t pending_mask;
171#endif
172#ifdef CONFIG_PROC_FS
173 struct proc_dir_entry *dir;
174#endif
175 const char *name;
176} ____cacheline_internodealigned_in_smp;
177
178extern struct irq_desc irq_desc[NR_IRQS];
179
180
181
182
183#define hw_interrupt_type irq_chip
184typedef struct irq_chip hw_irq_controller;
185#define no_irq_type no_irq_chip
186typedef struct irq_desc irq_desc_t;
187
188
189
190
191#include <asm/hw_irq.h>
192
193extern int setup_irq(unsigned int irq, struct irqaction *new);
194
195#ifdef CONFIG_GENERIC_HARDIRQS
196
197#ifndef handle_dynamic_tick
198# define handle_dynamic_tick(a) do { } while (0)
199#endif
200
201#ifdef CONFIG_SMP
202
203#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
204
205void set_pending_irq(unsigned int irq, cpumask_t mask);
206void move_native_irq(int irq);
207void move_masked_irq(int irq);
208
209#else
210
211static inline void move_irq(int irq)
212{
213}
214
215static inline void move_native_irq(int irq)
216{
217}
218
219static inline void move_masked_irq(int irq)
220{
221}
222
223static inline void set_pending_irq(unsigned int irq, cpumask_t mask)
224{
225}
226
227#endif
228
229extern int irq_set_affinity(unsigned int irq, cpumask_t cpumask);
230extern int irq_can_set_affinity(unsigned int irq);
231
232#else
233
234#define move_native_irq(x)
235#define move_masked_irq(x)
236
237static inline int irq_set_affinity(unsigned int irq, cpumask_t cpumask)
238{
239 return -EINVAL;
240}
241
242static inline int irq_can_set_affinity(unsigned int irq) { return 0; }
243
244#endif
245
246#ifdef CONFIG_IRQBALANCE
247extern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask);
248#else
249static inline void set_balance_irq_affinity(unsigned int irq, cpumask_t mask)
250{
251}
252#endif
253
254#ifdef CONFIG_AUTO_IRQ_AFFINITY
255extern int select_smp_affinity(unsigned int irq);
256#else
257static inline int select_smp_affinity(unsigned int irq)
258{
259 return 1;
260}
261#endif
262
263extern int no_irq_affinity;
264
265static inline int irq_balancing_disabled(unsigned int irq)
266{
267 return irq_desc[irq].status & IRQ_NO_BALANCING_MASK;
268}
269
270
271extern int handle_IRQ_event(unsigned int irq, struct irqaction *action);
272
273
274
275
276
277extern void fastcall handle_level_irq(unsigned int irq, struct irq_desc *desc);
278extern void fastcall handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc);
279extern void fastcall handle_edge_irq(unsigned int irq, struct irq_desc *desc);
280extern void fastcall handle_simple_irq(unsigned int irq, struct irq_desc *desc);
281extern void fastcall handle_percpu_irq(unsigned int irq, struct irq_desc *desc);
282extern void fastcall handle_bad_irq(unsigned int irq, struct irq_desc *desc);
283
284
285
286
287
288#ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ
289extern fastcall unsigned int __do_IRQ(unsigned int irq);
290#endif
291
292
293
294
295
296
297
298static inline void generic_handle_irq(unsigned int irq)
299{
300 struct irq_desc *desc = irq_desc + irq;
301
302#ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ
303 desc->handle_irq(irq, desc);
304#else
305 if (likely(desc->handle_irq))
306 desc->handle_irq(irq, desc);
307 else
308 __do_IRQ(irq);
309#endif
310}
311
312
313extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
314 int action_ret);
315
316
317void check_irq_resend(struct irq_desc *desc, unsigned int irq);
318
319
320extern int noirqdebug_setup(char *str);
321
322
323extern int can_request_irq(unsigned int irq, unsigned long irqflags);
324
325
326extern struct irq_chip no_irq_chip;
327extern struct irq_chip dummy_irq_chip;
328
329extern void
330set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
331 irq_flow_handler_t handle);
332extern void
333set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
334 irq_flow_handler_t handle, const char *name);
335
336extern void
337__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
338 const char *name);
339
340
341
342
343static inline void
344set_irq_handler(unsigned int irq, irq_flow_handler_t handle)
345{
346 __set_irq_handler(irq, handle, 0, NULL);
347}
348
349
350
351
352
353
354static inline void
355set_irq_chained_handler(unsigned int irq,
356 irq_flow_handler_t handle)
357{
358 __set_irq_handler(irq, handle, 1, NULL);
359}
360
361
362extern int create_irq(void);
363extern void destroy_irq(unsigned int irq);
364
365
366static inline int irq_has_action(unsigned int irq)
367{
368 struct irq_desc *desc = irq_desc + irq;
369 return desc->action != NULL;
370}
371
372
373extern void dynamic_irq_init(unsigned int irq);
374extern void dynamic_irq_cleanup(unsigned int irq);
375
376
377extern int set_irq_chip(unsigned int irq, struct irq_chip *chip);
378extern int set_irq_data(unsigned int irq, void *data);
379extern int set_irq_chip_data(unsigned int irq, void *data);
380extern int set_irq_type(unsigned int irq, unsigned int type);
381extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
382
383#define get_irq_chip(irq) (irq_desc[irq].chip)
384#define get_irq_chip_data(irq) (irq_desc[irq].chip_data)
385#define get_irq_data(irq) (irq_desc[irq].handler_data)
386#define get_irq_msi(irq) (irq_desc[irq].msi_desc)
387
388#endif
389
390#endif
391
392#endif
393