|
@@ -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,
|
|
|
const char *opt)
|
|
|
{
|
|
|
- if (!device->port.membase)
|
|
|
+ struct uart_port *port = &device->port;
|
|
|
+
|
|
|
+ if (!port->membase)
|
|
|
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;
|
|
|
|
|
|
return 0;
|