tty: goldfish: Implement support for kernel 'earlycon' parameter
authorMiodrag Dinic <miodrag.dinic@imgtec.com>
Tue, 29 Aug 2017 13:53:20 +0000 (15:53 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 31 Aug 2017 16:58:45 +0000 (18:58 +0200)
Add early console functionality to the Goldfish tty driver.

When 'earlycon' kernel command line parameter is used with no options,
the early console is determined by the 'stdout-path' property in device
tree's 'chosen' node. This is illustrated in the following device tree
source example:

Device tree example:

    chosen {
        stdout-path = "/goldfish_tty@1f004000";
    };

    goldfish_tty@1f004000 {
        interrupts = <0xc>;
        reg = <0x1f004000 0x0 0x1000>;
        compatible = "google,goldfish-tty";
    };

Signed-off-by: Miodrag Dinic <miodrag.dinic@imgtec.com>
Signed-off-by: Goran Ferenc <goran.ferenc@imgtec.com>
Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/Kconfig
drivers/tty/goldfish.c

index 95103054c0e469faf05472a6f3aa6e84e132eee1..873e0ba89737fe2d2c2234c74b1f5b65722bb559 100644 (file)
@@ -392,6 +392,9 @@ config PPC_EARLY_DEBUG_EHV_BC_HANDLE
 config GOLDFISH_TTY
        tristate "Goldfish TTY Driver"
        depends on GOLDFISH
+       select SERIAL_CORE
+       select SERIAL_CORE_CONSOLE
+       select SERIAL_EARLYCON
        help
          Console and system TTY driver for the Goldfish virtual platform.
 
index 757e17ff7aa4a2537f254cb414bf301803213b1d..381e981dee06fd5afde362c59adf8cbcada717dd 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2007 Google, Inc.
  * Copyright (C) 2012 Intel, Inc.
+ * Copyright (C) 2017 Imagination Technologies Ltd.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -24,6 +25,7 @@
 #include <linux/goldfish.h>
 #include <linux/mm.h>
 #include <linux/dma-mapping.h>
+#include <linux/serial_core.h>
 
 /* Goldfish tty register's offsets */
 #define        GOLDFISH_TTY_REG_BYTES_READY    0x04
@@ -440,6 +442,30 @@ static int goldfish_tty_remove(struct platform_device *pdev)
        return 0;
 }
 
+static void gf_early_console_putchar(struct uart_port *port, int ch)
+{
+       __raw_writel(ch, port->membase);
+}
+
+static void gf_early_write(struct console *con, const char *s, unsigned int n)
+{
+       struct earlycon_device *dev = con->data;
+
+       uart_console_write(&dev->port, s, n, gf_early_console_putchar);
+}
+
+static int __init gf_earlycon_setup(struct earlycon_device *device,
+                                   const char *opt)
+{
+       if (!device->port.membase)
+               return -ENODEV;
+
+       device->con->write = gf_early_write;
+       return 0;
+}
+
+OF_EARLYCON_DECLARE(early_gf_tty, "google,goldfish-tty", gf_earlycon_setup);
+
 static const struct of_device_id goldfish_tty_of_match[] = {
        { .compatible = "google,goldfish-tty", },
        {},