These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / tty / serial / 8250 / 8250_pci.c
index 9373cca..7cd6f9a 100644 (file)
@@ -28,7 +28,6 @@
 
 #include <linux/dmaengine.h>
 #include <linux/platform_data/dma-dw.h>
-#include <linux/platform_data/dma-hsu.h>
 
 #include "8250.h"
 
@@ -1380,6 +1379,9 @@ ce4100_serial_setup(struct serial_private *priv,
 #define PCI_DEVICE_ID_INTEL_BSW_UART1  0x228a
 #define PCI_DEVICE_ID_INTEL_BSW_UART2  0x228c
 
+#define PCI_DEVICE_ID_INTEL_BDW_UART1  0x9ce3
+#define PCI_DEVICE_ID_INTEL_BDW_UART2  0x9ce4
+
 #define BYT_PRV_CLK                    0x800
 #define BYT_PRV_CLK_EN                 (1 << 0)
 #define BYT_PRV_CLK_M_VAL_SHIFT                1
@@ -1417,6 +1419,10 @@ byt_set_termios(struct uart_port *p, struct ktermios *termios,
        reg |= BYT_PRV_CLK_EN | BYT_PRV_CLK_UPDATE;
        writel(reg, p->membase + BYT_PRV_CLK);
 
+       p->status &= ~UPSTAT_AUTOCTS;
+       if (termios->c_cflag & CRTSCTS)
+               p->status |= UPSTAT_AUTOCTS;
+
        serial8250_do_set_termios(p, termios, old);
 }
 
@@ -1458,11 +1464,13 @@ byt_serial_setup(struct serial_private *priv,
        switch (pdev->device) {
        case PCI_DEVICE_ID_INTEL_BYT_UART1:
        case PCI_DEVICE_ID_INTEL_BSW_UART1:
+       case PCI_DEVICE_ID_INTEL_BDW_UART1:
                rx_param->src_id = 3;
                tx_param->dst_id = 2;
                break;
        case PCI_DEVICE_ID_INTEL_BYT_UART2:
        case PCI_DEVICE_ID_INTEL_BSW_UART2:
+       case PCI_DEVICE_ID_INTEL_BDW_UART2:
                rx_param->src_id = 5;
                tx_param->dst_id = 4;
                break;
@@ -1504,185 +1512,77 @@ byt_serial_setup(struct serial_private *priv,
        return ret;
 }
 
-#define INTEL_MID_UART_PS              0x30
-#define INTEL_MID_UART_MUL             0x34
-#define INTEL_MID_UART_DIV             0x38
-
-static void intel_mid_set_termios(struct uart_port *p,
-                                 struct ktermios *termios,
-                                 struct ktermios *old,
-                                 unsigned long fref)
+static int
+pci_omegapci_setup(struct serial_private *priv,
+                     const struct pciserial_board *board,
+                     struct uart_8250_port *port, int idx)
 {
-       unsigned int baud = tty_termios_baud_rate(termios);
-       unsigned short ps = 16;
-       unsigned long fuart = baud * ps;
-       unsigned long w = BIT(24) - 1;
-       unsigned long mul, div;
-
-       if (fref < fuart) {
-               /* Find prescaler value that satisfies Fuart < Fref */
-               if (fref > baud)
-                       ps = fref / baud;       /* baud rate too high */
-               else
-                       ps = 1;                 /* PLL case */
-               fuart = baud * ps;
-       } else {
-               /* Get Fuart closer to Fref */
-               fuart *= rounddown_pow_of_two(fref / fuart);
-       }
-
-       rational_best_approximation(fuart, fref, w, w, &mul, &div);
-       p->uartclk = fuart * 16 / ps;           /* core uses ps = 16 always */
-
-       writel(ps, p->membase + INTEL_MID_UART_PS);             /* set PS */
-       writel(mul, p->membase + INTEL_MID_UART_MUL);           /* set MUL */
-       writel(div, p->membase + INTEL_MID_UART_DIV);
-
-       serial8250_do_set_termios(p, termios, old);
+       return setup_port(priv, port, 2, idx * 8, 0);
 }
 
-static void intel_mid_set_termios_38_4M(struct uart_port *p,
-                                       struct ktermios *termios,
-                                       struct ktermios *old)
+static int
+pci_brcm_trumanage_setup(struct serial_private *priv,
+                        const struct pciserial_board *board,
+                        struct uart_8250_port *port, int idx)
 {
-       intel_mid_set_termios(p, termios, old, 38400000);
-}
+       int ret = pci_default_setup(priv, board, port, idx);
 
-static void intel_mid_set_termios_50M(struct uart_port *p,
-                                     struct ktermios *termios,
-                                     struct ktermios *old)
-{
-       /*
-        * The uart clk is 50Mhz, and the baud rate come from:
-        *      baud = 50M * MUL / (DIV * PS * DLAB)
-        */
-       intel_mid_set_termios(p, termios, old, 50000000);
+       port->port.type = PORT_BRCM_TRUMANAGE;
+       port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+       return ret;
 }
 
-static bool intel_mid_dma_filter(struct dma_chan *chan, void *param)
-{
-       struct hsu_dma_slave *s = param;
-
-       if (s->dma_dev != chan->device->dev || s->chan_id != chan->chan_id)
-               return false;
-
-       chan->private = s;
-       return true;
-}
+/* RTS will control by MCR if this bit is 0 */
+#define FINTEK_RTS_CONTROL_BY_HW       BIT(4)
+/* only worked with FINTEK_RTS_CONTROL_BY_HW on */
+#define FINTEK_RTS_INVERT              BIT(5)
 
-static int intel_mid_serial_setup(struct serial_private *priv,
-                                 const struct pciserial_board *board,
-                                 struct uart_8250_port *port, int idx,
-                                 int index, struct pci_dev *dma_dev)
+/* We should do proper H/W transceiver setting before change to RS485 mode */
+static int pci_fintek_rs485_config(struct uart_port *port,
+                              struct serial_rs485 *rs485)
 {
-       struct device *dev = port->port.dev;
-       struct uart_8250_dma *dma;
-       struct hsu_dma_slave *tx_param, *rx_param;
-
-       dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);
-       if (!dma)
-               return -ENOMEM;
-
-       tx_param = devm_kzalloc(dev, sizeof(*tx_param), GFP_KERNEL);
-       if (!tx_param)
-               return -ENOMEM;
+       u8 setting;
+       u8 *index = (u8 *) port->private_data;
+       struct pci_dev *pci_dev = container_of(port->dev, struct pci_dev,
+                                               dev);
 
-       rx_param = devm_kzalloc(dev, sizeof(*rx_param), GFP_KERNEL);
-       if (!rx_param)
-               return -ENOMEM;
+       pci_read_config_byte(pci_dev, 0x40 + 8 * *index + 7, &setting);
 
-       rx_param->chan_id = index * 2 + 1;
-       tx_param->chan_id = index * 2;
-
-       dma->rxconf.src_maxburst = 64;
-       dma->txconf.dst_maxburst = 64;
-
-       rx_param->dma_dev = &dma_dev->dev;
-       tx_param->dma_dev = &dma_dev->dev;
-
-       dma->fn = intel_mid_dma_filter;
-       dma->rx_param = rx_param;
-       dma->tx_param = tx_param;
-
-       port->port.type = PORT_16750;
-       port->port.flags |= UPF_FIXED_PORT | UPF_FIXED_TYPE;
-       port->dma = dma;
+       if (!rs485)
+               rs485 = &port->rs485;
+       else if (rs485->flags & SER_RS485_ENABLED)
+               memset(rs485->padding, 0, sizeof(rs485->padding));
+       else
+               memset(rs485, 0, sizeof(*rs485));
 
-       return pci_default_setup(priv, board, port, idx);
-}
+       /* F81504/508/512 not support RTS delay before or after send */
+       rs485->flags &= SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND;
 
-#define PCI_DEVICE_ID_INTEL_PNW_UART1  0x081b
-#define PCI_DEVICE_ID_INTEL_PNW_UART2  0x081c
-#define PCI_DEVICE_ID_INTEL_PNW_UART3  0x081d
+       if (rs485->flags & SER_RS485_ENABLED) {
+               /* Enable RTS H/W control mode */
+               setting |= FINTEK_RTS_CONTROL_BY_HW;
 
-static int pnw_serial_setup(struct serial_private *priv,
-                           const struct pciserial_board *board,
-                           struct uart_8250_port *port, int idx)
-{
-       struct pci_dev *pdev = priv->dev;
-       struct pci_dev *dma_dev;
-       int index;
+               if (rs485->flags & SER_RS485_RTS_ON_SEND) {
+                       /* RTS driving high on TX */
+                       setting &= ~FINTEK_RTS_INVERT;
+               } else {
+                       /* RTS driving low on TX */
+                       setting |= FINTEK_RTS_INVERT;
+               }
 
-       switch (pdev->device) {
-       case PCI_DEVICE_ID_INTEL_PNW_UART1:
-               index = 0;
-               break;
-       case PCI_DEVICE_ID_INTEL_PNW_UART2:
-               index = 1;
-               break;
-       case PCI_DEVICE_ID_INTEL_PNW_UART3:
-               index = 2;
-               break;
-       default:
-               return -EINVAL;
+               rs485->delay_rts_after_send = 0;
+               rs485->delay_rts_before_send = 0;
+       } else {
+               /* Disable RTS H/W control mode */
+               setting &= ~(FINTEK_RTS_CONTROL_BY_HW | FINTEK_RTS_INVERT);
        }
 
-       dma_dev = pci_get_slot(pdev->bus, PCI_DEVFN(PCI_SLOT(pdev->devfn), 3));
-
-       port->port.set_termios = intel_mid_set_termios_50M;
+       pci_write_config_byte(pci_dev, 0x40 + 8 * *index + 7, setting);
 
-       return intel_mid_serial_setup(priv, board, port, idx, index, dma_dev);
-}
-
-#define PCI_DEVICE_ID_INTEL_TNG_UART   0x1191
-
-static int tng_serial_setup(struct serial_private *priv,
-                           const struct pciserial_board *board,
-                           struct uart_8250_port *port, int idx)
-{
-       struct pci_dev *pdev = priv->dev;
-       struct pci_dev *dma_dev;
-       int index = PCI_FUNC(pdev->devfn);
-
-       /* Currently no support for HSU port0 */
-       if (index-- == 0)
-               return -ENODEV;
-
-       dma_dev = pci_get_slot(pdev->bus, PCI_DEVFN(5, 0));
-
-       port->port.set_termios = intel_mid_set_termios_38_4M;
+       if (rs485 != &port->rs485)
+               port->rs485 = *rs485;
 
-       return intel_mid_serial_setup(priv, board, port, idx, index, dma_dev);
-}
-
-static int
-pci_omegapci_setup(struct serial_private *priv,
-                     const struct pciserial_board *board,
-                     struct uart_8250_port *port, int idx)
-{
-       return setup_port(priv, port, 2, idx * 8, 0);
-}
-
-static int
-pci_brcm_trumanage_setup(struct serial_private *priv,
-                        const struct pciserial_board *board,
-                        struct uart_8250_port *port, int idx)
-{
-       int ret = pci_default_setup(priv, board, port, idx);
-
-       port->port.type = PORT_BRCM_TRUMANAGE;
-       port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
-       return ret;
+       return 0;
 }
 
 static int pci_fintek_setup(struct serial_private *priv,
@@ -1690,6 +1590,7 @@ static int pci_fintek_setup(struct serial_private *priv,
                            struct uart_8250_port *port, int idx)
 {
        struct pci_dev *pdev = priv->dev;
+       u8 *data;
        u8 config_base;
        u16 iobase;
 
@@ -1702,6 +1603,15 @@ static int pci_fintek_setup(struct serial_private *priv,
 
        port->port.iotype = UPIO_PORT;
        port->port.iobase = iobase;
+       port->port.rs485_config = pci_fintek_rs485_config;
+
+       data = devm_kzalloc(&pdev->dev, sizeof(u8), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       /* preserve index in PCI configuration space */
+       *data = idx;
+       port->port.private_data = data;
 
        return 0;
 }
@@ -1712,6 +1622,8 @@ static int pci_fintek_init(struct pci_dev *dev)
        u32 max_port, i;
        u32 bar_data[3];
        u8 config_base;
+       struct serial_private *priv = pci_get_drvdata(dev);
+       struct uart_8250_port *port;
 
        switch (dev->device) {
        case 0x1104: /* 4 ports */
@@ -1752,6 +1664,19 @@ static int pci_fintek_init(struct pci_dev *dev)
                                (u8)((iobase & 0xff00) >> 8));
 
                pci_write_config_byte(dev, config_base + 0x06, dev->irq);
+
+               if (priv) {
+                       /* re-apply RS232/485 mode when
+                        * pciserial_resume_ports()
+                        */
+                       port = serial8250_get_port(priv->line[i]);
+                       pci_fintek_rs485_config(&port->port, NULL);
+               } else {
+                       /* First init without port data
+                        * force init to RS232 Mode
+                        */
+                       pci_write_config_byte(dev, config_base + 0x07, 0x01);
+               }
        }
 
        return max_port;
@@ -1823,6 +1748,9 @@ static int pci_eg20t_init(struct pci_dev *dev)
 #endif
 }
 
+#define PCI_DEVICE_ID_EXAR_XR17V4358   0x4358
+#define PCI_DEVICE_ID_EXAR_XR17V8358   0x8358
+
 static int
 pci_xr17c154_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
@@ -1832,6 +1760,15 @@ pci_xr17c154_setup(struct serial_private *priv,
        return pci_default_setup(priv, board, port, idx);
 }
 
+static inline int
+xr17v35x_has_slave(struct serial_private *priv)
+{
+       const int dev_id = priv->dev->device;
+
+       return ((dev_id == PCI_DEVICE_ID_EXAR_XR17V4358) ||
+               (dev_id == PCI_DEVICE_ID_EXAR_XR17V8358));
+}
+
 static int
 pci_xr17v35x_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
@@ -1845,6 +1782,13 @@ pci_xr17v35x_setup(struct serial_private *priv,
 
        port->port.flags |= UPF_EXAR_EFR;
 
+       /*
+        * Setup the uart clock for the devices on expansion slot to
+        * half the clock speed of the main chip (which is 125MHz)
+        */
+       if (xr17v35x_has_slave(priv) && idx >= 8)
+               port->port.uartclk = (7812500 * 16 / 2);
+
        /*
         * Setup Multipurpose Input/Output pins.
         */
@@ -1997,8 +1941,7 @@ pci_wch_ch38x_setup(struct serial_private *priv,
 #define PCIE_VENDOR_ID_WCH             0x1c00
 #define PCIE_DEVICE_ID_WCH_CH382_2S1P  0x3250
 #define PCIE_DEVICE_ID_WCH_CH384_4S    0x3470
-
-#define PCI_DEVICE_ID_EXAR_XR17V8358   0x8358
+#define PCIE_DEVICE_ID_WCH_CH382_2S    0x3253
 
 #define PCI_VENDOR_ID_PERICOM                  0x12D8
 #define PCI_DEVICE_ID_PERICOM_PI7C9X7951       0x7951
@@ -2113,42 +2056,28 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
        },
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
-               .device         = PCI_DEVICE_ID_INTEL_PNW_UART1,
-               .subvendor      = PCI_ANY_ID,
-               .subdevice      = PCI_ANY_ID,
-               .setup          = pnw_serial_setup,
-       },
-       {
-               .vendor         = PCI_VENDOR_ID_INTEL,
-               .device         = PCI_DEVICE_ID_INTEL_PNW_UART2,
-               .subvendor      = PCI_ANY_ID,
-               .subdevice      = PCI_ANY_ID,
-               .setup          = pnw_serial_setup,
-       },
-       {
-               .vendor         = PCI_VENDOR_ID_INTEL,
-               .device         = PCI_DEVICE_ID_INTEL_PNW_UART3,
+               .device         = PCI_DEVICE_ID_INTEL_BSW_UART1,
                .subvendor      = PCI_ANY_ID,
                .subdevice      = PCI_ANY_ID,
-               .setup          = pnw_serial_setup,
+               .setup          = byt_serial_setup,
        },
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
-               .device         = PCI_DEVICE_ID_INTEL_TNG_UART,
+               .device         = PCI_DEVICE_ID_INTEL_BSW_UART2,
                .subvendor      = PCI_ANY_ID,
                .subdevice      = PCI_ANY_ID,
-               .setup          = tng_serial_setup,
+               .setup          = byt_serial_setup,
        },
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
-               .device         = PCI_DEVICE_ID_INTEL_BSW_UART1,
+               .device         = PCI_DEVICE_ID_INTEL_BDW_UART1,
                .subvendor      = PCI_ANY_ID,
                .subdevice      = PCI_ANY_ID,
                .setup          = byt_serial_setup,
        },
        {
                .vendor         = PCI_VENDOR_ID_INTEL,
-               .device         = PCI_DEVICE_ID_INTEL_BSW_UART2,
+               .device         = PCI_DEVICE_ID_INTEL_BDW_UART2,
                .subvendor      = PCI_ANY_ID,
                .subdevice      = PCI_ANY_ID,
                .setup          = byt_serial_setup,
@@ -2513,6 +2442,13 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .subdevice      = PCI_ANY_ID,
                .setup          = pci_xr17v35x_setup,
        },
+       {
+               .vendor = PCI_VENDOR_ID_EXAR,
+               .device = PCI_DEVICE_ID_EXAR_XR17V4358,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_xr17v35x_setup,
+       },
        {
                .vendor = PCI_VENDOR_ID_EXAR,
                .device = PCI_DEVICE_ID_EXAR_XR17V8358,
@@ -2702,6 +2638,14 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .subdevice      = PCI_ANY_ID,
                .setup          = pci_wch_ch353_setup,
        },
+       /* WCH CH382 2S card (16850 clone) */
+       {
+               .vendor         = PCIE_VENDOR_ID_WCH,
+               .device         = PCIE_DEVICE_ID_WCH_CH382_2S,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_wch_ch38x_setup,
+       },
        /* WCH CH382 2S1P card (16850 clone) */
        {
                .vendor         = PCIE_VENDOR_ID_WCH,
@@ -2999,6 +2943,7 @@ enum pci_board_num_t {
        pbn_exar_XR17V352,
        pbn_exar_XR17V354,
        pbn_exar_XR17V358,
+       pbn_exar_XR17V4358,
        pbn_exar_XR17V8358,
        pbn_exar_ibm_saturn,
        pbn_pasemi_1682M,
@@ -3012,8 +2957,6 @@ enum pci_board_num_t {
        pbn_ADDIDATA_PCIe_8_3906250,
        pbn_ce4100_1_115200,
        pbn_byt,
-       pbn_pnw,
-       pbn_tng,
        pbn_qrk,
        pbn_omegapci,
        pbn_NETMOS9900_2s_115200,
@@ -3021,6 +2964,7 @@ enum pci_board_num_t {
        pbn_fintek_4,
        pbn_fintek_8,
        pbn_fintek_12,
+       pbn_wch382_2,
        pbn_wch384_4,
        pbn_pericom_PI7C9X7951,
        pbn_pericom_PI7C9X7952,
@@ -3690,6 +3634,14 @@ static struct pciserial_board pci_boards[] = {
                .reg_shift      = 0,
                .first_offset   = 0,
        },
+       [pbn_exar_XR17V4358] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 12,
+               .base_baud      = 7812500,
+               .uart_offset    = 0x400,
+               .reg_shift      = 0,
+               .first_offset   = 0,
+       },
        [pbn_exar_XR17V8358] = {
                .flags          = FL_BASE0,
                .num_ports      = 16,
@@ -3792,16 +3744,6 @@ static struct pciserial_board pci_boards[] = {
                .uart_offset    = 0x80,
                .reg_shift      = 2,
        },
-       [pbn_pnw] = {
-               .flags          = FL_BASE0,
-               .num_ports      = 1,
-               .base_baud      = 115200,
-       },
-       [pbn_tng] = {
-               .flags          = FL_BASE0,
-               .num_ports      = 1,
-               .base_baud      = 1843200,
-       },
        [pbn_qrk] = {
                .flags          = FL_BASE0,
                .num_ports      = 1,
@@ -3843,6 +3785,13 @@ static struct pciserial_board pci_boards[] = {
                .base_baud      = 115200,
                .first_offset   = 0x40,
        },
+       [pbn_wch382_2] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 2,
+               .base_baud      = 115200,
+               .uart_offset    = 8,
+               .first_offset   = 0xC0,
+       },
        [pbn_wch384_4] = {
                .flags          = FL_BASE0,
                .num_ports      = 4,
@@ -3890,6 +3839,13 @@ static const struct pci_device_id blacklist[] = {
        { PCI_DEVICE(0x4348, 0x5053), }, /* WCH CH353 1S1P */
        { PCI_DEVICE(0x1c00, 0x3250), }, /* WCH CH382 2S1P */
        { PCI_DEVICE(0x1c00, 0x3470), }, /* WCH CH384 4S */
+
+       /* Intel platforms with MID UART */
+       { PCI_VDEVICE(INTEL, 0x081b), },
+       { PCI_VDEVICE(INTEL, 0x081c), },
+       { PCI_VDEVICE(INTEL, 0x081d), },
+       { PCI_VDEVICE(INTEL, 0x1191), },
+       { PCI_VDEVICE(INTEL, 0x19d8), },
 };
 
 /*
@@ -5133,6 +5089,10 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID,
                0,
                0, pbn_exar_XR17V358 },
+       {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V4358,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0,
+               0, pbn_exar_XR17V4358 },
        {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V8358,
                PCI_ANY_ID, PCI_ANY_ID,
                0,
@@ -5582,25 +5542,15 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
                pbn_byt },
 
-       /*
-        * Intel Penwell
-        */
-       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PNW_UART1,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               pbn_pnw},
-       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PNW_UART2,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               pbn_pnw},
-       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PNW_UART3,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               pbn_pnw},
-
-       /*
-        * Intel Tangier
-        */
-       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TNG_UART,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               pbn_tng},
+       /* Intel Broadwell */
+       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BDW_UART1,
+               PCI_ANY_ID,  PCI_ANY_ID,
+               PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
+               pbn_byt },
+       {       PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BDW_UART2,
+               PCI_ANY_ID,  PCI_ANY_ID,
+               PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xff0000,
+               pbn_byt },
 
        /*
         * Intel Quark x1000
@@ -5641,6 +5591,10 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID,
                0, 0, pbn_b0_bt_2_115200 },
 
+       {       PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH382_2S,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_wch382_2 },
+
        {       PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_4S,
                PCI_ANY_ID, PCI_ANY_ID,
                0, 0, pbn_wch384_4 },