Skip to content

Commit

Permalink
tty: serial: msm: Add earlycon support
Browse files Browse the repository at this point in the history
Add support for DT based and command line based early console on platforms
with the msm serial hardware.

Cc: Rob Herring <robh@kernel.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Stephen Boyd authored and Greg Kroah-Hartman committed Sep 29, 2014
1 parent a86713b commit 0efe729
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 12 deletions.
12 changes: 12 additions & 0 deletions Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -942,6 +942,18 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
must already be setup and configured. Options are not
yet supported.

msm_serial,<addr>
Start an early, polled-mode console on an msm serial
port at the specified address. The serial port
must already be setup and configured. Options are not
yet supported.

msm_serial_dm,<addr>
Start an early, polled-mode console on an msm serial
dm port at the specified address. The serial port
must already be setup and configured. Options are not
yet supported.

smh Use ARM semihosting calls for early console.

earlyprintk= [X86,SH,BLACKFIN,ARM,M68k]
Expand Down
1 change: 1 addition & 0 deletions drivers/tty/serial/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -1070,6 +1070,7 @@ config SERIAL_MSM_CONSOLE
bool "MSM serial console support"
depends on SERIAL_MSM=y
select SERIAL_CORE_CONSOLE
select SERIAL_EARLYCON

config SERIAL_MSM_HS
tristate "MSM UART High Speed: Serial Driver"
Expand Down
74 changes: 62 additions & 12 deletions drivers/tty/serial/msm_serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -845,22 +845,15 @@ static inline struct uart_port *get_port_from_line(unsigned int line)
}

#ifdef CONFIG_SERIAL_MSM_CONSOLE
static void msm_console_write(struct console *co, const char *s,
unsigned int count)
static void __msm_console_write(struct uart_port *port, const char *s,
unsigned int count, bool is_uartdm)
{
int i;
struct uart_port *port;
struct msm_port *msm_port;
int num_newlines = 0;
bool replaced = false;
void __iomem *tf;

BUG_ON(co->index < 0 || co->index >= UART_NR);

port = get_port_from_line(co->index);
msm_port = UART_TO_MSM(port);

if (msm_port->is_uartdm)
if (is_uartdm)
tf = port->membase + UARTDM_TF;
else
tf = port->membase + UART_TF;
Expand All @@ -872,7 +865,7 @@ static void msm_console_write(struct console *co, const char *s,
count += num_newlines;

spin_lock(&port->lock);
if (msm_port->is_uartdm)
if (is_uartdm)
reset_dm_count(port, count);

i = 0;
Expand All @@ -881,7 +874,7 @@ static void msm_console_write(struct console *co, const char *s,
unsigned int num_chars;
char buf[4] = { 0 };

if (msm_port->is_uartdm)
if (is_uartdm)
num_chars = min(count - i, (unsigned int)sizeof(buf));
else
num_chars = 1;
Expand Down Expand Up @@ -910,6 +903,20 @@ static void msm_console_write(struct console *co, const char *s,
spin_unlock(&port->lock);
}

static void msm_console_write(struct console *co, const char *s,
unsigned int count)
{
struct uart_port *port;
struct msm_port *msm_port;

BUG_ON(co->index < 0 || co->index >= UART_NR);

port = get_port_from_line(co->index);
msm_port = UART_TO_MSM(port);

__msm_console_write(port, s, count, msm_port->is_uartdm);
}

static int __init msm_console_setup(struct console *co, char *options)
{
struct uart_port *port;
Expand Down Expand Up @@ -952,6 +959,49 @@ static int __init msm_console_setup(struct console *co, char *options)
return uart_set_options(port, co, baud, parity, bits, flow);
}

static void
msm_serial_early_write(struct console *con, const char *s, unsigned n)
{
struct earlycon_device *dev = con->data;

__msm_console_write(&dev->port, s, n, false);
}

static int __init
msm_serial_early_console_setup(struct earlycon_device *device, const char *opt)
{
if (!device->port.membase)
return -ENODEV;

device->con->write = msm_serial_early_write;
return 0;
}
EARLYCON_DECLARE(msm_serial, msm_serial_early_console_setup);
OF_EARLYCON_DECLARE(msm_serial, "qcom,msm-uart",
msm_serial_early_console_setup);

static void
msm_serial_early_write_dm(struct console *con, const char *s, unsigned n)
{
struct earlycon_device *dev = con->data;

__msm_console_write(&dev->port, s, n, true);
}

static int __init
msm_serial_early_console_setup_dm(struct earlycon_device *device,
const char *opt)
{
if (!device->port.membase)
return -ENODEV;

device->con->write = msm_serial_early_write_dm;
return 0;
}
EARLYCON_DECLARE(msm_serial_dm, msm_serial_early_console_setup_dm);
OF_EARLYCON_DECLARE(msm_serial_dm, "qcom,msm-uartdm",
msm_serial_early_console_setup_dm);

static struct uart_driver msm_uart_driver;

static struct console msm_console = {
Expand Down

0 comments on commit 0efe729

Please sign in to comment.