Commit c1fd5f64 authored by Fabio Porcedda's avatar Fabio Porcedda Committed by Wim Van Sebroeck

watchdog: add timeout-sec property binding

this patchset add the timeout-sec property to the following drivers:
orion_wdt, pnx4008_wdt, s3c2410_wdt and at91sam9_wdt.

The at91sam9_wdt is tested on evk-pr3,
the other drivers are compile tested only.
Signed-off-by: default avatarFabio Porcedda <fabio.porcedda@gmail.com>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Wolfram Sang <w.sang@pengutronix.de>
Cc: Masanari Iida <standby24x7@gmail.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Cc: Kukjin Kim <kgene.kim@samsung.com>
Cc: Andrew Victor <linux@maxim.org.za>
Cc: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 490ac7af
...@@ -7,9 +7,13 @@ Required properties: ...@@ -7,9 +7,13 @@ Required properties:
- reg: physical base address of the controller and length of memory mapped - reg: physical base address of the controller and length of memory mapped
region. region.
Optional properties:
- timeout-sec: contains the watchdog timeout in seconds.
Example: Example:
watchdog@fffffd40 { watchdog@fffffd40 {
compatible = "atmel,at91sam9260-wdt"; compatible = "atmel,at91sam9260-wdt";
reg = <0xfffffd40 0x10>; reg = <0xfffffd40 0x10>;
timeout-sec = <10>;
}; };
...@@ -5,10 +5,15 @@ Required Properties: ...@@ -5,10 +5,15 @@ Required Properties:
- Compatibility : "marvell,orion-wdt" - Compatibility : "marvell,orion-wdt"
- reg : Address of the timer registers - reg : Address of the timer registers
Optional properties:
- timeout-sec : Contains the watchdog timeout in seconds
Example: Example:
wdt@20300 { wdt@20300 {
compatible = "marvell,orion-wdt"; compatible = "marvell,orion-wdt";
reg = <0x20300 0x28>; reg = <0x20300 0x28>;
timeout-sec = <10>;
status = "okay"; status = "okay";
}; };
...@@ -5,9 +5,13 @@ Required properties: ...@@ -5,9 +5,13 @@ Required properties:
- reg: physical base address of the controller and length of memory mapped - reg: physical base address of the controller and length of memory mapped
region. region.
Optional properties:
- timeout-sec: contains the watchdog timeout in seconds.
Example: Example:
watchdog@4003C000 { watchdog@4003C000 {
compatible = "nxp,pnx4008-wdt"; compatible = "nxp,pnx4008-wdt";
reg = <0x4003C000 0x1000>; reg = <0x4003C000 0x1000>;
timeout-sec = <10>;
}; };
...@@ -9,3 +9,6 @@ Required properties: ...@@ -9,3 +9,6 @@ Required properties:
- reg : base physical address of the controller and length of memory mapped - reg : base physical address of the controller and length of memory mapped
region. region.
- interrupts : interrupt number to the cpu. - interrupts : interrupt number to the cpu.
Optional properties:
- timeout-sec : contains the watchdog timeout in seconds.
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
/* User land timeout */ /* User land timeout */
#define WDT_HEARTBEAT 15 #define WDT_HEARTBEAT 15
static int heartbeat = WDT_HEARTBEAT; static int heartbeat;
module_param(heartbeat, int, 0); module_param(heartbeat, int, 0);
MODULE_PARM_DESC(heartbeat, "Watchdog heartbeats in seconds. " MODULE_PARM_DESC(heartbeat, "Watchdog heartbeats in seconds. "
"(default = " __MODULE_STRING(WDT_HEARTBEAT) ")"); "(default = " __MODULE_STRING(WDT_HEARTBEAT) ")");
...@@ -176,6 +176,7 @@ static const struct watchdog_ops at91_wdt_ops = { ...@@ -176,6 +176,7 @@ static const struct watchdog_ops at91_wdt_ops = {
static struct watchdog_device at91_wdt_dev = { static struct watchdog_device at91_wdt_dev = {
.info = &at91_wdt_info, .info = &at91_wdt_info,
.ops = &at91_wdt_ops, .ops = &at91_wdt_ops,
.timeout = WDT_HEARTBEAT,
.min_timeout = 1, .min_timeout = 1,
.max_timeout = 0xFFFF, .max_timeout = 0xFFFF,
}; };
...@@ -194,8 +195,8 @@ static int __init at91wdt_probe(struct platform_device *pdev) ...@@ -194,8 +195,8 @@ static int __init at91wdt_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
} }
at91_wdt_dev.timeout = heartbeat;
at91_wdt_dev.parent = &pdev->dev; at91_wdt_dev.parent = &pdev->dev;
watchdog_init_timeout(&at91_wdt_dev, heartbeat, &pdev->dev);
watchdog_set_nowayout(&at91_wdt_dev, nowayout); watchdog_set_nowayout(&at91_wdt_dev, nowayout);
/* Set watchdog */ /* Set watchdog */
...@@ -212,7 +213,7 @@ static int __init at91wdt_probe(struct platform_device *pdev) ...@@ -212,7 +213,7 @@ static int __init at91wdt_probe(struct platform_device *pdev)
mod_timer(&at91wdt_private.timer, jiffies + WDT_TIMEOUT); mod_timer(&at91wdt_private.timer, jiffies + WDT_TIMEOUT);
pr_info("enabled (heartbeat=%d sec, nowayout=%d)\n", pr_info("enabled (heartbeat=%d sec, nowayout=%d)\n",
heartbeat, nowayout); at91_wdt_dev.timeout, nowayout);
return 0; return 0;
} }
......
...@@ -140,6 +140,7 @@ static const struct watchdog_ops orion_wdt_ops = { ...@@ -140,6 +140,7 @@ static const struct watchdog_ops orion_wdt_ops = {
static struct watchdog_device orion_wdt = { static struct watchdog_device orion_wdt = {
.info = &orion_wdt_info, .info = &orion_wdt_info,
.ops = &orion_wdt_ops, .ops = &orion_wdt_ops,
.min_timeout = 1,
}; };
static int orion_wdt_probe(struct platform_device *pdev) static int orion_wdt_probe(struct platform_device *pdev)
...@@ -164,12 +165,9 @@ static int orion_wdt_probe(struct platform_device *pdev) ...@@ -164,12 +165,9 @@ static int orion_wdt_probe(struct platform_device *pdev)
wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk; wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk;
if ((heartbeat < 1) || (heartbeat > wdt_max_duration)) orion_wdt.timeout = wdt_max_duration;
heartbeat = wdt_max_duration;
orion_wdt.timeout = heartbeat;
orion_wdt.min_timeout = 1;
orion_wdt.max_timeout = wdt_max_duration; orion_wdt.max_timeout = wdt_max_duration;
watchdog_init_timeout(&orion_wdt, heartbeat, &pdev->dev);
watchdog_set_nowayout(&orion_wdt, nowayout); watchdog_set_nowayout(&orion_wdt, nowayout);
ret = watchdog_register_device(&orion_wdt); ret = watchdog_register_device(&orion_wdt);
...@@ -179,7 +177,7 @@ static int orion_wdt_probe(struct platform_device *pdev) ...@@ -179,7 +177,7 @@ static int orion_wdt_probe(struct platform_device *pdev)
} }
pr_info("Initial timeout %d sec%s\n", pr_info("Initial timeout %d sec%s\n",
heartbeat, nowayout ? ", nowayout" : ""); orion_wdt.timeout, nowayout ? ", nowayout" : "");
return 0; return 0;
} }
......
...@@ -142,6 +142,7 @@ static const struct watchdog_ops pnx4008_wdt_ops = { ...@@ -142,6 +142,7 @@ static const struct watchdog_ops pnx4008_wdt_ops = {
static struct watchdog_device pnx4008_wdd = { static struct watchdog_device pnx4008_wdd = {
.info = &pnx4008_wdt_ident, .info = &pnx4008_wdt_ident,
.ops = &pnx4008_wdt_ops, .ops = &pnx4008_wdt_ops,
.timeout = DEFAULT_HEARTBEAT,
.min_timeout = 1, .min_timeout = 1,
.max_timeout = MAX_HEARTBEAT, .max_timeout = MAX_HEARTBEAT,
}; };
...@@ -151,8 +152,7 @@ static int pnx4008_wdt_probe(struct platform_device *pdev) ...@@ -151,8 +152,7 @@ static int pnx4008_wdt_probe(struct platform_device *pdev)
struct resource *r; struct resource *r;
int ret = 0; int ret = 0;
if (heartbeat < 1 || heartbeat > MAX_HEARTBEAT) watchdog_init_timeout(&pnx4008_wdd, heartbeat, &pdev->dev);
heartbeat = DEFAULT_HEARTBEAT;
r = platform_get_resource(pdev, IORESOURCE_MEM, 0); r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
wdt_base = devm_ioremap_resource(&pdev->dev, r); wdt_base = devm_ioremap_resource(&pdev->dev, r);
...@@ -167,7 +167,6 @@ static int pnx4008_wdt_probe(struct platform_device *pdev) ...@@ -167,7 +167,6 @@ static int pnx4008_wdt_probe(struct platform_device *pdev)
if (ret) if (ret)
goto out; goto out;
pnx4008_wdd.timeout = heartbeat;
pnx4008_wdd.bootstatus = (readl(WDTIM_RES(wdt_base)) & WDOG_RESET) ? pnx4008_wdd.bootstatus = (readl(WDTIM_RES(wdt_base)) & WDOG_RESET) ?
WDIOF_CARDRESET : 0; WDIOF_CARDRESET : 0;
watchdog_set_nowayout(&pnx4008_wdd, nowayout); watchdog_set_nowayout(&pnx4008_wdd, nowayout);
...@@ -181,7 +180,7 @@ static int pnx4008_wdt_probe(struct platform_device *pdev) ...@@ -181,7 +180,7 @@ static int pnx4008_wdt_probe(struct platform_device *pdev)
} }
dev_info(&pdev->dev, "PNX4008 Watchdog Timer: heartbeat %d sec\n", dev_info(&pdev->dev, "PNX4008 Watchdog Timer: heartbeat %d sec\n",
heartbeat); pnx4008_wdd.timeout);
return 0; return 0;
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
#define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (15) #define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (15)
static bool nowayout = WATCHDOG_NOWAYOUT; static bool nowayout = WATCHDOG_NOWAYOUT;
static int tmr_margin = CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME; static int tmr_margin;
static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT; static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT;
static int soft_noboot; static int soft_noboot;
static int debug; static int debug;
...@@ -226,6 +226,7 @@ static struct watchdog_ops s3c2410wdt_ops = { ...@@ -226,6 +226,7 @@ static struct watchdog_ops s3c2410wdt_ops = {
static struct watchdog_device s3c2410_wdd = { static struct watchdog_device s3c2410_wdd = {
.info = &s3c2410_wdt_ident, .info = &s3c2410_wdt_ident,
.ops = &s3c2410wdt_ops, .ops = &s3c2410wdt_ops,
.timeout = CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME,
}; };
/* interrupt handler code */ /* interrupt handler code */
...@@ -356,7 +357,8 @@ static int s3c2410wdt_probe(struct platform_device *pdev) ...@@ -356,7 +357,8 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
/* see if we can actually set the requested timer margin, and if /* see if we can actually set the requested timer margin, and if
* not, try the default value */ * not, try the default value */
if (s3c2410wdt_set_heartbeat(&s3c2410_wdd, tmr_margin)) { watchdog_init_timeout(&s3c2410_wdd, tmr_margin, &pdev->dev);
if (s3c2410wdt_set_heartbeat(&s3c2410_wdd, s3c2410_wdd.timeout)) {
started = s3c2410wdt_set_heartbeat(&s3c2410_wdd, started = s3c2410wdt_set_heartbeat(&s3c2410_wdd,
CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME); CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment