1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* interrupt.h */
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_INTERRUPT_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_INTERRUPT_H
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/kernel.h>
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/linkage.h>
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/bitops.h>
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/preempt.h>
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/cpumask.h>
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/irqreturn.h>
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/hardirq.h>
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/sched.h>
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/irqflags.h>
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/atomic.h>
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/ptrace.h>
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/system.h>
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These correspond to the IORESOURCE_IRQ_* defines in
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linux/ioport.h to select the interrupt line behaviour.  When
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * requesting an interrupt without specifying a IRQF_TRIGGER, the
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * setting should be assumed to be "as already configured", which
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * may be as per machine or firmware initialisation.
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TRIGGER_NONE	0x00000000
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TRIGGER_RISING	0x00000001
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TRIGGER_FALLING	0x00000002
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TRIGGER_HIGH	0x00000004
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TRIGGER_LOW	0x00000008
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TRIGGER_MASK	(IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TRIGGER_PROBE	0x00000010
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These flags used only by the kernel as part of the
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * irq handling routines.
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQF_DISABLED - keep irqs disabled when calling the action handler
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQF_SAMPLE_RANDOM - irq is used to feed the random generator
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQF_SHARED - allow sharing the irq among several devices
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQF_TIMER - Flag to mark this interrupt as timer interrupt
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_DISABLED		0x00000020
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_SAMPLE_RANDOM	0x00000040
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_SHARED		0x00000080
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_PROBE_SHARED	0x00000100
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_TIMER		0x00000200
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQF_PERCPU		0x00000400
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Migration helpers. Scheduled for removal in 1/2007
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Do not use for new code !
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_INTERRUPT		IRQF_DISABLED
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_SAMPLE_RANDOM	IRQF_SAMPLE_RANDOM
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_SHIRQ		IRQF_SHARED
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_PROBEIRQ		IRQF_PROBE_SHARED
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_PERCPU		IRQF_PERCPU
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_TRIGGER_LOW		IRQF_TRIGGER_LOW
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_TRIGGER_HIGH		IRQF_TRIGGER_HIGH
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_TRIGGER_FALLING	IRQF_TRIGGER_FALLING
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_TRIGGER_RISING	IRQF_TRIGGER_RISING
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SA_TRIGGER_MASK		IRQF_TRIGGER_MASK
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct irqaction {
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	irqreturn_t (*handler)(int, void *, struct pt_regs *);
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long flags;
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	cpumask_t mask;
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	const char *name;
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void *dev_id;
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct irqaction *next;
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int irq;
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct proc_dir_entry *dir;
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs);
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int request_irq(unsigned int,
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		       irqreturn_t (*handler)(int, void *, struct pt_regs *),
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		       unsigned long, const char *, void *);
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void free_irq(unsigned int, void *);
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On lockdep we dont want to enable hardirqs in hardirq
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * context. Use local_irq_enable_in_hardirq() to annotate
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * kernel code that has to do this nevertheless (pretty much
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the only valid case is for old/broken hardware that is
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * insanely slow).
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * NOTE: in theory this might break fragile code that relies
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * on hardirq delivery - in practice we dont seem to have such
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * places left. So the only effect should be slightly increased
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * irqs-off latencies.
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_LOCKDEP
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define local_irq_enable_in_hardirq()	do { } while (0)
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define local_irq_enable_in_hardirq()	local_irq_enable()
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_GENERIC_HARDIRQS
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void disable_irq_nosync(unsigned int irq);
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void disable_irq(unsigned int irq);
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void enable_irq(unsigned int irq);
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Special lockdep variants of irq disabling/enabling.
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These should be used for locking constructs that
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * know that a particular irq context which is disabled,
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and which is the only irq-context user of a lock,
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * that it's safe to take the lock in the irq-disabled
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * section without disabling hardirqs.
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On !CONFIG_LOCKDEP they are equivalent to the normal
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * irq disable/enable methods.
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void disable_irq_nosync_lockdep(unsigned int irq)
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	disable_irq_nosync(irq);
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_LOCKDEP
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_disable();
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void disable_irq_lockdep(unsigned int irq)
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	disable_irq(irq);
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_LOCKDEP
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_disable();
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void enable_irq_lockdep(unsigned int irq)
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_LOCKDEP
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_enable();
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	enable_irq(irq);
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* IRQ wakeup (PM) control: */
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int set_irq_wake(unsigned int irq, unsigned int on);
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int enable_irq_wake(unsigned int irq)
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return set_irq_wake(irq, 1);
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int disable_irq_wake(unsigned int irq)
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return set_irq_wake(irq, 0);
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* !CONFIG_GENERIC_HARDIRQS */
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * NOTE: non-genirq architectures, if they want to support the lock
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * validator need to define the methods below in their asm/irq.h
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * files, under an #ifdef CONFIG_LOCKDEP section.
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# ifndef CONFIG_LOCKDEP
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#  define disable_irq_nosync_lockdep(irq)	disable_irq_nosync(irq)
163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#  define disable_irq_lockdep(irq)		disable_irq(irq)
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#  define enable_irq_lockdep(irq)		enable_irq(irq)
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# endif
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_GENERIC_HARDIRQS */
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ARCH_SET_SOFTIRQ_PENDING
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define set_softirq_pending(x) (local_softirq_pending() = (x))
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define or_softirq_pending(x)  (local_softirq_pending() |= (x))
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Temporary defines for UP kernels, until all code gets fixed.
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_SMP
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __deprecated cli(void)
179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_disable();
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __deprecated sti(void)
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_enable();
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __deprecated save_flags(unsigned long *x)
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_save_flags(*x);
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define save_flags(x) save_flags(&x)
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __deprecated restore_flags(unsigned long x)
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_restore(x);
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __deprecated save_and_cli(unsigned long *x)
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_save(*x);
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define save_and_cli(x)	save_and_cli(&x)
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_SMP */
202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void local_bh_disable(void);
204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __local_bh_enable(void);
205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void _local_bh_enable(void);
206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void local_bh_enable(void);
207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void local_bh_enable_ip(unsigned long ip);
208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   frequency threaded job scheduling. For almost all the purposes
211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   tasklets are more than enough. F.e. all serial device BHs et
212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   al. should be converted to tasklets, not to softirqs.
213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum
216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	HI_SOFTIRQ=0,
218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TIMER_SOFTIRQ,
219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	NET_TX_SOFTIRQ,
220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	NET_RX_SOFTIRQ,
221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	BLOCK_SOFTIRQ,
222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TASKLET_SOFTIRQ
223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* softirq mask and active fields moved to irq_cpustat_t in
226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * asm/hardirq.h to get better cache usage.  KAO
227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct softirq_action
230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void	(*action)(struct softirq_action *);
232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void	*data;
233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruasmlinkage void do_softirq(void);
236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data);
237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void softirq_init(void);
238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(raise_softirq_irqoff(unsigned int nr));
240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(raise_softirq(unsigned int nr));
241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Tasklets --- multithreaded analogue of BHs.
244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   Main feature differing them of generic softirqs: tasklet
246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   is running only on one CPU simultaneously.
247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   Main feature differing them of BHs: different tasklets
249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   may be run simultaneously on different CPUs.
250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   Properties:
252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   * If tasklet_schedule() is called, then tasklet is guaranteed
253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru     to be executed on some cpu at least once after this.
254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   * If the tasklet is already scheduled, but its excecution is still not
255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru     started, it will be executed only once.
256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   * If this tasklet is already running on another CPU (or schedule is called
257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru     from tasklet itself), it is rescheduled for later.
258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   * Tasklet is strictly serialized wrt itself, but not
259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru     wrt another tasklets. If client needs some intertask synchronization,
260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru     he makes it with spinlocks.
261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct tasklet_struct
264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct tasklet_struct *next;
266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long state;
267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	atomic_t count;
268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*func)(unsigned long);
269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long data;
270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DECLARE_TASKLET(name, func, data) \
273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DECLARE_TASKLET_DISABLED(name, func, data) \
276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum
280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TASKLET_STATE_SCHED,	/* Tasklet is scheduled for execution */
282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TASKLET_STATE_RUN	/* Tasklet is running (SMP only) */
283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP
286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int tasklet_trylock(struct tasklet_struct *t)
287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_unlock(struct tasklet_struct *t)
292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	smp_mb__before_clear_bit();
294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	clear_bit(TASKLET_STATE_RUN, &(t)->state);
295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_unlock_wait(struct tasklet_struct *t)
298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define tasklet_trylock(t) 1
303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define tasklet_unlock_wait(t) do { } while (0)
304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define tasklet_unlock(t) do { } while (0)
305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(__tasklet_schedule(struct tasklet_struct *t));
308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_schedule(struct tasklet_struct *t)
310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		__tasklet_schedule(t);
313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(__tasklet_hi_schedule(struct tasklet_struct *t));
316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_hi_schedule(struct tasklet_struct *t)
318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		__tasklet_hi_schedule(t);
321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_disable_nosync(struct tasklet_struct *t)
325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	atomic_inc(&t->count);
327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	smp_mb__after_atomic_inc();
328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_disable(struct tasklet_struct *t)
331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	tasklet_disable_nosync(t);
333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	tasklet_unlock_wait(t);
334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	smp_mb();
335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_enable(struct tasklet_struct *t)
338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	smp_mb__before_atomic_dec();
340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	atomic_dec(&t->count);
341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void tasklet_hi_enable(struct tasklet_struct *t)
344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	smp_mb__before_atomic_dec();
346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	atomic_dec(&t->count);
347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void tasklet_kill(struct tasklet_struct *t);
350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void tasklet_init(struct tasklet_struct *t,
352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 void (*func)(unsigned long), unsigned long data);
353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Autoprobing for irqs:
356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * probe_irq_on() and probe_irq_off() provide robust primitives
358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * for accurate IRQ probing during kernel initialization.  They are
359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * reasonably simple to use, are not "fooled" by spurious interrupts,
360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and, unlike other attempts at IRQ probing, they do not get hung on
361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * stuck interrupts (such as unused PS2 mouse interfaces on ASUS boards).
362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For reasonably foolproof probing, use them as follows:
364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 1. clear and/or mask the device's internal interrupt.
366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 2. sti();
367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 3. irqs = probe_irq_on();      // "take over" all unassigned idle IRQs
368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4. enable the device and cause it to trigger an interrupt.
369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 5. wait for the device to interrupt, using non-intrusive polling or a delay.
370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 6. irq = probe_irq_off(irqs);  // get IRQ number, 0=none, negative=multiple
371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 7. service the device to clear its pending interrupt.
372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 8. loop again if paranoia is required.
373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * probe_irq_on() returns a mask of allocated irq's.
375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * probe_irq_off() takes the mask as a parameter,
377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and returns the irq number which occurred,
378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * or zero if none occurred, or a negative irq number
379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * if more than one irq occurred.
380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long probe_irq_on(void)
384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return 0;
386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int probe_irq_off(unsigned long val)
388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return 0;
390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int probe_irq_mask(unsigned long val)
392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return 0;
394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long probe_irq_on(void);	/* returns 0 on failure */
397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int probe_irq_off(unsigned long);	/* returns 0 or negative on failure */
398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned int probe_irq_mask(unsigned long);	/* returns mask of ISA interrupts */
399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
402