diff mbox

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

Message ID 1439048718-20387-1-git-send-email-hdegoede@redhat.com
State Accepted
Delegated to: Simon Glass
Headers show

Commit Message

Hans de Goede Aug. 8, 2015, 3:45 p.m. UTC
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(-)

Comments

Simon Glass Aug. 10, 2015, 12:59 p.m. UTC | #1
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>
Simon Glass Aug. 10, 2015, 3:43 p.m. UTC | #2
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 mbox

Patch

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);
 }