summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2020-07-27 21:58:47 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-07-27 21:58:47 +0200
commitf91f7747879ec28606293426720c136ec15b0e2d (patch)
tree883a065bed100b63f4dd1f5e663d9db305ca9c06
parent989d3ebf78ad149ee4e9930d7b73ac7370373a28 (diff)
parent2863db306e02b14c31dd7ea1fa4857bc3675e42c (diff)
downloadbarebox-f91f7747879ec28606293426720c136ec15b0e2d.tar.gz
barebox-f91f7747879ec28606293426720c136ec15b0e2d.tar.xz
Merge branch 'for-next/watchdog'
-rw-r--r--common/startup.c4
-rw-r--r--drivers/watchdog/wd_core.c30
-rw-r--r--include/watchdog.h6
3 files changed, 40 insertions, 0 deletions
diff --git a/common/startup.c b/common/startup.c
index 71a28a7be8..2fed4b71eb 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -43,6 +43,7 @@
#include <console_countdown.h>
#include <environment.h>
#include <linux/ctype.h>
+#include <watchdog.h>
extern initcall_t __barebox_initcalls_start[], __barebox_early_initcalls_end[],
__barebox_initcalls_end[];
@@ -356,6 +357,9 @@ static int run_init(void)
if (autoboot == AUTOBOOT_MENU)
run_command(MENUFILE);
+ if (autoboot == AUTOBOOT_ABORT && autoboot == global_autoboot_state)
+ watchdog_inhibit_all();
+
run_shell();
run_command(MENUFILE);
diff --git a/drivers/watchdog/wd_core.c b/drivers/watchdog/wd_core.c
index a17234f4b6..ab1dcaa40a 100644
--- a/drivers/watchdog/wd_core.c
+++ b/drivers/watchdog/wd_core.c
@@ -45,6 +45,9 @@ int watchdog_set_timeout(struct watchdog *wd, unsigned timeout)
if (timeout > wd->timeout_max)
return -EINVAL;
+ if (watchdog_hw_running(wd) == false)
+ return 0;
+
pr_debug("setting timeout on %s to %ds\n", watchdog_name(wd), timeout);
ret = wd->set_timeout(wd, timeout);
@@ -273,3 +276,30 @@ struct watchdog *watchdog_get_by_name(const char *name)
return NULL;
}
EXPORT_SYMBOL(watchdog_get_by_name);
+
+int watchdog_inhibit_all(void)
+{
+ struct watchdog *wd;
+ int ret = 0;
+
+ list_for_each_entry(wd, &watchdog_list, list) {
+ int err;
+ if (!wd->priority || watchdog_hw_running(wd) == false)
+ continue;
+
+ err = watchdog_set_timeout(wd, 0);
+ if (!err)
+ continue;
+
+ if (err != -ENOSYS || !IS_ENABLED(CONFIG_WATCHDOG_POLLER)) {
+ ret = err;
+ continue;
+ }
+
+ wd->poller_enable = true;
+ watchdog_poller_start(wd);
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL(watchdog_inhibit_all);
diff --git a/include/watchdog.h b/include/watchdog.h
index 419c1cdf46..81414ef8ec 100644
--- a/include/watchdog.h
+++ b/include/watchdog.h
@@ -45,6 +45,7 @@ int watchdog_deregister(struct watchdog *);
struct watchdog *watchdog_get_default(void);
struct watchdog *watchdog_get_by_name(const char *name);
int watchdog_set_timeout(struct watchdog*, unsigned);
+int watchdog_inhibit_all(void);
#else
static inline int watchdog_register(struct watchdog *w)
{
@@ -70,6 +71,11 @@ static inline int watchdog_set_timeout(struct watchdog*w, unsigned t)
{
return 0;
}
+
+static inline int watchdog_inhibit_all(void)
+{
+ return -ENOSYS;
+}
#endif
#define WATCHDOG_DEFAULT_PRIORITY 100