[U-Boot] [PATCH] dm: serial: Add a REQUIRE_SERIAL_CONSOLE option for boards with no serial port

Simon Glass sjg at chromium.org
Sat Aug 1 18:05:00 CEST 2015


Hi Hans,

On 25 July 2015 at 03:58, Hans de Goede <hdegoede at 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 at redhat.com>
> ---
>  drivers/serial/Kconfig         | 11 +++++++++++
>  drivers/serial/serial-uclass.c | 20 +++++++++++++++++---
>  2 files changed, 28 insertions(+), 3 deletions(-)

Acked-by: Simon Glass <sjg at chromium.org>

A few nits below.

>
> 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

non-dm

> +       depends on DM_SERIAL
> +       default y
> +       help
> +         Require a serial port for the console, and panic of none is found

s/of/if/

> +         during serial port initialization (default y). Set this to n on
> +         boards which have no debug serial port what so ever.

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 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
>

Regards,
Simon


More information about the U-Boot mailing list