serial: sandbox: Implement puts
authorSean Anderson <sean.anderson@seco.com>
Mon, 4 Apr 2022 18:17:58 +0000 (14:17 -0400)
committerTom Rini <trini@konsulko.com>
Thu, 14 Apr 2022 19:39:15 +0000 (15:39 -0400)
This implements puts for sandbox. It is fairly straightforward, except
that we break out the shared color printing functionality into its own
function.

Signed-off-by: Sean Anderson <sean.anderson@seco.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/serial/Kconfig
drivers/serial/sandbox.c

index 286c99800f01c5e5920e248043f2e7bbff156c24..6b189f8be0581e0eb2727140f7eb0200797eac27 100644 (file)
@@ -779,6 +779,7 @@ config S5P_SERIAL
 config SANDBOX_SERIAL
        bool "Sandbox UART support"
        depends on SANDBOX
+       imply SERIAL_PUTS
        help
          Select this to enable a seral UART for sandbox. This is required to
          operate correctly, otherwise you will see no serial output from
index 0b1756f5c0c8d16fd83fef6e6c716fc333d3e08e..50cf2c74a7988741d61a656bf12b9eb949ef05d2 100644 (file)
@@ -67,7 +67,7 @@ static int sandbox_serial_remove(struct udevice *dev)
        return 0;
 }
 
-static int sandbox_serial_putc(struct udevice *dev, const char ch)
+static void sandbox_print_color(struct udevice *dev)
 {
        struct sandbox_serial_priv *priv = dev_get_priv(dev);
        struct sandbox_serial_plat *plat = dev_get_plat(dev);
@@ -78,7 +78,13 @@ static int sandbox_serial_putc(struct udevice *dev, const char ch)
                priv->start_of_line = false;
                output_ansi_colour(plat->colour);
        }
+}
 
+static int sandbox_serial_putc(struct udevice *dev, const char ch)
+{
+       struct sandbox_serial_priv *priv = dev_get_priv(dev);
+
+       sandbox_print_color(dev);
        os_write(1, &ch, 1);
        if (ch == '\n')
                priv->start_of_line = true;
@@ -86,6 +92,18 @@ static int sandbox_serial_putc(struct udevice *dev, const char ch)
        return 0;
 }
 
+static ssize_t sandbox_serial_puts(struct udevice *dev, const char *s,
+                                  size_t len)
+{
+       struct sandbox_serial_priv *priv = dev_get_priv(dev);
+
+       sandbox_print_color(dev);
+       if (s[len - 1] == '\n')
+               priv->start_of_line = true;
+
+       return os_write(1, s, len);
+}
+
 static int sandbox_serial_pending(struct udevice *dev, bool input)
 {
        struct sandbox_serial_priv *priv = dev_get_priv(dev);
@@ -212,6 +230,7 @@ static int sandbox_serial_of_to_plat(struct udevice *dev)
 
 static const struct dm_serial_ops sandbox_serial_ops = {
        .putc = sandbox_serial_putc,
+       .puts = sandbox_serial_puts,
        .pending = sandbox_serial_pending,
        .getc = sandbox_serial_getc,
        .getconfig = sandbox_serial_getconfig,