Currently the serial code assumes that there is always at least one serial
port (and panics / crashes due to null pointer dereferences when there is
none).

This makes it impossible to use u-boot on boards where there is no (debug)
serial port, because e.g. all uart pins are muxed to another function.

This commit adds a CONFIG_REQUIRE_SERIAL_CONSOLE Kconfig option, which
defaults to y (preserving existing behavior), which can be set to n on
such boards to make them work.

This commit only implements this for CONFIG_DM_SERIAL=y configs, as allowing
running without a serial port for CONFIG_DM_SERIAL=n configs is non trivial,
and is not necessary at this moment.

Signed-off-by: Hans de Goede <hdego...@redhat.com>
---
 drivers/serial/Kconfig         | 11 +++++++++++
 drivers/serial/serial-uclass.c | 20 +++++++++++++++++---
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 4829284..89d01d5 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -1,3 +1,14 @@
+config REQUIRE_SERIAL_CONSOLE
+       bool "Require a serial port for console"
+       # Running without a serial console is not supported by the
+       # non dm serial code
+       depends on DM_SERIAL
+       default y
+       help
+         Require a serial port for the console, and panic of none is found
+         during serial port initialization (default y). Set this to n on
+         boards which have no debug serial port what so ever.
+
 config DM_SERIAL
        bool "Enable Driver Model for serial drivers"
        depends on DM
diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index 815fec3..df0f183 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -78,7 +78,9 @@ static void serial_find_console_or_panic(void)
 #undef INDEX
        }
 
+#ifdef CONFIG_REQUIRE_SERIAL_CONSOLE
        panic_str("No serial driver found");
+#endif
 }
 
 /* Called prior to relocation */
@@ -140,28 +142,40 @@ static int _serial_tstc(struct udevice *dev)
 
 void serial_putc(char ch)
 {
-       _serial_putc(gd->cur_serial_dev, ch);
+       if (gd->cur_serial_dev)
+               _serial_putc(gd->cur_serial_dev, ch);
 }
 
 void serial_puts(const char *str)
 {
-       _serial_puts(gd->cur_serial_dev, str);
+       if (gd->cur_serial_dev)
+               _serial_puts(gd->cur_serial_dev, str);
 }
 
 int serial_getc(void)
 {
+       if (!gd->cur_serial_dev)
+               return 0;
+
        return _serial_getc(gd->cur_serial_dev);
 }
 
 int serial_tstc(void)
 {
+       if (!gd->cur_serial_dev)
+               return 0;
+
        return _serial_tstc(gd->cur_serial_dev);
 }
 
 void serial_setbrg(void)
 {
-       struct dm_serial_ops *ops = serial_get_ops(gd->cur_serial_dev);
+       struct dm_serial_ops *ops;
+
+       if (!gd->cur_serial_dev)
+               return;
 
+       ops = serial_get_ops(gd->cur_serial_dev);
        if (ops->setbrg)
                ops->setbrg(gd->cur_serial_dev, gd->baudrate);
 }
-- 
2.4.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to