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