From 881d4108257a45ac890ef27c523783dbe401e462 Mon Sep 17 00:00:00 2001
From: Stefan Roese <sr@denx.de>
Date: Fri, 2 Sep 2022 14:10:45 +0200
Subject: [PATCH] cyclic: Introduce schedule() function

This patch introduces a schedule() function, which shall be used instead
of the old WATCHDOG_RESET. Follow-up patches will make sure, that this
new function is used.

Signed-off-by: Stefan Roese <sr@denx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Tom Rini <trini@konsulko.com> [am335x_evm, mx6cuboxi, rpi_3,dra7xx_evm, pine64_plus, am65x_evm, j721e_evm]
---
 common/cyclic.c  | 16 ++++++++++++++++
 include/cyclic.h | 12 ++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/common/cyclic.c b/common/cyclic.c
index cd5dcb1f2b..b3c180bd1a 100644
--- a/common/cyclic.c
+++ b/common/cyclic.c
@@ -18,6 +18,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+void hw_watchdog_reset(void);
+
 struct list_head *cyclic_get_list(void)
 {
 	return &gd->cyclic->cyclic_list;
@@ -96,6 +98,20 @@ void cyclic_run(void)
 	gd->cyclic->cyclic_running = false;
 }
 
+void schedule(void)
+{
+	/* The HW watchdog is not integrated into the cyclic IF (yet) */
+	if (IS_ENABLED(CONFIG_HW_WATCHDOG))
+		hw_watchdog_reset();
+
+	/*
+	 * schedule() might get called very early before the cyclic IF is
+	 * ready. Make sure to only call cyclic_run() when it's initalized.
+	 */
+	if (gd && gd->cyclic && gd->cyclic->cyclic_ready)
+		cyclic_run();
+}
+
 int cyclic_uninit(void)
 {
 	struct cyclic_info *cyclic, *tmp;
diff --git a/include/cyclic.h b/include/cyclic.h
index 23902234cc..7601636433 100644
--- a/include/cyclic.h
+++ b/include/cyclic.h
@@ -106,6 +106,14 @@ struct list_head *cyclic_get_list(void);
  * needs to be executed, then call into these registered functions.
  */
 void cyclic_run(void);
+
+/**
+ * schedule() - Schedule all potentially waiting tasks
+ *
+ * Basically a wrapper for cyclic_run(), pontentially enhanced by some
+ * other parts, that need to get handled periodically.
+ */
+void schedule(void);
 #else
 static inline struct cyclic_info *cyclic_register(cyclic_func_t func,
 						  uint64_t delay_us,
@@ -124,6 +132,10 @@ static inline void cyclic_run(void)
 {
 }
 
+static inline void schedule(void)
+{
+}
+
 static inline int cyclic_init(void)
 {
 	return 0;
-- 
2.39.5