File: /Users/paulross/dev/linux/linux-3.13/include/linux/irqdesc.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: #ifndef _LINUX_IRQDESC_H
       2: #define _LINUX_IRQDESC_H
       3: 
       4: /*
       5:  * Core internal functions to deal with irq descriptors
       6:  *
       7:  * This include will move to kernel/irq once we cleaned up the tree.
       8:  * For now it's included from <linux/irq.h>
       9:  */
      10: 
      11: struct irq_affinity_notify;
      12: struct proc_dir_entry;
      13: struct module;
      14: struct irq_desc;
      15: 
      16: /**
      17:  * struct irq_desc - interrupt descriptor
      18:  * @irq_data:        per irq and chip data passed down to chip functions
      19:  * @kstat_irqs:        irq stats per cpu
      20:  * @handle_irq:        highlevel irq-events handler
      21:  * @preflow_handler:    handler called before the flow handler (currently used by sparc)
      22:  * @action:        the irq action chain
      23:  * @status:        status information
      24:  * @core_internal_state__do_not_mess_with_it: core internal status information
      25:  * @depth:        disable-depth, for nested irq_disable() calls
      26:  * @wake_depth:        enable depth, for multiple irq_set_irq_wake() callers
      27:  * @irq_count:        stats field to detect stalled irqs
      28:  * @last_unhandled:    aging timer for unhandled count
      29:  * @irqs_unhandled:    stats field for spurious unhandled interrupts
      30:  * @lock:        locking for SMP
      31:  * @affinity_hint:    hint to user space for preferred irq affinity
      32:  * @affinity_notify:    context for notification of affinity changes
      33:  * @pending_mask:    pending rebalanced interrupts
      34:  * @threads_oneshot:    bitfield to handle shared oneshot threads
      35:  * @threads_active:    number of irqaction threads currently running
      36:  * @wait_for_threads:    wait queue for sync_irq to wait for threaded handlers
      37:  * @dir:        /proc/irq/ procfs entry
      38:  * @name:        flow handler name for /proc/interrupts output
      39:  */
      40: struct irq_desc {
      41:     struct irq_data        irq_data;
      42:     unsigned int __percpu    *kstat_irqs;
      43:     irq_flow_handler_t    handle_irq;
      44: #ifdef CONFIG_IRQ_PREFLOW_FASTEOI
      45:     irq_preflow_handler_t    preflow_handler;
      46: #endif
      47:     struct irqaction    *action;    /* IRQ action list */
      48:     unsigned int        status_use_accessors;
      49:     unsigned int        core_internal_state__do_not_mess_with_it;
      50:     unsigned int        depth;        /* nested irq disables */
      51:     unsigned int        wake_depth;    /* nested wake enables */
      52:     unsigned int        irq_count;    /* For detecting broken IRQs */
      53:     unsigned long        last_unhandled;    /* Aging timer for unhandled count */
      54:     unsigned int        irqs_unhandled;
      55:     raw_spinlock_t        lock;
      56:     struct cpumask        *percpu_enabled;
      57: #ifdef CONFIG_SMP
      58:     const struct cpumask    *affinity_hint;
      59:     struct irq_affinity_notify *affinity_notify;
      60: #ifdef CONFIG_GENERIC_PENDING_IRQ
      61:     cpumask_var_t        pending_mask;
      62: #endif
      63: #endif
      64:     unsigned long        threads_oneshot;
      65:     atomic_t        threads_active;
      66:     wait_queue_head_t       wait_for_threads;
      67: #ifdef CONFIG_PROC_FS
      68:     struct proc_dir_entry    *dir;
      69: #endif
      70:     int            parent_irq;
      71:     struct module        *owner;
      72:     const char        *name;
      73: } ____cacheline_internodealigned_in_smp;
      74: 
      75: #ifndef CONFIG_SPARSE_IRQ
      76: extern struct irq_desc irq_desc[NR_IRQS];
      77: #endif
      78: 
      79: static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc)
      80: {
      81:     return &desc->irq_data;
      82: }
      83: 
      84: static inline struct irq_chip *irq_desc_get_chip(struct irq_desc *desc)
      85: {
      86:     return desc->irq_data.chip;
      87: }
      88: 
      89: static inline void *irq_desc_get_chip_data(struct irq_desc *desc)
      90: {
      91:     return desc->irq_data.chip_data;
      92: }
      93: 
      94: static inline void *irq_desc_get_handler_data(struct irq_desc *desc)
      95: {
      96:     return desc->irq_data.handler_data;
      97: }
      98: 
      99: static inline struct msi_desc *irq_desc_get_msi_desc(struct irq_desc *desc)
     100: {
     101:     return desc->irq_data.msi_desc;
     102: }
     103: 
     104: /*
     105:  * Architectures call this to let the generic IRQ layer
     106:  * handle an interrupt. If the descriptor is attached to an
     107:  * irqchip-style controller then we call the ->handle_irq() handler,
     108:  * and it calls __do_IRQ() if it's attached to an irqtype-style controller.
     109:  */
     110: static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc)
     111: {
     112:     desc->handle_irq(irq, desc);
     113: }
     114: 
     115: int generic_handle_irq(unsigned int irq);
     116: 
     117: /* Test to see if a driver has successfully requested an irq */
     118: static inline int irq_has_action(unsigned int irq)
     119: {
     120:     struct irq_desc *desc = irq_to_desc(irq);
     121:     return desc->action != NULL;
     122: }
     123: 
     124: /* caller has locked the irq_desc and both params are valid */
     125: static inline void __irq_set_handler_locked(unsigned int irq,
     126:                         irq_flow_handler_t handler)
     127: {
     128:     struct irq_desc *desc;
     129: 
     130:     desc = irq_to_desc(irq);
     131:     desc->handle_irq = handler;
     132: }
     133: 
     134: /* caller has locked the irq_desc and both params are valid */
     135: static inline void
     136: __irq_set_chip_handler_name_locked(unsigned int irq, struct irq_chip *chip,
     137:                    irq_flow_handler_t handler, const char *name)
     138: {
     139:     struct irq_desc *desc;
     140: 
     141:     desc = irq_to_desc(irq);
     142:     irq_desc_get_irq_data(desc)->chip = chip;
     143:     desc->handle_irq = handler;
     144:     desc->name = name;
     145: }
     146: 
     147: static inline int irq_balancing_disabled(unsigned int irq)
     148: {
     149:     struct irq_desc *desc;
     150: 
     151:     desc = irq_to_desc(irq);
     152:     return desc->status_use_accessors & IRQ_NO_BALANCING_MASK;
     153: }
     154: 
     155: static inline void
     156: irq_set_lockdep_class(unsigned int irq, struct lock_class_key *class)
     157: {
     158:     struct irq_desc *desc = irq_to_desc(irq);
     159: 
     160:     if (desc)
     161:         lockdep_set_class(&desc->lock, class);
     162: }
     163: 
     164: #ifdef CONFIG_IRQ_PREFLOW_FASTEOI
     165: static inline void
     166: __irq_set_preflow_handler(unsigned int irq, irq_preflow_handler_t handler)
     167: {
     168:     struct irq_desc *desc;
     169: 
     170:     desc = irq_to_desc(irq);
     171:     desc->preflow_handler = handler;
     172: }
     173: #endif
     174: 
     175: #endif
     176: