| From 76e2b190803484db033153fe8a97b381a567ed25 Mon Sep 17 00:00:00 2001 |
| From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> |
| Date: Wed, 14 Nov 2012 19:16:35 +0800 |
| Subject: [PATCH 1/4] watchdog: add keep alive support |
| |
| this will allow to ping the watchdog via poller |
| |
| Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> |
| Signed-off-by: Fabio Porcedda <fabio.porcedda@gmail.com> |
| --- |
| drivers/watchdog/Kconfig | 1 + |
| drivers/watchdog/wd_core.c | 25 +++++++++++++++++++++++++ |
| include/watchdog.h | 2 ++ |
| 3 files changed, 28 insertions(+) |
| |
| diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig |
| index 63fb1a8c5..7ebff89b9 100644 |
| --- a/drivers/watchdog/Kconfig |
| +++ b/drivers/watchdog/Kconfig |
| @@ -4,6 +4,7 @@ config WATCHDOG_IMX_RESET_SOURCE |
| |
| menuconfig WATCHDOG |
| bool "Watchdog support" |
| + select GENERIC_POLLER |
| help |
| Many platforms support a watchdog to keep track of a working machine. |
| This framework provides routines to handle these watchdogs. |
| diff --git a/drivers/watchdog/wd_core.c b/drivers/watchdog/wd_core.c |
| index 3a3f51964..52537afef 100644 |
| --- a/drivers/watchdog/wd_core.c |
| +++ b/drivers/watchdog/wd_core.c |
| @@ -18,6 +18,7 @@ |
| #include <errno.h> |
| #include <linux/ctype.h> |
| #include <watchdog.h> |
| +#include <poller.h> |
| |
| static LIST_HEAD(watchdog_list); |
| |
| @@ -31,6 +32,20 @@ static const char *watchdog_name(struct watchdog *wd) |
| return "unknown"; |
| } |
| |
| +static struct watchdog *watchdog_get_default(void); |
| + |
| +static void watchdog_poller_func(struct poller_struct *poller) |
| +{ |
| + struct watchdog *wd = watchdog_get_default(); |
| + |
| + if (wd) |
| + wd->keep_alive(wd); |
| +} |
| + |
| +static struct poller_struct watchdog_poller = { |
| + .func = watchdog_poller_func, |
| +}; |
| + |
| int watchdog_register(struct watchdog *wd) |
| { |
| if (!wd->priority) |
| @@ -41,6 +56,16 @@ int watchdog_register(struct watchdog *wd) |
| pr_debug("registering watchdog %s with priority %d\n", watchdog_name(wd), |
| wd->priority); |
| |
| + |
| + if (wd->keep_alive) { |
| + int ret; |
| + |
| + ret = poller_register(&watchdog_poller); |
| + if (ret) { |
| + return ret; |
| + } |
| + } |
| + |
| return 0; |
| } |
| EXPORT_SYMBOL(watchdog_register); |
| diff --git a/include/watchdog.h b/include/watchdog.h |
| index 3e8a487a4..a2660c2e0 100644 |
| --- a/include/watchdog.h |
| +++ b/include/watchdog.h |
| @@ -13,12 +13,14 @@ |
| #ifndef INCLUDE_WATCHDOG_H |
| # define INCLUDE_WATCHDOG_H |
| |
| + |
| struct watchdog { |
| int (*set_timeout)(struct watchdog *, unsigned); |
| const char *name; |
| struct device_d *dev; |
| unsigned int priority; |
| struct list_head list; |
| + void (*keep_alive)(struct watchdog *); |
| }; |
| |
| #ifdef CONFIG_WATCHDOG |
| -- |
| 2.12.0 |
| |