1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_IRQ_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_IRQ_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Please do not include this file in generic code. There is currently 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * no requirement for any architecture to implement anything held 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * within this file. 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Thanks. --rmk 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/smp.h> 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_S390 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/linkage.h> 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/cache.h> 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/spinlock.h> 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/cpumask.h> 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/irqreturn.h> 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/irq.h> 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/ptrace.h> 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQ line status. 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Bits 0-16 are reserved for the IRQF_* bits in linux/interrupt.h 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQ types 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_NONE 0x00000000 /* Default, unspecified type */ 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_EDGE_RISING 0x00000001 /* Edge rising type */ 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_EDGE_FALLING 0x00000002 /* Edge falling type */ 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING) 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_LEVEL_HIGH 0x00000004 /* Level high type */ 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_LEVEL_LOW 0x00000008 /* Level low type */ 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_SENSE_MASK 0x0000000f /* Mask of the above */ 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_TYPE_PROBE 0x00000010 /* Probing in progress */ 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Internal flags */ 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_INPROGRESS 0x00010000 /* IRQ handler active - do not enter! */ 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_DISABLED 0x00020000 /* IRQ disabled - do not enter! */ 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_PENDING 0x00040000 /* IRQ pending - replay on enable */ 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_REPLAY 0x00080000 /* IRQ has been replayed but not acked yet */ 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_AUTODETECT 0x00100000 /* IRQ is being autodetected */ 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_WAITING 0x00200000 /* IRQ not yet seen - for autodetection */ 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_LEVEL 0x00400000 /* IRQ level triggered */ 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_MASKED 0x00800000 /* IRQ masked - shouldn't be seen again */ 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_PER_CPU 0x01000000 /* IRQ is per CPU */ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_IRQ_PER_CPU 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define CHECK_IRQ_PER_CPU(var) 0 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_NOPROBE 0x02000000 /* IRQ is not valid for probing */ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_NOREQUEST 0x04000000 /* IRQ cannot be requested */ 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_NOAUTOEN 0x08000000 /* IRQ will not be enabled on request irq */ 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_DELAYED_DISABLE 0x10000000 /* IRQ disable (masking) happens delayed. */ 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IRQ_WAKEUP 0x20000000 /* IRQ triggers system wakeup */ 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct proc_dir_entry; 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct irq_chip - hardware interrupt chip descriptor 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @name: name for /proc/interrupts 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @startup: start up the interrupt (defaults to ->enable if NULL) 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @shutdown: shut down the interrupt (defaults to ->disable if NULL) 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @enable: enable the interrupt (defaults to chip->unmask if NULL) 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @disable: disable the interrupt (defaults to chip->mask if NULL) 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ack: start of a new interrupt 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @mask: mask an interrupt source 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @mask_ack: ack and mask an interrupt source 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @unmask: unmask an interrupt source 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @eoi: end of interrupt - chip level 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @end: end of interrupt - flow level 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @set_affinity: set the CPU affinity on SMP machines 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @retrigger: resend an IRQ to the CPU 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @set_wake: enable/disable power-management wake-on of an IRQ 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @release: release function solely used by UML 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @typename: obsoleted by name, kept as migration helper 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct irq_chip { 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const char *name; 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int (*startup)(unsigned int irq); 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*shutdown)(unsigned int irq); 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*enable)(unsigned int irq); 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*disable)(unsigned int irq); 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*ack)(unsigned int irq); 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*mask)(unsigned int irq); 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*mask_ack)(unsigned int irq); 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*unmask)(unsigned int irq); 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*eoi)(unsigned int irq); 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*end)(unsigned int irq); 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*set_affinity)(unsigned int irq, cpumask_t dest); 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*retrigger)(unsigned int irq); 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*set_type)(unsigned int irq, unsigned int flow_type); 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*set_wake)(unsigned int irq, unsigned int on); 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Currently used only by UML, might disappear one day.*/ 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_IRQ_RELEASE_METHOD 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*release)(unsigned int irq, void *dev_id); 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For compatibility, ->typename is copied into ->name. 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Will disappear. 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const char *typename; 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct irq_desc - interrupt descriptor 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @chip: low level interrupt hardware access 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @handler_data: per-IRQ data for the irq_chip methods 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @chip_data: platform-specific per-chip private data for the chip 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * methods, to allow shared chip implementations 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @action: the irq action chain 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @status: status information 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @depth: disable-depth, for nested irq_disable() calls 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @wake_depth: enable depth, for multiple set_irq_wake() callers 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @irq_count: stats field to detect stalled irqs 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @irqs_unhandled: stats field for spurious unhandled interrupts 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @lock: locking for SMP 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @affinity: IRQ affinity on SMP 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @cpu: cpu index useful for balancing 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @pending_mask: pending rebalanced interrupts 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @move_irq: need to re-target IRQ destination 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dir: /proc/irq/ procfs entry 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Pad this out to 32 bytes for cache and indexing reasons. 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct irq_desc { 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void fastcall (*handle_irq)(unsigned int irq, 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct irq_desc *desc, 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *regs); 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct irq_chip *chip; 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *handler_data; 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *chip_data; 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct irqaction *action; /* IRQ action list */ 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int status; /* IRQ status */ 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int depth; /* nested irq disables */ 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int wake_depth; /* nested wake enables */ 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int irq_count; /* For detecting broken IRQs */ 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int irqs_unhandled; 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t lock; 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cpumask_t affinity; 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int cpu; 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru cpumask_t pending_mask; 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int move_irq; /* need to re-target IRQ dest */ 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_PROC_FS 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct proc_dir_entry *dir; 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} ____cacheline_aligned; 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct irq_desc irq_desc[NR_IRQS]; 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Migration helpers for obsolete names, they will go away: 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define hw_interrupt_type irq_chip 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct irq_chip hw_irq_controller; 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define no_irq_type no_irq_chip 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct irq_desc irq_desc_t; 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Pick up the arch-dependent methods: 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/hw_irq.h> 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int setup_irq(unsigned int irq, struct irqaction *new); 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_GENERIC_HARDIRQS 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef handle_dynamic_tick 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define handle_dynamic_tick(a) do { } while (0) 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_native_irq_info(int irq, cpumask_t mask) 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru irq_desc[irq].affinity = mask; 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_native_irq_info(int irq, cpumask_t mask) 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid set_pending_irq(unsigned int irq, cpumask_t mask); 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid move_native_irq(int irq); 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_PCI_MSI 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Wonder why these are dummies? 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For e.g the set_ioapic_affinity_vector() calls the set_ioapic_affinity_irq() 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * counter part after translating the vector to irq info. We need to perform 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * this operation on the real irq, when we dont use vector, i.e when 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * pci_use_vector() is false. 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void move_irq(int irq) 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_irq_info(int irq, cpumask_t mask) 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* CONFIG_PCI_MSI */ 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void move_irq(int irq) 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru move_native_irq(irq); 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_irq_info(int irq, cpumask_t mask) 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_native_irq_info(irq, mask); 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_PCI_MSI */ 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE */ 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void move_irq(int irq) 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void move_native_irq(int irq) 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_pending_irq(unsigned int irq, cpumask_t mask) 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_irq_info(int irq, cpumask_t mask) 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_native_irq_info(irq, mask); 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_GENERIC_PENDING_IRQ */ 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* CONFIG_SMP */ 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define move_irq(x) 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define move_native_irq(x) 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_SMP */ 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_IRQBALANCE 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask); 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_balance_irq_affinity(unsigned int irq, cpumask_t mask) 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_AUTO_IRQ_AFFINITY 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int select_smp_affinity(unsigned int irq); 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int select_smp_affinity(unsigned int irq) 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int no_irq_affinity; 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Handle irq action chains: */ 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct irqaction *action); 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Built-in IRQ handlers for various IRQ types, 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * callable via desc->chip->handle_irq() 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void fastcall 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruhandle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void fastcall 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruhandle_fasteoi_irq(unsigned int irq, struct irq_desc *desc, 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *regs); 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void fastcall 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruhandle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void fastcall 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruhandle_simple_irq(unsigned int irq, struct irq_desc *desc, 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *regs); 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void fastcall 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruhandle_percpu_irq(unsigned int irq, struct irq_desc *desc, 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *regs); 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void fastcall 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruhandle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Get a descriptive string for the highlevel handler, for 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * /proc/interrupts output: 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern const char * 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruhandle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *, 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *)); 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Monolithic do_IRQ implementation. 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (is an explicit fastcall, because i386 4KSTACKS calls it from assembly) 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Architectures call this to let the generic IRQ layer 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * handle an interrupt. If the descriptor is attached to an 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * irqchip-style controller then we call the ->handle_irq() handler, 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and it calls __do_IRQ() if it's attached to an irqtype-style controller. 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void generic_handle_irq(unsigned int irq, struct pt_regs *regs) 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct irq_desc *desc = irq_desc + irq; 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (likely(desc->handle_irq)) 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru desc->handle_irq(irq, desc, regs); 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __do_IRQ(irq, regs); 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Handling of unhandled and spurious interrupts: */ 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void note_interrupt(unsigned int irq, struct irq_desc *desc, 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int action_ret, struct pt_regs *regs); 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Resending of interrupts :*/ 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid check_irq_resend(struct irq_desc *desc, unsigned int irq); 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Initialize /proc/irq/ */ 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void init_irq_proc(void); 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Enable/disable irq debugging output: */ 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int noirqdebug_setup(char *str); 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Checks whether the interrupt can be requested by request_irq(): */ 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int can_request_irq(unsigned int irq, unsigned long irqflags); 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Dummy irq-chip implementations: */ 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct irq_chip no_irq_chip; 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct irq_chip dummy_irq_chip; 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruset_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void fastcall (*handle)(unsigned int, 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct irq_desc *, 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *)); 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__set_irq_handler(unsigned int irq, 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void fastcall (*handle)(unsigned int, struct irq_desc *, 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *), 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int is_chained); 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Set a highlevel flow handler for a given IRQ: 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruset_irq_handler(unsigned int irq, 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void fastcall (*handle)(unsigned int, struct irq_desc *, 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *)) 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __set_irq_handler(irq, handle, 0); 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Set a highlevel chained flow handler for a given IRQ. 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (a chained handler is automatically enabled and set to 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IRQ_NOREQUEST and IRQ_NOPROBE) 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruset_irq_chained_handler(unsigned int irq, 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void fastcall (*handle)(unsigned int, struct irq_desc *, 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct pt_regs *)) 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __set_irq_handler(irq, handle, 1); 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Set/get chip/data for an IRQ: */ 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int set_irq_chip(unsigned int irq, struct irq_chip *chip); 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int set_irq_data(unsigned int irq, void *data); 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int set_irq_chip_data(unsigned int irq, void *data); 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int set_irq_type(unsigned int irq, unsigned int type); 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_irq_chip(irq) (irq_desc[irq].chip) 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_irq_chip_data(irq) (irq_desc[irq].chip_data) 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_irq_data(irq) (irq_desc[irq].handler_data) 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_GENERIC_HARDIRQS */ 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* !CONFIG_S390 */ 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_IRQ_H */ 412