[PATCH] mark struct file_operations const 3
[deliverable/linux.git] / drivers / char / watchdog / w83697hf_wdt.c
index 1ea43bf2c35dd000eb380a6e474ff71a0210e36f..c960ec110dd7c07c0464c840234f1f4957eb81da 100644 (file)
@@ -1,6 +1,7 @@
 /*
  *     w83697hf/hg WDT driver
  *
+ *     (c) Copyright 2006 Samuel Tardieu <sam@rfc1149.net>
  *     (c) Copyright 2006 Marcus Junker <junker@anduras.de>
  *
  *     Based on w83627hf_wdt.c which is based on advantechwdt.c
@@ -123,20 +124,18 @@ w83697hf_deselect_wdt(void)
 static void
 w83697hf_init(void)
 {
-       unsigned char t;
+       unsigned char bbuf;
 
        w83697hf_select_wdt();
 
-       w83697hf_set_reg(0x29, 0x20);   /* Set pin 119 to WDTO# mode (= CR29, WDT0) */
+       bbuf = w83697hf_get_reg(0x29);
+       bbuf &= ~0x60;
+       bbuf |= 0x20;
+       w83697hf_set_reg(0x29, bbuf);   /* Set pin 119 to WDTO# mode (= CR29, WDT0) */
 
-       t = w83697hf_get_reg(0xF3);     /* Read CRF3 */
-       if (t != 0) {
-               printk (KERN_INFO PFX "Watchdog already running. Resetting timeout to %d sec\n", timeout);
-               w83697hf_set_reg(0xF3, timeout);        /* Write new timeout */
-       }
-       t = w83697hf_get_reg(0xF4);     /* Read CRF4 */
-       t&=~0x0C;                       /* set second mode & disable keyboard turning off watchdog */
-       w83697hf_set_reg(0xF4, t);      /* Write back to CRF4 */
+       bbuf = w83697hf_get_reg(0xF3);
+       bbuf &= ~0x04;
+       w83697hf_set_reg(0xF3, bbuf);   /* Count mode is seconds */
 
        w83697hf_deselect_wdt();
 }
@@ -324,7 +323,7 @@ wdt_notify_sys(struct notifier_block *this, unsigned long code,
  *     Kernel Interfaces
  */
 
-static struct file_operations wdt_fops = {
+static const struct file_operations wdt_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .write          = wdt_write,
@@ -370,33 +369,35 @@ w83697hf_check_wdt(void)
        return -EIO;
 }
 
+static int w83697hf_ioports[] = { 0x2e, 0x4e, 0x00 };
+
 static int __init
 wdt_init(void)
 {
-       int ret, autodetect;
+       int ret, i, found = 0;
 
        spin_lock_init(&io_lock);
 
        printk (KERN_INFO PFX "WDT driver for W83697HF/HG initializing\n");
 
-       autodetect = wdt_io == 0;
-       if (autodetect)
-               wdt_io = 0x2e;
-
-       if (!w83697hf_check_wdt())
-               goto found;
-
-       if (autodetect) {
-               wdt_io = 0x4e;
+       if (wdt_io == 0) {
+               /* we will autodetect the W83697HF/HG watchdog */
+               for (i = 0; ((!found) && (w83697hf_ioports[i] != 0)); i++) {
+                       wdt_io = w83697hf_ioports[i];
+                       if (!w83697hf_check_wdt())
+                               found++;
+               }
+       } else {
                if (!w83697hf_check_wdt())
-                       goto found;
+                       found++;
        }
 
-       printk (KERN_ERR PFX "No W83697HF/HG could be found\n");
-       ret = -EIO;
-       goto out;
+       if (!found) {
+               printk (KERN_ERR PFX "No W83697HF/HG could be found\n");
+               ret = -EIO;
+               goto out;
+       }
 
-found:
        w83697hf_init();
        wdt_disable();  /* Disable watchdog until first use */
 
@@ -444,6 +445,6 @@ module_init(wdt_init);
 module_exit(wdt_exit);
 
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Marcus Junker <junker@anduras.de>");
+MODULE_AUTHOR("Marcus Junker <junker@anduras.de>, Samuel Tardieu <sam@rfc1149.net>");
 MODULE_DESCRIPTION("w83697hf/hg WDT driver");
 MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
This page took 0.02988 seconds and 5 git commands to generate.