aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r--drivers/pci/msi.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index f66be868ad21..2f9b1c0d1f96 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -77,24 +77,9 @@ static void pci_msi_teardown_msi_irqs(struct pci_dev *dev)
77 77
78/* Arch hooks */ 78/* Arch hooks */
79 79
80struct msi_controller * __weak pcibios_msi_controller(struct pci_dev *dev)
81{
82 return NULL;
83}
84
85static struct msi_controller *pci_msi_controller(struct pci_dev *dev)
86{
87 struct msi_controller *msi_ctrl = dev->bus->msi;
88
89 if (msi_ctrl)
90 return msi_ctrl;
91
92 return pcibios_msi_controller(dev);
93}
94
95int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) 80int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
96{ 81{
97 struct msi_controller *chip = pci_msi_controller(dev); 82 struct msi_controller *chip = dev->bus->msi;
98 int err; 83 int err;
99 84
100 if (!chip || !chip->setup_irq) 85 if (!chip || !chip->setup_irq)
@@ -665,6 +650,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
665 pci_msi_set_enable(dev, 1); 650 pci_msi_set_enable(dev, 1);
666 dev->msi_enabled = 1; 651 dev->msi_enabled = 1;
667 652
653 pcibios_free_irq(dev);
668 dev->irq = entry->irq; 654 dev->irq = entry->irq;
669 return 0; 655 return 0;
670} 656}
@@ -792,9 +778,9 @@ static int msix_capability_init(struct pci_dev *dev,
792 /* Set MSI-X enabled bits and unmask the function */ 778 /* Set MSI-X enabled bits and unmask the function */
793 pci_intx_for_msi(dev, 0); 779 pci_intx_for_msi(dev, 0);
794 dev->msix_enabled = 1; 780 dev->msix_enabled = 1;
795
796 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0); 781 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
797 782
783 pcibios_free_irq(dev);
798 return 0; 784 return 0;
799 785
800out_avail: 786out_avail:
@@ -909,6 +895,7 @@ void pci_msi_shutdown(struct pci_dev *dev)
909 895
910 /* Restore dev->irq to its default pin-assertion irq */ 896 /* Restore dev->irq to its default pin-assertion irq */
911 dev->irq = desc->msi_attrib.default_irq; 897 dev->irq = desc->msi_attrib.default_irq;
898 pcibios_alloc_irq(dev);
912} 899}
913 900
914void pci_disable_msi(struct pci_dev *dev) 901void pci_disable_msi(struct pci_dev *dev)
@@ -1009,6 +996,7 @@ void pci_msix_shutdown(struct pci_dev *dev)
1009 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); 996 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
1010 pci_intx_for_msi(dev, 1); 997 pci_intx_for_msi(dev, 1);
1011 dev->msix_enabled = 0; 998 dev->msix_enabled = 0;
999 pcibios_alloc_irq(dev);
1012} 1000}
1013 1001
1014void pci_disable_msix(struct pci_dev *dev) 1002void pci_disable_msix(struct pci_dev *dev)