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
18#include <asm/atomic.h>
19#include <asm/ptrace.h>
20#include <asm/system.h>
21
22
23
24
25
26
27
28
29#define IRQF_TRIGGER_NONE 0x00000000
30#define IRQF_TRIGGER_RISING 0x00000001
31#define IRQF_TRIGGER_FALLING 0x00000002
32#define IRQF_TRIGGER_HIGH 0x00000004
33#define IRQF_TRIGGER_LOW 0x00000008
34#define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
35 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
36#define IRQF_TRIGGER_PROBE 0x00000010
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#define IRQF_DISABLED 0x00000020
54#define IRQF_SAMPLE_RANDOM 0x00000040
55#define IRQF_SHARED 0x00000080
56#define IRQF_PROBE_SHARED 0x00000100
57#define IRQF_TIMER 0x00000200
58#define IRQF_PERCPU 0x00000400
59#define IRQF_NOBALANCING 0x00000800
60#define IRQF_IRQPOLL 0x00001000
61
62
63
64
65
66
67
68enum {
69 IRQTF_RUNTHREAD,
70 IRQTF_DIED,
71 IRQTF_WARNED,
72};
73
74typedef irqreturn_t (*irq_handler_t)(int, void *);
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90struct irqaction {
91 irq_handler_t handler;
92 unsigned long flags;
93 cpumask_t mask;
94 const char *name;
95 void *dev_id;
96 struct irqaction *next;
97 int irq;
98 struct proc_dir_entry *dir;
99 irq_handler_t thread_fn;
100 struct task_struct *thread;
101 unsigned long thread_flags;
102};
103
104extern irqreturn_t no_action(int cpl, void *dev_id);
105
106#ifdef CONFIG_GENERIC_HARDIRQS
107extern int __must_check
108request_threaded_irq(unsigned int irq, irq_handler_t handler,
109 irq_handler_t thread_fn,
110 unsigned long flags, const char *name, void *dev);
111
112static inline int __must_check
113request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
114 const char *name, void *dev)
115{
116 return request_threaded_irq(irq, handler, NULL, flags, name, dev);
117}
118
119extern void exit_irq_thread(void);
120#else
121
122extern int __must_check
123request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
124 const char *name, void *dev);
125
126
127
128
129
130
131
132static inline int __must_check
133request_threaded_irq(unsigned int irq, irq_handler_t handler,
134 irq_handler_t thread_fn,
135 unsigned long flags, const char *name, void *dev)
136{
137 return request_irq(irq, handler, flags, name, dev);
138}
139
140static inline void exit_irq_thread(void) { }
141#endif
142
143extern void free_irq(unsigned int, void *);
144
145struct device;
146
147extern int __must_check
148devm_request_threaded_irq(struct device *dev, unsigned int irq,
149 irq_handler_t handler, irq_handler_t thread_fn,
150 unsigned long irqflags, const char *devname,
151 void *dev_id);
152
153static inline int __must_check
154devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,
155 unsigned long irqflags, const char *devname, void *dev_id)
156{
157 return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags,
158 devname, dev_id);
159}
160
161extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);
162
163
164
165
166
167
168
169
170
171
172
173
174
175#ifdef CONFIG_LOCKDEP
176# define local_irq_enable_in_hardirq() do { } while (0)
177#else
178# define local_irq_enable_in_hardirq() local_irq_enable()
179#endif
180
181extern void disable_irq_nosync(unsigned int irq);
182extern void disable_irq(unsigned int irq);
183extern void enable_irq(unsigned int irq);
184
185
186extern void suspend_device_irqs(void);
187extern void resume_device_irqs(void);
188#ifdef CONFIG_PM_SLEEP
189extern int check_wakeup_irqs(void);
190#else
191static inline int check_wakeup_irqs(void) { return 0; }
192#endif
193
194#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS)
195
196extern cpumask_var_t irq_default_affinity;
197
198extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask);
199extern int irq_can_set_affinity(unsigned int irq);
200extern int irq_select_affinity(unsigned int irq);
201
202#else
203
204static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m)
205{
206 return -EINVAL;
207}
208
209static inline int irq_can_set_affinity(unsigned int irq)
210{
211 return 0;
212}
213
214static inline int irq_select_affinity(unsigned int irq) { return 0; }
215
216#endif
217
218#ifdef CONFIG_GENERIC_HARDIRQS
219
220
221
222
223
224
225
226
227
228
229
230static inline void disable_irq_nosync_lockdep(unsigned int irq)
231{
232 disable_irq_nosync(irq);
233#ifdef CONFIG_LOCKDEP
234 local_irq_disable();
235#endif
236}
237
238static inline void disable_irq_nosync_lockdep_irqsave(unsigned int irq, unsigned long *flags)
239{
240 disable_irq_nosync(irq);
241#ifdef CONFIG_LOCKDEP
242 local_irq_save(*flags);
243#endif
244}
245
246static inline void disable_irq_lockdep(unsigned int irq)
247{
248 disable_irq(irq);
249#ifdef CONFIG_LOCKDEP
250 local_irq_disable();
251#endif
252}
253
254static inline void enable_irq_lockdep(unsigned int irq)
255{
256#ifdef CONFIG_LOCKDEP
257 local_irq_enable();
258#endif
259 enable_irq(irq);
260}
261
262static inline void enable_irq_lockdep_irqrestore(unsigned int irq, unsigned long *flags)
263{
264#ifdef CONFIG_LOCKDEP
265 local_irq_restore(*flags);
266#endif
267 enable_irq(irq);
268}
269
270
271extern int set_irq_wake(unsigned int irq, unsigned int on);
272
273static inline int enable_irq_wake(unsigned int irq)
274{
275 return set_irq_wake(irq, 1);
276}
277
278static inline int disable_irq_wake(unsigned int irq)
279{
280 return set_irq_wake(irq, 0);
281}
282
283#else
284
285
286
287
288
289#ifndef CONFIG_LOCKDEP
290# define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq)
291# define disable_irq_nosync_lockdep_irqsave(irq, flags) \
292 disable_irq_nosync(irq)
293# define disable_irq_lockdep(irq) disable_irq(irq)
294# define enable_irq_lockdep(irq) enable_irq(irq)
295# define enable_irq_lockdep_irqrestore(irq, flags) \
296 enable_irq(irq)
297# endif
298
299static inline int enable_irq_wake(unsigned int irq)
300{
301 return 0;
302}
303
304static inline int disable_irq_wake(unsigned int irq)
305{
306 return 0;
307}
308#endif
309
310#ifndef __ARCH_SET_SOFTIRQ_PENDING
311#define set_softirq_pending(x) (local_softirq_pending() = (x))
312#define or_softirq_pending(x) (local_softirq_pending() |= (x))
313#endif
314
315
316
317
318
319
320
321#ifndef hard_irq_disable
322#define hard_irq_disable() do { } while(0)
323#endif
324
325
326
327
328
329
330
331enum
332{
333 HI_SOFTIRQ=0,
334 TIMER_SOFTIRQ,
335 NET_TX_SOFTIRQ,
336 NET_RX_SOFTIRQ,
337 BLOCK_SOFTIRQ,
338 TASKLET_SOFTIRQ,
339 SCHED_SOFTIRQ,
340 HRTIMER_SOFTIRQ,
341 RCU_SOFTIRQ,
342
343 NR_SOFTIRQS
344};
345
346
347
348
349extern char *softirq_to_name[NR_SOFTIRQS];
350
351
352
353
354
355struct softirq_action
356{
357 void (*action)(struct softirq_action *);
358};
359
360asmlinkage void do_softirq(void);
361asmlinkage void __do_softirq(void);
362extern void open_softirq(int nr, void (*action)(struct softirq_action *));
363extern void softirq_init(void);
364#define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
365extern void raise_softirq_irqoff(unsigned int nr);
366extern void raise_softirq(unsigned int nr);
367extern void wakeup_softirqd(void);
368
369
370
371
372
373
374
375
376DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
377
378
379
380
381extern void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq);
382
383
384
385
386extern void __send_remote_softirq(struct call_single_data *cp, int cpu,
387 int this_cpu, int softirq);
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409struct tasklet_struct
410{
411 struct tasklet_struct *next;
412 unsigned long state;
413 atomic_t count;
414 void (*func)(unsigned long);
415 unsigned long data;
416};
417
418#define DECLARE_TASKLET(name, func, data) \
419struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
420
421#define DECLARE_TASKLET_DISABLED(name, func, data) \
422struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
423
424
425enum
426{
427 TASKLET_STATE_SCHED,
428 TASKLET_STATE_RUN
429};
430
431#ifdef CONFIG_SMP
432static inline int tasklet_trylock(struct tasklet_struct *t)
433{
434 return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
435}
436
437static inline void tasklet_unlock(struct tasklet_struct *t)
438{
439 smp_mb__before_clear_bit();
440 clear_bit(TASKLET_STATE_RUN, &(t)->state);
441}
442
443static inline void tasklet_unlock_wait(struct tasklet_struct *t)
444{
445 while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
446}
447#else
448#define tasklet_trylock(t) 1
449#define tasklet_unlock_wait(t) do { } while (0)
450#define tasklet_unlock(t) do { } while (0)
451#endif
452
453extern void __tasklet_schedule(struct tasklet_struct *t);
454
455static inline void tasklet_schedule(struct tasklet_struct *t)
456{
457 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
458 __tasklet_schedule(t);
459}
460
461extern void __tasklet_hi_schedule(struct tasklet_struct *t);
462
463static inline void tasklet_hi_schedule(struct tasklet_struct *t)
464{
465 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
466 __tasklet_hi_schedule(t);
467}
468
469
470static inline void tasklet_disable_nosync(struct tasklet_struct *t)
471{
472 atomic_inc(&t->count);
473 smp_mb__after_atomic_inc();
474}
475
476static inline void tasklet_disable(struct tasklet_struct *t)
477{
478 tasklet_disable_nosync(t);
479 tasklet_unlock_wait(t);
480 smp_mb();
481}
482
483static inline void tasklet_enable(struct tasklet_struct *t)
484{
485 smp_mb__before_atomic_dec();
486 atomic_dec(&t->count);
487}
488
489static inline void tasklet_hi_enable(struct tasklet_struct *t)
490{
491 smp_mb__before_atomic_dec();
492 atomic_dec(&t->count);
493}
494
495extern void tasklet_kill(struct tasklet_struct *t);
496extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
497extern void tasklet_init(struct tasklet_struct *t,
498 void (*func)(unsigned long), unsigned long data);
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
529static inline unsigned long probe_irq_on(void)
530{
531 return 0;
532}
533static inline int probe_irq_off(unsigned long val)
534{
535 return 0;
536}
537static inline unsigned int probe_irq_mask(unsigned long val)
538{
539 return 0;
540}
541#else
542extern unsigned long probe_irq_on(void);
543extern int probe_irq_off(unsigned long);
544extern unsigned int probe_irq_mask(unsigned long);
545#endif
546
547#ifdef CONFIG_PROC_FS
548
549extern void init_irq_proc(void);
550#else
551static inline void init_irq_proc(void)
552{
553}
554#endif
555
556#if defined(CONFIG_GENERIC_HARDIRQS) && defined(CONFIG_DEBUG_SHIRQ)
557extern void debug_poll_all_shared_irqs(void);
558#else
559static inline void debug_poll_all_shared_irqs(void) { }
560#endif
561
562int show_interrupts(struct seq_file *p, void *v);
563
564struct irq_desc;
565
566extern int early_irq_init(void);
567extern int arch_probe_nr_irqs(void);
568extern int arch_early_irq_init(void);
569extern int arch_init_chip_data(struct irq_desc *desc, int cpu);
570
571#endif
572