aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/irq.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/irq.h')
-rw-r--r--include/linux/irq.h354
1 files changed, 255 insertions, 99 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h
index abde2527c699..09a308072f56 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -28,61 +28,87 @@
28#include <asm/ptrace.h> 28#include <asm/ptrace.h>
29#include <asm/irq_regs.h> 29#include <asm/irq_regs.h>
30 30
31struct seq_file;
31struct irq_desc; 32struct irq_desc;
33struct irq_data;
32typedef void (*irq_flow_handler_t)(unsigned int irq, 34typedef void (*irq_flow_handler_t)(unsigned int irq,
33 struct irq_desc *desc); 35 struct irq_desc *desc);
34 36typedef void (*irq_preflow_handler_t)(struct irq_data *data);
35 37
36/* 38/*
37 * IRQ line status. 39 * IRQ line status.
38 * 40 *
39 * Bits 0-7 are reserved for the IRQF_* bits in linux/interrupt.h 41 * Bits 0-7 are the same as the IRQF_* bits in linux/interrupt.h
42 *
43 * IRQ_TYPE_NONE - default, unspecified type
44 * IRQ_TYPE_EDGE_RISING - rising edge triggered
45 * IRQ_TYPE_EDGE_FALLING - falling edge triggered
46 * IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered
47 * IRQ_TYPE_LEVEL_HIGH - high level triggered
48 * IRQ_TYPE_LEVEL_LOW - low level triggered
49 * IRQ_TYPE_LEVEL_MASK - Mask to filter out the level bits
50 * IRQ_TYPE_SENSE_MASK - Mask for all the above bits
51 * IRQ_TYPE_PROBE - Special flag for probing in progress
40 * 52 *
41 * IRQ types 53 * Bits which can be modified via irq_set/clear/modify_status_flags()
54 * IRQ_LEVEL - Interrupt is level type. Will be also
55 * updated in the code when the above trigger
56 * bits are modified via set_irq_type()
57 * IRQ_PER_CPU - Mark an interrupt PER_CPU. Will protect
58 * it from affinity setting
59 * IRQ_NOPROBE - Interrupt cannot be probed by autoprobing
60 * IRQ_NOREQUEST - Interrupt cannot be requested via
61 * request_irq()
62 * IRQ_NOAUTOEN - Interrupt is not automatically enabled in
63 * request/setup_irq()
64 * IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set)
65 * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context
66 * IRQ_NESTED_TRHEAD - Interrupt nests into another thread
42 */ 67 */
43#define IRQ_TYPE_NONE 0x00000000 /* Default, unspecified type */ 68enum {
44#define IRQ_TYPE_EDGE_RISING 0x00000001 /* Edge rising type */ 69 IRQ_TYPE_NONE = 0x00000000,
45#define IRQ_TYPE_EDGE_FALLING 0x00000002 /* Edge falling type */ 70 IRQ_TYPE_EDGE_RISING = 0x00000001,
46#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING) 71 IRQ_TYPE_EDGE_FALLING = 0x00000002,
47#define IRQ_TYPE_LEVEL_HIGH 0x00000004 /* Level high type */ 72 IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
48#define IRQ_TYPE_LEVEL_LOW 0x00000008 /* Level low type */ 73 IRQ_TYPE_LEVEL_HIGH = 0x00000004,
49#define IRQ_TYPE_SENSE_MASK 0x0000000f /* Mask of the above */ 74 IRQ_TYPE_LEVEL_LOW = 0x00000008,
50#define IRQ_TYPE_PROBE 0x00000010 /* Probing in progress */ 75 IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
51 76 IRQ_TYPE_SENSE_MASK = 0x0000000f,
52/* Internal flags */ 77
53#define IRQ_INPROGRESS 0x00000100 /* IRQ handler active - do not enter! */ 78 IRQ_TYPE_PROBE = 0x00000010,
54#define IRQ_DISABLED 0x00000200 /* IRQ disabled - do not enter! */ 79
55#define IRQ_PENDING 0x00000400 /* IRQ pending - replay on enable */ 80 IRQ_LEVEL = (1 << 8),
56#define IRQ_REPLAY 0x00000800 /* IRQ has been replayed but not acked yet */ 81 IRQ_PER_CPU = (1 << 9),
57#define IRQ_AUTODETECT 0x00001000 /* IRQ is being autodetected */ 82 IRQ_NOPROBE = (1 << 10),
58#define IRQ_WAITING 0x00002000 /* IRQ not yet seen - for autodetection */ 83 IRQ_NOREQUEST = (1 << 11),
59#define IRQ_LEVEL 0x00004000 /* IRQ level triggered */ 84 IRQ_NOAUTOEN = (1 << 12),
60#define IRQ_MASKED 0x00008000 /* IRQ masked - shouldn't be seen again */ 85 IRQ_NO_BALANCING = (1 << 13),
61#define IRQ_PER_CPU 0x00010000 /* IRQ is per CPU */ 86 IRQ_MOVE_PCNTXT = (1 << 14),
62#define IRQ_NOPROBE 0x00020000 /* IRQ is not valid for probing */ 87 IRQ_NESTED_THREAD = (1 << 15),
63#define IRQ_NOREQUEST 0x00040000 /* IRQ cannot be requested */ 88};
64#define IRQ_NOAUTOEN 0x00080000 /* IRQ will not be enabled on request irq */
65#define IRQ_WAKEUP 0x00100000 /* IRQ triggers system wakeup */
66#define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */
67#define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */
68#define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */
69#define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */
70#define IRQ_AFFINITY_SET 0x02000000 /* IRQ affinity was set from userspace*/
71#define IRQ_SUSPENDED 0x04000000 /* IRQ has gone through suspend sequence */
72#define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */
73#define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */
74 89
75#define IRQF_MODIFY_MASK \ 90#define IRQF_MODIFY_MASK \
76 (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ 91 (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
77 IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL) 92 IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \
93 IRQ_PER_CPU | IRQ_NESTED_THREAD)
78 94
79#ifdef CONFIG_IRQ_PER_CPU 95#define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
80# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) 96
81# define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) 97static inline __deprecated bool CHECK_IRQ_PER_CPU(unsigned int status)
82#else 98{
83# define CHECK_IRQ_PER_CPU(var) 0 99 return status & IRQ_PER_CPU;
84# define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING 100}
85#endif 101
102/*
103 * Return value for chip->irq_set_affinity()
104 *
105 * IRQ_SET_MASK_OK - OK, core updates irq_data.affinity
106 * IRQ_SET_MASK_NOCPY - OK, chip did update irq_data.affinity
107 */
108enum {
109 IRQ_SET_MASK_OK = 0,
110 IRQ_SET_MASK_OK_NOCOPY,
111};
86 112
87struct msi_desc; 113struct msi_desc;
88 114
@@ -90,6 +116,8 @@ struct msi_desc;
90 * struct irq_data - per irq and irq chip data passed down to chip functions 116 * struct irq_data - per irq and irq chip data passed down to chip functions
91 * @irq: interrupt number 117 * @irq: interrupt number
92 * @node: node index useful for balancing 118 * @node: node index useful for balancing
119 * @state_use_accessors: status information for irq chip functions.
120 * Use accessor functions to deal with it
93 * @chip: low level interrupt hardware access 121 * @chip: low level interrupt hardware access
94 * @handler_data: per-IRQ data for the irq_chip methods 122 * @handler_data: per-IRQ data for the irq_chip methods
95 * @chip_data: platform-specific per-chip private data for the chip 123 * @chip_data: platform-specific per-chip private data for the chip
@@ -104,6 +132,7 @@ struct msi_desc;
104struct irq_data { 132struct irq_data {
105 unsigned int irq; 133 unsigned int irq;
106 unsigned int node; 134 unsigned int node;
135 unsigned int state_use_accessors;
107 struct irq_chip *chip; 136 struct irq_chip *chip;
108 void *handler_data; 137 void *handler_data;
109 void *chip_data; 138 void *chip_data;
@@ -113,6 +142,121 @@ struct irq_data {
113#endif 142#endif
114}; 143};
115 144
145/*
146 * Bit masks for irq_data.state
147 *
148 * IRQD_TRIGGER_MASK - Mask for the trigger type bits
149 * IRQD_SETAFFINITY_PENDING - Affinity setting is pending
150 * IRQD_NO_BALANCING - Balancing disabled for this IRQ
151 * IRQD_PER_CPU - Interrupt is per cpu
152 * IRQD_AFFINITY_SET - Interrupt affinity was set
153 * IRQD_LEVEL - Interrupt is level triggered
154 * IRQD_WAKEUP_STATE - Interrupt is configured for wakeup
155 * from suspend
156 * IRDQ_MOVE_PCNTXT - Interrupt can be moved in process
157 * context
158 * IRQD_IRQ_DISABLED - Disabled state of the interrupt
159 * IRQD_IRQ_MASKED - Masked state of the interrupt
160 * IRQD_IRQ_INPROGRESS - In progress state of the interrupt
161 */
162enum {
163 IRQD_TRIGGER_MASK = 0xf,
164 IRQD_SETAFFINITY_PENDING = (1 << 8),
165 IRQD_NO_BALANCING = (1 << 10),
166 IRQD_PER_CPU = (1 << 11),
167 IRQD_AFFINITY_SET = (1 << 12),
168 IRQD_LEVEL = (1 << 13),
169 IRQD_WAKEUP_STATE = (1 << 14),
170 IRQD_MOVE_PCNTXT = (1 << 15),
171 IRQD_IRQ_DISABLED = (1 << 16),
172 IRQD_IRQ_MASKED = (1 << 17),
173 IRQD_IRQ_INPROGRESS = (1 << 18),
174};
175
176static inline bool irqd_is_setaffinity_pending(struct irq_data *d)
177{
178 return d->state_use_accessors & IRQD_SETAFFINITY_PENDING;
179}
180
181static inline bool irqd_is_per_cpu(struct irq_data *d)
182{
183 return d->state_use_accessors & IRQD_PER_CPU;
184}
185
186static inline bool irqd_can_balance(struct irq_data *d)
187{
188 return !(d->state_use_accessors & (IRQD_PER_CPU | IRQD_NO_BALANCING));
189}
190
191static inline bool irqd_affinity_was_set(struct irq_data *d)
192{
193 return d->state_use_accessors & IRQD_AFFINITY_SET;
194}
195
196static inline void irqd_mark_affinity_was_set(struct irq_data *d)
197{
198 d->state_use_accessors |= IRQD_AFFINITY_SET;
199}
200
201static inline u32 irqd_get_trigger_type(struct irq_data *d)
202{
203 return d->state_use_accessors & IRQD_TRIGGER_MASK;
204}
205
206/*
207 * Must only be called inside irq_chip.irq_set_type() functions.
208 */
209static inline void irqd_set_trigger_type(struct irq_data *d, u32 type)
210{
211 d->state_use_accessors &= ~IRQD_TRIGGER_MASK;
212 d->state_use_accessors |= type & IRQD_TRIGGER_MASK;
213}
214
215static inline bool irqd_is_level_type(struct irq_data *d)
216{
217 return d->state_use_accessors & IRQD_LEVEL;
218}
219
220static inline bool irqd_is_wakeup_set(struct irq_data *d)
221{
222 return d->state_use_accessors & IRQD_WAKEUP_STATE;
223}
224
225static inline bool irqd_can_move_in_process_context(struct irq_data *d)
226{
227 return d->state_use_accessors & IRQD_MOVE_PCNTXT;
228}
229
230static inline bool irqd_irq_disabled(struct irq_data *d)
231{
232 return d->state_use_accessors & IRQD_IRQ_DISABLED;
233}
234
235static inline bool irqd_irq_masked(struct irq_data *d)
236{
237 return d->state_use_accessors & IRQD_IRQ_MASKED;
238}
239
240static inline bool irqd_irq_inprogress(struct irq_data *d)
241{
242 return d->state_use_accessors & IRQD_IRQ_INPROGRESS;
243}
244
245/*
246 * Functions for chained handlers which can be enabled/disabled by the
247 * standard disable_irq/enable_irq calls. Must be called with
248 * irq_desc->lock held.
249 */
250static inline void irqd_set_chained_irq_inprogress(struct irq_data *d)
251{
252 d->state_use_accessors |= IRQD_IRQ_INPROGRESS;
253}
254
255static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
256{
257 d->state_use_accessors &= ~IRQD_IRQ_INPROGRESS;
258}
259
116/** 260/**
117 * struct irq_chip - hardware interrupt chip descriptor 261 * struct irq_chip - hardware interrupt chip descriptor
118 * 262 *
@@ -149,33 +293,15 @@ struct irq_data {
149 * @irq_set_wake: enable/disable power-management wake-on of an IRQ 293 * @irq_set_wake: enable/disable power-management wake-on of an IRQ
150 * @irq_bus_lock: function to lock access to slow bus (i2c) chips 294 * @irq_bus_lock: function to lock access to slow bus (i2c) chips
151 * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips 295 * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
296 * @irq_cpu_online: configure an interrupt source for a secondary CPU
297 * @irq_cpu_offline: un-configure an interrupt source for a secondary CPU
298 * @irq_print_chip: optional to print special chip info in show_interrupts
299 * @flags: chip specific flags
152 * 300 *
153 * @release: release function solely used by UML 301 * @release: release function solely used by UML
154 */ 302 */
155struct irq_chip { 303struct irq_chip {
156 const char *name; 304 const char *name;
157#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
158 unsigned int (*startup)(unsigned int irq);
159 void (*shutdown)(unsigned int irq);
160 void (*enable)(unsigned int irq);
161 void (*disable)(unsigned int irq);
162
163 void (*ack)(unsigned int irq);
164 void (*mask)(unsigned int irq);
165 void (*mask_ack)(unsigned int irq);
166 void (*unmask)(unsigned int irq);
167 void (*eoi)(unsigned int irq);
168
169 void (*end)(unsigned int irq);
170 int (*set_affinity)(unsigned int irq,
171 const struct cpumask *dest);
172 int (*retrigger)(unsigned int irq);
173 int (*set_type)(unsigned int irq, unsigned int flow_type);
174 int (*set_wake)(unsigned int irq, unsigned int on);
175
176 void (*bus_lock)(unsigned int irq);
177 void (*bus_sync_unlock)(unsigned int irq);
178#endif
179 unsigned int (*irq_startup)(struct irq_data *data); 305 unsigned int (*irq_startup)(struct irq_data *data);
180 void (*irq_shutdown)(struct irq_data *data); 306 void (*irq_shutdown)(struct irq_data *data);
181 void (*irq_enable)(struct irq_data *data); 307 void (*irq_enable)(struct irq_data *data);
@@ -195,12 +321,35 @@ struct irq_chip {
195 void (*irq_bus_lock)(struct irq_data *data); 321 void (*irq_bus_lock)(struct irq_data *data);
196 void (*irq_bus_sync_unlock)(struct irq_data *data); 322 void (*irq_bus_sync_unlock)(struct irq_data *data);
197 323
324 void (*irq_cpu_online)(struct irq_data *data);
325 void (*irq_cpu_offline)(struct irq_data *data);
326
327 void (*irq_print_chip)(struct irq_data *data, struct seq_file *p);
328
329 unsigned long flags;
330
198 /* Currently used only by UML, might disappear one day.*/ 331 /* Currently used only by UML, might disappear one day.*/
199#ifdef CONFIG_IRQ_RELEASE_METHOD 332#ifdef CONFIG_IRQ_RELEASE_METHOD
200 void (*release)(unsigned int irq, void *dev_id); 333 void (*release)(unsigned int irq, void *dev_id);
201#endif 334#endif
202}; 335};
203 336
337/*
338 * irq_chip specific flags
339 *
340 * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type()
341 * IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled
342 * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path
343 * IRQCHIP_ONOFFLINE_ENABLED: Only call irq_on/off_line callbacks
344 * when irq enabled
345 */
346enum {
347 IRQCHIP_SET_TYPE_MASKED = (1 << 0),
348 IRQCHIP_EOI_IF_HANDLED = (1 << 1),
349 IRQCHIP_MASK_ON_SUSPEND = (1 << 2),
350 IRQCHIP_ONOFFLINE_ENABLED = (1 << 3),
351};
352
204/* This include will go away once we isolated irq_desc usage to core code */ 353/* This include will go away once we isolated irq_desc usage to core code */
205#include <linux/irqdesc.h> 354#include <linux/irqdesc.h>
206 355
@@ -217,27 +366,28 @@ struct irq_chip {
217# define ARCH_IRQ_INIT_FLAGS 0 366# define ARCH_IRQ_INIT_FLAGS 0
218#endif 367#endif
219 368
220#define IRQ_DEFAULT_INIT_FLAGS (IRQ_DISABLED | ARCH_IRQ_INIT_FLAGS) 369#define IRQ_DEFAULT_INIT_FLAGS ARCH_IRQ_INIT_FLAGS
221 370
222struct irqaction; 371struct irqaction;
223extern int setup_irq(unsigned int irq, struct irqaction *new); 372extern int setup_irq(unsigned int irq, struct irqaction *new);
224extern void remove_irq(unsigned int irq, struct irqaction *act); 373extern void remove_irq(unsigned int irq, struct irqaction *act);
225 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
226#ifdef CONFIG_GENERIC_HARDIRQS 379#ifdef CONFIG_GENERIC_HARDIRQS
227 380
228#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) 381#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
229void move_native_irq(int irq); 382void irq_move_irq(struct irq_data *data);
230void move_masked_irq(int irq); 383void irq_move_masked_irq(struct irq_data *data);
231#else 384#else
232static inline void move_native_irq(int irq) { } 385static inline void irq_move_irq(struct irq_data *data) { }
233static inline void move_masked_irq(int irq) { } 386static inline void irq_move_masked_irq(struct irq_data *data) { }
234#endif 387#endif
235 388
236extern int no_irq_affinity; 389extern int no_irq_affinity;
237 390
238/* Handle irq action chains: */
239extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action);
240
241/* 391/*
242 * Built-in IRQ handlers for various IRQ types, 392 * Built-in IRQ handlers for various IRQ types,
243 * callable via desc->handle_irq() 393 * callable via desc->handle_irq()
@@ -245,6 +395,7 @@ extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action);
245extern void handle_level_irq(unsigned int irq, struct irq_desc *desc); 395extern void handle_level_irq(unsigned int irq, struct irq_desc *desc);
246extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc); 396extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc);
247extern void handle_edge_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);
248extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc); 399extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc);
249extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); 400extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc);
250extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); 401extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
@@ -266,23 +417,23 @@ extern struct irq_chip no_irq_chip;
266extern struct irq_chip dummy_irq_chip; 417extern struct irq_chip dummy_irq_chip;
267 418
268extern void 419extern void
269set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, 420irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
270 irq_flow_handler_t handle);
271extern void
272set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
273 irq_flow_handler_t handle, const char *name); 421 irq_flow_handler_t handle, const char *name);
274 422
423static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *chip,
424 irq_flow_handler_t handle)
425{
426 irq_set_chip_and_handler_name(irq, chip, handle, NULL);
427}
428
275extern void 429extern void
276__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, 430__irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
277 const char *name); 431 const char *name);
278 432
279/*
280 * Set a highlevel flow handler for a given IRQ:
281 */
282static inline void 433static inline void
283set_irq_handler(unsigned int irq, irq_flow_handler_t handle) 434irq_set_handler(unsigned int irq, irq_flow_handler_t handle)
284{ 435{
285 __set_irq_handler(irq, handle, 0, NULL); 436 __irq_set_handler(irq, handle, 0, NULL);
286} 437}
287 438
288/* 439/*
@@ -291,14 +442,11 @@ set_irq_handler(unsigned int irq, irq_flow_handler_t handle)
291 * IRQ_NOREQUEST and IRQ_NOPROBE) 442 * IRQ_NOREQUEST and IRQ_NOPROBE)
292 */ 443 */
293static inline void 444static inline void
294set_irq_chained_handler(unsigned int irq, 445irq_set_chained_handler(unsigned int irq, irq_flow_handler_t handle)
295 irq_flow_handler_t handle)
296{ 446{
297 __set_irq_handler(irq, handle, 1, NULL); 447 __irq_set_handler(irq, handle, 1, NULL);
298} 448}
299 449
300extern void set_irq_nested_thread(unsigned int irq, int nest);
301
302void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set); 450void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set);
303 451
304static inline void irq_set_status_flags(unsigned int irq, unsigned long set) 452static inline void irq_set_status_flags(unsigned int irq, unsigned long set)
@@ -311,16 +459,24 @@ static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr)
311 irq_modify_status(irq, clr, 0); 459 irq_modify_status(irq, clr, 0);
312} 460}
313 461
314static inline void set_irq_noprobe(unsigned int irq) 462static inline void irq_set_noprobe(unsigned int irq)
315{ 463{
316 irq_modify_status(irq, 0, IRQ_NOPROBE); 464 irq_modify_status(irq, 0, IRQ_NOPROBE);
317} 465}
318 466
319static inline void set_irq_probe(unsigned int irq) 467static inline void irq_set_probe(unsigned int irq)
320{ 468{
321 irq_modify_status(irq, IRQ_NOPROBE, 0); 469 irq_modify_status(irq, IRQ_NOPROBE, 0);
322} 470}
323 471
472static inline void irq_set_nested_thread(unsigned int irq, bool nest)
473{
474 if (nest)
475 irq_set_status_flags(irq, IRQ_NESTED_THREAD);
476 else
477 irq_clear_status_flags(irq, IRQ_NESTED_THREAD);
478}
479
324/* Handle dynamic irq creation and destruction */ 480/* Handle dynamic irq creation and destruction */
325extern unsigned int create_irq_nr(unsigned int irq_want, int node); 481extern unsigned int create_irq_nr(unsigned int irq_want, int node);
326extern int create_irq(void); 482extern int create_irq(void);
@@ -337,14 +493,14 @@ static inline void dynamic_irq_init(unsigned int irq)
337} 493}
338 494
339/* Set/get chip/data for an IRQ: */ 495/* Set/get chip/data for an IRQ: */
340extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); 496extern int irq_set_chip(unsigned int irq, struct irq_chip *chip);
341extern int set_irq_data(unsigned int irq, void *data); 497extern int irq_set_handler_data(unsigned int irq, void *data);
342extern int set_irq_chip_data(unsigned int irq, void *data); 498extern int irq_set_chip_data(unsigned int irq, void *data);
343extern int set_irq_type(unsigned int irq, unsigned int type); 499extern int irq_set_irq_type(unsigned int irq, unsigned int type);
344extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); 500extern int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry);
345extern struct irq_data *irq_get_irq_data(unsigned int irq); 501extern struct irq_data *irq_get_irq_data(unsigned int irq);
346 502
347static inline struct irq_chip *get_irq_chip(unsigned int irq) 503static inline struct irq_chip *irq_get_chip(unsigned int irq)
348{ 504{
349 struct irq_data *d = irq_get_irq_data(irq); 505 struct irq_data *d = irq_get_irq_data(irq);
350 return d ? d->chip : NULL; 506 return d ? d->chip : NULL;
@@ -355,7 +511,7 @@ static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d)
355 return d->chip; 511 return d->chip;
356} 512}
357 513
358static inline void *get_irq_chip_data(unsigned int irq) 514static inline void *irq_get_chip_data(unsigned int irq)
359{ 515{
360 struct irq_data *d = irq_get_irq_data(irq); 516 struct irq_data *d = irq_get_irq_data(irq);
361 return d ? d->chip_data : NULL; 517 return d ? d->chip_data : NULL;
@@ -366,18 +522,18 @@ static inline void *irq_data_get_irq_chip_data(struct irq_data *d)
366 return d->chip_data; 522 return d->chip_data;
367} 523}
368 524
369static inline void *get_irq_data(unsigned int irq) 525static inline void *irq_get_handler_data(unsigned int irq)
370{ 526{
371 struct irq_data *d = irq_get_irq_data(irq); 527 struct irq_data *d = irq_get_irq_data(irq);
372 return d ? d->handler_data : NULL; 528 return d ? d->handler_data : NULL;
373} 529}
374 530
375static inline void *irq_data_get_irq_data(struct irq_data *d) 531static inline void *irq_data_get_irq_handler_data(struct irq_data *d)
376{ 532{
377 return d->handler_data; 533 return d->handler_data;
378} 534}
379 535
380static inline struct msi_desc *get_irq_msi(unsigned int irq) 536static inline struct msi_desc *irq_get_msi_desc(unsigned int irq)
381{ 537{
382 struct irq_data *d = irq_get_irq_data(irq); 538 struct irq_data *d = irq_get_irq_data(irq);
383 return d ? d->msi_desc : NULL; 539 return d ? d->msi_desc : NULL;