return pci_msi_default_domain;
 }
 
+static struct irq_domain *pci_msi_get_domain(struct pci_dev *dev)
+{
+       struct irq_domain *domain = NULL;
+
+       if (dev->bus->msi)
+               domain = dev->bus->msi->domain;
+       if (!domain)
+               domain = arch_get_pci_msi_domain(dev);
+
+       return domain;
+}
+
 static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
 {
        struct irq_domain *domain;
 
-       domain = arch_get_pci_msi_domain(dev);
+       domain = pci_msi_get_domain(dev);
        if (domain)
                return pci_msi_domain_alloc_irqs(domain, dev, nvec, type);
 
 {
        struct irq_domain *domain;
 
-       domain = arch_get_pci_msi_domain(dev);
+       domain = pci_msi_get_domain(dev);
        if (domain)
                pci_msi_domain_free_irqs(domain, dev);
        else
 
        struct device *dev;
        struct device_node *of_node;
        struct list_head list;
+#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+       struct irq_domain *domain;
+#endif
 
        int (*setup_irq)(struct msi_controller *chip, struct pci_dev *dev,
                         struct msi_desc *desc);