From: Guenter Roeck <linux@roeck-us.net>
To: linux-watchdog@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Cc: Wim Van Sebroeck <wim@iguana.be>,
Catalin Marinas <catalin.marinas@arm.com>,
Maxime Ripard <maxime.ripard@free-electrons.com>,
Will Deacon <will.deacon@arm.com>, Arnd Bergmann <arnd@arndb.de>,
Russell King <linux@arm.linux.org.uk>,
Jonas Jensen <jonas.jensen@gmail.com>,
linux-kernel@vger.kernel.org, Guenter Roeck <linux@roeck-us.net>
Subject: [RFC PATCH 1/5] watchdog: Add API to trigger reboots
Date: Thu, 1 May 2014 08:41:29 -0700 [thread overview]
Message-ID: <1398958893-30049-2-git-send-email-linux@roeck-us.net> (raw)
In-Reply-To: <1398958893-30049-1-git-send-email-linux@roeck-us.net>
Some hardware implements reboot through its watchdog hardware,
for example by triggering a watchdog timeout. Platform specific
code starts to spread into watchdog drivers, typically by setting
pointers to a callback functions which is then called from the
platform reset handler.
To simplify code and provide a unified API to trigger reboots by
watchdog drivers, provide a single API to trigger such reboots
through the watchdog subsystem.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/watchdog/watchdog_core.c | 17 +++++++++++++++++
include/linux/watchdog.h | 11 +++++++++++
2 files changed, 28 insertions(+)
diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c
index cec9b55..4ec6e2f 100644
--- a/drivers/watchdog/watchdog_core.c
+++ b/drivers/watchdog/watchdog_core.c
@@ -43,6 +43,17 @@
static DEFINE_IDA(watchdog_ida);
static struct class *watchdog_class;
+static struct watchdog_device *wdd_reboot_dev;
+
+void watchdog_do_reboot(enum reboot_mode mode, const char *cmd)
+{
+ if (wdd_reboot_dev) {
+ if (wdd_reboot_dev->ops->reboot)
+ wdd_reboot_dev->ops->reboot(wdd_reboot_dev, mode, cmd);
+ }
+}
+EXPORT_SYMBOL(watchdog_do_reboot);
+
static void watchdog_check_min_max_timeout(struct watchdog_device *wdd)
{
/*
@@ -162,6 +173,9 @@ int watchdog_register_device(struct watchdog_device *wdd)
return ret;
}
+ if (wdd->ops->reboot)
+ wdd_reboot_dev = wdd;
+
return 0;
}
EXPORT_SYMBOL_GPL(watchdog_register_device);
@@ -181,6 +195,9 @@ void watchdog_unregister_device(struct watchdog_device *wdd)
if (wdd == NULL)
return;
+ if (wdd == wdd_reboot_dev)
+ wdd_reboot_dev = NULL;
+
devno = wdd->cdev.dev;
ret = watchdog_dev_unregister(wdd);
if (ret)
diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h
index 2a3038e..0d204af 100644
--- a/include/linux/watchdog.h
+++ b/include/linux/watchdog.h
@@ -12,6 +12,7 @@
#include <linux/bitops.h>
#include <linux/device.h>
#include <linux/cdev.h>
+#include <linux/reboot.h>
#include <uapi/linux/watchdog.h>
struct watchdog_ops;
@@ -23,6 +24,7 @@ struct watchdog_device;
* @start: The routine for starting the watchdog device.
* @stop: The routine for stopping the watchdog device.
* @ping: The routine that sends a keepalive ping to the watchdog device.
+ * @reboot: The routine for rebooting the system
* @status: The routine that shows the status of the watchdog device.
* @set_timeout:The routine for setting the watchdog devices timeout value.
* @get_timeleft:The routine that get's the time that's left before a reset.
@@ -42,6 +44,8 @@ struct watchdog_ops {
int (*stop)(struct watchdog_device *);
/* optional operations */
int (*ping)(struct watchdog_device *);
+ void (*reboot)(struct watchdog_device *, enum reboot_mode,
+ const char *);
unsigned int (*status)(struct watchdog_device *);
int (*set_timeout)(struct watchdog_device *, unsigned int);
unsigned int (*get_timeleft)(struct watchdog_device *);
@@ -142,4 +146,11 @@ extern int watchdog_init_timeout(struct watchdog_device *wdd,
extern int watchdog_register_device(struct watchdog_device *);
extern void watchdog_unregister_device(struct watchdog_device *);
+#ifdef CONFIG_WATCHDOG_CORE
+extern void watchdog_do_reboot(enum reboot_mode mode, const char *cmd);
+#else
+static inline void watchdog_do_reboot(enum reboot_mode mode,
+ const char *cmd) { }
+#endif
+
#endif /* ifndef _LINUX_WATCHDOG_H */
--
1.7.9.7
WARNING: multiple messages have this Message-ID (diff)
From: linux@roeck-us.net (Guenter Roeck)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH 1/5] watchdog: Add API to trigger reboots
Date: Thu, 1 May 2014 08:41:29 -0700 [thread overview]
Message-ID: <1398958893-30049-2-git-send-email-linux@roeck-us.net> (raw)
In-Reply-To: <1398958893-30049-1-git-send-email-linux@roeck-us.net>
Some hardware implements reboot through its watchdog hardware,
for example by triggering a watchdog timeout. Platform specific
code starts to spread into watchdog drivers, typically by setting
pointers to a callback functions which is then called from the
platform reset handler.
To simplify code and provide a unified API to trigger reboots by
watchdog drivers, provide a single API to trigger such reboots
through the watchdog subsystem.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/watchdog/watchdog_core.c | 17 +++++++++++++++++
include/linux/watchdog.h | 11 +++++++++++
2 files changed, 28 insertions(+)
diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c
index cec9b55..4ec6e2f 100644
--- a/drivers/watchdog/watchdog_core.c
+++ b/drivers/watchdog/watchdog_core.c
@@ -43,6 +43,17 @@
static DEFINE_IDA(watchdog_ida);
static struct class *watchdog_class;
+static struct watchdog_device *wdd_reboot_dev;
+
+void watchdog_do_reboot(enum reboot_mode mode, const char *cmd)
+{
+ if (wdd_reboot_dev) {
+ if (wdd_reboot_dev->ops->reboot)
+ wdd_reboot_dev->ops->reboot(wdd_reboot_dev, mode, cmd);
+ }
+}
+EXPORT_SYMBOL(watchdog_do_reboot);
+
static void watchdog_check_min_max_timeout(struct watchdog_device *wdd)
{
/*
@@ -162,6 +173,9 @@ int watchdog_register_device(struct watchdog_device *wdd)
return ret;
}
+ if (wdd->ops->reboot)
+ wdd_reboot_dev = wdd;
+
return 0;
}
EXPORT_SYMBOL_GPL(watchdog_register_device);
@@ -181,6 +195,9 @@ void watchdog_unregister_device(struct watchdog_device *wdd)
if (wdd == NULL)
return;
+ if (wdd == wdd_reboot_dev)
+ wdd_reboot_dev = NULL;
+
devno = wdd->cdev.dev;
ret = watchdog_dev_unregister(wdd);
if (ret)
diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h
index 2a3038e..0d204af 100644
--- a/include/linux/watchdog.h
+++ b/include/linux/watchdog.h
@@ -12,6 +12,7 @@
#include <linux/bitops.h>
#include <linux/device.h>
#include <linux/cdev.h>
+#include <linux/reboot.h>
#include <uapi/linux/watchdog.h>
struct watchdog_ops;
@@ -23,6 +24,7 @@ struct watchdog_device;
* @start: The routine for starting the watchdog device.
* @stop: The routine for stopping the watchdog device.
* @ping: The routine that sends a keepalive ping to the watchdog device.
+ * @reboot: The routine for rebooting the system
* @status: The routine that shows the status of the watchdog device.
* @set_timeout:The routine for setting the watchdog devices timeout value.
* @get_timeleft:The routine that get's the time that's left before a reset.
@@ -42,6 +44,8 @@ struct watchdog_ops {
int (*stop)(struct watchdog_device *);
/* optional operations */
int (*ping)(struct watchdog_device *);
+ void (*reboot)(struct watchdog_device *, enum reboot_mode,
+ const char *);
unsigned int (*status)(struct watchdog_device *);
int (*set_timeout)(struct watchdog_device *, unsigned int);
unsigned int (*get_timeleft)(struct watchdog_device *);
@@ -142,4 +146,11 @@ extern int watchdog_init_timeout(struct watchdog_device *wdd,
extern int watchdog_register_device(struct watchdog_device *);
extern void watchdog_unregister_device(struct watchdog_device *);
+#ifdef CONFIG_WATCHDOG_CORE
+extern void watchdog_do_reboot(enum reboot_mode mode, const char *cmd);
+#else
+static inline void watchdog_do_reboot(enum reboot_mode mode,
+ const char *cmd) { }
+#endif
+
#endif /* ifndef _LINUX_WATCHDOG_H */
--
1.7.9.7
next prev parent reply other threads:[~2014-05-01 15:41 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-01 15:41 [RFC PATCH 0/5] watchdog: Add reboot API Guenter Roeck
2014-05-01 15:41 ` Guenter Roeck
2014-05-01 15:41 ` Guenter Roeck [this message]
2014-05-01 15:41 ` [RFC PATCH 1/5] watchdog: Add API to trigger reboots Guenter Roeck
2014-05-02 10:01 ` Will Deacon
2014-05-02 10:01 ` Will Deacon
2014-05-02 13:22 ` Guenter Roeck
2014-05-02 13:22 ` Guenter Roeck
2014-05-03 1:22 ` Maxime Ripard
2014-05-03 1:22 ` Maxime Ripard
2014-05-03 4:29 ` Guenter Roeck
2014-05-03 4:29 ` Guenter Roeck
2014-05-05 4:27 ` Maxime Ripard
2014-05-05 4:27 ` Maxime Ripard
2014-05-07 11:52 ` Lucas Stach
2014-05-07 11:52 ` Lucas Stach
2014-05-07 13:01 ` Guenter Roeck
2014-05-07 13:01 ` Guenter Roeck
2014-05-07 15:49 ` Lucas Stach
2014-05-07 15:49 ` Lucas Stach
2014-05-07 19:15 ` Maxime Ripard
2014-05-07 19:15 ` Maxime Ripard
2014-05-05 18:36 ` Felipe Balbi
2014-05-05 18:36 ` Felipe Balbi
2014-05-05 19:45 ` Guenter Roeck
2014-05-05 19:45 ` Guenter Roeck
2014-05-01 15:41 ` [RFC PATCH 2/5] arm64: Support reboot through watchdog subsystem Guenter Roeck
2014-05-01 15:41 ` Guenter Roeck
2014-05-01 15:41 ` [RFC PATCH 3/5] arm: " Guenter Roeck
2014-05-01 15:41 ` Guenter Roeck
2014-05-01 15:41 ` [RFC PATCH 4/5] watchdog: moxart: Register reboot handler with " Guenter Roeck
2014-05-01 15:41 ` Guenter Roeck
2014-05-01 15:41 ` [RFC PATCH 5/5] watchdog: sunxi: " Guenter Roeck
2014-05-01 15:41 ` Guenter Roeck
2014-05-05 18:26 ` [RFC PATCH 0/5] watchdog: Add reboot API Arnd Bergmann
2014-05-05 18:26 ` Arnd Bergmann
2014-05-06 14:29 ` Jonas Jensen
2014-05-06 14:29 ` Jonas Jensen
2014-05-07 11:01 ` Heiko Stübner
2014-05-07 11:01 ` Heiko Stübner
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=1398958893-30049-2-git-send-email-linux@roeck-us.net \
--to=linux@roeck-us.net \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=jonas.jensen@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=maxime.ripard@free-electrons.com \
--cc=will.deacon@arm.com \
--cc=wim@iguana.be \
/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 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.