serial8250_isa_init_ports() uses home grown approach to make itself a singleton. Instead, explicitly show that we initialise ISA ports once by providing a helper function which calls the original function via DO_ONCE() macro. Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- drivers/tty/serial/8250/8250_core.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index cae61d1ebec5..9c0d6693f745 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -22,6 +22,7 @@ #include <linux/console.h> #include <linux/sysrq.h> #include <linux/delay.h> +#include <linux/once.h> #include <linux/platform_device.h> #include <linux/tty.h> #include <linux/ratelimit.h> @@ -495,13 +496,8 @@ static inline void serial8250_apply_quirks(struct uart_8250_port *up) static void __init serial8250_isa_init_ports(void) { struct uart_8250_port *up; - static int first = 1; int i, irqflag = 0; - if (!first) - return; - first = 0; - if (nr_uarts > UART_NR) nr_uarts = UART_NR; @@ -555,6 +551,11 @@ static void __init serial8250_isa_init_ports(void) } } +static void __init serial8250_isa_init_ports_once(void) +{ + DO_ONCE(serial8250_isa_init_ports); +} + static void __init serial8250_register_ports(struct uart_driver *drv, struct device *dev) { @@ -686,7 +687,7 @@ static int __init univ8250_console_init(void) if (nr_uarts == 0) return -ENODEV; - serial8250_isa_init_ports(); + serial8250_isa_init_ports_once(); register_console(&univ8250_console); return 0; } @@ -719,7 +720,7 @@ int __init early_serial_setup(struct uart_port *port) if (port->line >= ARRAY_SIZE(serial8250_ports) || nr_uarts == 0) return -ENODEV; - serial8250_isa_init_ports(); + serial8250_isa_init_ports_once(); p = &serial8250_ports[port->line].port; p->iobase = port->iobase; p->membase = port->membase; @@ -1170,7 +1171,7 @@ static int __init serial8250_init(void) if (nr_uarts == 0) return -ENODEV; - serial8250_isa_init_ports(); + serial8250_isa_init_ports_once(); pr_info("Serial: 8250/16550 driver, %d ports, IRQ sharing %sabled\n", nr_uarts, share_irqs ? "en" : "dis"); -- 2.27.0