diff mbox

[U-Boot,v2,02/15] dm: serial: Reset the watchdog while waiting in getc()

Message ID 1414035435-17897-3-git-send-email-sjg@chromium.org
State Accepted
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass Oct. 23, 2014, 3:37 a.m. UTC
We have moved the busy-wait loop out of drivers and into the uclass. This
means that we must reset the watchdog when busy-waiting.

Note: some drivers may still have a busy-wait even with driver model, as
a transition mechanism. Driver model will tolerate this, and is can be
cleaned up when all users of the driver use driver model. An example is
ns16550.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Tom Rini <trini@ti.com>
---

Changes in v2: None

 drivers/serial/serial-uclass.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Simon Glass Oct. 24, 2014, 3:51 a.m. UTC | #1
On 22 October 2014 21:37, Simon Glass <sjg@chromium.org> wrote:
> We have moved the busy-wait loop out of drivers and into the uclass. This
> means that we must reset the watchdog when busy-waiting.
>
> Note: some drivers may still have a busy-wait even with driver model, as
> a transition mechanism. Driver model will tolerate this, and is can be
> cleaned up when all users of the driver use driver model. An example is
> ns16550.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Reviewed-by: Tom Rini <trini@ti.com>
> ---
>
> Changes in v2: None
>
>  drivers/serial/serial-uclass.c | 5 +++++
>  1 file changed, 5 insertions(+)

Applied to u-boot-dm/master
diff mbox

Patch

diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index 1a75950..1983a3d 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -11,9 +11,12 @@ 
 #include <os.h>
 #include <serial.h>
 #include <stdio_dev.h>
+#include <watchdog.h>
 #include <dm/lists.h>
 #include <dm/device-internal.h>
 
+#include <ns16550.h>
+
 DECLARE_GLOBAL_DATA_PTR;
 
 /* The currently-selected console serial device */
@@ -119,6 +122,8 @@  static int serial_getc_dev(struct udevice *dev)
 
 	do {
 		err = ops->getc(dev);
+		if (err == -EAGAIN)
+			WATCHDOG_RESET();
 	} while (err == -EAGAIN);
 
 	return err >= 0 ? err : 0;