1
2#ifndef _LINUX_INTERRUPT_H
3#define _LINUX_INTERRUPT_H
4
5#include <linux/kernel.h>
6#include <linux/linkage.h>
7#include <linux/bitops.h>
8#include <linux/preempt.h>
9#include <linux/cpumask.h>
10#include <linux/irqreturn.h>
11#include <linux/hardirq.h>
12#include <linux/sched.h>
13#include <linux/irqflags.h>
14#include <asm/atomic.h>
15#include <asm/ptrace.h>
16#include <asm/system.h>
17
18
19
20
21
22
23
24
25#define IRQF_TRIGGER_NONE 0x00000000
26#define IRQF_TRIGGER_RISING 0x00000001
27#define IRQF_TRIGGER_FALLING 0x00000002
28#define IRQF_TRIGGER_HIGH 0x00000004
29#define IRQF_TRIGGER_LOW 0x00000008
30#define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
31 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
32#define IRQF_TRIGGER_PROBE 0x00000010
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49#define IRQF_DISABLED 0x00000020
50#define IRQF_SAMPLE_RANDOM 0x00000040
51#define IRQF_SHARED 0x00000080
52#define IRQF_PROBE_SHARED 0x00000100
53#define IRQF_TIMER 0x00000200
54#define IRQF_PERCPU 0x00000400
55#define IRQF_NOBALANCING 0x00000800
56#define IRQF_IRQPOLL 0x00001000
57
58typedef irqreturn_t (*irq_handler_t)(int, void *);
59
60struct irqaction {
61 irq_handler_t handler;
62 unsigned long flags;
63 cpumask_t mask;
64 const char *name;
65 void *dev_id;
66 struct irqaction *next;
67 int irq;
68 struct proc_dir_entry *dir;
69};
70
71extern irqreturn_t no_action(int cpl, void *dev_id);
72extern int __must_check request_irq(unsigned int, irq_handler_t handler,
73 unsigned long, const char *, void *);
74extern void free_irq(unsigned int, void *);
75
76struct device;
77
78extern int __must_check devm_request_irq(struct device *dev, unsigned int irq,
79 irq_handler_t handler, unsigned long irqflags,
80 const char *devname, void *dev_id);
81extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);
82
83
84
85
86
87
88
89
90
91
92
93
94
95#ifdef CONFIG_LOCKDEP
96# define local_irq_enable_in_hardirq() do { } while (0)
97#else
98# define local_irq_enable_in_hardirq() local_irq_enable()
99#endif
100
101extern void disable_irq_nosync(unsigned int irq);
102extern void disable_irq(unsigned int irq);
103extern void enable_irq(unsigned int irq);
104
105#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS)
106
107extern int irq_set_affinity(unsigned int irq, cpumask_t cpumask);
108extern int irq_can_set_affinity(unsigned int irq);
109
110#else
111
112static inline int irq_set_affinity(unsigned int irq, cpumask_t cpumask)
113{
114 return -EINVAL;
115}
116
117static inline int irq_can_set_affinity(unsigned int irq)
118{
119 return 0;
120}
121
122#endif
123
124#ifdef CONFIG_GENERIC_HARDIRQS
125
126
127
128
129
130
131
132
133
134
135
136static inline void disable_irq_nosync_lockdep(unsigned int irq)
137{
138 disable_irq_nosync(irq);
139#ifdef CONFIG_LOCKDEP
140 local_irq_disable();
141#endif
142}
143
144static inline void disable_irq_nosync_lockdep_irqsave(unsigned int irq, unsigned long *flags)
145{
146 disable_irq_nosync(irq);
147#ifdef CONFIG_LOCKDEP
148 local_irq_save(*flags);
149#endif
150}
151
152static inline void disable_irq_lockdep(unsigned int irq)
153{
154 disable_irq(irq);
155#ifdef CONFIG_LOCKDEP
156 local_irq_disable();
157#endif
158}
159
160static inline void enable_irq_lockdep(unsigned int irq)
161{
162#ifdef CONFIG_LOCKDEP
163 local_irq_enable();
164#endif
165 enable_irq(irq);
166}
167
168static inline void enable_irq_lockdep_irqrestore(unsigned int irq, unsigned long *flags)
169{
170#ifdef CONFIG_LOCKDEP
171 local_irq_restore(*flags);
172#endif
173 enable_irq(irq);
174}
175
176
177extern int set_irq_wake(unsigned int irq, unsigned int on);
178
179static inline int enable_irq_wake(unsigned int irq)
180{
181 return set_irq_wake(irq, 1);
182}
183
184static inline int disable_irq_wake(unsigned int irq)
185{
186 return set_irq_wake(irq, 0);
187}
188
189#else
190
191
192
193
194
195#ifndef CONFIG_LOCKDEP
196# define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq)
197# define disable_irq_nosync_lockdep_irqsave(irq, flags) \
198 disable_irq_nosync(irq)
199# define disable_irq_lockdep(irq) disable_irq(irq)
200# define enable_irq_lockdep(irq) enable_irq(irq)
201# define enable_irq_lockdep_irqrestore(irq, flags) \
202 enable_irq(irq)
203# endif
204
205static inline int enable_irq_wake(unsigned int irq)
206{
207 return 0;
208}
209
210static inline int disable_irq_wake(unsigned int irq)
211{
212 return 0;
213}
214#endif
215
216#ifndef __ARCH_SET_SOFTIRQ_PENDING
217#define set_softirq_pending(x) (local_softirq_pending() = (x))
218#define or_softirq_pending(x) (local_softirq_pending() |= (x))
219#endif
220
221
222
223
224#ifndef CONFIG_SMP
225static inline void __deprecated cli(void)
226{
227 local_irq_disable();
228}
229static inline void __deprecated sti(void)
230{
231 local_irq_enable();
232}
233static inline void __deprecated save_flags(unsigned long *x)
234{
235 local_save_flags(*x);
236}
237#define save_flags(x) save_flags(&x)
238static inline void __deprecated restore_flags(unsigned long x)
239{
240 local_irq_restore(x);
241}
242
243static inline void __deprecated save_and_cli(unsigned long *x)
244{
245 local_irq_save(*x);
246}
247#define save_and_cli(x) save_and_cli(&x)
248#endif
249
250
251
252
253
254
255
256#ifndef hard_irq_disable
257#define hard_irq_disable() do { } while(0)
258#endif
259
260
261
262
263
264
265
266enum
267{
268 HI_SOFTIRQ=0,
269 TIMER_SOFTIRQ,
270 NET_TX_SOFTIRQ,
271 NET_RX_SOFTIRQ,
272 BLOCK_SOFTIRQ,
273 TASKLET_SOFTIRQ,
274 SCHED_SOFTIRQ,
275#ifdef CONFIG_HIGH_RES_TIMERS
276 HRTIMER_SOFTIRQ,
277#endif
278 RCU_SOFTIRQ,
279};
280
281
282
283
284
285struct softirq_action
286{
287 void (*action)(struct softirq_action *);
288 void *data;
289};
290
291asmlinkage void do_softirq(void);
292asmlinkage void __do_softirq(void);
293extern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data);
294extern void softirq_init(void);
295#define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
296extern void raise_softirq_irqoff(unsigned int nr);
297extern void raise_softirq(unsigned int nr);
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320struct tasklet_struct
321{
322 struct tasklet_struct *next;
323 unsigned long state;
324 atomic_t count;
325 void (*func)(unsigned long);
326 unsigned long data;
327};
328
329#define DECLARE_TASKLET(name, func, data) \
330struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
331
332#define DECLARE_TASKLET_DISABLED(name, func, data) \
333struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
334
335
336enum
337{
338 TASKLET_STATE_SCHED,
339 TASKLET_STATE_RUN
340};
341
342#ifdef CONFIG_SMP
343static inline int tasklet_trylock(struct tasklet_struct *t)
344{
345 return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
346}
347
348static inline void tasklet_unlock(struct tasklet_struct *t)
349{
350 smp_mb__before_clear_bit();
351 clear_bit(TASKLET_STATE_RUN, &(t)->state);
352}
353
354static inline void tasklet_unlock_wait(struct tasklet_struct *t)
355{
356 while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
357}
358#else
359#define tasklet_trylock(t) 1
360#define tasklet_unlock_wait(t) do { } while (0)
361#define tasklet_unlock(t) do { } while (0)
362#endif
363
364extern void __tasklet_schedule(struct tasklet_struct *t);
365
366static inline void tasklet_schedule(struct tasklet_struct *t)
367{
368 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
369 __tasklet_schedule(t);
370}
371
372extern void __tasklet_hi_schedule(struct tasklet_struct *t);
373
374static inline void tasklet_hi_schedule(struct tasklet_struct *t)
375{
376 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
377 __tasklet_hi_schedule(t);
378}
379
380
381static inline void tasklet_disable_nosync(struct tasklet_struct *t)
382{
383 atomic_inc(&t->count);
384 smp_mb__after_atomic_inc();
385}
386
387static inline void tasklet_disable(struct tasklet_struct *t)
388{
389 tasklet_disable_nosync(t);
390 tasklet_unlock_wait(t);
391 smp_mb();
392}
393
394static inline void tasklet_enable(struct tasklet_struct *t)
395{
396 smp_mb__before_atomic_dec();
397 atomic_dec(&t->count);
398}
399
400static inline void tasklet_hi_enable(struct tasklet_struct *t)
401{
402 smp_mb__before_atomic_dec();
403 atomic_dec(&t->count);
404}
405
406extern void tasklet_kill(struct tasklet_struct *t);
407extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
408extern void tasklet_init(struct tasklet_struct *t,
409 void (*func)(unsigned long), unsigned long data);
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
440static inline unsigned long probe_irq_on(void)
441{
442 return 0;
443}
444static inline int probe_irq_off(unsigned long val)
445{
446 return 0;
447}
448static inline unsigned int probe_irq_mask(unsigned long val)
449{
450 return 0;
451}
452#else
453extern unsigned long probe_irq_on(void);
454extern int probe_irq_off(unsigned long);
455extern unsigned int probe_irq_mask(unsigned long);
456#endif
457
458#ifdef CONFIG_PROC_FS
459
460extern void init_irq_proc(void);
461#else
462static inline void init_irq_proc(void)
463{
464}
465#endif
466
467int show_interrupts(struct seq_file *p, void *v);
468
469#endif
470