diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 15:48:11 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 15:48:11 -0700 |
commit | 8690d8a9f6c2d5728a9c9f68231f1bb4de109e3a (patch) | |
tree | 175067bf67d29c75f310a1bb76d8429f579d8e9a /drivers/watchdog/w83697ug_wdt.c | |
parent | d3f12d36f148f101c568bdbce795e41cd9ceadf3 (diff) | |
parent | 3b9d49eea1c32e529fa932670a53358e1c8cd67e (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
* git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog:
[WATCHDOG] i6300esb.c: start locking
[WATCHDOG] i6300esb.c: convert to platform device driver
[WATCHDOG] wdt.c: remove #ifdef CONFIG_WDT_501
[WATCHDOG] Fix io.h & uaccess.h includes.
[WATCHDOG] More coding-style and trivial clean-up
[WATCHDOG] struct file_operations should be const
[WATCHDOG] cpwd.c: Coding style - Clean-up
[WATCHDOG] hpwdt.c: Add new HP BMC controller.
[PATCH 13/13] drivers/watchdog: use USB API functions rather than constants
[WATCHDOG] orion5x_wdt: fix compile issue by providing tclk as platform data
[WATCHDOG] rc32434_wdt: make sure watchdog is not running at startup
[WATCHDOG] rc32434_wdt: add spin_locking
[WATCHDOG] rc32434_wdt: add shutdown method
[WATCHDOG] rc32434_wdt: add timeout module parameter
[WATCHDOG] rc32434_wdt: clean-up driver
[WATCHDOG] davinci: convert to ioremap() + io[read|write]
[WATCHDOG] w83697ug: add error checking
[WATCHDOG] cpwd.c & riowd.c - unlocked_ioctl
Diffstat (limited to 'drivers/watchdog/w83697ug_wdt.c')
-rw-r--r-- | drivers/watchdog/w83697ug_wdt.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/watchdog/w83697ug_wdt.c b/drivers/watchdog/w83697ug_wdt.c index ada8ad82d99..883b5f79673 100644 --- a/drivers/watchdog/w83697ug_wdt.c +++ b/drivers/watchdog/w83697ug_wdt.c @@ -2,7 +2,7 @@ * w83697ug/uf WDT driver * * (c) Copyright 2008 Flemming Fransen <ff@nrvissing.net> - * reused original code to supoprt w83697ug/uf. + * reused original code to support w83697ug/uf. * * Based on w83627hf_wdt.c which is based on advantechwdt.c * which is based on wdt.c. @@ -79,7 +79,7 @@ MODULE_PARM_DESC(nowayout, (same as EFER) */ #define WDT_EFDR (WDT_EFIR+1) /* Extended Function Data Register */ -static void w83697ug_select_wd_register(void) +static int w83697ug_select_wd_register(void) { unsigned char c; unsigned char version; @@ -102,7 +102,7 @@ static void w83697ug_select_wd_register(void) } else { printk(KERN_ERR PFX "No W83697UG/UF could be found\n"); - return; + return -ENODEV; } outb_p(0x07, WDT_EFER); /* point to logical device number reg */ @@ -110,6 +110,8 @@ static void w83697ug_select_wd_register(void) outb_p(0x30, WDT_EFER); /* select CR30 */ c = inb_p(WDT_EFDR); outb_p(c || 0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */ + + return 0; } static void w83697ug_unselect_wd_register(void) @@ -117,11 +119,14 @@ static void w83697ug_unselect_wd_register(void) outb_p(0xAA, WDT_EFER); /* Leave extended function mode */ } -static void w83697ug_init(void) +static int w83697ug_init(void) { + int ret; unsigned char t; - w83697ug_select_wd_register(); + ret = w83697ug_select_wd_register(); + if (ret != 0) + return ret; outb_p(0xF6, WDT_EFER); /* Select CRF6 */ t = inb_p(WDT_EFDR); /* read CRF6 */ @@ -137,13 +142,15 @@ static void w83697ug_init(void) outb_p(t, WDT_EFDR); /* Write back to CRF5 */ w83697ug_unselect_wd_register(); + return 0; } static void wdt_ctrl(int timeout) { spin_lock(&io_lock); - w83697ug_select_wd_register(); + if (w83697ug_select_wd_register() < 0) + return; outb_p(0xF4, WDT_EFER); /* Select CRF4 */ outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF4 */ @@ -347,7 +354,9 @@ static int __init wdt_init(void) goto out; } - w83697ug_init(); + ret = w83697ug_init(); + if (ret != 0) + goto unreg_regions; ret = register_reboot_notifier(&wdt_notifier); if (ret != 0) { |