From 16fceb13b18c58f05e6181bb0c271f22648b41f6 Mon Sep 17 00:00:00 2001 From: Kartik Date: Wed, 10 Apr 2024 17:54:02 +0000 Subject: [PATCH] NVIDIA: SAUCE: tty/serial: tegra-utc: Add support for earlycon Add support for earlycon in Tegra UTC driver. http://nvbugs/4593743 Signed-off-by: Kartik Signed-off-by: Laxman Dewangan Acked-by: Noah Wager Acked-by: Jacob Martin Signed-off-by: Noah Wager --- drivers/tty/serial/tegra-utc.c | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/tty/serial/tegra-utc.c b/drivers/tty/serial/tegra-utc.c index fa7acc4aecb9..645b813b16cf 100644 --- a/drivers/tty/serial/tegra-utc.c +++ b/drivers/tty/serial/tegra-utc.c @@ -406,6 +406,47 @@ static void tegra_utc_setup_port(struct device *dev, struct tegra_utc_port *tup, } #if IS_ENABLED(CONFIG_SERIAL_TEGRA_UTC_CONSOLE) +static void tegra_utc_putc(struct uart_port *port, unsigned char c) +{ + writel(c, port->membase + TEGRA_UTC_DATA); +} + +static void tegra_utc_early_write(struct console *con, const char *s, unsigned int n) +{ + struct earlycon_device *dev = con->data; + + while (n) { + unsigned int burst_size = TEGRA_UTC_CLIENT_FIFO_SIZE; + + burst_size -= readl(dev->port.membase + TEGRA_UTC_FIFO_OCCUPANCY); + if (n < burst_size) + burst_size = n; + + uart_console_write(&dev->port, s, burst_size, tegra_utc_putc); + + n -= burst_size; + s += burst_size; + } +} + +static int __init tegra_utc_early_console_setup(struct earlycon_device *device, const char *opt) +{ + if (!device->port.membase) + return -ENODEV; + + writel(0x11, device->port.membase + TEGRA_UTC_COMMAND); + writel(0x4, device->port.membase + TEGRA_UTC_FIFO_THRESHOLD); + writel(0xf, device->port.membase + TEGRA_UTC_INTR_CLEAR); + writel(0x0, device->port.membase + TEGRA_UTC_INTR_MASK); + writel(0x0, device->port.membase + TEGRA_UTC_INTR_SET); + writel(0x1, device->port.membase + TEGRA_UTC_ENABLE); + + device->con->write = tegra_utc_early_write; + + return 0; +} +OF_EARLYCON_DECLARE(tegra_utc, "nvidia,tegra-utc", tegra_utc_early_console_setup); + static void tegra_utc_console_putchar(struct uart_port *port, unsigned char ch) { struct tegra_utc_port *tup = container_of(port, struct tegra_utc_port, port);