|
@@ -742,6 +742,42 @@ static int irq_domain_alloc_descs(int virq, unsigned int cnt,
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
|
|
+/**
|
|
|
+ * irq_domain_add_hierarchy - Add a irqdomain into the hierarchy
|
|
|
+ * @parent: Parent irq domain to associate with the new domain
|
|
|
+ * @flags: Irq domain flags associated to the domain
|
|
|
+ * @size: Size of the domain. See below
|
|
|
+ * @node: Optional device-tree node of the interrupt controller
|
|
|
+ * @ops: Pointer to the interrupt domain callbacks
|
|
|
+ * @host_data: Controller private data pointer
|
|
|
+ *
|
|
|
+ * If @size is 0 a tree domain is created, otherwise a linear domain.
|
|
|
+ *
|
|
|
+ * If successful the parent is associated to the new domain and the
|
|
|
+ * domain flags are set.
|
|
|
+ * Returns pointer to IRQ domain, or NULL on failure.
|
|
|
+ */
|
|
|
+struct irq_domain *irq_domain_add_hierarchy(struct irq_domain *parent,
|
|
|
+ unsigned int flags,
|
|
|
+ unsigned int size,
|
|
|
+ struct device_node *node,
|
|
|
+ const struct irq_domain_ops *ops,
|
|
|
+ void *host_data)
|
|
|
+{
|
|
|
+ struct irq_domain *domain;
|
|
|
+
|
|
|
+ if (size)
|
|
|
+ domain = irq_domain_add_linear(node, size, ops, host_data);
|
|
|
+ else
|
|
|
+ domain = irq_domain_add_tree(node, ops, host_data);
|
|
|
+ if (domain) {
|
|
|
+ domain->parent = parent;
|
|
|
+ domain->flags |= flags;
|
|
|
+ }
|
|
|
+
|
|
|
+ return domain;
|
|
|
+}
|
|
|
+
|
|
|
static void irq_domain_insert_irq(int virq)
|
|
|
{
|
|
|
struct irq_data *data;
|