diff options
| -rw-r--r-- | drivers/watchdog/w83627hf_wdt.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/drivers/watchdog/w83627hf_wdt.c b/drivers/watchdog/w83627hf_wdt.c index ab5ec6d84b16..910d43736821 100644 --- a/drivers/watchdog/w83627hf_wdt.c +++ b/drivers/watchdog/w83627hf_wdt.c | |||
| @@ -72,28 +72,10 @@ MODULE_PARM_DESC(nowayout, | |||
| 72 | 72 | ||
| 73 | static void w83627hf_select_wd_register(void) | 73 | static void w83627hf_select_wd_register(void) |
| 74 | { | 74 | { |
| 75 | unsigned char c; | ||
| 76 | outb_p(0x87, WDT_EFER); /* Enter extended function mode */ | 75 | outb_p(0x87, WDT_EFER); /* Enter extended function mode */ |
| 77 | outb_p(0x87, WDT_EFER); /* Again according to manual */ | 76 | outb_p(0x87, WDT_EFER); /* Again according to manual */ |
| 78 | |||
| 79 | outb(0x20, WDT_EFER); /* check chip version */ | ||
| 80 | c = inb(WDT_EFDR); | ||
| 81 | if (c == 0x82) { /* W83627THF */ | ||
| 82 | outb_p(0x2b, WDT_EFER); /* select GPIO3 */ | ||
| 83 | c = ((inb_p(WDT_EFDR) & 0xf7) | 0x04); /* select WDT0 */ | ||
| 84 | outb_p(0x2b, WDT_EFER); | ||
| 85 | outb_p(c, WDT_EFDR); /* set GPIO3 to WDT0 */ | ||
| 86 | } else if (c == 0x88 || c == 0xa0) { /* W83627EHF / W83627DHG */ | ||
| 87 | outb_p(0x2d, WDT_EFER); /* select GPIO5 */ | ||
| 88 | c = inb_p(WDT_EFDR) & ~0x01; /* PIN77 -> WDT0# */ | ||
| 89 | outb_p(0x2d, WDT_EFER); | ||
| 90 | outb_p(c, WDT_EFDR); /* set GPIO5 to WDT0 */ | ||
| 91 | } | ||
| 92 | |||
| 93 | outb_p(0x07, WDT_EFER); /* point to logical device number reg */ | 77 | outb_p(0x07, WDT_EFER); /* point to logical device number reg */ |
| 94 | outb_p(0x08, WDT_EFDR); /* select logical device 8 (GPIO2) */ | 78 | outb_p(0x08, WDT_EFDR); /* select logical device 8 (GPIO2) */ |
| 95 | outb_p(0x30, WDT_EFER); /* select CR30 */ | ||
| 96 | outb_p(0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */ | ||
| 97 | } | 79 | } |
| 98 | 80 | ||
| 99 | static void w83627hf_unselect_wd_register(void) | 81 | static void w83627hf_unselect_wd_register(void) |
| @@ -110,6 +92,23 @@ static void w83627hf_init(struct watchdog_device *wdog) | |||
| 110 | 92 | ||
| 111 | w83627hf_select_wd_register(); | 93 | w83627hf_select_wd_register(); |
| 112 | 94 | ||
| 95 | outb(0x20, WDT_EFER); /* check chip version */ | ||
| 96 | t = inb(WDT_EFDR); | ||
| 97 | if (t == 0x82) { /* W83627THF */ | ||
| 98 | outb_p(0x2b, WDT_EFER); /* select GPIO3 */ | ||
| 99 | t = ((inb_p(WDT_EFDR) & 0xf7) | 0x04); /* select WDT0 */ | ||
| 100 | outb_p(0x2b, WDT_EFER); | ||
| 101 | outb_p(t, WDT_EFDR); /* set GPIO3 to WDT0 */ | ||
| 102 | } else if (t == 0x88 || t == 0xa0) { /* W83627EHF / W83627DHG */ | ||
| 103 | outb_p(0x2d, WDT_EFER); /* select GPIO5 */ | ||
| 104 | t = inb_p(WDT_EFDR) & ~0x01; /* PIN77 -> WDT0# */ | ||
| 105 | outb_p(0x2d, WDT_EFER); | ||
| 106 | outb_p(t, WDT_EFDR); /* set GPIO5 to WDT0 */ | ||
| 107 | } | ||
| 108 | |||
| 109 | outb_p(0x30, WDT_EFER); /* select CR30 */ | ||
| 110 | outb_p(0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */ | ||
| 111 | |||
| 113 | outb_p(0xF6, WDT_EFER); /* Select CRF6 */ | 112 | outb_p(0xF6, WDT_EFER); /* Select CRF6 */ |
| 114 | t = inb_p(WDT_EFDR); /* read CRF6 */ | 113 | t = inb_p(WDT_EFDR); /* read CRF6 */ |
| 115 | if (t != 0) { | 114 | if (t != 0) { |
