[U-Boot] [PATCH] ns16550: Add WATCHDOG_RESET to putc for short watchdog timeout boards

This is needed for board with a very short watchdog timeout, like the lwmon5 with a 100ms timeout. Without this patch this board resets in the commands with long outputs, like "printenv" or "fdt print".
Note that the image size is not increased with this patch when CONFIG_HW_WATCHDOG or CONFIG_WATCHDOG are not defined since the compiler optimizes this additional code away.
Signed-off-by: Stefan Roese sr@denx.de --- drivers/serial/ns16550.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 7e833fd..25fa521 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -5,6 +5,7 @@ */
#include <config.h> +#include <common.h> #include <ns16550.h> #include <watchdog.h> #include <linux/types.h> @@ -68,7 +69,13 @@ void NS16550_reinit (NS16550_t com_port, int baud_divisor)
void NS16550_putc (NS16550_t com_port, char c) { - while ((serial_in(&com_port->lsr) & UART_LSR_THRE) == 0); + while ((serial_in(&com_port->lsr) & UART_LSR_THRE) == 0) { + int count = 0; + + /* reset watchdog from time to time */ + if ((count++ % (256 << 10)) == 0) + WATCHDOG_RESET(); + } serial_out(c, &com_port->thr); }

Dear Stefan Roese,
In message 1285773233-29381-1-git-send-email-sr@denx.de you wrote:
This is needed for board with a very short watchdog timeout, like the lwmon5 with a 100ms timeout. Without this patch this board resets in the commands with long outputs, like "printenv" or "fdt print".
Note that the image size is not increased with this patch when CONFIG_HW_WATCHDOG or CONFIG_WATCHDOG are not defined since the compiler optimizes this additional code away.
Signed-off-by: Stefan Roese sr@denx.de
drivers/serial/ns16550.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 7e833fd..25fa521 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -5,6 +5,7 @@ */
#include <config.h> +#include <common.h> #include <ns16550.h> #include <watchdog.h> #include <linux/types.h> @@ -68,7 +69,13 @@ void NS16550_reinit (NS16550_t com_port, int baud_divisor)
void NS16550_putc (NS16550_t com_port, char c) {
- while ((serial_in(&com_port->lsr) & UART_LSR_THRE) == 0);
- while ((serial_in(&com_port->lsr) & UART_LSR_THRE) == 0) {
int count = 0;
/* reset watchdog from time to time */
if ((count++ % (256 << 10)) == 0)
WATCHDOG_RESET();
- }
This code makes no sense to me. You initialize the variable in the same loop, so it will never bi different from 0 when you test it.
Best regards,
Wolfgang Denk
participants (2)
-
Stefan Roese
-
Wolfgang Denk