diff --git a/common/Kconfig b/common/Kconfig index 93c96f23b0..43701fe9e8 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -224,6 +224,16 @@ config CONSOLE_FLUSH_SUPPORT help This enables compilation of flush() function for console flush support. +config CONSOLE_FLUSH_ON_NEWLINE + bool "Flush console buffer on every newline character" + depends on DM_SERIAL + help + This makes the serial core code flush the console device + whenever a newline (\n) character has been emitted. This can + be especially useful when "printf debugging", as otherwise + lots of output could still be in the UART's FIFO by the time + one hits the code which causes the CPU to hang or reset. + config CONSOLE_MUX bool "Enable console multiplexing" default y if VIDEO || LCD diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index 8bdcdd1eaa..df6a387284 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -182,7 +182,6 @@ int serial_initialize(void) return serial_init(); } -#ifdef CONFIG_CONSOLE_FLUSH_SUPPORT static void _serial_flush(struct udevice *dev) { struct dm_serial_ops *ops = serial_get_ops(dev); @@ -192,7 +191,6 @@ static void _serial_flush(struct udevice *dev) while (ops->pending(dev, false) > 0) ; } -#endif static void _serial_putc(struct udevice *dev, char ch) { @@ -205,6 +203,9 @@ static void _serial_putc(struct udevice *dev, char ch) do { err = ops->putc(dev, ch); } while (err == -EAGAIN); + + if (IS_ENABLED(CONFIG_CONSOLE_FLUSH_ON_NEWLINE) && ch == '\n') + _serial_flush(dev); } static int __serial_puts(struct udevice *dev, const char *str, size_t len) @@ -243,6 +244,9 @@ static void _serial_puts(struct udevice *dev, const char *str) if (*newline && __serial_puts(dev, "\r\n", 2)) return; + if (IS_ENABLED(CONFIG_CONSOLE_FLUSH_ON_NEWLINE) && *newline) + _serial_flush(dev); + str += len + !!*newline; } while (*str); }