public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Cc: trini@konsulko.com, sjg@chromium.org, rasmus.villemoes@prevas.dk
Subject: [PATCH v1 1/6] watchdog: Integrate watchdog triggering into the cyclic framework
Date: Fri,  2 Sep 2022 14:10:44 +0200	[thread overview]
Message-ID: <20220902121049.1282136-2-sr@denx.de> (raw)
In-Reply-To: <20220902121049.1282136-1-sr@denx.de>

This patch integrates the watchdog triggering into the recently added
cyclic infrastructure. Each watchdog device that shall be triggered
registers it's own cyclic function. This way, multiple watchdog devices
are still supported, each via a cyclic function with separate trigger
intervals.

Signed-off-by: Stefan Roese <sr@denx.de>
---
v1:
- Reword WDT logging at startup as suggested by Rasmus
- Fail upon !priv->cyclic initr_watchdog()
- Remove some superflous checks in wdt_cyclic()

 drivers/watchdog/Kconfig      |  2 +
 drivers/watchdog/wdt-uclass.c | 73 ++++++++++++++++++++---------------
 2 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 50e6a1efba51..e55deaf906b5 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -3,6 +3,7 @@ menu "Watchdog Timer Support"
 config WATCHDOG
 	bool "Enable U-Boot watchdog reset"
 	depends on !HW_WATCHDOG
+	select CYCLIC
 	help
 	  This option enables U-Boot watchdog support where U-Boot is using
 	  watchdog_reset function to service watchdog device in U-Boot. Enable
@@ -74,6 +75,7 @@ config WDT
 	bool "Enable driver model for watchdog timer drivers"
 	depends on DM
 	imply WATCHDOG
+	select CYCLIC
 	help
 	  Enable driver model for watchdog timer. At the moment the API
 	  is very simple and only supports four operations:
diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c
index dbf556467d3c..3f342cd99fdd 100644
--- a/drivers/watchdog/wdt-uclass.c
+++ b/drivers/watchdog/wdt-uclass.c
@@ -6,6 +6,7 @@
 #define LOG_CATEGORY UCLASS_WDT
 
 #include <common.h>
+#include <cyclic.h>
 #include <dm.h>
 #include <errno.h>
 #include <hang.h>
@@ -38,8 +39,25 @@ struct wdt_priv {
 	bool running;
 	/* No autostart */
 	bool noautostart;
+
+	struct cyclic_info *cyclic;
 };
 
+static void wdt_cyclic(void *ctx)
+{
+	struct udevice *dev = ctx;
+	struct wdt_priv *priv;
+
+	if (!device_active(dev))
+		return;
+
+	priv = dev_get_uclass_priv(dev);
+	if (!priv->running)
+		return;
+
+	wdt_reset(dev);
+}
+
 static void init_watchdog_dev(struct udevice *dev)
 {
 	struct wdt_priv *priv;
@@ -64,9 +82,6 @@ static void init_watchdog_dev(struct udevice *dev)
 		printf("WDT:   Failed to start %s\n", dev->name);
 		return;
 	}
-
-	printf("WDT:   Started %s with%s servicing (%ds timeout)\n", dev->name,
-	       IS_ENABLED(CONFIG_WATCHDOG) ? "" : "out", priv->timeout);
 }
 
 int initr_watchdog(void)
@@ -105,8 +120,29 @@ int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
 	ret = ops->start(dev, timeout_ms, flags);
 	if (ret == 0) {
 		struct wdt_priv *priv = dev_get_uclass_priv(dev);
+		char str[16];
 
 		priv->running = true;
+
+		memset(str, 0, 16);
+		if (IS_ENABLED(CONFIG_WATCHDOG)) {
+			/* Register the watchdog driver as a cyclic function */
+			priv->cyclic = cyclic_register(wdt_cyclic,
+						       priv->reset_period * 1000,
+						       dev->name, dev);
+			if (!priv->cyclic) {
+				printf("cyclic_register for %s failed\n",
+				       dev->name);
+				return -ENODEV;
+			} else {
+				snprintf(str, 16, "every %ldms",
+					 priv->reset_period);
+			}
+		}
+
+		printf("WDT:   Started %s with%s servicing %s (%ds timeout)\n",
+		       dev->name, IS_ENABLED(CONFIG_WATCHDOG) ? "" : "out",
+		       str, priv->timeout);
 	}
 
 	return ret;
@@ -194,37 +230,10 @@ int wdt_expire_now(struct udevice *dev, ulong flags)
  */
 void watchdog_reset(void)
 {
-	struct wdt_priv *priv;
-	struct udevice *dev;
-	struct uclass *uc;
-	ulong now;
-
-	/* Exit if GD is not ready or watchdog is not initialized yet */
-	if (!gd || !(gd->flags & GD_FLG_WDT_READY))
-		return;
-
-	if (uclass_get(UCLASS_WDT, &uc))
-		return;
-
 	/*
-	 * All devices bound to the wdt uclass should have been probed
-	 * in initr_watchdog(). But just in case something went wrong,
-	 * check device_active() before accessing the uclass private
-	 * data.
+	 * Empty function for now. The actual WDT handling is now done in
+	 * the cyclic function instead.
 	 */
-	uclass_foreach_dev(dev, uc) {
-		if (!device_active(dev))
-			continue;
-		priv = dev_get_uclass_priv(dev);
-		if (!priv->running)
-			continue;
-		/* Do not reset the watchdog too often */
-		now = get_timer(0);
-		if (time_after_eq(now, priv->next_reset)) {
-			priv->next_reset = now + priv->reset_period;
-			wdt_reset(dev);
-		}
-	}
 }
 #endif
 
-- 
2.37.3


  reply	other threads:[~2022-09-02 12:11 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-02 12:10 [PATCH v1 0/6] Migrate watchdog reset to cyclic infrastructure Stefan Roese
2022-09-02 12:10 ` Stefan Roese [this message]
2022-09-02 19:59   ` [PATCH v1 1/6] watchdog: Integrate watchdog triggering into the cyclic framework Simon Glass
2022-09-02 12:10 ` [PATCH v1 2/6] cyclic: Introduce schedule() function Stefan Roese
2022-09-02 12:10 ` [PATCH v1 3/6] cyclic: Use schedule() instead of WATCHDOG_RESET() Stefan Roese
2022-09-02 12:10 ` [PATCH v1 4/6] watchdog: Get rid of ASSEMBLY hacks Stefan Roese
2022-09-02 12:10 ` [PATCH v1 5/6] watchdog: Remove WATCHDOG_RESET macro Stefan Roese
2022-09-02 12:10 ` [PATCH v1 6/6] watchdog: Further cleanup Stefan Roese
2022-09-16  7:21 ` [PATCH v1 0/6] Migrate watchdog reset to cyclic infrastructure Stefan Roese

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220902121049.1282136-2-sr@denx.de \
    --to=sr@denx.de \
    --cc=rasmus.villemoes@prevas.dk \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox