| Grant Likely | 6469dfb | 2011-07-26 03:19:06 -0600 | [diff] [blame] | 1 | /* | 
 | 2 |  * irq_domain - IRQ translation domains | 
 | 3 |  * | 
 | 4 |  * Translation infrastructure between hw and linux irq numbers.  This is | 
 | 5 |  * helpful for interrupt controllers to implement mapping between hardware | 
 | 6 |  * irq numbers and the Linux irq number space. | 
 | 7 |  * | 
 | 8 |  * irq_domains also have a hook for translating device tree interrupt | 
 | 9 |  * representation into a hardware irq number that can be mapped back to a | 
 | 10 |  * Linux irq number without any extra platform support code. | 
 | 11 |  * | 
 | 12 |  * irq_domain is expected to be embedded in an interrupt controller's private | 
 | 13 |  * data structure. | 
 | 14 |  */ | 
 | 15 | #ifndef _LINUX_IRQDOMAIN_H | 
 | 16 | #define _LINUX_IRQDOMAIN_H | 
 | 17 |  | 
 | 18 | #include <linux/irq.h> | 
| Grant Likely | 971a0ee | 2011-07-26 03:19:06 -0600 | [diff] [blame] | 19 | #include <linux/mod_devicetable.h> | 
| Grant Likely | 6469dfb | 2011-07-26 03:19:06 -0600 | [diff] [blame] | 20 |  | 
 | 21 | #ifdef CONFIG_IRQ_DOMAIN | 
 | 22 | struct device_node; | 
 | 23 | struct irq_domain; | 
 | 24 |  | 
 | 25 | /** | 
 | 26 |  * struct irq_domain_ops - Methods for irq_domain objects | 
 | 27 |  * @to_irq: (optional) given a local hardware irq number, return the linux | 
 | 28 |  *          irq number.  If to_irq is not implemented, then the irq_domain | 
 | 29 |  *          will use this translation: irq = (domain->irq_base + hwirq) | 
 | 30 |  * @dt_translate: Given a device tree node and interrupt specifier, decode | 
 | 31 |  *                the hardware irq number and linux irq type value. | 
 | 32 |  */ | 
 | 33 | struct irq_domain_ops { | 
 | 34 | 	unsigned int (*to_irq)(struct irq_domain *d, unsigned long hwirq); | 
 | 35 |  | 
 | 36 | #ifdef CONFIG_OF | 
 | 37 | 	int (*dt_translate)(struct irq_domain *d, struct device_node *node, | 
 | 38 | 			    const u32 *intspec, unsigned int intsize, | 
 | 39 | 			    unsigned long *out_hwirq, unsigned int *out_type); | 
 | 40 | #endif /* CONFIG_OF */ | 
 | 41 | }; | 
 | 42 |  | 
 | 43 | /** | 
 | 44 |  * struct irq_domain - Hardware interrupt number translation object | 
 | 45 |  * @list: Element in global irq_domain list. | 
 | 46 |  * @irq_base: Start of irq_desc range assigned to the irq_domain.  The creator | 
 | 47 |  *            of the irq_domain is responsible for allocating the array of | 
 | 48 |  *            irq_desc structures. | 
 | 49 |  * @nr_irq: Number of irqs managed by the irq domain | 
 | 50 |  * @ops: pointer to irq_domain methods | 
 | 51 |  * @priv: private data pointer for use by owner.  Not touched by irq_domain | 
 | 52 |  *        core code. | 
 | 53 |  * @of_node: (optional) Pointer to device tree nodes associated with the | 
 | 54 |  *           irq_domain.  Used when decoding device tree interrupt specifiers. | 
 | 55 |  */ | 
 | 56 | struct irq_domain { | 
 | 57 | 	struct list_head list; | 
 | 58 | 	unsigned int irq_base; | 
 | 59 | 	unsigned int nr_irq; | 
 | 60 | 	const struct irq_domain_ops *ops; | 
 | 61 | 	void *priv; | 
 | 62 | 	struct device_node *of_node; | 
 | 63 | }; | 
 | 64 |  | 
 | 65 | /** | 
 | 66 |  * irq_domain_to_irq() - Translate from a hardware irq to a linux irq number | 
 | 67 |  * | 
 | 68 |  * Returns the linux irq number associated with a hardware irq.  By default, | 
 | 69 |  * the mapping is irq == domain->irq_base + hwirq, but this mapping can | 
 | 70 |  * be overridden if the irq_domain implements a .to_irq() hook. | 
 | 71 |  */ | 
 | 72 | static inline unsigned int irq_domain_to_irq(struct irq_domain *d, | 
 | 73 | 					     unsigned long hwirq) | 
 | 74 | { | 
 | 75 | 	return d->ops->to_irq ? d->ops->to_irq(d, hwirq) : d->irq_base + hwirq; | 
 | 76 | } | 
 | 77 |  | 
 | 78 | extern void irq_domain_add(struct irq_domain *domain); | 
 | 79 | extern void irq_domain_del(struct irq_domain *domain); | 
 | 80 | #endif /* CONFIG_IRQ_DOMAIN */ | 
 | 81 |  | 
| Grant Likely | 971a0ee | 2011-07-26 03:19:06 -0600 | [diff] [blame] | 82 | #if defined(CONFIG_IRQ_DOMAIN) && defined(CONFIG_OF_IRQ) | 
 | 83 | extern void irq_domain_add_simple(struct device_node *controller, int irq_base); | 
 | 84 | extern void irq_domain_generate_simple(const struct of_device_id *match, | 
 | 85 | 					u64 phys_base, unsigned int irq_start); | 
 | 86 | #else /* CONFIG_IRQ_DOMAIN && CONFIG_OF_IRQ */ | 
 | 87 | static inline void irq_domain_generate_simple(const struct of_device_id *match, | 
 | 88 | 					u64 phys_base, unsigned int irq_start) { } | 
 | 89 | #endif /* CONFIG_IRQ_DOMAIN && CONFIG_OF_IRQ */ | 
 | 90 |  | 
| Grant Likely | 6469dfb | 2011-07-26 03:19:06 -0600 | [diff] [blame] | 91 | #endif /* _LINUX_IRQDOMAIN_H */ |