[PATCH] genirq: add IRQ_NOREQUEST support
[deliverable/linux.git] / include / linux / irq.h
CommitLineData
06fcb0c6
IM
1#ifndef _LINUX_IRQ_H
2#define _LINUX_IRQ_H
1da177e4
LT
3
4/*
5 * Please do not include this file in generic code. There is currently
6 * no requirement for any architecture to implement anything held
7 * within this file.
8 *
9 * Thanks. --rmk
10 */
11
23f9b317 12#include <linux/smp.h>
1da177e4 13
06fcb0c6 14#ifndef CONFIG_S390
1da177e4
LT
15
16#include <linux/linkage.h>
17#include <linux/cache.h>
18#include <linux/spinlock.h>
19#include <linux/cpumask.h>
908dcecd 20#include <linux/irqreturn.h>
1da177e4
LT
21
22#include <asm/irq.h>
23#include <asm/ptrace.h>
24
25/*
26 * IRQ line status.
27 */
28#define IRQ_INPROGRESS 1 /* IRQ handler active - do not enter! */
29#define IRQ_DISABLED 2 /* IRQ disabled - do not enter! */
30#define IRQ_PENDING 4 /* IRQ pending - replay on enable */
31#define IRQ_REPLAY 8 /* IRQ has been replayed but not acked yet */
32#define IRQ_AUTODETECT 16 /* IRQ is being autodetected */
33#define IRQ_WAITING 32 /* IRQ not yet seen - for autodetection */
34#define IRQ_LEVEL 64 /* IRQ level triggered */
35#define IRQ_MASKED 128 /* IRQ masked - shouldn't be seen again */
0d7012a9 36#ifdef CONFIG_IRQ_PER_CPU
f26fdd59
KW
37# define IRQ_PER_CPU 256 /* IRQ is per CPU */
38# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
39#else
40# define CHECK_IRQ_PER_CPU(var) 0
41#endif
1da177e4 42
3418d724 43#define IRQ_NOPROBE 512 /* IRQ is not valid for probing */
6550c775 44#define IRQ_NOREQUEST 1024 /* IRQ cannot be requested */
8fee5c36
IM
45/**
46 * struct hw_interrupt_type - hardware interrupt type descriptor
47 *
48 * @name: name for /proc/interrupts
49 * @startup: start up the interrupt (defaults to ->enable if NULL)
50 * @shutdown: shut down the interrupt (defaults to ->disable if NULL)
51 * @enable: enable the interrupt (defaults to chip->unmask if NULL)
52 * @disable: disable the interrupt (defaults to chip->mask if NULL)
53 * @handle_irq: irq flow handler called from the arch IRQ glue code
54 * @ack: start of a new interrupt
55 * @mask: mask an interrupt source
56 * @mask_ack: ack and mask an interrupt source
57 * @unmask: unmask an interrupt source
58 * @hold: same interrupt while the handler is running
59 * @end: end of interrupt
60 * @set_affinity: set the CPU affinity on SMP machines
61 * @retrigger: resend an IRQ to the CPU
62 * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ
63 * @set_wake: enable/disable power-management wake-on of an IRQ
64 *
65 * @release: release function solely used by UML
1da177e4
LT
66 */
67struct hw_interrupt_type {
71d218b7
IM
68 const char *typename;
69 unsigned int (*startup)(unsigned int irq);
70 void (*shutdown)(unsigned int irq);
71 void (*enable)(unsigned int irq);
72 void (*disable)(unsigned int irq);
73 void (*ack)(unsigned int irq);
74 void (*end)(unsigned int irq);
75 void (*set_affinity)(unsigned int irq, cpumask_t dest);
c0ad90a3
IM
76 int (*retrigger)(unsigned int irq);
77
b77d6adc
PBG
78 /* Currently used only by UML, might disappear one day.*/
79#ifdef CONFIG_IRQ_RELEASE_METHOD
71d218b7 80 void (*release)(unsigned int irq, void *dev_id);
b77d6adc 81#endif
1da177e4
LT
82};
83
84typedef struct hw_interrupt_type hw_irq_controller;
85
4a733ee1
IM
86struct proc_dir_entry;
87
8fee5c36
IM
88/**
89 * struct irq_desc - interrupt descriptor
90 *
91 * @handler: interrupt type dependent handler functions
92 * @handler_data: data for the type handlers
93 * @action: the irq action chain
94 * @status: status information
95 * @depth: disable-depth, for nested irq_disable() calls
96 * @irq_count: stats field to detect stalled irqs
97 * @irqs_unhandled: stats field for spurious unhandled interrupts
98 * @lock: locking for SMP
99 * @affinity: IRQ affinity on SMP
100 * @pending_mask: pending rebalanced interrupts
101 * @move_irq: need to re-target IRQ destination
102 * @dir: /proc/irq/ procfs entry
103 * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP
1da177e4
LT
104 *
105 * Pad this out to 32 bytes for cache and indexing reasons.
106 */
34ffdb72 107struct irq_desc {
71d218b7
IM
108 hw_irq_controller *chip;
109 void *chip_data;
110 struct irqaction *action; /* IRQ action list */
111 unsigned int status; /* IRQ status */
112 unsigned int depth; /* nested irq disables */
113 unsigned int irq_count; /* For detecting broken IRQs */
114 unsigned int irqs_unhandled;
115 spinlock_t lock;
a53da52f 116#ifdef CONFIG_SMP
71d218b7 117 cpumask_t affinity;
a53da52f 118#endif
06fcb0c6 119#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
cd916d31 120 cpumask_t pending_mask;
71d218b7 121 unsigned int move_irq; /* need to re-target IRQ dest */
54d5d424 122#endif
4a733ee1
IM
123#ifdef CONFIG_PROC_FS
124 struct proc_dir_entry *dir;
125#endif
34ffdb72 126} ____cacheline_aligned;
1da177e4 127
34ffdb72 128extern struct irq_desc irq_desc[NR_IRQS];
1da177e4 129
34ffdb72
IM
130/*
131 * Migration helpers for obsolete names, they will go away:
132 */
133typedef struct irq_desc irq_desc_t;
134
135/*
136 * Pick up the arch-dependent methods:
137 */
138#include <asm/hw_irq.h>
1da177e4 139
06fcb0c6 140extern int setup_irq(unsigned int irq, struct irqaction *new);
1da177e4
LT
141
142#ifdef CONFIG_GENERIC_HARDIRQS
06fcb0c6 143
54d5d424
AR
144#ifdef CONFIG_SMP
145static inline void set_native_irq_info(int irq, cpumask_t mask)
146{
a53da52f 147 irq_desc[irq].affinity = mask;
54d5d424
AR
148}
149#else
150static inline void set_native_irq_info(int irq, cpumask_t mask)
151{
152}
153#endif
154
155#ifdef CONFIG_SMP
156
06fcb0c6 157#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
54d5d424 158
c777ac55
AM
159void set_pending_irq(unsigned int irq, cpumask_t mask);
160void move_native_irq(int irq);
54d5d424
AR
161
162#ifdef CONFIG_PCI_MSI
163/*
164 * Wonder why these are dummies?
165 * For e.g the set_ioapic_affinity_vector() calls the set_ioapic_affinity_irq()
166 * counter part after translating the vector to irq info. We need to perform
167 * this operation on the real irq, when we dont use vector, i.e when
168 * pci_use_vector() is false.
169 */
170static inline void move_irq(int irq)
171{
172}
173
174static inline void set_irq_info(int irq, cpumask_t mask)
175{
176}
177
06fcb0c6 178#else /* CONFIG_PCI_MSI */
54d5d424
AR
179
180static inline void move_irq(int irq)
181{
182 move_native_irq(irq);
183}
184
185static inline void set_irq_info(int irq, cpumask_t mask)
186{
187 set_native_irq_info(irq, mask);
188}
54d5d424 189
06fcb0c6
IM
190#endif /* CONFIG_PCI_MSI */
191
192#else /* CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE */
193
194static inline void move_irq(int irq)
195{
196}
197
198static inline void move_native_irq(int irq)
199{
200}
201
202static inline void set_pending_irq(unsigned int irq, cpumask_t mask)
203{
204}
54d5d424 205
54d5d424
AR
206static inline void set_irq_info(int irq, cpumask_t mask)
207{
208 set_native_irq_info(irq, mask);
209}
210
06fcb0c6 211#endif /* CONFIG_GENERIC_PENDING_IRQ */
54d5d424 212
06fcb0c6 213#else /* CONFIG_SMP */
54d5d424
AR
214
215#define move_irq(x)
216#define move_native_irq(x)
217
06fcb0c6 218#endif /* CONFIG_SMP */
54d5d424 219
1b61b910
ZY
220#ifdef CONFIG_IRQBALANCE
221extern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask);
222#else
223static inline void set_balance_irq_affinity(unsigned int irq, cpumask_t mask)
224{
225}
226#endif
227
71d218b7
IM
228#ifdef CONFIG_AUTO_IRQ_AFFINITY
229extern int select_smp_affinity(unsigned int irq);
230#else
231static inline int select_smp_affinity(unsigned int irq)
232{
233 return 1;
234}
235#endif
236
1da177e4
LT
237extern int no_irq_affinity;
238extern int noirqdebug_setup(char *str);
239
2e60bbb6
IM
240extern irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs,
241 struct irqaction *action);
242/*
243 * Explicit fastcall, because i386 4KSTACKS calls it from assembly:
244 */
1da177e4 245extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
2e60bbb6 246
34ffdb72 247extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
2e60bbb6 248 int action_ret, struct pt_regs *regs);
1da177e4
LT
249extern int can_request_irq(unsigned int irq, unsigned long irqflags);
250
a4633adc
TG
251/* Resending of interrupts :*/
252void check_irq_resend(struct irq_desc *desc, unsigned int irq);
253
1da177e4 254extern void init_irq_proc(void);
eee45269 255
06fcb0c6 256#endif /* CONFIG_GENERIC_HARDIRQS */
1da177e4
LT
257
258extern hw_irq_controller no_irq_type; /* needed in every arch ? */
259
06fcb0c6 260#endif /* !CONFIG_S390 */
1da177e4 261
06fcb0c6 262#endif /* _LINUX_IRQ_H */
This page took 0.213135 seconds and 5 git commands to generate.