diff options
author | Hans de Goede <hdegoede@redhat.com> | 2015-08-08 18:45:18 +0300 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-08-10 16:01:28 +0300 |
commit | 8c4585881de51e8c9a8b2207bb2fab1cd83728b8 (patch) | |
tree | cfcad27fd42925a6fba4d56bf14424b495e12f4b /drivers/serial/serial-uclass.c | |
parent | bd48c0617b5c7212e5bf22169e716da878842da4 (diff) | |
download | u-boot-8c4585881de51e8c9a8b2207bb2fab1cd83728b8.tar.xz |
dm: serial: Add a REQUIRE_SERIAL_CONSOLE option for boards with no serial port
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 <hdegoede@redhat.com>
Acked-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/serial/serial-uclass.c')
-rw-r--r-- | drivers/serial/serial-uclass.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index bbc366b322..2a496979bc 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); } |