return -ENODEV;
        }
 
-       ip->irqdomain = irq_domain_create_linear(fn, hwirqs, cfg->ops,
-                                                (void *)(long)ioapic);
-
+       ip->irqdomain = irq_domain_create_hierarchy(parent, 0, hwirqs, fn, cfg->ops,
+                                                   (void *)(long)ioapic);
        if (!ip->irqdomain) {
                /* Release fw handle if it was allocated above */
                if (!cfg->dev)
                return -ENOMEM;
        }
 
-       ip->irqdomain->parent = parent;
-
        if (cfg->type == IOAPIC_DOMAIN_LEGACY ||
            cfg->type == IOAPIC_DOMAIN_STRICT)
                ioapic_dynirq_base = max(ioapic_dynirq_base,