#include <linux/kernel.h>
 #include <linux/pci.h>
 #include <linux/of.h>
+#include <linux/of_irq.h>
 #include <linux/of_pci.h>
 #include "pci.h"
 
 struct irq_domain *pci_host_bridge_of_msi_domain(struct pci_bus *bus)
 {
 #ifdef CONFIG_IRQ_DOMAIN
-       struct device_node *np;
        struct irq_domain *d;
 
        if (!bus->dev.of_node)
                return NULL;
 
        /* Start looking for a phandle to an MSI controller. */
-       np = of_parse_phandle(bus->dev.of_node, "msi-parent", 0);
+       d = of_msi_get_domain(&bus->dev, bus->dev.of_node, DOMAIN_BUS_PCI_MSI);
+       if (d)
+               return d;
 
        /*
         * If we don't have an msi-parent property, look for a domain
         * directly attached to the host bridge.
         */
-       if (!np)
-               np = bus->dev.of_node;
-
-       d = irq_find_matching_host(np, DOMAIN_BUS_PCI_MSI);
+       d = irq_find_matching_host(bus->dev.of_node, DOMAIN_BUS_PCI_MSI);
        if (d)
                return d;
 
-       return irq_find_host(np);
+       return irq_find_host(bus->dev.of_node);
 #else
        return NULL;
 #endif