summaryrefslogtreecommitdiffstats
path: root/drivers/watchdog/bfin_wdt.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2010-02-16 01:32:25 +0100
committerWim Van Sebroeck <wim@iguana.be>2010-02-21 20:16:30 +0100
commit3dae93ec3ee1fceec69f40ef9b97892ce62ba7a5 (patch)
tree71901f55ab30c1108043d80b93c462c15c2746a8 /drivers/watchdog/bfin_wdt.c
parentMerge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vir... (diff)
downloadlinux-3dae93ec3ee1fceec69f40ef9b97892ce62ba7a5.tar.xz
linux-3dae93ec3ee1fceec69f40ef9b97892ce62ba7a5.zip
[WATCHDOG] bfin: fix max timeout calculation
Relying on overflow/wrap around isn't exact because if you wrap far enough, you get back to "valid" values. Reported-by: Thorsten Pohlmann <pohlmann@tetronik.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Wim Van Sebroeck <wim@iguana.be> Cc: stable <stable@kernel.org>
Diffstat (limited to 'drivers/watchdog/bfin_wdt.c')
-rw-r--r--drivers/watchdog/bfin_wdt.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/watchdog/bfin_wdt.c b/drivers/watchdog/bfin_wdt.c
index c7b3f9df2317..2159e668751c 100644
--- a/drivers/watchdog/bfin_wdt.c
+++ b/drivers/watchdog/bfin_wdt.c
@@ -1,9 +1,8 @@
/*
* Blackfin On-Chip Watchdog Driver
- * Supports BF53[123]/BF53[467]/BF54[2489]/BF561
*
* Originally based on softdog.c
- * Copyright 2006-2007 Analog Devices Inc.
+ * Copyright 2006-2010 Analog Devices Inc.
* Copyright 2006-2007 Michele d'Amico
* Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>
*
@@ -137,13 +136,15 @@ static int bfin_wdt_running(void)
*/
static int bfin_wdt_set_timeout(unsigned long t)
{
- u32 cnt;
+ u32 cnt, max_t, sclk;
unsigned long flags;
- stampit();
+ sclk = get_sclk();
+ max_t = -1 / sclk;
+ cnt = t * sclk;
+ stamp("maxtimeout=%us newtimeout=%lus (cnt=%#x)", max_t, t, cnt);
- cnt = t * get_sclk();
- if (cnt < get_sclk()) {
+ if (t > max_t) {
printk(KERN_WARNING PFX "timeout value is too large\n");
return -EINVAL;
}