}
 EXPORT_SYMBOL_GPL(irq_domain_free_fwnode);
 
-/**
- * __irq_domain_add() - Allocate a new irq_domain data structure
- * @fwnode: firmware node for the interrupt controller
- * @size: Size of linear map; 0 for radix mapping only
- * @hwirq_max: Maximum number of interrupts supported by controller
- * @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no
- *              direct mapping
- * @ops: domain callbacks
- * @host_data: Controller private data pointer
- *
- * Allocates and initializes an irq_domain structure.
- * Returns pointer to IRQ domain, or NULL on failure.
- */
-struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size,
-                                   irq_hw_number_t hwirq_max, int direct_max,
-                                   const struct irq_domain_ops *ops,
-                                   void *host_data)
+static struct irq_domain *__irq_domain_create(struct fwnode_handle *fwnode,
+                                             unsigned int size,
+                                             irq_hw_number_t hwirq_max,
+                                             int direct_max,
+                                             const struct irq_domain_ops *ops,
+                                             void *host_data)
 {
        struct irqchip_fwid *fwid;
        struct irq_domain *domain;
 
        irq_domain_check_hierarchy(domain);
 
+       return domain;
+}
+
+static void __irq_domain_publish(struct irq_domain *domain)
+{
        mutex_lock(&irq_domain_mutex);
        debugfs_add_domain_dir(domain);
        list_add(&domain->link, &irq_domain_list);
        mutex_unlock(&irq_domain_mutex);
 
        pr_debug("Added domain %s\n", domain->name);
+}
+
+/**
+ * __irq_domain_add() - Allocate a new irq_domain data structure
+ * @fwnode: firmware node for the interrupt controller
+ * @size: Size of linear map; 0 for radix mapping only
+ * @hwirq_max: Maximum number of interrupts supported by controller
+ * @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no
+ *              direct mapping
+ * @ops: domain callbacks
+ * @host_data: Controller private data pointer
+ *
+ * Allocates and initializes an irq_domain structure.
+ * Returns pointer to IRQ domain, or NULL on failure.
+ */
+struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size,
+                                   irq_hw_number_t hwirq_max, int direct_max,
+                                   const struct irq_domain_ops *ops,
+                                   void *host_data)
+{
+       struct irq_domain *domain;
+
+       domain = __irq_domain_create(fwnode, size, hwirq_max, direct_max,
+                                    ops, host_data);
+       if (domain)
+               __irq_domain_publish(domain);
+
        return domain;
 }
 EXPORT_SYMBOL_GPL(__irq_domain_add);
        struct irq_domain *domain;
 
        if (size)
-               domain = irq_domain_create_linear(fwnode, size, ops, host_data);
+               domain = __irq_domain_create(fwnode, size, size, 0, ops, host_data);
        else
-               domain = irq_domain_create_tree(fwnode, ops, host_data);
+               domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data);
+
        if (domain) {
                domain->parent = parent;
                domain->flags |= flags;
+
+               __irq_domain_publish(domain);
        }
 
        return domain;