]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
serial: 8250_pci: Add support for Sunix serial boards
authorKai-Heng Feng <kai.heng.feng@canonical.com>
Tue, 13 Aug 2019 11:55:00 +0000 (13:55 +0200)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Tue, 17 Sep 2019 16:02:18 +0000 (18:02 +0200)
BugLink: https://bugs.launchpad.net/bugs/1826716
Add support to Sunix serial boards with up to 16 ports.

Sunix board need its own setup callback instead of using Timedia's, to
properly support more than 4 ports.

Cc: Morris Ku <morris_ku@sunix.com>
Cc: Debbie Liu <debbie_liu@sunix.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Link: https://lore.kernel.org/r/20190809190130.30773-1-kai.heng.feng@canonical.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(backported from commit a4b7aca30609899a925cbf24b08bfea79883254c linux-next)
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Acked-by: Anthony Wong <anthony.wong@canonical.com>
Acked-by: AceLan Kao <acelan.kao@canonical.com>
Acked-by: Connor Kuehl <connor.kuehl@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
drivers/tty/serial/8250/8250_pci.c
drivers/tty/serial/8250/8250_port.c
include/uapi/linux/serial_core.h

index f05d35217611c82624d580f7cd88c95ed01db26f..e384d73bcac2106ef66d7695ae1ef705b5529f82 100644 (file)
@@ -1637,6 +1637,30 @@ pci_wch_ch38x_setup(struct serial_private *priv,
        return pci_default_setup(priv, board, port, idx);
 }
 
+static int
+pci_sunix_setup(struct serial_private *priv,
+               const struct pciserial_board *board,
+               struct uart_8250_port *port, int idx)
+{
+       int bar;
+       int offset;
+
+       port->port.flags |= UPF_FIXED_TYPE;
+       port->port.type = PORT_SUNIX;
+
+       if (idx < 4) {
+               bar = 0;
+               offset = idx * board->uart_offset;
+       } else {
+               bar = 1;
+               idx -= 4;
+               idx = div_s64_rem(idx, 4, &offset);
+               offset = idx * 64 + offset * board->uart_offset;
+       }
+
+       return setup_port(priv, port, bar, offset, 0);
+}
+
 #define PCI_VENDOR_ID_SBSMODULARIO     0x124B
 #define PCI_SUBVENDOR_ID_SBSMODULARIO  0x124B
 #define PCI_DEVICE_ID_OCTPRO           0x0001
@@ -2231,21 +2255,14 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .setup          = pci_timedia_setup,
        },
        /*
-        * SUNIX (Timedia) cards
-        * Do not "probe" for these cards as there is at least one combination
-        * card that should be handled by parport_pc that doesn't match the
-        * rule in pci_timedia_probe.
-        * It is part number is MIO5079A but its subdevice ID is 0x0102.
-        * There are some boards with part number SER5037AL that report
-        * subdevice ID 0x0002.
+        * Sunix PCI serial boards
         */
        {
                .vendor         = PCI_VENDOR_ID_SUNIX,
                .device         = PCI_DEVICE_ID_SUNIX_1999,
                .subvendor      = PCI_VENDOR_ID_SUNIX,
                .subdevice      = PCI_ANY_ID,
-               .init           = pci_timedia_init,
-               .setup          = pci_timedia_setup,
+               .setup          = pci_sunix_setup,
        },
        /*
         * Xircom cards
@@ -2699,6 +2716,11 @@ enum pci_board_num_t {
        pbn_pericom_PI7C9X7952,
        pbn_pericom_PI7C9X7954,
        pbn_pericom_PI7C9X7958,
+       pbn_sunix_pci_1s,
+       pbn_sunix_pci_2s,
+       pbn_sunix_pci_4s,
+       pbn_sunix_pci_8s,
+       pbn_sunix_pci_16s,
 };
 
 /*
@@ -3436,6 +3458,31 @@ static struct pciserial_board pci_boards[] = {
                .base_baud      = 921600,
                .uart_offset    = 0x8,
        },
+       [pbn_sunix_pci_1s] = {
+               .num_ports      = 1,
+               .base_baud      = 921600,
+               .uart_offset    = 0x8,
+       },
+       [pbn_sunix_pci_2s] = {
+               .num_ports      = 2,
+               .base_baud      = 921600,
+               .uart_offset    = 0x8,
+       },
+       [pbn_sunix_pci_4s] = {
+               .num_ports      = 4,
+               .base_baud      = 921600,
+               .uart_offset    = 0x8,
+       },
+       [pbn_sunix_pci_8s] = {
+               .num_ports      = 8,
+               .base_baud      = 921600,
+               .uart_offset    = 0x8,
+       },
+       [pbn_sunix_pci_16s] = {
+               .num_ports      = 16,
+               .base_baud      = 921600,
+               .uart_offset    = 0x8,
+       },
 };
 
 static const struct pci_device_id blacklist[] = {
@@ -4489,17 +4536,29 @@ static const struct pci_device_id serial_pci_tbl[] = {
                pbn_b0_bt_1_921600 },
 
        /*
-        * SUNIX (TIMEDIA)
+        * Sunix PCI serial boards
         */
        {       PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
-               PCI_VENDOR_ID_SUNIX, PCI_ANY_ID,
-               PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xffff00,
-               pbn_b0_bt_1_921600 },
-
+               PCI_VENDOR_ID_SUNIX, 0x0001, 0, 0,
+               pbn_sunix_pci_1s },
        {       PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
-               PCI_VENDOR_ID_SUNIX, PCI_ANY_ID,
-               PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00,
-               pbn_b0_bt_1_921600 },
+               PCI_VENDOR_ID_SUNIX, 0x0002, 0, 0,
+               pbn_sunix_pci_2s },
+       {       PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
+               PCI_VENDOR_ID_SUNIX, 0x0004, 0, 0,
+               pbn_sunix_pci_4s },
+       {       PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
+               PCI_VENDOR_ID_SUNIX, 0x0084, 0, 0,
+               pbn_sunix_pci_4s },
+       {       PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
+               PCI_VENDOR_ID_SUNIX, 0x0008, 0, 0,
+               pbn_sunix_pci_8s },
+       {       PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
+               PCI_VENDOR_ID_SUNIX, 0x0088, 0, 0,
+               pbn_sunix_pci_8s },
+       {       PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
+               PCI_VENDOR_ID_SUNIX, 0x0010, 0, 0,
+               pbn_sunix_pci_16s },
 
        /*
         * AFAVLAB serial card, from Harald Welte <laforge@gnumonks.org>
index f6ceb83a1d6efc221fa36ee05066a6f9a924de16..2ff86278877d793f3721741c69780b5b8c38708a 100644 (file)
@@ -305,6 +305,14 @@ static const struct serial8250_config uart_config[] = {
                .rxtrig_bytes   = {1, 4, 8, 14},
                .flags          = UART_CAP_FIFO,
        },
+       [PORT_SUNIX] = {
+               .name           = "Sunix",
+               .fifo_size      = 128,
+               .tx_loadsz      = 128,
+               .fcr            = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+               .rxtrig_bytes   = {1, 32, 64, 112},
+               .flags          = UART_CAP_FIFO | UART_CAP_SLEEP,
+       },
 };
 
 /* Uart divisor latch read */
index dce5f9dae1210455734e555044749f94d399594e..87914a635bbf0fa6fef0ba9f842667ece5c9cbb3 100644 (file)
 /* MediaTek BTIF */
 #define PORT_MTK_BTIF  117
 
+/* Sunix UART */
+#define PORT_SUNIX     121
+
 #endif /* _UAPILINUX_SERIAL_CORE_H */