diff --git a/drivers/irqchip/irq-loongson-pch-msi.c b/drivers/irqchip/irq-loongson-pch-msi.c index ab473e1b0..bd337ecdd 100644 --- a/drivers/irqchip/irq-loongson-pch-msi.c +++ b/drivers/irqchip/irq-loongson-pch-msi.c @@ -152,21 +152,26 @@ static struct msi_parent_ops pch_msi_parent_ops = { .init_dev_msi_info = msi_lib_init_dev_msi_info, }; -static int pch_msi_init_domains(struct pch_msi_data *priv, struct irq_domain *parent, +static int pch_msi_init_domains(struct pch_msi_data *priv, + struct irq_domain *parent, struct fwnode_handle *domain_handle) { - struct irq_domain_info info = { - .ops = &pch_msi_middle_domain_ops, - .size = priv->num_irqs, - .parent = parent, - .host_data = priv, - .fwnode = domain_handle, - }; + struct irq_domain *middle_domain; - if (!msi_create_parent_irq_domain(&info, &pch_msi_parent_ops)) { + middle_domain = irq_domain_create_hierarchy(parent, 0, priv->num_irqs, + domain_handle, + &pch_msi_middle_domain_ops, + priv); + if (!middle_domain) { pr_err("Failed to create the MSI middle domain\n"); return -ENOMEM; } + + irq_domain_update_bus_token(middle_domain, DOMAIN_BUS_NEXUS); + + middle_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT; + middle_domain->msi_parent_ops = &pch_msi_parent_ops; + return 0; }