Commit c41251b1 authored by Scott Telford's avatar Scott Telford Committed by Greg Kroah-Hartman

serial: xuartps: Add some register initialisation to cdns_early_console_setup()

Add initialisation of control register and baud rate to
cdns_early_console_setup(), required when running kernel standalone
without a boot loader. Baud rate is only initialised when specified in
earlycon command-line option, otherwise it is assumed this has been
set by a boot loader. Updated Documentation/kernel-parameters.txt
accordingly.
Signed-off-by: default avatarScott Telford <stelford@cadence.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 212d249b
...@@ -1045,11 +1045,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -1045,11 +1045,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
determined by the stdout-path property in device determined by the stdout-path property in device
tree's chosen node. tree's chosen node.
cdns,<addr> cdns,<addr>[,options]
Start an early, polled-mode console on a cadence serial Start an early, polled-mode console on a Cadence
port at the specified address. The cadence serial port (xuartps) serial port at the specified address. Only
must already be setup and configured. Options are not supported option is baud rate. If baud rate is not
yet supported. specified, the serial port must already be setup and
configured.
uart[8250],io,<addr>[,options] uart[8250],io,<addr>[,options]
uart[8250],mmio,<addr>[,options] uart[8250],mmio,<addr>[,options]
......
...@@ -1165,9 +1165,34 @@ static void __init cdns_early_write(struct console *con, const char *s, ...@@ -1165,9 +1165,34 @@ static void __init cdns_early_write(struct console *con, const char *s,
static int __init cdns_early_console_setup(struct earlycon_device *device, static int __init cdns_early_console_setup(struct earlycon_device *device,
const char *opt) const char *opt)
{ {
if (!device->port.membase) struct uart_port *port = &device->port;
if (!port->membase)
return -ENODEV; return -ENODEV;
/* initialise control register */
writel(CDNS_UART_CR_TX_EN|CDNS_UART_CR_TXRST|CDNS_UART_CR_RXRST,
port->membase + CDNS_UART_CR);
/* only set baud if specified on command line - otherwise
* assume it has been initialized by a boot loader.
*/
if (device->baud) {
u32 cd = 0, bdiv = 0;
u32 mr;
int div8;
cdns_uart_calc_baud_divs(port->uartclk, device->baud,
&bdiv, &cd, &div8);
mr = CDNS_UART_MR_PARITY_NONE;
if (div8)
mr |= CDNS_UART_MR_CLKSEL;
writel(mr, port->membase + CDNS_UART_MR);
writel(cd, port->membase + CDNS_UART_BAUDGEN);
writel(bdiv, port->membase + CDNS_UART_BAUDDIV);
}
device->con->write = cdns_early_write; device->con->write = cdns_early_write;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment