aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/msi.c16
-rw-r--r--include/linux/msi.h3
2 files changed, 17 insertions, 2 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 4befe09053c1..476f4b1a2727 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -37,11 +37,23 @@ struct irq_domain * __weak arch_get_pci_msi_domain(struct pci_dev *dev)
37 return pci_msi_default_domain; 37 return pci_msi_default_domain;
38} 38}
39 39
40static struct irq_domain *pci_msi_get_domain(struct pci_dev *dev)
41{
42 struct irq_domain *domain = NULL;
43
44 if (dev->bus->msi)
45 domain = dev->bus->msi->domain;
46 if (!domain)
47 domain = arch_get_pci_msi_domain(dev);
48
49 return domain;
50}
51
40static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) 52static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
41{ 53{
42 struct irq_domain *domain; 54 struct irq_domain *domain;
43 55
44 domain = arch_get_pci_msi_domain(dev); 56 domain = pci_msi_get_domain(dev);
45 if (domain) 57 if (domain)
46 return pci_msi_domain_alloc_irqs(domain, dev, nvec, type); 58 return pci_msi_domain_alloc_irqs(domain, dev, nvec, type);
47 59
@@ -52,7 +64,7 @@ static void pci_msi_teardown_msi_irqs(struct pci_dev *dev)
52{ 64{
53 struct irq_domain *domain; 65 struct irq_domain *domain;
54 66
55 domain = arch_get_pci_msi_domain(dev); 67 domain = pci_msi_get_domain(dev);
56 if (domain) 68 if (domain)
57 pci_msi_domain_free_irqs(domain, dev); 69 pci_msi_domain_free_irqs(domain, dev);
58 else 70 else
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 692f217ae813..8ac4a68ffae2 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -108,6 +108,9 @@ struct msi_controller {
108 struct device *dev; 108 struct device *dev;
109 struct device_node *of_node; 109 struct device_node *of_node;
110 struct list_head list; 110 struct list_head list;
111#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
112 struct irq_domain *domain;
113#endif
111 114
112 int (*setup_irq)(struct msi_controller *chip, struct pci_dev *dev, 115 int (*setup_irq)(struct msi_controller *chip, struct pci_dev *dev,
113 struct msi_desc *desc); 116 struct msi_desc *desc);