diff options
Diffstat (limited to 'include/linux/irqdesc.h')
| -rw-r--r-- | include/linux/irqdesc.h | 61 | 
1 files changed, 57 insertions, 4 deletions
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index dd1109fb241e..624a668e61f1 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h @@ -3,9 +3,6 @@  /*   * Core internal functions to deal with irq descriptors - * - * This include will move to kernel/irq once we cleaned up the tree. - * For now it's included from <linux/irq.h>   */  struct irq_affinity_notify; @@ -17,7 +14,7 @@ struct pt_regs;  /**   * struct irq_desc - interrupt descriptor - * @irq_data:		per irq and chip data passed down to chip functions + * @irq_common_data:	per irq and chip data passed down to chip functions   * @kstat_irqs:		irq stats per cpu   * @handle_irq:		highlevel irq-events handler   * @preflow_handler:	handler called before the flow handler (currently used by sparc) @@ -47,6 +44,7 @@ struct pt_regs;   * @name:		flow handler name for /proc/interrupts output   */  struct irq_desc { +	struct irq_common_data	irq_common_data;  	struct irq_data		irq_data;  	unsigned int __percpu	*kstat_irqs;  	irq_flow_handler_t	handle_irq; @@ -93,6 +91,20 @@ struct irq_desc {  extern struct irq_desc irq_desc[NR_IRQS];  #endif +static inline struct irq_desc *irq_data_to_desc(struct irq_data *data) +{ +#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY +	return irq_to_desc(data->irq); +#else +	return container_of(data, struct irq_desc, irq_data); +#endif +} + +static inline unsigned int irq_desc_get_irq(struct irq_desc *desc) +{ +	return desc->irq_data.irq; +} +  static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc)  {  	return &desc->irq_data; @@ -178,6 +190,47 @@ __irq_set_chip_handler_name_locked(unsigned int irq, struct irq_chip *chip,  	desc->name = name;  } +/** + * irq_set_handler_locked - Set irq handler from a locked region + * @data:	Pointer to the irq_data structure which identifies the irq + * @handler:	Flow control handler function for this interrupt + * + * Sets the handler in the irq descriptor associated to @data. + * + * Must be called with irq_desc locked and valid parameters. Typical + * call site is the irq_set_type() callback. + */ +static inline void irq_set_handler_locked(struct irq_data *data, +					  irq_flow_handler_t handler) +{ +	struct irq_desc *desc = irq_data_to_desc(data); + +	desc->handle_irq = handler; +} + +/** + * irq_set_chip_handler_name_locked - Set chip, handler and name from a locked region + * @data:	Pointer to the irq_data structure for which the chip is set + * @chip:	Pointer to the new irq chip + * @handler:	Flow control handler function for this interrupt + * @name:	Name of the interrupt + * + * Replace the irq chip at the proper hierarchy level in @data and + * sets the handler and name in the associated irq descriptor. + * + * Must be called with irq_desc locked and valid parameters. + */ +static inline void +irq_set_chip_handler_name_locked(struct irq_data *data, struct irq_chip *chip, +				 irq_flow_handler_t handler, const char *name) +{ +	struct irq_desc *desc = irq_data_to_desc(data); + +	desc->handle_irq = handler; +	desc->name = name; +	data->chip = chip; +} +  static inline int irq_balancing_disabled(unsigned int irq)  {  	struct irq_desc *desc;  |