Commit 63bad145 authored by Eric Lammerts's avatar Eric Lammerts Committed by Wim Van Sebroeck

[WATCHDOG] w83697ug: add error checking

I noticed the W83697UG driver tries to register a watchdog even though
it already noticed the chip isn't there.

WDT driver for the Winbond(TM) W83697UG/UF Super I/O chip initialising.
w83697ug/uf WDT: No W83697UG/UF could be found
w83697ug/uf WDT: Watchdog already running. Resetting timeout to 60 sec
w83697ug/uf WDT: cannot register miscdev on minor=130 (err=-16)

Patch propagates the error back to wdt_init().
Signed-off-by: default avatarEric Lammerts <eric@lammerts.org>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 9626dd75
...@@ -79,7 +79,7 @@ MODULE_PARM_DESC(nowayout, ...@@ -79,7 +79,7 @@ MODULE_PARM_DESC(nowayout,
(same as EFER) */ (same as EFER) */
#define WDT_EFDR (WDT_EFIR+1) /* Extended Function Data Register */ #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 c;
unsigned char version; unsigned char version;
...@@ -102,7 +102,7 @@ static void w83697ug_select_wd_register(void) ...@@ -102,7 +102,7 @@ static void w83697ug_select_wd_register(void)
} else { } else {
printk(KERN_ERR PFX "No W83697UG/UF could be found\n"); 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 */ outb_p(0x07, WDT_EFER); /* point to logical device number reg */
...@@ -110,6 +110,8 @@ static void w83697ug_select_wd_register(void) ...@@ -110,6 +110,8 @@ static void w83697ug_select_wd_register(void)
outb_p(0x30, WDT_EFER); /* select CR30 */ outb_p(0x30, WDT_EFER); /* select CR30 */
c = inb_p(WDT_EFDR); c = inb_p(WDT_EFDR);
outb_p(c || 0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */ outb_p(c || 0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */
return 0;
} }
static void w83697ug_unselect_wd_register(void) static void w83697ug_unselect_wd_register(void)
...@@ -117,11 +119,14 @@ 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 */ outb_p(0xAA, WDT_EFER); /* Leave extended function mode */
} }
static void w83697ug_init(void) static int w83697ug_init(void)
{ {
int ret;
unsigned char t; unsigned char t;
w83697ug_select_wd_register(); ret = w83697ug_select_wd_register();
if (ret != 0)
return ret;
outb_p(0xF6, WDT_EFER); /* Select CRF6 */ outb_p(0xF6, WDT_EFER); /* Select CRF6 */
t = inb_p(WDT_EFDR); /* read CRF6 */ t = inb_p(WDT_EFDR); /* read CRF6 */
...@@ -137,13 +142,15 @@ static void w83697ug_init(void) ...@@ -137,13 +142,15 @@ static void w83697ug_init(void)
outb_p(t, WDT_EFDR); /* Write back to CRF5 */ outb_p(t, WDT_EFDR); /* Write back to CRF5 */
w83697ug_unselect_wd_register(); w83697ug_unselect_wd_register();
return 0;
} }
static void wdt_ctrl(int timeout) static void wdt_ctrl(int timeout)
{ {
spin_lock(&io_lock); spin_lock(&io_lock);
w83697ug_select_wd_register(); if (w83697ug_select_wd_register() < 0)
return;
outb_p(0xF4, WDT_EFER); /* Select CRF4 */ outb_p(0xF4, WDT_EFER); /* Select CRF4 */
outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF4 */ outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF4 */
...@@ -347,7 +354,9 @@ static int __init wdt_init(void) ...@@ -347,7 +354,9 @@ static int __init wdt_init(void)
goto out; goto out;
} }
w83697ug_init(); ret = w83697ug_init();
if (ret != 0)
goto unreg_regions;
ret = register_reboot_notifier(&wdt_notifier); ret = register_reboot_notifier(&wdt_notifier);
if (ret != 0) { if (ret != 0) {
......
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