watchdog: sch311x_wdt: Fix Polarity when starting watchdog
authorWim Van Sebroeck <wim@iguana.be>
Sun, 8 Jul 2012 12:57:09 +0000 (14:57 +0200)
committerWim Van Sebroeck <wim@iguana.be>
Mon, 23 Jul 2012 10:50:30 +0000 (12:50 +0200)
Some motherboards like the Advantech ARK3400 documentation
use a non-inverted GPIO pin. We fix this by assuming that
the BIOS will set the Polarity bit for the GPIO correctly
at startup and we keep the Bit-setting intact when we start
and stop the watchdog.

Reported-by: Jean-François Deverge <jf.deverge@gmail.com>
Signed-off-by: Dave Mueller <d.mueller@elsoft.ch>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
drivers/watchdog/sch311x_wdt.c

index f847700..9681ada 100644 (file)
@@ -136,6 +136,8 @@ static void sch311x_wdt_set_timeout(int t)
 
 static void sch311x_wdt_start(void)
 {
+       unsigned char t;
+
        spin_lock(&sch311x_wdt_data.io_lock);
 
        /* set watchdog's timeout */
@@ -149,7 +151,8 @@ static void sch311x_wdt_start(void)
         * Bit 4-6  (Reserved)
         * Bit 7,   Output Type: 0 = Push Pull Bit, 1 = Open Drain
         */
-       outb(0x0e, sch311x_wdt_data.runtime_reg + GP60);
+       t = inb(sch311x_wdt_data.runtime_reg + GP60);
+       outb((t & ~0x0d) | 0x0c, sch311x_wdt_data.runtime_reg + GP60);
 
        spin_unlock(&sch311x_wdt_data.io_lock);
 
@@ -157,10 +160,13 @@ static void sch311x_wdt_start(void)
 
 static void sch311x_wdt_stop(void)
 {
+       unsigned char t;
+
        spin_lock(&sch311x_wdt_data.io_lock);
 
        /* stop the watchdog */
-       outb(0x01, sch311x_wdt_data.runtime_reg + GP60);
+       t = inb(sch311x_wdt_data.runtime_reg + GP60);
+       outb((t & ~0x0d) | 0x01, sch311x_wdt_data.runtime_reg + GP60);
        /* disable timeout by setting it to 0 */
        sch311x_wdt_set_timeout(0);