If the earlycon parameter is given twice, the kernel will spit out a
WARN() in register_console() because it was already registered. The
non-dt variant setup_earlycon() already handles that gracefully. The dt
variant of_setup_earlycon() doesn't. Add the check there and add the
-EALREADY handling in early_init_dt_scan_chosen_stdout().
FWIW, this doesn't happen if CONFIG_ACPI_SPCR_TABLE is set. In that case
the registration is delayed until after earlycon parameter(s) are
parsed.
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Michael Walle <michael@walle.cc>
Link: https://lore.kernel.org/r/20220628120705.200617-1-michael@walle.cc
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 
        int l;
        const struct earlycon_id *match;
        const void *fdt = initial_boot_params;
+       int ret;
 
        offset = fdt_path_offset(fdt, "/chosen");
        if (offset < 0)
                if (fdt_node_check_compatible(fdt, offset, match->compatible))
                        continue;
 
-               if (of_setup_earlycon(match, offset, options) == 0)
+               ret = of_setup_earlycon(match, offset, options);
+               if (!ret || ret == -EALREADY)
                        return 0;
        }
        return -ENODEV;
 
        bool big_endian;
        u64 addr;
 
+       if (early_con.flags & CON_ENABLED)
+               return -EALREADY;
+
        spin_lock_init(&port->lock);
        port->iotype = UPIO_MEM;
        addr = of_flat_dt_translate_address(node);