linux/include/linux/irq.h
<<
>>
Prefs
   1#ifndef _LINUX_IRQ_H
   2#define _LINUX_IRQ_H
   3
   4/*
   5 * Please do not include this file in generic code.  There is currently
   6 * no requirement for any architecture to implement anything held
   7 * within this file.
   8 *
   9 * Thanks. --rmk
  10 */
  11
  12#include <linux/smp.h>
  13
  14#ifndef CONFIG_S390
  15
  16#include <linux/linkage.h>
  17#include <linux/cache.h>
  18#include <linux/spinlock.h>
  19#include <linux/cpumask.h>
  20#include <linux/gfp.h>
  21#include <linux/irqreturn.h>
  22#include <linux/irqnr.h>
  23#include <linux/errno.h>
  24#include <linux/topology.h>
  25#include <linux/wait.h>
  26
  27#include <asm/irq.h>
  28#include <asm/ptrace.h>
  29#include <asm/irq_regs.h>
  30
  31struct irq_desc;
  32typedef void (*irq_flow_handler_t)(unsigned int irq,
  33                                            struct irq_desc *desc);
  34
  35
  36/*
  37 * IRQ line status.
  38 *
  39 * Bits 0-7 are reserved for the IRQF_* bits in linux/interrupt.h
  40 *
  41 * IRQ types
  42 */
  43#define IRQ_TYPE_NONE           0x00000000      /* Default, unspecified type */
  44#define IRQ_TYPE_EDGE_RISING    0x00000001      /* Edge rising type */
  45#define IRQ_TYPE_EDGE_FALLING   0x00000002      /* Edge falling type */
  46#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
  47#define IRQ_TYPE_LEVEL_HIGH     0x00000004      /* Level high type */
  48#define IRQ_TYPE_LEVEL_LOW      0x00000008      /* Level low type */
  49#define IRQ_TYPE_SENSE_MASK     0x0000000f      /* Mask of the above */
  50#define IRQ_TYPE_PROBE          0x00000010      /* Probing in progress */
  51
  52/* Internal flags */
  53#define IRQ_INPROGRESS          0x00000100      /* IRQ handler active - do not enter! */
  54#define IRQ_DISABLED            0x00000200      /* IRQ disabled - do not enter! */
  55#define IRQ_PENDING             0x00000400      /* IRQ pending - replay on enable */
  56#define IRQ_REPLAY              0x00000800      /* IRQ has been replayed but not acked yet */
  57#define IRQ_AUTODETECT          0x00001000      /* IRQ is being autodetected */
  58#define IRQ_WAITING             0x00002000      /* IRQ not yet seen - for autodetection */
  59#define IRQ_LEVEL               0x00004000      /* IRQ level triggered */
  60#define IRQ_MASKED              0x00008000      /* IRQ masked - shouldn't be seen again */
  61#define IRQ_PER_CPU             0x00010000      /* IRQ is per CPU */
  62#define IRQ_NOPROBE             0x00020000      /* IRQ is not valid for probing */
  63#define IRQ_NOREQUEST           0x00040000      /* IRQ cannot be requested */
  64#define IRQ_NOAUTOEN            0x00080000      /* IRQ will not be enabled on request irq */
  65#define IRQ_WAKEUP              0x00100000      /* IRQ triggers system wakeup */
  66#define IRQ_MOVE_PENDING        0x00200000      /* need to re-target IRQ destination */
  67#define IRQ_NO_BALANCING        0x00400000      /* IRQ is excluded from balancing */
  68#define IRQ_SPURIOUS_DISABLED   0x00800000      /* IRQ was disabled by the spurious trap */
  69#define IRQ_MOVE_PCNTXT         0x01000000      /* IRQ migration from process context */
  70#define IRQ_AFFINITY_SET        0x02000000      /* IRQ affinity was set from userspace*/
  71#define IRQ_SUSPENDED           0x04000000      /* IRQ has gone through suspend sequence */
  72#define IRQ_ONESHOT             0x08000000      /* IRQ is not unmasked after hardirq */
  73#define IRQ_NESTED_THREAD       0x10000000      /* IRQ is nested into another, no own handler thread */
  74
  75#define IRQF_MODIFY_MASK        \
  76        (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
  77         IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL)
  78
  79#ifdef CONFIG_IRQ_PER_CPU
  80# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
  81# define IRQ_NO_BALANCING_MASK  (IRQ_PER_CPU | IRQ_NO_BALANCING)
  82#else
  83# define CHECK_IRQ_PER_CPU(var) 0
  84# define IRQ_NO_BALANCING_MASK  IRQ_NO_BALANCING
  85#endif
  86
  87struct msi_desc;
  88
  89/**
  90 * struct irq_data - per irq and irq chip data passed down to chip functions
  91 * @irq:                interrupt number
  92 * @node:               node index useful for balancing
  93 * @chip:               low level interrupt hardware access
  94 * @handler_data:       per-IRQ data for the irq_chip methods
  95 * @chip_data:          platform-specific per-chip private data for the chip
  96 *                      methods, to allow shared chip implementations
  97 * @msi_desc:           MSI descriptor
  98 * @affinity:           IRQ affinity on SMP
  99 *
 100 * The fields here need to overlay the ones in irq_desc until we
 101 * cleaned up the direct references and switched everything over to
 102 * irq_data.
 103 */
 104struct irq_data {
 105        unsigned int            irq;
 106        unsigned int            node;
 107        struct irq_chip         *chip;
 108        void                    *handler_data;
 109        void                    *chip_data;
 110        struct msi_desc         *msi_desc;
 111#ifdef CONFIG_SMP
 112        cpumask_var_t           affinity;
 113#endif
 114};
 115
 116/**
 117 * struct irq_chip - hardware interrupt chip descriptor
 118 *
 119 * @name:               name for /proc/interrupts
 120 * @startup:            deprecated, replaced by irq_startup
 121 * @shutdown:           deprecated, replaced by irq_shutdown
 122 * @enable:             deprecated, replaced by irq_enable
 123 * @disable:            deprecated, replaced by irq_disable
 124 * @ack:                deprecated, replaced by irq_ack
 125 * @mask:               deprecated, replaced by irq_mask
 126 * @mask_ack:           deprecated, replaced by irq_mask_ack
 127 * @unmask:             deprecated, replaced by irq_unmask
 128 * @eoi:                deprecated, replaced by irq_eoi
 129 * @end:                deprecated, will go away with __do_IRQ()
 130 * @set_affinity:       deprecated, replaced by irq_set_affinity
 131 * @retrigger:          deprecated, replaced by irq_retrigger
 132 * @set_type:           deprecated, replaced by irq_set_type
 133 * @set_wake:           deprecated, replaced by irq_wake
 134 * @bus_lock:           deprecated, replaced by irq_bus_lock
 135 * @bus_sync_unlock:    deprecated, replaced by irq_bus_sync_unlock
 136 *
 137 * @irq_startup:        start up the interrupt (defaults to ->enable if NULL)
 138 * @irq_shutdown:       shut down the interrupt (defaults to ->disable if NULL)
 139 * @irq_enable:         enable the interrupt (defaults to chip->unmask if NULL)
 140 * @irq_disable:        disable the interrupt
 141 * @irq_ack:            start of a new interrupt
 142 * @irq_mask:           mask an interrupt source
 143 * @irq_mask_ack:       ack and mask an interrupt source
 144 * @irq_unmask:         unmask an interrupt source
 145 * @irq_eoi:            end of interrupt
 146 * @irq_set_affinity:   set the CPU affinity on SMP machines
 147 * @irq_retrigger:      resend an IRQ to the CPU
 148 * @irq_set_type:       set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ
 149 * @irq_set_wake:       enable/disable power-management wake-on of an IRQ
 150 * @irq_bus_lock:       function to lock access to slow bus (i2c) chips
 151 * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
 152 *
 153 * @release:            release function solely used by UML
 154 */
 155struct irq_chip {
 156        const char      *name;
 157#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
 158        unsigned int    (*startup)(unsigned int irq);
 159        void            (*shutdown)(unsigned int irq);
 160        void            (*enable)(unsigned int irq);
 161        void            (*disable)(unsigned int irq);
 162
 163        void            (*ack)(unsigned int irq);
 164        void            (*mask)(unsigned int irq);
 165        void            (*mask_ack)(unsigned int irq);
 166        void            (*unmask)(unsigned int irq);
 167        void            (*eoi)(unsigned int irq);
 168
 169        void            (*end)(unsigned int irq);
 170        int             (*set_affinity)(unsigned int irq,
 171                                        const struct cpumask *dest);
 172        int             (*retrigger)(unsigned int irq);
 173        int             (*set_type)(unsigned int irq, unsigned int flow_type);
 174        int             (*set_wake)(unsigned int irq, unsigned int on);
 175
 176        void            (*bus_lock)(unsigned int irq);
 177        void            (*bus_sync_unlock)(unsigned int irq);
 178#endif
 179        unsigned int    (*irq_startup)(struct irq_data *data);
 180        void            (*irq_shutdown)(struct irq_data *data);
 181        void            (*irq_enable)(struct irq_data *data);
 182        void            (*irq_disable)(struct irq_data *data);
 183
 184        void            (*irq_ack)(struct irq_data *data);
 185        void            (*irq_mask)(struct irq_data *data);
 186        void            (*irq_mask_ack)(struct irq_data *data);
 187        void            (*irq_unmask)(struct irq_data *data);
 188        void            (*irq_eoi)(struct irq_data *data);
 189
 190        int             (*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force);
 191        int             (*irq_retrigger)(struct irq_data *data);
 192        int             (*irq_set_type)(struct irq_data *data, unsigned int flow_type);
 193        int             (*irq_set_wake)(struct irq_data *data, unsigned int on);
 194
 195        void            (*irq_bus_lock)(struct irq_data *data);
 196        void            (*irq_bus_sync_unlock)(struct irq_data *data);
 197
 198        /* Currently used only by UML, might disappear one day.*/
 199#ifdef CONFIG_IRQ_RELEASE_METHOD
 200        void            (*release)(unsigned int irq, void *dev_id);
 201#endif
 202};
 203
 204/* This include will go away once we isolated irq_desc usage to core code */
 205#include <linux/irqdesc.h>
 206
 207/*
 208 * Pick up the arch-dependent methods:
 209 */
 210#include <asm/hw_irq.h>
 211
 212#ifndef NR_IRQS_LEGACY
 213# define NR_IRQS_LEGACY 0
 214#endif
 215
 216#ifndef ARCH_IRQ_INIT_FLAGS
 217# define ARCH_IRQ_INIT_FLAGS    0
 218#endif
 219
 220#define IRQ_DEFAULT_INIT_FLAGS  (IRQ_DISABLED | ARCH_IRQ_INIT_FLAGS)
 221
 222struct irqaction;
 223extern int setup_irq(unsigned int irq, struct irqaction *new);
 224extern void remove_irq(unsigned int irq, struct irqaction *act);
 225
 226#ifdef CONFIG_GENERIC_HARDIRQS
 227
 228#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
 229void move_native_irq(int irq);
 230void move_masked_irq(int irq);
 231#else
 232static inline void move_native_irq(int irq) { }
 233static inline void move_masked_irq(int irq) { }
 234#endif
 235
 236extern int no_irq_affinity;
 237
 238/* Handle irq action chains: */
 239extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action);
 240
 241/*
 242 * Built-in IRQ handlers for various IRQ types,
 243 * callable via desc->handle_irq()
 244 */
 245extern void handle_level_irq(unsigned int irq, struct irq_desc *desc);
 246extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc);
 247extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc);
 248extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc);
 249extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc);
 250extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
 251extern void handle_nested_irq(unsigned int irq);
 252
 253/* Handling of unhandled and spurious interrupts: */
 254extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
 255                           irqreturn_t action_ret);
 256
 257
 258/* Enable/disable irq debugging output: */
 259extern int noirqdebug_setup(char *str);
 260
 261/* Checks whether the interrupt can be requested by request_irq(): */
 262extern int can_request_irq(unsigned int irq, unsigned long irqflags);
 263
 264/* Dummy irq-chip implementations: */
 265extern struct irq_chip no_irq_chip;
 266extern struct irq_chip dummy_irq_chip;
 267
 268extern void
 269set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
 270                         irq_flow_handler_t handle);
 271extern void
 272set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
 273                              irq_flow_handler_t handle, const char *name);
 274
 275extern void
 276__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
 277                  const char *name);
 278
 279/*
 280 * Set a highlevel flow handler for a given IRQ:
 281 */
 282static inline void
 283set_irq_handler(unsigned int irq, irq_flow_handler_t handle)
 284{
 285        __set_irq_handler(irq, handle, 0, NULL);
 286}
 287
 288/*
 289 * Set a highlevel chained flow handler for a given IRQ.
 290 * (a chained handler is automatically enabled and set to
 291 *  IRQ_NOREQUEST and IRQ_NOPROBE)
 292 */
 293static inline void
 294set_irq_chained_handler(unsigned int irq,
 295                        irq_flow_handler_t handle)
 296{
 297        __set_irq_handler(irq, handle, 1, NULL);
 298}
 299
 300extern void set_irq_nested_thread(unsigned int irq, int nest);
 301
 302void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set);
 303
 304static inline void irq_set_status_flags(unsigned int irq, unsigned long set)
 305{
 306        irq_modify_status(irq, 0, set);
 307}
 308
 309static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr)
 310{
 311        irq_modify_status(irq, clr, 0);
 312}
 313
 314static inline void set_irq_noprobe(unsigned int irq)
 315{
 316        irq_modify_status(irq, 0, IRQ_NOPROBE);
 317}
 318
 319static inline void set_irq_probe(unsigned int irq)
 320{
 321        irq_modify_status(irq, IRQ_NOPROBE, 0);
 322}
 323
 324/* Handle dynamic irq creation and destruction */
 325extern unsigned int create_irq_nr(unsigned int irq_want, int node);
 326extern int create_irq(void);
 327extern void destroy_irq(unsigned int irq);
 328
 329/*
 330 * Dynamic irq helper functions. Obsolete. Use irq_alloc_desc* and
 331 * irq_free_desc instead.
 332 */
 333extern void dynamic_irq_cleanup(unsigned int irq);
 334static inline void dynamic_irq_init(unsigned int irq)
 335{
 336        dynamic_irq_cleanup(irq);
 337}
 338
 339/* Set/get chip/data for an IRQ: */
 340extern int set_irq_chip(unsigned int irq, struct irq_chip *chip);
 341extern int set_irq_data(unsigned int irq, void *data);
 342extern int set_irq_chip_data(unsigned int irq, void *data);
 343extern int set_irq_type(unsigned int irq, unsigned int type);
 344extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
 345extern struct irq_data *irq_get_irq_data(unsigned int irq);
 346
 347static inline struct irq_chip *get_irq_chip(unsigned int irq)
 348{
 349        struct irq_data *d = irq_get_irq_data(irq);
 350        return d ? d->chip : NULL;
 351}
 352
 353static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d)
 354{
 355        return d->chip;
 356}
 357
 358static inline void *get_irq_chip_data(unsigned int irq)
 359{
 360        struct irq_data *d = irq_get_irq_data(irq);
 361        return d ? d->chip_data : NULL;
 362}
 363
 364static inline void *irq_data_get_irq_chip_data(struct irq_data *d)
 365{
 366        return d->chip_data;
 367}
 368
 369static inline void *get_irq_data(unsigned int irq)
 370{
 371        struct irq_data *d = irq_get_irq_data(irq);
 372        return d ? d->handler_data : NULL;
 373}
 374
 375static inline void *irq_data_get_irq_data(struct irq_data *d)
 376{
 377        return d->handler_data;
 378}
 379
 380static inline struct msi_desc *get_irq_msi(unsigned int irq)
 381{
 382        struct irq_data *d = irq_get_irq_data(irq);
 383        return d ? d->msi_desc : NULL;
 384}
 385
 386static inline struct msi_desc *irq_data_get_msi(struct irq_data *d)
 387{
 388        return d->msi_desc;
 389}
 390
 391int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node);
 392void irq_free_descs(unsigned int irq, unsigned int cnt);
 393int irq_reserve_irqs(unsigned int from, unsigned int cnt);
 394
 395static inline int irq_alloc_desc(int node)
 396{
 397        return irq_alloc_descs(-1, 0, 1, node);
 398}
 399
 400static inline int irq_alloc_desc_at(unsigned int at, int node)
 401{
 402        return irq_alloc_descs(at, at, 1, node);
 403}
 404
 405static inline int irq_alloc_desc_from(unsigned int from, int node)
 406{
 407        return irq_alloc_descs(-1, from, 1, node);
 408}
 409
 410static inline void irq_free_desc(unsigned int irq)
 411{
 412        irq_free_descs(irq, 1);
 413}
 414
 415static inline int irq_reserve_irq(unsigned int irq)
 416{
 417        return irq_reserve_irqs(irq, 1);
 418}
 419
 420#endif /* CONFIG_GENERIC_HARDIRQS */
 421
 422#endif /* !CONFIG_S390 */
 423
 424#endif /* _LINUX_IRQ_H */
 425
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.