serial: 8250_of: Drop quirk fot NPCM from 8250_port
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 15 Feb 2024 14:50:08 +0000 (16:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 18 Feb 2024 17:59:59 +0000 (18:59 +0100)
We are not supposed to spread quirks in 8250_port module especially
when we have a separate driver for the hardware in question.

Move quirk from generic module to the driver that uses it.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20240215145029.581389-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_of.c
drivers/tty/serial/8250/8250_port.c

index 34f17a9785e79e1d26b6fbbbea3441a89f523e44..9dcc17e3326906e6e8303eeebf0ed1cf13449edf 100644 (file)
@@ -4,7 +4,10 @@
  *
  *    Copyright (C) 2006 Arnd Bergmann <arnd@arndb.de>, IBM Corp.
  */
+
+#include <linux/bits.h>
 #include <linux/console.h>
+#include <linux/math.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/serial_core.h>
@@ -25,6 +28,36 @@ struct of_serial_info {
        int line;
 };
 
+/* Nuvoton NPCM timeout register */
+#define UART_NPCM_TOR          7
+#define UART_NPCM_TOIE         BIT(7)  /* Timeout Interrupt Enable */
+
+static int npcm_startup(struct uart_port *port)
+{
+       /*
+        * Nuvoton calls the scratch register 'UART_TOR' (timeout
+        * register). Enable it, and set TIOC (timeout interrupt
+        * comparator) to be 0x20 for correct operation.
+        */
+       serial_port_out(port, UART_NPCM_TOR, UART_NPCM_TOIE | 0x20);
+
+       return serial8250_do_startup(port);
+}
+
+/* Nuvoton NPCM UARTs have a custom divisor calculation */
+static unsigned int npcm_get_divisor(struct uart_port *port, unsigned int baud,
+                                    unsigned int *frac)
+{
+       return DIV_ROUND_CLOSEST(port->uartclk, 16 * baud + 2) - 2;
+}
+
+static int npcm_setup(struct uart_port *port)
+{
+       port->get_divisor = npcm_get_divisor;
+       port->startup = npcm_startup;
+       return 0;
+}
+
 /*
  * Fill a struct uart_port for a given device node
  */
@@ -164,10 +197,17 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
        switch (type) {
        case PORT_RT2880:
                ret = rt288x_setup(port);
-               if (ret)
-                       goto err_pmruntime;
+               break;
+       case PORT_NPCM:
+               ret = npcm_setup(port);
+               break;
+       default:
+               /* Nothing to do */
+               ret = 0;
                break;
        }
+       if (ret)
+               goto err_pmruntime;
 
        if (IS_REACHABLE(CONFIG_SERIAL_8250_FSL) &&
            (of_device_is_compatible(np, "fsl,ns16550") ||
index c37905ea3cae64b9a3e3116d2389544030a25dd3..d9e886f2424e6c4924cda181ab111694fd59c72c 100644 (file)
 
 #include "8250.h"
 
-/* Nuvoton NPCM timeout register */
-#define UART_NPCM_TOR          7
-#define UART_NPCM_TOIE         BIT(7)  /* Timeout Interrupt Enable */
-
 /*
  * Debugging.
  */
@@ -2235,15 +2231,6 @@ int serial8250_do_startup(struct uart_port *port)
                                UART_DA830_PWREMU_MGMT_FREE);
        }
 
-       if (port->type == PORT_NPCM) {
-               /*
-                * Nuvoton calls the scratch register 'UART_TOR' (timeout
-                * register). Enable it, and set TIOC (timeout interrupt
-                * comparator) to be 0x20 for correct operation.
-                */
-               serial_port_out(port, UART_NPCM_TOR, UART_NPCM_TOIE | 0x20);
-       }
-
 #ifdef CONFIG_SERIAL_8250_RSA
        /*
         * If this is an RSA port, see if we can kick it up to the
@@ -2545,15 +2532,6 @@ static void serial8250_shutdown(struct uart_port *port)
                serial8250_do_shutdown(port);
 }
 
-/* Nuvoton NPCM UARTs have a custom divisor calculation */
-static unsigned int npcm_get_divisor(struct uart_8250_port *up,
-               unsigned int baud)
-{
-       struct uart_port *port = &up->port;
-
-       return DIV_ROUND_CLOSEST(port->uartclk, 16 * baud + 2) - 2;
-}
-
 static unsigned int serial8250_do_get_divisor(struct uart_port *port,
                                              unsigned int baud,
                                              unsigned int *frac)
@@ -2598,8 +2576,6 @@ static unsigned int serial8250_do_get_divisor(struct uart_port *port,
                quot = 0x8001;
        else if (magic_multiplier && baud >= port->uartclk / 12)
                quot = 0x8002;
-       else if (up->port.type == PORT_NPCM)
-               quot = npcm_get_divisor(up, baud);
        else
                quot = uart_get_divisor(port, baud);