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/gfp.h>
21#include <linux/irqreturn.h>
22#include <linux/irqnr.h>
23#include <linux/errno.h>
24#include <linux/topology.h>
25#include <linux/wait.h>
26
27#include <asm/irq.h>
28#include <asm/ptrace.h>
29#include <asm/irq_regs.h>
30
31struct irq_desc;
32typedef void (*irq_flow_handler_t)(unsigned int irq,
33 struct irq_desc *desc);
34
35
36
37
38
39
40
41
42
43#define IRQ_TYPE_NONE 0x00000000
44#define IRQ_TYPE_EDGE_RISING 0x00000001
45#define IRQ_TYPE_EDGE_FALLING 0x00000002
46#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
47#define IRQ_TYPE_LEVEL_HIGH 0x00000004
48#define IRQ_TYPE_LEVEL_LOW 0x00000008
49#define IRQ_TYPE_SENSE_MASK 0x0000000f
50#define IRQ_TYPE_PROBE 0x00000010
51
52
53#define IRQ_INPROGRESS 0x00000100
54#define IRQ_DISABLED 0x00000200
55#define IRQ_PENDING 0x00000400
56#define IRQ_REPLAY 0x00000800
57#define IRQ_AUTODETECT 0x00001000
58#define IRQ_WAITING 0x00002000
59#define IRQ_LEVEL 0x00004000
60#define IRQ_MASKED 0x00008000
61#define IRQ_PER_CPU 0x00010000
62#define IRQ_NOPROBE 0x00020000
63#define IRQ_NOREQUEST 0x00040000
64#define IRQ_NOAUTOEN 0x00080000
65#define IRQ_WAKEUP 0x00100000
66#define IRQ_MOVE_PENDING 0x00200000
67#define IRQ_NO_BALANCING 0x00400000
68#define IRQ_SPURIOUS_DISABLED 0x00800000
69#define IRQ_MOVE_PCNTXT 0x01000000
70#define IRQ_AFFINITY_SET 0x02000000
71#define IRQ_SUSPENDED 0x04000000
72#define IRQ_ONESHOT 0x08000000
73#define IRQ_NESTED_THREAD 0x10000000
74
75#define IRQF_MODIFY_MASK \
76 (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
77 IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL)
78
79#ifdef CONFIG_IRQ_PER_CPU
80# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
81# define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
82#else
83# define CHECK_IRQ_PER_CPU(var) 0
84# define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING
85#endif
86
87struct msi_desc;
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104struct irq_data {
105 unsigned int irq;
106 unsigned int node;
107 struct irq_chip *chip;
108 void *handler_data;
109 void *chip_data;
110 struct msi_desc *msi_desc;
111#ifdef CONFIG_SMP
112 cpumask_var_t affinity;
113#endif
114};
115
116
117
118
119
120
121
122
123
124
125
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
151
152
153
154
155struct irq_chip {
156 const char *name;
157#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
158 unsigned int (*startup)(unsigned int irq);
159 void (*shutdown)(unsigned int irq);
160 void (*enable)(unsigned int irq);
161 void (*disable)(unsigned int irq);
162
163 void (*ack)(unsigned int irq);
164 void (*mask)(unsigned int irq);
165 void (*mask_ack)(unsigned int irq);
166 void (*unmask)(unsigned int irq);
167 void (*eoi)(unsigned int irq);
168
169 void (*end)(unsigned int irq);
170 int (*set_affinity)(unsigned int irq,
171 const struct cpumask *dest);
172 int (*retrigger)(unsigned int irq);
173 int (*set_type)(unsigned int irq, unsigned int flow_type);
174 int (*set_wake)(unsigned int irq, unsigned int on);
175
176 void (*bus_lock)(unsigned int irq);
177 void (*bus_sync_unlock)(unsigned int irq);
178#endif
179 unsigned int (*irq_startup)(struct irq_data *data);
180 void (*irq_shutdown)(struct irq_data *data);
181 void (*irq_enable)(struct irq_data *data);
182 void (*irq_disable)(struct irq_data *data);
183
184 void (*irq_ack)(struct irq_data *data);
185 void (*irq_mask)(struct irq_data *data);
186 void (*irq_mask_ack)(struct irq_data *data);
187 void (*irq_unmask)(struct irq_data *data);
188 void (*irq_eoi)(struct irq_data *data);
189
190 int (*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force);
191 int (*irq_retrigger)(struct irq_data *data);
192 int (*irq_set_type)(struct irq_data *data, unsigned int flow_type);
193 int (*irq_set_wake)(struct irq_data *data, unsigned int on);
194
195 void (*irq_bus_lock)(struct irq_data *data);
196 void (*irq_bus_sync_unlock)(struct irq_data *data);
197
198
199#ifdef CONFIG_IRQ_RELEASE_METHOD
200 void (*release)(unsigned int irq, void *dev_id);
201#endif
202};
203
204
205#include <linux/irqdesc.h>
206
207
208
209
210#include <asm/hw_irq.h>
211
212#ifndef NR_IRQS_LEGACY
213# define NR_IRQS_LEGACY 0
214#endif
215
216#ifndef ARCH_IRQ_INIT_FLAGS
217# define ARCH_IRQ_INIT_FLAGS 0
218#endif
219
220#define IRQ_DEFAULT_INIT_FLAGS (IRQ_DISABLED | ARCH_IRQ_INIT_FLAGS)
221
222struct irqaction;
223extern int setup_irq(unsigned int irq, struct irqaction *new);
224extern void remove_irq(unsigned int irq, struct irqaction *act);
225
226#ifdef CONFIG_GENERIC_HARDIRQS
227
228#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
229void move_native_irq(int irq);
230void move_masked_irq(int irq);
231#else
232static inline void move_native_irq(int irq) { }
233static inline void move_masked_irq(int irq) { }
234#endif
235
236extern int no_irq_affinity;
237
238
239extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action);
240
241
242
243
244
245extern void handle_level_irq(unsigned int irq, struct irq_desc *desc);
246extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc);
247extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc);
248extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc);
249extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc);
250extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
251extern void handle_nested_irq(unsigned int irq);
252
253
254extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
255 irqreturn_t action_ret);
256
257
258
259extern int noirqdebug_setup(char *str);
260
261
262extern int can_request_irq(unsigned int irq, unsigned long irqflags);
263
264
265extern struct irq_chip no_irq_chip;
266extern struct irq_chip dummy_irq_chip;
267
268extern void
269set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
270 irq_flow_handler_t handle);
271extern void
272set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
273 irq_flow_handler_t handle, const char *name);
274
275extern void
276__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
277 const char *name);
278
279
280
281
282static inline void
283set_irq_handler(unsigned int irq, irq_flow_handler_t handle)
284{
285 __set_irq_handler(irq, handle, 0, NULL);
286}
287
288
289
290
291
292
293static inline void
294set_irq_chained_handler(unsigned int irq,
295 irq_flow_handler_t handle)
296{
297 __set_irq_handler(irq, handle, 1, NULL);
298}
299
300extern void set_irq_nested_thread(unsigned int irq, int nest);
301
302void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set);
303
304static inline void irq_set_status_flags(unsigned int irq, unsigned long set)
305{
306 irq_modify_status(irq, 0, set);
307}
308
309static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr)
310{
311 irq_modify_status(irq, clr, 0);
312}
313
314static inline void set_irq_noprobe(unsigned int irq)
315{
316 irq_modify_status(irq, 0, IRQ_NOPROBE);
317}
318
319static inline void set_irq_probe(unsigned int irq)
320{
321 irq_modify_status(irq, IRQ_NOPROBE, 0);
322}
323
324
325extern unsigned int create_irq_nr(unsigned int irq_want, int node);
326extern int create_irq(void);
327extern void destroy_irq(unsigned int irq);
328
329
330
331
332
333extern void dynamic_irq_cleanup(unsigned int irq);
334static inline void dynamic_irq_init(unsigned int irq)
335{
336 dynamic_irq_cleanup(irq);
337}
338
339
340extern int set_irq_chip(unsigned int irq, struct irq_chip *chip);
341extern int set_irq_data(unsigned int irq, void *data);
342extern int set_irq_chip_data(unsigned int irq, void *data);
343extern int set_irq_type(unsigned int irq, unsigned int type);
344extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
345extern struct irq_data *irq_get_irq_data(unsigned int irq);
346
347static inline struct irq_chip *get_irq_chip(unsigned int irq)
348{
349 struct irq_data *d = irq_get_irq_data(irq);
350 return d ? d->chip : NULL;
351}
352
353static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d)
354{
355 return d->chip;
356}
357
358static inline void *get_irq_chip_data(unsigned int irq)
359{
360 struct irq_data *d = irq_get_irq_data(irq);
361 return d ? d->chip_data : NULL;
362}
363
364static inline void *irq_data_get_irq_chip_data(struct irq_data *d)
365{
366 return d->chip_data;
367}
368
369static inline void *get_irq_data(unsigned int irq)
370{
371 struct irq_data *d = irq_get_irq_data(irq);
372 return d ? d->handler_data : NULL;
373}
374
375static inline void *irq_data_get_irq_data(struct irq_data *d)
376{
377 return d->handler_data;
378}
379
380static inline struct msi_desc *get_irq_msi(unsigned int irq)
381{
382 struct irq_data *d = irq_get_irq_data(irq);
383 return d ? d->msi_desc : NULL;
384}
385
386static inline struct msi_desc *irq_data_get_msi(struct irq_data *d)
387{
388 return d->msi_desc;
389}
390
391int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node);
392void irq_free_descs(unsigned int irq, unsigned int cnt);
393int irq_reserve_irqs(unsigned int from, unsigned int cnt);
394
395static inline int irq_alloc_desc(int node)
396{
397 return irq_alloc_descs(-1, 0, 1, node);
398}
399
400static inline int irq_alloc_desc_at(unsigned int at, int node)
401{
402 return irq_alloc_descs(at, at, 1, node);
403}
404
405static inline int irq_alloc_desc_from(unsigned int from, int node)
406{
407 return irq_alloc_descs(-1, from, 1, node);
408}
409
410static inline void irq_free_desc(unsigned int irq)
411{
412 irq_free_descs(irq, 1);
413}
414
415static inline int irq_reserve_irq(unsigned int irq)
416{
417 return irq_reserve_irqs(irq, 1);
418}
419
420#endif
421
422#endif
423
424#endif
425