lkml.org 
[lkml]   [2010]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] watchdog: add f71862fg support
From: Lutz Ballaschke <vegan.grindcore@gmail.com>

Fintek Super-I/O f71862fg watchdog support added to f71808e_wdt driver.
Furthermore the WDIOC_GETTIMELEFT ioctl is added to the driver.

Signed-off-by: Lutz Ballaschke <vegan.grindcore@gmail.com>
---

diff -Nurp linux-2.6.36-rc1-orig/drivers/watchdog/f71808e_wdt.c linux-2.6.36-rc1/drivers/watchdog/f71808e_wdt.c
--- linux-2.6.36-rc1-orig/drivers/watchdog/f71808e_wdt.c 2010-08-16 02:41:37.000000000 +0200
+++ linux-2.6.36-rc1/drivers/watchdog/f71808e_wdt.c 2010-09-04 18:52:14.000000000 +0200
@@ -42,6 +42,11 @@
#define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
#define SIO_REG_DEVREV 0x22 /* Device revision */
#define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */
+#define SIO_REG_ROM_ADDR_SEL 0x27 /* ROM address select */
+#define SIO_REG_MFUNCT1 0x29 /* Multi function select 1 */
+#define SIO_REG_MFUNCT2 0x2a /* Multi function select 2 */
+#define SIO_REG_MFUNCT3 0x2b /* Multi function select 3 */
+#define SIO_REG_MFUNCT4 0x2c /* Multi function select 4 */
#define SIO_REG_ENABLE 0x30 /* Logical device enable */
#define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */

@@ -52,8 +57,6 @@
#define SIO_F71882_ID 0x0541 /* Chipset ID */
#define SIO_F71889_ID 0x0723 /* Chipset ID */

-#define F71882FG_REG_START 0x01
-
#define F71808FG_REG_WDO_CONF 0xf0
#define F71808FG_REG_WDT_CONF 0xf5
#define F71808FG_REG_WD_TIME 0xf6
@@ -252,6 +255,24 @@ exit_unlock:
return err;
}

+static int watchdog_time_left(void)
+{
+ int ret = 0;
+
+ mutex_lock(&watchdog.lock);
+ ret = superio_enter(watchdog.sioaddr);
+ if (ret)
+ goto exit_unlock;
+
+ superio_select(watchdog.sioaddr, SIO_F71808FG_LD_WDT);
+ ret = (int) superio_inb(watchdog.sioaddr, F71808FG_REG_WD_TIME);
+ superio_exit(watchdog.sioaddr);
+
+exit_unlock:
+ mutex_unlock(&watchdog.lock);
+ return ret;
+}
+
static int watchdog_keepalive(void)
{
int err = 0;
@@ -299,13 +320,19 @@ static int watchdog_start(void)
switch (watchdog.type) {
case f71808fg:
/* Set pin 21 to GPIO23/WDTRST#, then to WDTRST# */
- superio_clear_bit(watchdog.sioaddr, 0x2a, 3);
- superio_clear_bit(watchdog.sioaddr, 0x2b, 3);
+ superio_clear_bit(watchdog.sioaddr, SIO_REG_MFUNCT2, 3);
+ superio_clear_bit(watchdog.sioaddr, SIO_REG_MFUNCT3, 3);
break;

case f71882fg:
/* Set pin 56 to WDTRST# */
- superio_set_bit(watchdog.sioaddr, 0x29, 1);
+ superio_set_bit(watchdog.sioaddr, SIO_REG_MFUNCT1, 1);
+ break;
+
+ case f71862fg:
+ /* Set pin 63 to WDTRST# (SPI must be disabled first!) */
+ superio_clear_bit(watchdog.sioaddr, SIO_REG_ROM_ADDR_SEL, 6);
+ superio_set_bit(watchdog.sioaddr, SIO_REG_MFUNCT3, 4);
break;

default:
@@ -549,6 +576,12 @@ static long watchdog_ioctl(struct file *
case WDIOC_GETTIMEOUT:
return put_user(watchdog.timeout, uarg.i);

+ case WDIOC_GETTIMELEFT:
+ status = watchdog_time_left();
+ if (status < 0)
+ return status;
+ return put_user(status, uarg.i);
+
default:
return -ENOTTY;

@@ -709,6 +742,8 @@ static int __init f71808e_find(int sioad
watchdog.type = f71882fg;
break;
case SIO_F71862_ID:
+ watchdog.type = f71862fg;
+ break;
case SIO_F71889_ID:
/* These have a watchdog, though it isn't implemented (yet). */
err = -ENOSYS;


\
 
 \ /
  Last update: 2010-09-06 15:25    [W:0.066 / U:0.024 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site