aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq/internals.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/irq/internals.h')
-rw-r--r--kernel/irq/internals.h174
1 files changed, 125 insertions, 49 deletions
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index c63f3bc88f0b..6546431447d7 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -1,95 +1,171 @@
1/* 1/*
2 * IRQ subsystem internal functions and variables: 2 * IRQ subsystem internal functions and variables:
3 *
4 * Do not ever include this file from anything else than
5 * kernel/irq/. Do not even think about using any information outside
6 * of this file for your non core code.
3 */ 7 */
8#include <linux/irqdesc.h>
9
10#ifdef CONFIG_SPARSE_IRQ
11# define IRQ_BITMAP_BITS (NR_IRQS + 8196)
12#else
13# define IRQ_BITMAP_BITS NR_IRQS
14#endif
15
16#define istate core_internal_state__do_not_mess_with_it
4 17
5extern int noirqdebug; 18extern int noirqdebug;
6 19
7/* Set default functions for irq_chip structures: */ 20/*
8extern void irq_chip_set_defaults(struct irq_chip *chip); 21 * Bits used by threaded handlers:
22 * IRQTF_RUNTHREAD - signals that the interrupt handler thread should run
23 * IRQTF_DIED - handler thread died
24 * IRQTF_WARNED - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed
25 * IRQTF_AFFINITY - irq thread is requested to adjust affinity
26 * IRQTF_FORCED_THREAD - irq action is force threaded
27 */
28enum {
29 IRQTF_RUNTHREAD,
30 IRQTF_DIED,
31 IRQTF_WARNED,
32 IRQTF_AFFINITY,
33 IRQTF_FORCED_THREAD,
34};
9 35
10/* Set default handler: */ 36/*
11extern void compat_irq_chip_set_default_handler(struct irq_desc *desc); 37 * Bit masks for desc->state
38 *
39 * IRQS_AUTODETECT - autodetection in progress
40 * IRQS_SPURIOUS_DISABLED - was disabled due to spurious interrupt
41 * detection
42 * IRQS_POLL_INPROGRESS - polling in progress
43 * IRQS_ONESHOT - irq is not unmasked in primary handler
44 * IRQS_REPLAY - irq is replayed
45 * IRQS_WAITING - irq is waiting
46 * IRQS_PENDING - irq is pending and replayed later
47 * IRQS_SUSPENDED - irq is suspended
48 */
49enum {
50 IRQS_AUTODETECT = 0x00000001,
51 IRQS_SPURIOUS_DISABLED = 0x00000002,
52 IRQS_POLL_INPROGRESS = 0x00000008,
53 IRQS_ONESHOT = 0x00000020,
54 IRQS_REPLAY = 0x00000040,
55 IRQS_WAITING = 0x00000080,
56 IRQS_PENDING = 0x00000200,
57 IRQS_SUSPENDED = 0x00000800,
58};
59
60#include "debug.h"
61#include "settings.h"
62
63#define irq_data_to_desc(data) container_of(data, struct irq_desc, irq_data)
12 64
13extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, 65extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
14 unsigned long flags); 66 unsigned long flags);
15extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp); 67extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp);
16extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume); 68extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume);
17 69
18extern struct lock_class_key irq_desc_lock_class; 70extern int irq_startup(struct irq_desc *desc);
71extern void irq_shutdown(struct irq_desc *desc);
72extern void irq_enable(struct irq_desc *desc);
73extern void irq_disable(struct irq_desc *desc);
74extern void mask_irq(struct irq_desc *desc);
75extern void unmask_irq(struct irq_desc *desc);
76
19extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr); 77extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr);
20extern void clear_kstat_irqs(struct irq_desc *desc);
21extern raw_spinlock_t sparse_irq_lock;
22 78
23#ifdef CONFIG_SPARSE_IRQ 79irqreturn_t handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action);
24void replace_irq_desc(unsigned int irq, struct irq_desc *desc); 80irqreturn_t handle_irq_event(struct irq_desc *desc);
25#endif 81
82/* Resending of interrupts :*/
83void check_irq_resend(struct irq_desc *desc, unsigned int irq);
84bool irq_wait_for_poll(struct irq_desc *desc);
26 85
27#ifdef CONFIG_PROC_FS 86#ifdef CONFIG_PROC_FS
28extern void register_irq_proc(unsigned int irq, struct irq_desc *desc); 87extern void register_irq_proc(unsigned int irq, struct irq_desc *desc);
88extern void unregister_irq_proc(unsigned int irq, struct irq_desc *desc);
29extern void register_handler_proc(unsigned int irq, struct irqaction *action); 89extern void register_handler_proc(unsigned int irq, struct irqaction *action);
30extern void unregister_handler_proc(unsigned int irq, struct irqaction *action); 90extern void unregister_handler_proc(unsigned int irq, struct irqaction *action);
31#else 91#else
32static inline void register_irq_proc(unsigned int irq, struct irq_desc *desc) { } 92static inline void register_irq_proc(unsigned int irq, struct irq_desc *desc) { }
93static inline void unregister_irq_proc(unsigned int irq, struct irq_desc *desc) { }
33static inline void register_handler_proc(unsigned int irq, 94static inline void register_handler_proc(unsigned int irq,
34 struct irqaction *action) { } 95 struct irqaction *action) { }
35static inline void unregister_handler_proc(unsigned int irq, 96static inline void unregister_handler_proc(unsigned int irq,
36 struct irqaction *action) { } 97 struct irqaction *action) { }
37#endif 98#endif
38 99
39extern int irq_select_affinity_usr(unsigned int irq); 100extern int irq_select_affinity_usr(unsigned int irq, struct cpumask *mask);
40 101
41extern void irq_set_thread_affinity(struct irq_desc *desc); 102extern void irq_set_thread_affinity(struct irq_desc *desc);
42 103
43/* Inline functions for support of irq chips on slow busses */ 104/* Inline functions for support of irq chips on slow busses */
44static inline void chip_bus_lock(unsigned int irq, struct irq_desc *desc) 105static inline void chip_bus_lock(struct irq_desc *desc)
106{
107 if (unlikely(desc->irq_data.chip->irq_bus_lock))
108 desc->irq_data.chip->irq_bus_lock(&desc->irq_data);
109}
110
111static inline void chip_bus_sync_unlock(struct irq_desc *desc)
112{
113 if (unlikely(desc->irq_data.chip->irq_bus_sync_unlock))
114 desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
115}
116
117struct irq_desc *
118__irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus);
119void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus);
120
121static inline struct irq_desc *
122irq_get_desc_buslock(unsigned int irq, unsigned long *flags)
123{
124 return __irq_get_desc_lock(irq, flags, true);
125}
126
127static inline void
128irq_put_desc_busunlock(struct irq_desc *desc, unsigned long flags)
45{ 129{
46 if (unlikely(desc->chip->bus_lock)) 130 __irq_put_desc_unlock(desc, flags, true);
47 desc->chip->bus_lock(irq);
48} 131}
49 132
50static inline void chip_bus_sync_unlock(unsigned int irq, struct irq_desc *desc) 133static inline struct irq_desc *
134irq_get_desc_lock(unsigned int irq, unsigned long *flags)
51{ 135{
52 if (unlikely(desc->chip->bus_sync_unlock)) 136 return __irq_get_desc_lock(irq, flags, false);
53 desc->chip->bus_sync_unlock(irq); 137}
138
139static inline void
140irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags)
141{
142 __irq_put_desc_unlock(desc, flags, false);
54} 143}
55 144
56/* 145/*
57 * Debugging printout: 146 * Manipulation functions for irq_data.state
58 */ 147 */
148static inline void irqd_set_move_pending(struct irq_data *d)
149{
150 d->state_use_accessors |= IRQD_SETAFFINITY_PENDING;
151}
59 152
60#include <linux/kallsyms.h> 153static inline void irqd_clr_move_pending(struct irq_data *d)
61 154{
62#define P(f) if (desc->status & f) printk("%14s set\n", #f) 155 d->state_use_accessors &= ~IRQD_SETAFFINITY_PENDING;
156}
63 157
64static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc) 158static inline void irqd_clear(struct irq_data *d, unsigned int mask)
65{ 159{
66 printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n", 160 d->state_use_accessors &= ~mask;
67 irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled);
68 printk("->handle_irq(): %p, ", desc->handle_irq);
69 print_symbol("%s\n", (unsigned long)desc->handle_irq);
70 printk("->chip(): %p, ", desc->chip);
71 print_symbol("%s\n", (unsigned long)desc->chip);
72 printk("->action(): %p\n", desc->action);
73 if (desc->action) {
74 printk("->action->handler(): %p, ", desc->action->handler);
75 print_symbol("%s\n", (unsigned long)desc->action->handler);
76 }
77
78 P(IRQ_INPROGRESS);
79 P(IRQ_DISABLED);
80 P(IRQ_PENDING);
81 P(IRQ_REPLAY);
82 P(IRQ_AUTODETECT);
83 P(IRQ_WAITING);
84 P(IRQ_LEVEL);
85 P(IRQ_MASKED);
86#ifdef CONFIG_IRQ_PER_CPU
87 P(IRQ_PER_CPU);
88#endif
89 P(IRQ_NOPROBE);
90 P(IRQ_NOREQUEST);
91 P(IRQ_NOAUTOEN);
92} 161}
93 162
94#undef P 163static inline void irqd_set(struct irq_data *d, unsigned int mask)
164{
165 d->state_use_accessors |= mask;
166}
95 167
168static inline bool irqd_has_set(struct irq_data *d, unsigned int mask)
169{
170 return d->state_use_accessors & mask;
171}