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: