All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] watchdog: core: module param to activate watchdog
@ 2014-02-28 16:16 Markus Pargmann
  2014-03-02  5:11 ` Guenter Roeck
  2014-03-02  9:43 ` Wim Van Sebroeck
  0 siblings, 2 replies; 8+ messages in thread
From: Markus Pargmann @ 2014-02-28 16:16 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: linux-watchdog, kernel, Markus Pargmann

Many watchdog driver reset the watchdog device on initialization. This
is a problem if the watchdog is activated by the bootloader and should
be active the whole time until the userspace can write to it.

This patch adds a module parameter (watchdog.activate_first) that
activates the first registered watchdog. Using this parameter it is
possible to have an active watchdog during the whole boot process.

Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
---
 drivers/watchdog/watchdog_core.c |  4 ++++
 drivers/watchdog/watchdog_core.h |  4 ++++
 drivers/watchdog/watchdog_dev.c  | 21 ++++++++++++++++++++-
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c
index cec9b55..6db16eb 100644
--- a/drivers/watchdog/watchdog_core.c
+++ b/drivers/watchdog/watchdog_core.c
@@ -43,6 +43,10 @@
 static DEFINE_IDA(watchdog_ida);
 static struct class *watchdog_class;
 
+unsigned int activate_first = 0;
+module_param(activate_first, uint, 0);
+MODULE_PARM_DESC(activate_first, "Activation timeout for first watchdog registered. 0 means no activation.");
+
 static void watchdog_check_min_max_timeout(struct watchdog_device *wdd)
 {
 	/*
diff --git a/drivers/watchdog/watchdog_core.h b/drivers/watchdog/watchdog_core.h
index 6c95141..4526170 100644
--- a/drivers/watchdog/watchdog_core.h
+++ b/drivers/watchdog/watchdog_core.h
@@ -28,6 +28,10 @@
 
 #define MAX_DOGS	32	/* Maximum number of watchdog devices */
 
+/* Activate first registered watchdog and set this as the timeout value
+ * (only != 0) */
+extern unsigned int activate_first;
+
 /*
  *	Functions/procedures to be called by the core
  */
diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
index 6aaefba..fe60fdc 100644
--- a/drivers/watchdog/watchdog_dev.c
+++ b/drivers/watchdog/watchdog_dev.c
@@ -553,8 +553,27 @@ int watchdog_dev_register(struct watchdog_device *watchdog)
 			misc_deregister(&watchdog_miscdev);
 			old_wdd = NULL;
 		}
+
+		return err;
 	}
-	return err;
+
+	if (activate_first && watchdog->id == 0) {
+		err = watchdog_set_timeout(watchdog, activate_first);
+		if (err && err != -EOPNOTSUPP) {
+			pr_err("watchdog%d failed to set timeout for first activation\n",
+					watchdog->id);
+			return err;
+		}
+
+		err = watchdog_start(watchdog);
+		if (err) {
+			pr_err("watchdog%d failed to start first watchdog\n",
+					watchdog->id);
+			return err;
+		}
+	}
+
+	return 0;
 }
 
 /*
-- 
1.8.5.3


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-03-03 14:38 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-28 16:16 [PATCH] watchdog: core: module param to activate watchdog Markus Pargmann
2014-03-02  5:11 ` Guenter Roeck
2014-03-03  9:39   ` Markus Pargmann
2014-03-02  9:43 ` Wim Van Sebroeck
2014-03-03  9:27   ` Markus Pargmann
2014-03-03 10:19     ` Wim Van Sebroeck
2014-03-03 11:09       ` Markus Pargmann
2014-03-03 14:38         ` Guenter Roeck

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.