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

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
Loading
Loading
Loading
Loading
+6 −5
Original line number Original line Diff line number Diff line
@@ -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]
+26 −1
Original line number Original line Diff line number Diff line
@@ -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;