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#ifdef CONFIG_GENERIC_HARDIRQS
106
107
108
109
110
111
112
113
114
115
116
117static inline void disable_irq_nosync_lockdep(unsigned int irq)
118{
119 disable_irq_nosync(irq);
120#ifdef CONFIG_LOCKDEP
121 local_irq_disable();
122#endif
123}
124
125static inline void disable_irq_nosync_lockdep_irqsave(unsigned int irq, unsigned long *flags)
126{
127 disable_irq_nosync(irq);
128#ifdef CONFIG_LOCKDEP
129 local_irq_save(*flags);
130#endif
131}
132
133static inline void disable_irq_lockdep(unsigned int irq)
134{
135 disable_irq(irq);
136#ifdef CONFIG_LOCKDEP
137 local_irq_disable();
138#endif
139}
140
141static inline void enable_irq_lockdep(unsigned int irq)
142{
143#ifdef CONFIG_LOCKDEP
144 local_irq_enable();
145#endif
146 enable_irq(irq);
147}
148
149static inline void enable_irq_lockdep_irqrestore(unsigned int irq, unsigned long *flags)
150{
151#ifdef CONFIG_LOCKDEP
152 local_irq_restore(*flags);
153#endif
154 enable_irq(irq);
155}
156
157
158extern int set_irq_wake(unsigned int irq, unsigned int on);
159
160static inline int enable_irq_wake(unsigned int irq)
161{
162 return set_irq_wake(irq, 1);
163}
164
165static inline int disable_irq_wake(unsigned int irq)
166{
167 return set_irq_wake(irq, 0);
168}
169
170#else
171
172
173
174
175
176#ifndef CONFIG_LOCKDEP
177# define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq)
178# define disable_irq_nosync_lockdep_irqsave(irq, flags) \
179 disable_irq_nosync(irq)
180# define disable_irq_lockdep(irq) disable_irq(irq)
181# define enable_irq_lockdep(irq) enable_irq(irq)
182# define enable_irq_lockdep_irqrestore(irq, flags) \
183 enable_irq(irq)
184# endif
185
186static inline int enable_irq_wake(unsigned int irq)
187{
188 return 0;
189}
190
191static inline int disable_irq_wake(unsigned int irq)
192{
193 return 0;
194}
195#endif
196
197#ifndef __ARCH_SET_SOFTIRQ_PENDING
198#define set_softirq_pending(x) (local_softirq_pending() = (x))
199#define or_softirq_pending(x) (local_softirq_pending() |= (x))
200#endif
201
202
203
204
205#ifndef CONFIG_SMP
206static inline void __deprecated cli(void)
207{
208 local_irq_disable();
209}
210static inline void __deprecated sti(void)
211{
212 local_irq_enable();
213}
214static inline void __deprecated save_flags(unsigned long *x)
215{
216 local_save_flags(*x);
217}
218#define save_flags(x) save_flags(&x)
219static inline void __deprecated restore_flags(unsigned long x)
220{
221 local_irq_restore(x);
222}
223
224static inline void __deprecated save_and_cli(unsigned long *x)
225{
226 local_irq_save(*x);
227}
228#define save_and_cli(x) save_and_cli(&x)
229#endif
230
231
232
233
234
235
236
237#ifndef hard_irq_disable
238#define hard_irq_disable() do { } while(0)
239#endif
240
241
242
243
244
245
246
247enum
248{
249 HI_SOFTIRQ=0,
250 TIMER_SOFTIRQ,
251 NET_TX_SOFTIRQ,
252 NET_RX_SOFTIRQ,
253 BLOCK_SOFTIRQ,
254 TASKLET_SOFTIRQ,
255 SCHED_SOFTIRQ,
256#ifdef CONFIG_HIGH_RES_TIMERS
257 HRTIMER_SOFTIRQ,
258#endif
259 RCU_SOFTIRQ,
260};
261
262
263
264
265
266struct softirq_action
267{
268 void (*action)(struct softirq_action *);
269 void *data;
270};
271
272asmlinkage void do_softirq(void);
273extern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data);
274extern void softirq_init(void);
275#define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
276extern void raise_softirq_irqoff(unsigned int nr);
277extern void raise_softirq(unsigned int nr);
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300struct tasklet_struct
301{
302 struct tasklet_struct *next;
303 unsigned long state;
304 atomic_t count;
305 void (*func)(unsigned long);
306 unsigned long data;
307};
308
309#define DECLARE_TASKLET(name, func, data) \
310struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
311
312#define DECLARE_TASKLET_DISABLED(name, func, data) \
313struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
314
315
316enum
317{
318 TASKLET_STATE_SCHED,
319 TASKLET_STATE_RUN
320};
321
322#ifdef CONFIG_SMP
323static inline int tasklet_trylock(struct tasklet_struct *t)
324{
325 return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
326}
327
328static inline void tasklet_unlock(struct tasklet_struct *t)
329{
330 smp_mb__before_clear_bit();
331 clear_bit(TASKLET_STATE_RUN, &(t)->state);
332}
333
334static inline void tasklet_unlock_wait(struct tasklet_struct *t)
335{
336 while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
337}
338#else
339#define tasklet_trylock(t) 1
340#define tasklet_unlock_wait(t) do { } while (0)
341#define tasklet_unlock(t) do { } while (0)
342#endif
343
344extern void __tasklet_schedule(struct tasklet_struct *t);
345
346static inline void tasklet_schedule(struct tasklet_struct *t)
347{
348 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
349 __tasklet_schedule(t);
350}
351
352extern void __tasklet_hi_schedule(struct tasklet_struct *t);
353
354static inline void tasklet_hi_schedule(struct tasklet_struct *t)
355{
356 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
357 __tasklet_hi_schedule(t);
358}
359
360
361static inline void tasklet_disable_nosync(struct tasklet_struct *t)
362{
363 atomic_inc(&t->count);
364 smp_mb__after_atomic_inc();
365}
366
367static inline void tasklet_disable(struct tasklet_struct *t)
368{
369 tasklet_disable_nosync(t);
370 tasklet_unlock_wait(t);
371 smp_mb();
372}
373
374static inline void tasklet_enable(struct tasklet_struct *t)
375{
376 smp_mb__before_atomic_dec();
377 atomic_dec(&t->count);
378}
379
380static inline void tasklet_hi_enable(struct tasklet_struct *t)
381{
382 smp_mb__before_atomic_dec();
383 atomic_dec(&t->count);
384}
385
386extern void tasklet_kill(struct tasklet_struct *t);
387extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
388extern void tasklet_init(struct tasklet_struct *t,
389 void (*func)(unsigned long), unsigned long data);
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
420static inline unsigned long probe_irq_on(void)
421{
422 return 0;
423}
424static inline int probe_irq_off(unsigned long val)
425{
426 return 0;
427}
428static inline unsigned int probe_irq_mask(unsigned long val)
429{
430 return 0;
431}
432#else
433extern unsigned long probe_irq_on(void);
434extern int probe_irq_off(unsigned long);
435extern unsigned int probe_irq_mask(unsigned long);
436#endif
437
438#ifdef CONFIG_PROC_FS
439
440extern void init_irq_proc(void);
441#else
442static inline void init_irq_proc(void)
443{
444}
445#endif
446
447int show_interrupts(struct seq_file *p, void *v);
448
449#endif
450