Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752874AbbDCXEL (ORCPT ); Fri, 3 Apr 2015 19:04:11 -0400 Received: from mail-qc0-f182.google.com ([209.85.216.182]:33451 "EHLO mail-qc0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752787AbbDCXEJ (ORCPT ); Fri, 3 Apr 2015 19:04:09 -0400 From: Peter Hurley To: Greg Kroah-Hartman Cc: Andrew Morton , Jiri Slaby , linux-serial@vger.kernel.org, Rob Herring , linux-kernel@vger.kernel.org, Peter Hurley Subject: [PATCH] earlycon: 8250: Fix command line regression Date: Fri, 3 Apr 2015 19:03:49 -0400 Message-Id: <1428102229-26103-1-git-send-email-peter@hurleysoftware.com> X-Mailer: git-send-email 2.3.5 In-Reply-To: <20150403190044.GA24702@kroah.com> References: <20150403190044.GA24702@kroah.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4866 Lines: 128 Restore undocumented behavior of kernel command line parameters of the forms: console=uart[####],io|mmio|mmio32,[,options] console=uart[####],[,options] where 'options' have not been specified; in this case, the hardware is assumed to be initialized. Document the required behavior of the original implementation. Reported-by: Yinghai Lu Signed-off-by: Peter Hurley --- Documentation/kernel-parameters.txt | 15 +++++++++++---- drivers/tty/serial/8250/8250_core.c | 15 ++++++++++++++- drivers/tty/serial/8250/8250_early.c | 19 ------------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index bfcb1a6..59c9832 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -711,12 +711,19 @@ bytes respectively. Such letter suffixes can also be entirely omitted. Documentation/networking/netconsole.txt for an alternative. - uart[8250],io,[,options] - uart[8250],mmio,[,options] + uart[],io,[,options] + uart[],mmio,[,options] + uart[],mmio32,[,options] + uart[],0x[,options] Start an early, polled-mode console on the 8250/16550 UART at the specified I/O port or MMIO address, - switching to the matching ttyS device later. The - options are the same as for ttyS, above. + switching to the matching ttyS device later. + Any optional number is accepted and ignored. + If none of [io|mmio|mmio32], is assumed to be + equivalent to 'mmio'. 'options' are specified in the + same format described for ttyS above; if unspecified, + the h/w is not re-initialized. + hvc Use the hypervisor console device . This is for both Xen and PowerPC hypervisors. diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index e0fb5f0..5f41a9c 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -3456,12 +3456,17 @@ static int univ8250_console_setup(struct console *co, char *options) * * Only attempts to match console command lines of the form: * console=uart<>,io|mmio|mmio32,, - * console=uart<>,,options + * console=uart<>,0x, * This form is used to register an initial earlycon boot console and * replace it with the serial8250_console at 8250 driver init. * * Performs console setup for a match (as required by interface) * + * ** HACK ALERT ** + * If no are specified, then assume the h/w is already setup. + * This was the undocumented behavior of the original implementation so + * it is cast in stone forever. + * * Returns 0 if console matches; otherwise non-zero to use default matching */ static int univ8250_console_match(struct console *co, char *name, int idx, @@ -3491,6 +3496,14 @@ static int univ8250_console_match(struct console *co, char *name, int idx, continue; co->index = i; + + /* if no line settings, then assume h/w was setup */ + if (!options) { + /* link port to console */ + port->cons = co; + return 0; + } + return univ8250_console_setup(co, options); } diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c index e95ebfe..8e11968 100644 --- a/drivers/tty/serial/8250/8250_early.c +++ b/drivers/tty/serial/8250/8250_early.c @@ -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); -- 2.3.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/