Takashi Iwai d54bec
From 254cc7743e847780655025c1d81a9c15854bf236 Mon Sep 17 00:00:00 2001
Takashi Iwai d54bec
From: Felipe Balbi <felipe.balbi@linux.intel.com>
Takashi Iwai d54bec
Date: Tue, 1 Oct 2019 14:58:25 +0300
Takashi Iwai d54bec
Subject: [PATCH] serial: 8250_lpss: Switch over to MSI interrupts
Takashi Iwai d54bec
Git-commit: 254cc7743e847780655025c1d81a9c15854bf236
Takashi Iwai d54bec
Patch-mainline: v5.5-rc1
Takashi Iwai d54bec
References: jsc#SLE-13436
Takashi Iwai d54bec
Takashi Iwai d54bec
Some devices support MSI interrupts. Let's at least try to use them in
Takashi Iwai d54bec
platforms that provide MSI capability.
Takashi Iwai d54bec
Takashi Iwai d54bec
While at that, remove the now duplicated code from qrp_serial_setup().
Takashi Iwai d54bec
Takashi Iwai d54bec
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Takashi Iwai d54bec
Link: https://lore.kernel.org/r/20191001115825.795700-1-felipe.balbi@linux.intel.com
Takashi Iwai d54bec
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Takashi Iwai d54bec
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai d54bec
Takashi Iwai d54bec
---
Takashi Iwai d54bec
 drivers/tty/serial/8250/8250_lpss.c | 21 +++++++++------------
Takashi Iwai d54bec
 1 file changed, 9 insertions(+), 12 deletions(-)
Takashi Iwai d54bec
Takashi Iwai d54bec
diff --git a/drivers/tty/serial/8250/8250_lpss.c b/drivers/tty/serial/8250/8250_lpss.c
Takashi Iwai d54bec
index 5f72ef3ea574..60eff3240c8a 100644
Takashi Iwai d54bec
--- a/drivers/tty/serial/8250/8250_lpss.c
Takashi Iwai d54bec
+++ b/drivers/tty/serial/8250/8250_lpss.c
Takashi Iwai d54bec
@@ -221,17 +221,6 @@ static void qrk_serial_exit_dma(struct lpss8250 *lpss) {}
Takashi Iwai d54bec
 
Takashi Iwai d54bec
 static int qrk_serial_setup(struct lpss8250 *lpss, struct uart_port *port)
Takashi Iwai d54bec
 {
Takashi Iwai d54bec
-	struct pci_dev *pdev = to_pci_dev(port->dev);
Takashi Iwai d54bec
-	int ret;
Takashi Iwai d54bec
-
Takashi Iwai d54bec
-	pci_set_master(pdev);
Takashi Iwai d54bec
-
Takashi Iwai d54bec
-	ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
Takashi Iwai d54bec
-	if (ret < 0)
Takashi Iwai d54bec
-		return ret;
Takashi Iwai d54bec
-
Takashi Iwai d54bec
-	port->irq = pci_irq_vector(pdev, 0);
Takashi Iwai d54bec
-
Takashi Iwai d54bec
 	qrk_serial_setup_dma(lpss, port);
Takashi Iwai d54bec
 	return 0;
Takashi Iwai d54bec
 }
Takashi Iwai d54bec
@@ -293,16 +282,22 @@ static int lpss8250_probe(struct pci_dev *pdev, const struct pci_device_id *id)
Takashi Iwai d54bec
 	if (ret)
Takashi Iwai d54bec
 		return ret;
Takashi Iwai d54bec
 
Takashi Iwai d54bec
+	pci_set_master(pdev);
Takashi Iwai d54bec
+
Takashi Iwai d54bec
 	lpss = devm_kzalloc(&pdev->dev, sizeof(*lpss), GFP_KERNEL);
Takashi Iwai d54bec
 	if (!lpss)
Takashi Iwai d54bec
 		return -ENOMEM;
Takashi Iwai d54bec
 
Takashi Iwai d54bec
+	ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
Takashi Iwai d54bec
+	if (ret < 0)
Takashi Iwai d54bec
+		return ret;
Takashi Iwai d54bec
+
Takashi Iwai d54bec
 	lpss->board = (struct lpss8250_board *)id->driver_data;
Takashi Iwai d54bec
 
Takashi Iwai d54bec
 	memset(&uart, 0, sizeof(struct uart_8250_port));
Takashi Iwai d54bec
 
Takashi Iwai d54bec
 	uart.port.dev = &pdev->dev;
Takashi Iwai d54bec
-	uart.port.irq = pdev->irq;
Takashi Iwai d54bec
+	uart.port.irq = pci_irq_vector(pdev, 0);
Takashi Iwai d54bec
 	uart.port.private_data = &lpss->data;
Takashi Iwai d54bec
 	uart.port.type = PORT_16550A;
Takashi Iwai d54bec
 	uart.port.iotype = UPIO_MEM;
Takashi Iwai d54bec
@@ -337,6 +332,7 @@ static int lpss8250_probe(struct pci_dev *pdev, const struct pci_device_id *id)
Takashi Iwai d54bec
 err_exit:
Takashi Iwai d54bec
 	if (lpss->board->exit)
Takashi Iwai d54bec
 		lpss->board->exit(lpss);
Takashi Iwai d54bec
+	pci_free_irq_vectors(pdev);
Takashi Iwai d54bec
 	return ret;
Takashi Iwai d54bec
 }
Takashi Iwai d54bec
 
Takashi Iwai d54bec
@@ -348,6 +344,7 @@ static void lpss8250_remove(struct pci_dev *pdev)
Takashi Iwai d54bec
 
Takashi Iwai d54bec
 	if (lpss->board->exit)
Takashi Iwai d54bec
 		lpss->board->exit(lpss);
Takashi Iwai d54bec
+	pci_free_irq_vectors(pdev);
Takashi Iwai d54bec
 }
Takashi Iwai d54bec
 
Takashi Iwai d54bec
 static const struct lpss8250_board byt_board = {
Takashi Iwai d54bec
-- 
Takashi Iwai d54bec
2.16.4
Takashi Iwai d54bec