Merge branches 'acpi-scan', 'acpi-utils' and 'acpi-pm'
[firefly-linux-kernel-4.4.55.git] / kernel / irq / irqdomain.c
index 9c88db7056d4a33f608672ec0b96e4b6d9ec0823..7fac311057b806e7e6ba6c4634fac7151ace347b 100644 (file)
@@ -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;