serial: 8250_exar: Move custom divisor support out from 8250_port
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 31 Jul 2019 17:05:58 +0000 (20:05 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Sep 2019 10:43:49 +0000 (12:43 +0200)
There are Exar custom divisor support in 8250_port which belongs to
8250_exar module. Move it out to the correct module and do not contaminate
generic code with it.

Cc: Aaron Sierra <asierra@xes-inc.com>
Cc: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20190731170558.52897-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_exar.c
drivers/tty/serial/8250/8250_port.c

index 1bf9adea2e61855f3bf16bc80bfa1b3a278e7b5b..3a39368e6e4736a3a0bee875a3195923c167f2a8 100644 (file)
@@ -140,6 +140,31 @@ static void exar_pm(struct uart_port *port, unsigned int state, unsigned int old
        serial_port_out(port, UART_EXAR_SLEEP, state ? 0xff : 0);
 }
 
+/*
+ * XR17V35x UARTs have an extra fractional divisor register (DLD)
+ * Calculate divisor with extra 4-bit fractional portion
+ */
+static unsigned int xr17v35x_get_divisor(struct uart_port *p, unsigned int baud,
+                                        unsigned int *frac)
+{
+       unsigned int quot_16;
+
+       quot_16 = DIV_ROUND_CLOSEST(p->uartclk, baud);
+       *frac = quot_16 & 0x0f;
+
+       return quot_16 >> 4;
+}
+
+static void xr17v35x_set_divisor(struct uart_port *p, unsigned int baud,
+                                unsigned int quot, unsigned int quot_frac)
+{
+       serial8250_do_set_divisor(p, baud, quot, quot_frac);
+
+       /* Preserve bits not related to baudrate; DLD[7:4]. */
+       quot_frac |= serial_port_in(p, 0x2) & 0xf0;
+       serial_port_out(p, 0x2, quot_frac);
+}
+
 static int default_setup(struct exar8250 *priv, struct pci_dev *pcidev,
                         int idx, unsigned int offset,
                         struct uart_8250_port *port)
@@ -163,6 +188,9 @@ static int default_setup(struct exar8250 *priv, struct pci_dev *pcidev,
        status = readb(port->port.membase + UART_EXAR_DVID);
        if (status == 0x82 || status == 0x84 || status == 0x88) {
                port->port.type = PORT_XR17V35X;
+
+               port->port.get_divisor = xr17v35x_get_divisor;
+               port->port.set_divisor = xr17v35x_set_divisor;
        } else {
                port->port.type = PORT_XR17D15X;
        }
index c3ba4c794feef3846379142f6720678088b2ae03..995a7e8b78390b60c1702cf91958c942fc06e8e2 100644 (file)
@@ -2407,23 +2407,6 @@ static void serial8250_shutdown(struct uart_port *port)
                serial8250_do_shutdown(port);
 }
 
-/*
- * XR17V35x UARTs have an extra fractional divisor register (DLD)
- * Calculate divisor with extra 4-bit fractional portion
- */
-static unsigned int xr17v35x_get_divisor(struct uart_8250_port *up,
-                                        unsigned int baud,
-                                        unsigned int *frac)
-{
-       struct uart_port *port = &up->port;
-       unsigned int quot_16;
-
-       quot_16 = DIV_ROUND_CLOSEST(port->uartclk, baud);
-       *frac = quot_16 & 0x0f;
-
-       return quot_16 >> 4;
-}
-
 /* Nuvoton NPCM UARTs have a custom divisor calculation */
 static unsigned int npcm_get_divisor(struct uart_8250_port *up,
                unsigned int baud)
@@ -2451,8 +2434,6 @@ static unsigned int serial8250_do_get_divisor(struct uart_port *port,
        else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
                 baud == (port->uartclk/8))
                quot = 0x8002;
-       else if (up->port.type == PORT_XR17V35X)
-               quot = xr17v35x_get_divisor(up, baud, frac);
        else if (up->port.type == PORT_NPCM)
                quot = npcm_get_divisor(up, baud);
        else
@@ -2539,13 +2520,6 @@ void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud,
                serial_port_out(port, UART_LCR, up->lcr | UART_LCR_DLAB);
 
        serial_dl_write(up, quot);
-
-       /* XR17V35x UARTs have an extra fractional divisor register (DLD) */
-       if (up->port.type == PORT_XR17V35X) {
-               /* Preserve bits not related to baudrate; DLD[7:4]. */
-               quot_frac |= serial_port_in(port, 0x2) & 0xf0;
-               serial_port_out(port, 0x2, quot_frac);
-       }
 }
 EXPORT_SYMBOL_GPL(serial8250_do_set_divisor);