serial: 8250_lpss: Switch over to MSI interrupts
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 1 Oct 2019 11:58:25 +0000 (14:58 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Oct 2019 12:58:05 +0000 (14:58 +0200)
Some devices support MSI interrupts. Let's at least try to use them in
platforms that provide MSI capability.

While at that, remove the now duplicated code from qrp_serial_setup().

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Link: https://lore.kernel.org/r/20191001115825.795700-1-felipe.balbi@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_lpss.c

index 5f72ef3ea574b16e2b10d214684773054a07730e..60eff3240c8a5cc2da9e478db7ed37fde4108070 100644 (file)
@@ -221,17 +221,6 @@ static void qrk_serial_exit_dma(struct lpss8250 *lpss) {}
 
 static int qrk_serial_setup(struct lpss8250 *lpss, struct uart_port *port)
 {
-       struct pci_dev *pdev = to_pci_dev(port->dev);
-       int ret;
-
-       pci_set_master(pdev);
-
-       ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
-       if (ret < 0)
-               return ret;
-
-       port->irq = pci_irq_vector(pdev, 0);
-
        qrk_serial_setup_dma(lpss, port);
        return 0;
 }
@@ -293,16 +282,22 @@ static int lpss8250_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (ret)
                return ret;
 
+       pci_set_master(pdev);
+
        lpss = devm_kzalloc(&pdev->dev, sizeof(*lpss), GFP_KERNEL);
        if (!lpss)
                return -ENOMEM;
 
+       ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
+       if (ret < 0)
+               return ret;
+
        lpss->board = (struct lpss8250_board *)id->driver_data;
 
        memset(&uart, 0, sizeof(struct uart_8250_port));
 
        uart.port.dev = &pdev->dev;
-       uart.port.irq = pdev->irq;
+       uart.port.irq = pci_irq_vector(pdev, 0);
        uart.port.private_data = &lpss->data;
        uart.port.type = PORT_16550A;
        uart.port.iotype = UPIO_MEM;
@@ -337,6 +332,7 @@ static int lpss8250_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 err_exit:
        if (lpss->board->exit)
                lpss->board->exit(lpss);
+       pci_free_irq_vectors(pdev);
        return ret;
 }
 
@@ -348,6 +344,7 @@ static void lpss8250_remove(struct pci_dev *pdev)
 
        if (lpss->board->exit)
                lpss->board->exit(lpss);
+       pci_free_irq_vectors(pdev);
 }
 
 static const struct lpss8250_board byt_board = {