serial: earlycon: Common log banner for command line and DT
[cascardo/linux.git] / drivers / tty / serial / earlycon.c
index 7089667..36b79f1 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/io.h>
 #include <linux/serial_core.h>
 #include <linux/sizes.h>
+#include <linux/of.h>
 #include <linux/of_fdt.h>
 
 #ifdef CONFIG_FIX_EARLYCON_MEM
@@ -58,6 +59,7 @@ static void __init earlycon_init(struct earlycon_device *device,
                                 const char *name)
 {
        struct console *earlycon = device->con;
+       struct uart_port *port = &device->port;
        const char *s;
        size_t len;
 
@@ -71,6 +73,19 @@ static void __init earlycon_init(struct earlycon_device *device,
        len = s - name;
        strlcpy(earlycon->name, name, min(len + 1, sizeof(earlycon->name)));
        earlycon->data = &early_console_dev;
+
+       if (port->iotype == UPIO_MEM || port->iotype == UPIO_MEM16 ||
+           port->iotype == UPIO_MEM32 || port->iotype == UPIO_MEM32BE)
+               pr_info("Early serial console at MMIO%s 0x%llx (options '%s')\n",
+                       (port->iotype == UPIO_MEM) ? "" :
+                       (port->iotype == UPIO_MEM16) ? "16" :
+                       (port->iotype == UPIO_MEM32) ? "32" : "32be",
+                       (unsigned long long)port->mapbase,
+                       device->options);
+       else
+               pr_info("Early serial console at I/O port 0x%lx (options '%s')\n",
+                       port->iobase,
+                       device->options);
 }
 
 static int __init parse_options(struct earlycon_device *device, char *options)
@@ -109,19 +124,6 @@ static int __init parse_options(struct earlycon_device *device, char *options)
                strlcpy(device->options, options, length);
        }
 
-       if (port->iotype == UPIO_MEM || port->iotype == UPIO_MEM16 ||
-           port->iotype == UPIO_MEM32 || port->iotype == UPIO_MEM32BE)
-               pr_info("Early serial console at MMIO%s 0x%llx (options '%s')\n",
-                       (port->iotype == UPIO_MEM) ? "" :
-                       (port->iotype == UPIO_MEM16) ? "16" :
-                       (port->iotype == UPIO_MEM32) ? "32" : "32be",
-                       (unsigned long long)port->mapbase,
-                       device->options);
-       else
-               pr_info("Early serial console at I/O port 0x%lx (options '%s')\n",
-                       port->iobase,
-                       device->options);
-
        return 0;
 }
 
@@ -218,8 +220,7 @@ early_param("earlycon", param_setup_earlycon);
 
 #ifdef CONFIG_OF_EARLY_FLATTREE
 
-int __init of_setup_earlycon(unsigned long addr,
-                            const struct earlycon_id *match,
+int __init of_setup_earlycon(const struct earlycon_id *match,
                             unsigned long node,
                             const char *options)
 {
@@ -227,12 +228,18 @@ int __init of_setup_earlycon(unsigned long addr,
        struct uart_port *port = &early_console_dev.port;
        const __be32 *val;
        bool big_endian;
+       u64 addr;
 
        spin_lock_init(&port->lock);
        port->iotype = UPIO_MEM;
+       addr = of_flat_dt_translate_address(node);
+       if (addr == OF_BAD_ADDR) {
+               pr_warn("[%s] bad address\n", match->name);
+               return -ENXIO;
+       }
        port->mapbase = addr;
        port->uartclk = BASE_BAUD * 16;
-       port->membase = earlycon_map(addr, SZ_4K);
+       port->membase = earlycon_map(port->mapbase, SZ_4K);
 
        val = of_get_flat_dt_prop(node, "reg-offset", NULL);
        if (val)