irqdomain.h 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. #include <linux/irq.h>
  18. #include <linux/mod_devicetable.h>
  19. #ifdef CONFIG_IRQ_DOMAIN
  20. struct device_node;
  21. struct irq_domain;
  22. /**
  23. * struct irq_domain_ops - Methods for irq_domain objects
  24. * @to_irq: (optional) given a local hardware irq number, return the linux
  25. * irq number. If to_irq is not implemented, then the irq_domain
  26. * will use this translation: irq = (domain->irq_base + hwirq)
  27. * @dt_translate: Given a device tree node and interrupt specifier, decode
  28. * the hardware irq number and linux irq type value.
  29. */
  30. struct irq_domain_ops {
  31. unsigned int (*to_irq)(struct irq_domain *d, unsigned long hwirq);
  32. #ifdef CONFIG_OF
  33. int (*dt_translate)(struct irq_domain *d, struct device_node *node,
  34. const u32 *intspec, unsigned int intsize,
  35. unsigned long *out_hwirq, unsigned int *out_type);
  36. #endif /* CONFIG_OF */
  37. };
  38. /**
  39. * struct irq_domain - Hardware interrupt number translation object
  40. * @list: Element in global irq_domain list.
  41. * @irq_base: Start of irq_desc range assigned to the irq_domain. The creator
  42. * of the irq_domain is responsible for allocating the array of
  43. * irq_desc structures.
  44. * @nr_irq: Number of irqs managed by the irq domain
  45. * @ops: pointer to irq_domain methods
  46. * @priv: private data pointer for use by owner. Not touched by irq_domain
  47. * core code.
  48. * @of_node: (optional) Pointer to device tree nodes associated with the
  49. * irq_domain. Used when decoding device tree interrupt specifiers.
  50. */
  51. struct irq_domain {
  52. struct list_head list;
  53. unsigned int irq_base;
  54. unsigned int nr_irq;
  55. const struct irq_domain_ops *ops;
  56. void *priv;
  57. struct device_node *of_node;
  58. };
  59. /**
  60. * irq_domain_to_irq() - Translate from a hardware irq to a linux irq number
  61. *
  62. * Returns the linux irq number associated with a hardware irq. By default,
  63. * the mapping is irq == domain->irq_base + hwirq, but this mapping can
  64. * be overridden if the irq_domain implements a .to_irq() hook.
  65. */
  66. static inline unsigned int irq_domain_to_irq(struct irq_domain *d,
  67. unsigned long hwirq)
  68. {
  69. return d->ops->to_irq ? d->ops->to_irq(d, hwirq) : d->irq_base + hwirq;
  70. }
  71. extern void irq_domain_add(struct irq_domain *domain);
  72. extern void irq_domain_del(struct irq_domain *domain);
  73. #endif /* CONFIG_IRQ_DOMAIN */
  74. #if defined(CONFIG_IRQ_DOMAIN) && defined(CONFIG_OF_IRQ)
  75. extern struct irq_domain_ops irq_domain_simple_ops;
  76. extern void irq_domain_add_simple(struct device_node *controller, int irq_base);
  77. extern void irq_domain_generate_simple(const struct of_device_id *match,
  78. u64 phys_base, unsigned int irq_start);
  79. #else /* CONFIG_IRQ_DOMAIN && CONFIG_OF_IRQ */
  80. static inline void irq_domain_generate_simple(const struct of_device_id *match,
  81. u64 phys_base, unsigned int irq_start) { }
  82. #endif /* CONFIG_IRQ_DOMAIN && CONFIG_OF_IRQ */
  83. #endif /* _LINUX_IRQDOMAIN_H */