Message ID | 1439048718-20387-1-git-send-email-hdegoede@redhat.com |
---|---|
State | Accepted |
Delegated to: | Simon Glass |
Headers | show |
On 8 August 2015 at 09:45, Hans de Goede <hdegoede@redhat.com> wrote: > 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> > --- > Changes in v2: > -Fix some typos in the Kconfig description / help-text. > --- > drivers/serial/Kconfig | 11 +++++++++++ > drivers/serial/serial-uclass.c | 20 +++++++++++++++++--- > 2 files changed, 28 insertions(+), 3 deletions(-) Acked-by: Simon Glass <sjg@chromium.org>
On 10 August 2015 at 06:59, Simon Glass <sjg@chromium.org> wrote: > On 8 August 2015 at 09:45, Hans de Goede <hdegoede@redhat.com> wrote: >> 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> >> --- >> Changes in v2: >> -Fix some typos in the Kconfig description / help-text. >> --- >> drivers/serial/Kconfig | 11 +++++++++++ >> drivers/serial/serial-uclass.c | 20 +++++++++++++++++--- >> 2 files changed, 28 insertions(+), 3 deletions(-) > > Acked-by: Simon Glass <sjg@chromium.org> Applied to u-boot-dm, thanks!
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index fd126a8..a880eac 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 if none is found + during serial port initialization (default y). Set this to n on + boards which have no debug serial port whatsoever. + 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 bbc366b..2a49697 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); }
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> --- Changes in v2: -Fix some typos in the Kconfig description / help-text. --- drivers/serial/Kconfig | 11 +++++++++++ drivers/serial/serial-uclass.c | 20 +++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-)