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 seq_file;
32struct module;
33struct irq_desc;
34struct irq_data;
35typedef void (*irq_flow_handler_t)(unsigned int irq,
36 struct irq_desc *desc);
37typedef void (*irq_preflow_handler_t)(struct irq_data *data);
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71enum {
72 IRQ_TYPE_NONE = 0x00000000,
73 IRQ_TYPE_EDGE_RISING = 0x00000001,
74 IRQ_TYPE_EDGE_FALLING = 0x00000002,
75 IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
76 IRQ_TYPE_LEVEL_HIGH = 0x00000004,
77 IRQ_TYPE_LEVEL_LOW = 0x00000008,
78 IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
79 IRQ_TYPE_SENSE_MASK = 0x0000000f,
80
81 IRQ_TYPE_PROBE = 0x00000010,
82
83 IRQ_LEVEL = (1 << 8),
84 IRQ_PER_CPU = (1 << 9),
85 IRQ_NOPROBE = (1 << 10),
86 IRQ_NOREQUEST = (1 << 11),
87 IRQ_NOAUTOEN = (1 << 12),
88 IRQ_NO_BALANCING = (1 << 13),
89 IRQ_MOVE_PCNTXT = (1 << 14),
90 IRQ_NESTED_THREAD = (1 << 15),
91 IRQ_NOTHREAD = (1 << 16),
92 IRQ_PER_CPU_DEVID = (1 << 17),
93};
94
95#define IRQF_MODIFY_MASK \
96 (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
97 IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \
98 IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID)
99
100#define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
101
102
103
104
105
106
107
108enum {
109 IRQ_SET_MASK_OK = 0,
110 IRQ_SET_MASK_OK_NOCOPY,
111};
112
113struct msi_desc;
114struct irq_domain;
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136struct irq_data {
137 unsigned int irq;
138 unsigned long hwirq;
139 unsigned int node;
140 unsigned int state_use_accessors;
141 struct irq_chip *chip;
142 struct irq_domain *domain;
143 void *handler_data;
144 void *chip_data;
145 struct msi_desc *msi_desc;
146#ifdef CONFIG_SMP
147 cpumask_var_t affinity;
148#endif
149};
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168enum {
169 IRQD_TRIGGER_MASK = 0xf,
170 IRQD_SETAFFINITY_PENDING = (1 << 8),
171 IRQD_NO_BALANCING = (1 << 10),
172 IRQD_PER_CPU = (1 << 11),
173 IRQD_AFFINITY_SET = (1 << 12),
174 IRQD_LEVEL = (1 << 13),
175 IRQD_WAKEUP_STATE = (1 << 14),
176 IRQD_MOVE_PCNTXT = (1 << 15),
177 IRQD_IRQ_DISABLED = (1 << 16),
178 IRQD_IRQ_MASKED = (1 << 17),
179 IRQD_IRQ_INPROGRESS = (1 << 18),
180};
181
182static inline bool irqd_is_setaffinity_pending(struct irq_data *d)
183{
184 return d->state_use_accessors & IRQD_SETAFFINITY_PENDING;
185}
186
187static inline bool irqd_is_per_cpu(struct irq_data *d)
188{
189 return d->state_use_accessors & IRQD_PER_CPU;
190}
191
192static inline bool irqd_can_balance(struct irq_data *d)
193{
194 return !(d->state_use_accessors & (IRQD_PER_CPU | IRQD_NO_BALANCING));
195}
196
197static inline bool irqd_affinity_was_set(struct irq_data *d)
198{
199 return d->state_use_accessors & IRQD_AFFINITY_SET;
200}
201
202static inline void irqd_mark_affinity_was_set(struct irq_data *d)
203{
204 d->state_use_accessors |= IRQD_AFFINITY_SET;
205}
206
207static inline u32 irqd_get_trigger_type(struct irq_data *d)
208{
209 return d->state_use_accessors & IRQD_TRIGGER_MASK;
210}
211
212
213
214
215static inline void irqd_set_trigger_type(struct irq_data *d, u32 type)
216{
217 d->state_use_accessors &= ~IRQD_TRIGGER_MASK;
218 d->state_use_accessors |= type & IRQD_TRIGGER_MASK;
219}
220
221static inline bool irqd_is_level_type(struct irq_data *d)
222{
223 return d->state_use_accessors & IRQD_LEVEL;
224}
225
226static inline bool irqd_is_wakeup_set(struct irq_data *d)
227{
228 return d->state_use_accessors & IRQD_WAKEUP_STATE;
229}
230
231static inline bool irqd_can_move_in_process_context(struct irq_data *d)
232{
233 return d->state_use_accessors & IRQD_MOVE_PCNTXT;
234}
235
236static inline bool irqd_irq_disabled(struct irq_data *d)
237{
238 return d->state_use_accessors & IRQD_IRQ_DISABLED;
239}
240
241static inline bool irqd_irq_masked(struct irq_data *d)
242{
243 return d->state_use_accessors & IRQD_IRQ_MASKED;
244}
245
246static inline bool irqd_irq_inprogress(struct irq_data *d)
247{
248 return d->state_use_accessors & IRQD_IRQ_INPROGRESS;
249}
250
251
252
253
254
255
256static inline void irqd_set_chained_irq_inprogress(struct irq_data *d)
257{
258 d->state_use_accessors |= IRQD_IRQ_INPROGRESS;
259}
260
261static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
262{
263 d->state_use_accessors &= ~IRQD_IRQ_INPROGRESS;
264}
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295struct irq_chip {
296 const char *name;
297 unsigned int (*irq_startup)(struct irq_data *data);
298 void (*irq_shutdown)(struct irq_data *data);
299 void (*irq_enable)(struct irq_data *data);
300 void (*irq_disable)(struct irq_data *data);
301
302 void (*irq_ack)(struct irq_data *data);
303 void (*irq_mask)(struct irq_data *data);
304 void (*irq_mask_ack)(struct irq_data *data);
305 void (*irq_unmask)(struct irq_data *data);
306 void (*irq_eoi)(struct irq_data *data);
307
308 int (*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force);
309 int (*irq_retrigger)(struct irq_data *data);
310 int (*irq_set_type)(struct irq_data *data, unsigned int flow_type);
311 int (*irq_set_wake)(struct irq_data *data, unsigned int on);
312
313 void (*irq_bus_lock)(struct irq_data *data);
314 void (*irq_bus_sync_unlock)(struct irq_data *data);
315
316 void (*irq_cpu_online)(struct irq_data *data);
317 void (*irq_cpu_offline)(struct irq_data *data);
318
319 void (*irq_suspend)(struct irq_data *data);
320 void (*irq_resume)(struct irq_data *data);
321 void (*irq_pm_shutdown)(struct irq_data *data);
322
323 void (*irq_print_chip)(struct irq_data *data, struct seq_file *p);
324
325 unsigned long flags;
326
327
328#ifdef CONFIG_IRQ_RELEASE_METHOD
329 void (*release)(unsigned int irq, void *dev_id);
330#endif
331};
332
333
334
335
336
337
338
339
340
341
342
343enum {
344 IRQCHIP_SET_TYPE_MASKED = (1 << 0),
345 IRQCHIP_EOI_IF_HANDLED = (1 << 1),
346 IRQCHIP_MASK_ON_SUSPEND = (1 << 2),
347 IRQCHIP_ONOFFLINE_ENABLED = (1 << 3),
348 IRQCHIP_SKIP_SET_WAKE = (1 << 4),
349};
350
351
352#include <linux/irqdesc.h>
353
354
355
356
357#include <asm/hw_irq.h>
358
359#ifndef NR_IRQS_LEGACY
360# define NR_IRQS_LEGACY 0
361#endif
362
363#ifndef ARCH_IRQ_INIT_FLAGS
364# define ARCH_IRQ_INIT_FLAGS 0
365#endif
366
367#define IRQ_DEFAULT_INIT_FLAGS ARCH_IRQ_INIT_FLAGS
368
369struct irqaction;
370extern int setup_irq(unsigned int irq, struct irqaction *new);
371extern void remove_irq(unsigned int irq, struct irqaction *act);
372extern int setup_percpu_irq(unsigned int irq, struct irqaction *new);
373extern void remove_percpu_irq(unsigned int irq, struct irqaction *act);
374
375extern void irq_cpu_online(void);
376extern void irq_cpu_offline(void);
377extern int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *cpumask);
378
379#ifdef CONFIG_GENERIC_HARDIRQS
380
381#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
382void irq_move_irq(struct irq_data *data);
383void irq_move_masked_irq(struct irq_data *data);
384#else
385static inline void irq_move_irq(struct irq_data *data) { }
386static inline void irq_move_masked_irq(struct irq_data *data) { }
387#endif
388
389extern int no_irq_affinity;
390
391
392
393
394
395extern void handle_level_irq(unsigned int irq, struct irq_desc *desc);
396extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc);
397extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc);
398extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc);
399extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc);
400extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc);
401extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);
402extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
403extern void handle_nested_irq(unsigned int irq);
404
405
406extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
407 irqreturn_t action_ret);
408
409
410
411extern int noirqdebug_setup(char *str);
412
413
414extern int can_request_irq(unsigned int irq, unsigned long irqflags);
415
416
417extern struct irq_chip no_irq_chip;
418extern struct irq_chip dummy_irq_chip;
419
420extern void
421irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
422 irq_flow_handler_t handle, const char *name);
423
424static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *chip,
425 irq_flow_handler_t handle)
426{
427 irq_set_chip_and_handler_name(irq, chip, handle, NULL);
428}
429
430extern int irq_set_percpu_devid(unsigned int irq);
431
432extern void
433__irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
434 const char *name);
435
436static inline void
437irq_set_handler(unsigned int irq, irq_flow_handler_t handle)
438{
439 __irq_set_handler(irq, handle, 0, NULL);
440}
441
442
443
444
445
446
447static inline void
448irq_set_chained_handler(unsigned int irq, irq_flow_handler_t handle)
449{
450 __irq_set_handler(irq, handle, 1, NULL);
451}
452
453void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set);
454
455static inline void irq_set_status_flags(unsigned int irq, unsigned long set)
456{
457 irq_modify_status(irq, 0, set);
458}
459
460static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr)
461{
462 irq_modify_status(irq, clr, 0);
463}
464
465static inline void irq_set_noprobe(unsigned int irq)
466{
467 irq_modify_status(irq, 0, IRQ_NOPROBE);
468}
469
470static inline void irq_set_probe(unsigned int irq)
471{
472 irq_modify_status(irq, IRQ_NOPROBE, 0);
473}
474
475static inline void irq_set_nothread(unsigned int irq)
476{
477 irq_modify_status(irq, 0, IRQ_NOTHREAD);
478}
479
480static inline void irq_set_thread(unsigned int irq)
481{
482 irq_modify_status(irq, IRQ_NOTHREAD, 0);
483}
484
485static inline void irq_set_nested_thread(unsigned int irq, bool nest)
486{
487 if (nest)
488 irq_set_status_flags(irq, IRQ_NESTED_THREAD);
489 else
490 irq_clear_status_flags(irq, IRQ_NESTED_THREAD);
491}
492
493static inline void irq_set_percpu_devid_flags(unsigned int irq)
494{
495 irq_set_status_flags(irq,
496 IRQ_NOAUTOEN | IRQ_PER_CPU | IRQ_NOTHREAD |
497 IRQ_NOPROBE | IRQ_PER_CPU_DEVID);
498}
499
500
501extern unsigned int create_irq_nr(unsigned int irq_want, int node);
502extern int create_irq(void);
503extern void destroy_irq(unsigned int irq);
504
505
506
507
508
509extern void dynamic_irq_cleanup(unsigned int irq);
510static inline void dynamic_irq_init(unsigned int irq)
511{
512 dynamic_irq_cleanup(irq);
513}
514
515
516extern int irq_set_chip(unsigned int irq, struct irq_chip *chip);
517extern int irq_set_handler_data(unsigned int irq, void *data);
518extern int irq_set_chip_data(unsigned int irq, void *data);
519extern int irq_set_irq_type(unsigned int irq, unsigned int type);
520extern int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry);
521extern struct irq_data *irq_get_irq_data(unsigned int irq);
522
523static inline struct irq_chip *irq_get_chip(unsigned int irq)
524{
525 struct irq_data *d = irq_get_irq_data(irq);
526 return d ? d->chip : NULL;
527}
528
529static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d)
530{
531 return d->chip;
532}
533
534static inline void *irq_get_chip_data(unsigned int irq)
535{
536 struct irq_data *d = irq_get_irq_data(irq);
537 return d ? d->chip_data : NULL;
538}
539
540static inline void *irq_data_get_irq_chip_data(struct irq_data *d)
541{
542 return d->chip_data;
543}
544
545static inline void *irq_get_handler_data(unsigned int irq)
546{
547 struct irq_data *d = irq_get_irq_data(irq);
548 return d ? d->handler_data : NULL;
549}
550
551static inline void *irq_data_get_irq_handler_data(struct irq_data *d)
552{
553 return d->handler_data;
554}
555
556static inline struct msi_desc *irq_get_msi_desc(unsigned int irq)
557{
558 struct irq_data *d = irq_get_irq_data(irq);
559 return d ? d->msi_desc : NULL;
560}
561
562static inline struct msi_desc *irq_data_get_msi(struct irq_data *d)
563{
564 return d->msi_desc;
565}
566
567int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
568 struct module *owner);
569
570
571#define irq_alloc_descs(irq, from, cnt, node) \
572 __irq_alloc_descs(irq, from, cnt, node, THIS_MODULE)
573
574#define irq_alloc_desc(node) \
575 irq_alloc_descs(-1, 0, 1, node)
576
577#define irq_alloc_desc_at(at, node) \
578 irq_alloc_descs(at, at, 1, node)
579
580#define irq_alloc_desc_from(from, node) \
581 irq_alloc_descs(-1, from, 1, node)
582
583void irq_free_descs(unsigned int irq, unsigned int cnt);
584int irq_reserve_irqs(unsigned int from, unsigned int cnt);
585
586static inline void irq_free_desc(unsigned int irq)
587{
588 irq_free_descs(irq, 1);
589}
590
591static inline int irq_reserve_irq(unsigned int irq)
592{
593 return irq_reserve_irqs(irq, 1);
594}
595
596#ifndef irq_reg_writel
597# define irq_reg_writel(val, addr) writel(val, addr)
598#endif
599#ifndef irq_reg_readl
600# define irq_reg_readl(addr) readl(addr)
601#endif
602
603
604
605
606
607
608
609
610
611
612
613struct irq_chip_regs {
614 unsigned long enable;
615 unsigned long disable;
616 unsigned long mask;
617 unsigned long ack;
618 unsigned long eoi;
619 unsigned long type;
620 unsigned long polarity;
621};
622
623
624
625
626
627
628
629
630
631
632
633
634struct irq_chip_type {
635 struct irq_chip chip;
636 struct irq_chip_regs regs;
637 irq_flow_handler_t handler;
638 u32 type;
639};
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663struct irq_chip_generic {
664 raw_spinlock_t lock;
665 void __iomem *reg_base;
666 unsigned int irq_base;
667 unsigned int irq_cnt;
668 u32 mask_cache;
669 u32 type_cache;
670 u32 polarity_cache;
671 u32 wake_enabled;
672 u32 wake_active;
673 unsigned int num_ct;
674 void *private;
675 struct list_head list;
676 struct irq_chip_type chip_types[0];
677};
678
679
680
681
682
683
684
685
686enum irq_gc_flags {
687 IRQ_GC_INIT_MASK_CACHE = 1 << 0,
688 IRQ_GC_INIT_NESTED_LOCK = 1 << 1,
689};
690
691
692void irq_gc_noop(struct irq_data *d);
693void irq_gc_mask_disable_reg(struct irq_data *d);
694void irq_gc_mask_set_bit(struct irq_data *d);
695void irq_gc_mask_clr_bit(struct irq_data *d);
696void irq_gc_unmask_enable_reg(struct irq_data *d);
697void irq_gc_ack_set_bit(struct irq_data *d);
698void irq_gc_ack_clr_bit(struct irq_data *d);
699void irq_gc_mask_disable_reg_and_ack(struct irq_data *d);
700void irq_gc_eoi(struct irq_data *d);
701int irq_gc_set_wake(struct irq_data *d, unsigned int on);
702
703
704struct irq_chip_generic *
705irq_alloc_generic_chip(const char *name, int nr_ct, unsigned int irq_base,
706 void __iomem *reg_base, irq_flow_handler_t handler);
707void irq_setup_generic_chip(struct irq_chip_generic *gc, u32 msk,
708 enum irq_gc_flags flags, unsigned int clr,
709 unsigned int set);
710int irq_setup_alt_chip(struct irq_data *d, unsigned int type);
711void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk,
712 unsigned int clr, unsigned int set);
713
714static inline struct irq_chip_type *irq_data_get_chip_type(struct irq_data *d)
715{
716 return container_of(d->chip, struct irq_chip_type, chip);
717}
718
719#define IRQ_MSK(n) (u32)((n) < 32 ? ((1 << (n)) - 1) : UINT_MAX)
720
721#ifdef CONFIG_SMP
722static inline void irq_gc_lock(struct irq_chip_generic *gc)
723{
724 raw_spin_lock(&gc->lock);
725}
726
727static inline void irq_gc_unlock(struct irq_chip_generic *gc)
728{
729 raw_spin_unlock(&gc->lock);
730}
731#else
732static inline void irq_gc_lock(struct irq_chip_generic *gc) { }
733static inline void irq_gc_unlock(struct irq_chip_generic *gc) { }
734#endif
735
736#endif
737
738#endif
739
740#endif
741