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: Scott Telford <stelford@cadence.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Scott Telford 2016-09-22 16:58:16 +01:00 committed by Greg Kroah-Hartman
parent 212d249b6a
commit c41251b175
2 changed files with 32 additions and 6 deletions

View File

@ -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]

View File

@ -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;