Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 133770
b: refs/heads/master
c: 08eb2e0
h: refs/heads/master
v: v3
  • Loading branch information
Phil Sutter authored and Wim Van Sebroeck committed Mar 25, 2009
1 parent 1f9b5f5 commit fe25fe9
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9b655e07d77e3b1a00c1c8302e2ef3b7fb719de3
refs/heads/master: 08eb2e0c084778f30691e3f18540cdb754c56530
47 changes: 31 additions & 16 deletions trunk/drivers/watchdog/rc32434_wdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

#define PFX KBUILD_MODNAME ": "

#define VERSION "0.4"
#define VERSION "0.5"

static struct {
unsigned long inuse;
Expand All @@ -58,6 +58,9 @@ extern unsigned int idt_cpu_freq;
#define WATCHDOG_TIMEOUT 20

static int timeout = WATCHDOG_TIMEOUT;
module_param(timeout, int, 0);
MODULE_PARM_DESC(timeout, "Watchdog timeout value, in seconds (default="
WATCHDOG_TIMEOUT ")");

static int nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, int, 0);
Expand All @@ -68,6 +71,21 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
#define SET_BITS(addr, or, nand) \
writel((readl(&addr) | or) & ~nand, &addr)

static int rc32434_wdt_set(int new_timeout)
{
int max_to = WTCOMP2SEC((u32)-1);

if (new_timeout < 0 || new_timeout > max_to) {
printk(KERN_ERR PFX "timeout value must be between 0 and %d",
max_to);
return -EINVAL;
}
timeout = new_timeout;
writel(SEC2WTCOMP(timeout), &wdt_reg->wtcompare);

return 0;
}

static void rc32434_wdt_start(void)
{
u32 or, nand;
Expand All @@ -85,6 +103,9 @@ static void rc32434_wdt_start(void)

SET_BITS(wdt_reg->errcs, or, nand);

/* set the timeout (either default or based on module param) */
rc32434_wdt_set(timeout);

/* reset WTC timeout bit and enable WDT */
nand = 1 << RC32434_WTC_TO;
or = 1 << RC32434_WTC_EN;
Expand All @@ -102,21 +123,6 @@ static void rc32434_wdt_stop(void)
printk(KERN_INFO PFX "Stopped watchdog timer.\n");
}

static int rc32434_wdt_set(int new_timeout)
{
int max_to = WTCOMP2SEC((u32)-1);

if (new_timeout < 0 || new_timeout > max_to) {
printk(KERN_ERR PFX "timeout value must be between 0 and %d",
max_to);
return -EINVAL;
}
timeout = new_timeout;
writel(SEC2WTCOMP(timeout), &wdt_reg->wtcompare);

return 0;
}

static void rc32434_wdt_ping(void)
{
writel(0, &wdt_reg->wtcount);
Expand Down Expand Up @@ -264,6 +270,15 @@ static int __devinit rc32434_wdt_probe(struct platform_device *pdev)
return -ENXIO;
}

/* Check that the heartbeat value is within it's range;
* if not reset to the default */
if (rc32434_wdt_set(timeout)) {
rc32434_wdt_set(WATCHDOG_TIMEOUT);
printk(KERN_INFO PFX
"timeout value must be between 0 and %d\n",
WTCOMP2SEC((u32)-1));
}

ret = misc_register(&rc32434_wdt_miscdev);
if (ret < 0) {
printk(KERN_ERR PFX "failed to register watchdog device\n");
Expand Down

0 comments on commit fe25fe9

Please sign in to comment.