OSDN Git Service

SPI: designware: pci: Switch over to MSI interrupts
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 1 Oct 2019 08:14:05 +0000 (11:14 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 1 Oct 2019 17:40:38 +0000 (18:40 +0100)
Some devices support MSI interrupts. Let's at least try to use them in
platforms that provide MSI capability.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Link: https://lore.kernel.org/r/20191001081405.764161-1-felipe.balbi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-dw-pci.c

index 1406449..7ab53f4 100644 (file)
@@ -57,13 +57,18 @@ static int spi_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        /* Get basic io resource and map it */
        dws->paddr = pci_resource_start(pdev, pci_bar);
+       pci_set_master(pdev);
 
        ret = pcim_iomap_regions(pdev, 1 << pci_bar, pci_name(pdev));
        if (ret)
                return ret;
 
+       ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
+       if (ret < 0)
+               return ret;
+
        dws->regs = pcim_iomap_table(pdev)[pci_bar];
-       dws->irq = pdev->irq;
+       dws->irq = pci_irq_vector(pdev, 0);
 
        /*
         * Specific handling for platforms, like dma setup,
@@ -80,12 +85,15 @@ static int spi_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                                return ret;
                }
        } else {
+               pci_free_irq_vectors(pdev);
                return -ENODEV;
        }
 
        ret = dw_spi_add_host(&pdev->dev, dws);
-       if (ret)
+       if (ret) {
+               pci_free_irq_vectors(pdev);
                return ret;
+       }
 
        /* PCI hook and SPI hook use the same drv data */
        pci_set_drvdata(pdev, dws);
@@ -101,6 +109,7 @@ static void spi_pci_remove(struct pci_dev *pdev)
        struct dw_spi *dws = pci_get_drvdata(pdev);
 
        dw_spi_remove_host(dws);
+       pci_free_irq_vectors(pdev);
 }
 
 #ifdef CONFIG_PM_SLEEP