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