diff options
| -rw-r--r-- | drivers/pci/msi.c | 16 | ||||
| -rw-r--r-- | include/linux/msi.h | 3 |
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 | ||
| 40 | static 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 | |||
| 40 | static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | 52 | static 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); |
