Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87515772 authored by Peter Hurley's avatar Peter Hurley Committed by Greg Kroah-Hartman
Browse files

earlycon: 8250: Fix command line regression



Restore undocumented behavior of kernel command line parameters of
the forms:
    console=uart[8250],io|mmio|mmio32,<addr>[,options]
    console=uart[8250],<addr>[,options]
where 'options' have not been specified; in this case, the hardware
is assumed to be initialized.

Fixes: c7cef0a8 ("console: Add extensible console matching")
Reported-by: default avatarYinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 99492c39
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -3412,9 +3412,23 @@ static void univ8250_console_write(struct console *co, const char *s,
	serial8250_console_write(up, s, count);
}

static int serial8250_console_setup(struct uart_8250_port *up, char *options)
static unsigned int probe_baud(struct uart_port *port)
{
	unsigned char lcr, dll, dlm;
	unsigned int quot;

	lcr = serial_port_in(port, UART_LCR);
	serial_port_out(port, UART_LCR, lcr | UART_LCR_DLAB);
	dll = serial_port_in(port, UART_DLL);
	dlm = serial_port_in(port, UART_DLM);
	serial_port_out(port, UART_LCR, lcr);

	quot = (dlm << 8) | dll;
	return (port->uartclk / 16) / quot;
}

static int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
{
	struct uart_port *port = &up->port;
	int baud = 9600;
	int bits = 8;
	int parity = 'n';
@@ -3425,13 +3439,15 @@ static int serial8250_console_setup(struct uart_8250_port *up, char *options)

	if (options)
		uart_parse_options(options, &baud, &parity, &bits, &flow);
	else if (probe)
		baud = probe_baud(port);

	return uart_set_options(port, port->cons, baud, parity, bits, flow);
}

static int univ8250_console_setup(struct console *co, char *options)
{
	struct uart_8250_port *up;
	struct uart_port *port;

	/*
	 * Check whether an invalid uart number has been specified, and
@@ -3440,11 +3456,11 @@ static int univ8250_console_setup(struct console *co, char *options)
	 */
	if (co->index >= nr_uarts)
		co->index = 0;
	up = &serial8250_ports[co->index];
	port = &serial8250_ports[co->index].port;
	/* link port to console */
	up->port.cons = co;
	port->cons = co;

	return serial8250_console_setup(up, options);
	return serial8250_console_setup(port, options, false);
}

/**
@@ -3491,7 +3507,8 @@ static int univ8250_console_match(struct console *co, char *name, int idx,
			continue;

		co->index = i;
		return univ8250_console_setup(co, options);
		port->cons = co;
		return serial8250_console_setup(port, options, true);
	}

	return -ENODEV;
+0 −19
Original line number Diff line number Diff line
@@ -105,21 +105,6 @@ static void __init early_serial8250_write(struct console *console,
		serial8250_early_out(port, UART_IER, ier);
}

static unsigned int __init probe_baud(struct uart_port *port)
{
	unsigned char lcr, dll, dlm;
	unsigned int quot;

	lcr = serial8250_early_in(port, UART_LCR);
	serial8250_early_out(port, UART_LCR, lcr | UART_LCR_DLAB);
	dll = serial8250_early_in(port, UART_DLL);
	dlm = serial8250_early_in(port, UART_DLM);
	serial8250_early_out(port, UART_LCR, lcr);

	quot = (dlm << 8) | dll;
	return (port->uartclk / 16) / quot;
}

static void __init init_port(struct earlycon_device *device)
{
	struct uart_port *port = &device->port;
@@ -151,10 +136,6 @@ static int __init early_serial8250_setup(struct earlycon_device *device,
		struct uart_port *port = &device->port;
		unsigned int ier;

		device->baud = probe_baud(&device->port);
		snprintf(device->options, sizeof(device->options), "%u",
			 device->baud);

		/* assume the device was initialized, only mask interrupts */
		ier = serial8250_early_in(port, UART_IER);
		serial8250_early_out(port, UART_IER, ier & UART_IER_UUE);