aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabrizio Castro <fabrizio.castro@bp.renesas.com>2018-03-05 10:30:26 -0500
committerWim Van Sebroeck <wim@linux-watchdog.org>2018-03-10 05:45:35 -0500
commit089bcaa87e772beb005068a5ef28c71bb895d01d (patch)
treee4d9f0d111f6b022617f866e66cfd39f9a6a1cbc
parent3fe95e6c68e6258410e85488af9e1b1ff545b831 (diff)
watchdog: renesas_wdt: Add restart handler
On iWave's boards iwg20d and iwg22d the only way to reboot the system is by means of the watchdog. This patch adds a restart handler to rwdt_ops, and also makes sure we keep its priority to the lowest level, in order to not override other more effective handlers. Signed-off-by: Fabrizio Castro <fabrizio.castro@bp.renesas.com> Signed-off-by: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
-rw-r--r--drivers/watchdog/renesas_wdt.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/watchdog/renesas_wdt.c b/drivers/watchdog/renesas_wdt.c
index 0dede5beb3f1..6b8c6ddfe30b 100644
--- a/drivers/watchdog/renesas_wdt.c
+++ b/drivers/watchdog/renesas_wdt.c
@@ -110,6 +110,16 @@ static unsigned int rwdt_get_timeleft(struct watchdog_device *wdev)
110 return DIV_BY_CLKS_PER_SEC(priv, 65536 - val); 110 return DIV_BY_CLKS_PER_SEC(priv, 65536 - val);
111} 111}
112 112
113static int rwdt_restart(struct watchdog_device *wdev, unsigned long action,
114 void *data)
115{
116 struct rwdt_priv *priv = watchdog_get_drvdata(wdev);
117
118 rwdt_start(wdev);
119 rwdt_write(priv, 0xffff, RWTCNT);
120 return 0;
121}
122
113static const struct watchdog_info rwdt_ident = { 123static const struct watchdog_info rwdt_ident = {
114 .options = WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT, 124 .options = WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT,
115 .identity = "Renesas WDT Watchdog", 125 .identity = "Renesas WDT Watchdog",
@@ -121,6 +131,7 @@ static const struct watchdog_ops rwdt_ops = {
121 .stop = rwdt_stop, 131 .stop = rwdt_stop,
122 .ping = rwdt_init_timeout, 132 .ping = rwdt_init_timeout,
123 .get_timeleft = rwdt_get_timeleft, 133 .get_timeleft = rwdt_get_timeleft,
134 .restart = rwdt_restart,
124}; 135};
125 136
126#if defined(CONFIG_ARCH_RCAR_GEN2) && defined(CONFIG_SMP) 137#if defined(CONFIG_ARCH_RCAR_GEN2) && defined(CONFIG_SMP)
@@ -220,6 +231,7 @@ static int rwdt_probe(struct platform_device *pdev)
220 platform_set_drvdata(pdev, priv); 231 platform_set_drvdata(pdev, priv);
221 watchdog_set_drvdata(&priv->wdev, priv); 232 watchdog_set_drvdata(&priv->wdev, priv);
222 watchdog_set_nowayout(&priv->wdev, nowayout); 233 watchdog_set_nowayout(&priv->wdev, nowayout);
234 watchdog_set_restart_priority(&priv->wdev, 0);
223 235
224 /* This overrides the default timeout only if DT configuration was found */ 236 /* This overrides the default timeout only if DT configuration was found */
225 ret = watchdog_init_timeout(&priv->wdev, 0, &pdev->dev); 237 ret = watchdog_init_timeout(&priv->wdev, 0, &pdev->dev);