PM / Sleep: Add more wakeup source initialization routines
[linux-2.6.git] / drivers / watchdog / alim7101_wdt.c
index 67aed9f..46f4b85 100644 (file)
@@ -31,9 +31,9 @@
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/pci.h>
+#include <linux/io.h>
+#include <linux/uaccess.h>
 
-#include <asm/io.h>
-#include <asm/uaccess.h>
 #include <asm/system.h>
 
 #define OUR_NAME "alim7101_wdt"
  */
 
 #define WATCHDOG_TIMEOUT 30            /* 30 sec default timeout */
-static int timeout = WATCHDOG_TIMEOUT; /* in seconds, will be multiplied by HZ to get seconds to wait for a ping */
+/* in seconds, will be multiplied by HZ to get seconds to wait for a ping */
+static int timeout = WATCHDOG_TIMEOUT;
 module_param(timeout, int, 0);
-MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
+MODULE_PARM_DESC(timeout,
+               "Watchdog timeout in seconds. (1<=timeout<=3600, default="
+                               __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
 
-static int use_gpio = 0; /* Use the pic (for a1d revision alim7101) */
+static int use_gpio; /* Use the pic (for a1d revision alim7101) */
 module_param(use_gpio, int, 0);
-MODULE_PARM_DESC(use_gpio, "Use the gpio watchdog.  (required by old cobalt boards)");
+MODULE_PARM_DESC(use_gpio,
+               "Use the gpio watchdog (required by old cobalt boards).");
 
 static void wdt_timer_ping(unsigned long);
 static DEFINE_TIMER(timer, wdt_timer_ping, 0, 1);
@@ -77,8 +81,9 @@ static struct pci_dev *alim7101_pmu;
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
-                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+MODULE_PARM_DESC(nowayout,
+               "Watchdog cannot be stopped once started (default="
+                               __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     Whack the dog
@@ -89,23 +94,26 @@ static void wdt_timer_ping(unsigned long data)
        /* If we got a heartbeat pulse within the WDT_US_INTERVAL
         * we agree to ping the WDT
         */
-       char    tmp;
+       char tmp;
 
-       if(time_before(jiffies, next_heartbeat))
-       {
+       if (time_before(jiffies, next_heartbeat)) {
                /* Ping the WDT (this is actually a disarm/arm sequence) */
                pci_read_config_byte(alim7101_pmu, 0x92, &tmp);
-               pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp & ~ALI_WDT_ARM));
-               pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp | ALI_WDT_ARM));
+               pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_WDT, (tmp & ~ALI_WDT_ARM));
+               pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_WDT, (tmp | ALI_WDT_ARM));
                if (use_gpio) {
-                       pci_read_config_byte(alim7101_pmu, ALI_7101_GPIO_O, &tmp);
-                       pci_write_config_byte(alim7101_pmu, ALI_7101_GPIO_O, tmp
-                                       | 0x20);
-                       pci_write_config_byte(alim7101_pmu, ALI_7101_GPIO_O, tmp
-                                       & ~0x20);
+                       pci_read_config_byte(alim7101_pmu,
+                                       ALI_7101_GPIO_O, &tmp);
+                       pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_GPIO_O, tmp | 0x20);
+                       pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_GPIO_O, tmp & ~0x20);
                }
        } else {
-               printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n");
+               printk(KERN_WARNING PFX
+                       "Heartbeat lost! Will not ping the watchdog\n");
        }
        /* Re-set the timer interval */
        mod_timer(&timer, jiffies + WDT_INTERVAL);
@@ -117,21 +125,27 @@ static void wdt_timer_ping(unsigned long data)
 
 static void wdt_change(int writeval)
 {
-       char    tmp;
+       char tmp;
 
        pci_read_config_byte(alim7101_pmu, ALI_7101_WDT, &tmp);
        if (writeval == WDT_ENABLE) {
-               pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp | ALI_WDT_ARM));
+               pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_WDT, (tmp | ALI_WDT_ARM));
                if (use_gpio) {
-                       pci_read_config_byte(alim7101_pmu, ALI_7101_GPIO_O, &tmp);
-                       pci_write_config_byte(alim7101_pmu, ALI_7101_GPIO_O, tmp & ~0x20);
+                       pci_read_config_byte(alim7101_pmu,
+                                       ALI_7101_GPIO_O, &tmp);
+                       pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_GPIO_O, tmp & ~0x20);
                }
 
        } else {
-               pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp & ~ALI_WDT_ARM));
+               pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_WDT, (tmp & ~ALI_WDT_ARM));
                if (use_gpio) {
-                       pci_read_config_byte(alim7101_pmu, ALI_7101_GPIO_O, &tmp);
-                       pci_write_config_byte(alim7101_pmu, ALI_7101_GPIO_O, tmp | 0x20);
+                       pci_read_config_byte(alim7101_pmu,
+                                       ALI_7101_GPIO_O, &tmp);
+                       pci_write_config_byte(alim7101_pmu,
+                                       ALI_7101_GPIO_O, tmp | 0x20);
                }
        }
 }
@@ -169,10 +183,11 @@ static void wdt_keepalive(void)
  * /dev/watchdog handling
  */
 
-static ssize_t fop_write(struct file * file, const char __user * buf, size_t count, loff_t * ppos)
+static ssize_t fop_write(struct file *file, const char __user *buf,
+                                               size_t count, loff_t *ppos)
 {
        /* See if we got the magic character 'V' and reload the timer */
-       if(count) {
+       if (count) {
                if (!nowayout) {
                        size_t ofs;
 
@@ -183,7 +198,7 @@ static ssize_t fop_write(struct file * file, const char __user * buf, size_t cou
                        /* now scan */
                        for (ofs = 0; ofs != count; ofs++) {
                                char c;
-                               if (get_user(c, buf+ofs))
+                               if (get_user(c, buf + ofs))
                                        return -EFAULT;
                                if (c == 'V')
                                        wdt_expect_close = 42;
@@ -195,122 +210,120 @@ static ssize_t fop_write(struct file * file, const char __user * buf, size_t cou
        return count;
 }
 
-static int fop_open(struct inode * inode, struct file * file)
+static int fop_open(struct inode *inode, struct file *file)
 {
        /* Just in case we're already talking to someone... */
-       if(test_and_set_bit(0, &wdt_is_open))
+       if (test_and_set_bit(0, &wdt_is_open))
                return -EBUSY;
        /* Good, fire up the show */
        wdt_startup();
        return nonseekable_open(inode, file);
 }
 
-static int fop_close(struct inode * inode, struct file * file)
+static int fop_close(struct inode *inode, struct file *file)
 {
-       if(wdt_expect_close == 42)
+       if (wdt_expect_close == 42)
                wdt_turnoff();
        else {
                /* wim: shouldn't there be a: del_timer(&timer); */
-               printk(KERN_CRIT PFX "device file closed unexpectedly. Will not stop the WDT!\n");
+               printk(KERN_CRIT PFX
+                 "device file closed unexpectedly. Will not stop the WDT!\n");
        }
        clear_bit(0, &wdt_is_open);
        wdt_expect_close = 0;
        return 0;
 }
 
-static int fop_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static long fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        void __user *argp = (void __user *)arg;
        int __user *p = argp;
-       static struct watchdog_info ident =
-       {
-               .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
+       static const struct watchdog_info ident = {
+               .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT
+                                                       | WDIOF_MAGICCLOSE,
                .firmware_version = 1,
                .identity = "ALiM7101",
        };
 
-       switch(cmd)
+       switch (cmd) {
+       case WDIOC_GETSUPPORT:
+               return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;
+       case WDIOC_GETSTATUS:
+       case WDIOC_GETBOOTSTATUS:
+               return put_user(0, p);
+       case WDIOC_SETOPTIONS:
        {
-               case WDIOC_GETSUPPORT:
-                       return copy_to_user(argp, &ident, sizeof(ident))?-EFAULT:0;
-               case WDIOC_GETSTATUS:
-               case WDIOC_GETBOOTSTATUS:
-                       return put_user(0, p);
-               case WDIOC_KEEPALIVE:
-                       wdt_keepalive();
-                       return 0;
-               case WDIOC_SETOPTIONS:
-               {
-                       int new_options, retval = -EINVAL;
-
-                       if(get_user(new_options, p))
-                               return -EFAULT;
-
-                       if(new_options & WDIOS_DISABLECARD) {
-                               wdt_turnoff();
-                               retval = 0;
-                       }
-
-                       if(new_options & WDIOS_ENABLECARD) {
-                               wdt_startup();
-                               retval = 0;
-                       }
+               int new_options, retval = -EINVAL;
 
-                       return retval;
+               if (get_user(new_options, p))
+                       return -EFAULT;
+               if (new_options & WDIOS_DISABLECARD) {
+                       wdt_turnoff();
+                       retval = 0;
                }
-               case WDIOC_SETTIMEOUT:
-               {
-                       int new_timeout;
-
-                       if(get_user(new_timeout, p))
-                               return -EFAULT;
-
-                       if(new_timeout < 1 || new_timeout > 3600) /* arbitrary upper limit */
-                               return -EINVAL;
-
-                       timeout = new_timeout;
-                       wdt_keepalive();
-                       /* Fall through */
+               if (new_options & WDIOS_ENABLECARD) {
+                       wdt_startup();
+                       retval = 0;
                }
-               case WDIOC_GETTIMEOUT:
-                       return put_user(timeout, p);
-               default:
-                       return -ENOTTY;
+               return retval;
+       }
+       case WDIOC_KEEPALIVE:
+               wdt_keepalive();
+               return 0;
+       case WDIOC_SETTIMEOUT:
+       {
+               int new_timeout;
+
+               if (get_user(new_timeout, p))
+                       return -EFAULT;
+               /* arbitrary upper limit */
+               if (new_timeout < 1 || new_timeout > 3600)
+                       return -EINVAL;
+               timeout = new_timeout;
+               wdt_keepalive();
+               /* Fall through */
+       }
+       case WDIOC_GETTIMEOUT:
+               return put_user(timeout, p);
+       default:
+               return -ENOTTY;
        }
 }
 
 static const struct file_operations wdt_fops = {
-       .owner=         THIS_MODULE,
-       .llseek=        no_llseek,
-       .write=         fop_write,
-       .open=          fop_open,
-       .release=       fop_close,
-       .ioctl=         fop_ioctl,
+       .owner          =       THIS_MODULE,
+       .llseek         =       no_llseek,
+       .write          =       fop_write,
+       .open           =       fop_open,
+       .release        =       fop_close,
+       .unlocked_ioctl =       fop_ioctl,
 };
 
 static struct miscdevice wdt_miscdev = {
-       .minor=WATCHDOG_MINOR,
-       .name="watchdog",
-       .fops=&wdt_fops,
+       .minor  =       WATCHDOG_MINOR,
+       .name   =       "watchdog",
+       .fops   =       &wdt_fops,
 };
 
 /*
  *     Notifier for system down
  */
 
-static int wdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused)
+static int wdt_notify_sys(struct notifier_block *this,
+                                       unsigned long code, void *unused)
 {
-       if (code==SYS_DOWN || code==SYS_HALT)
+       if (code == SYS_DOWN || code == SYS_HALT)
                wdt_turnoff();
 
-       if (code==SYS_RESTART) {
+       if (code == SYS_RESTART) {
                /*
-                * Cobalt devices have no way of rebooting themselves other than
-                * getting the watchdog to pull reset, so we restart the watchdog on
-                * reboot with no heartbeat
+                * Cobalt devices have no way of rebooting themselves other
+                * than getting the watchdog to pull reset, so we restart the
+                * watchdog on reboot with no heartbeat
                 */
                wdt_change(WDT_ENABLE);
-               printk(KERN_INFO PFX "Watchdog timer is now enabled with no heartbeat - should reboot in ~1 second.\n");
+               printk(KERN_INFO PFX "Watchdog timer is now enabled "
+                       "with no heartbeat - should reboot in ~1 second.\n");
        }
        return NOTIFY_DONE;
 }
@@ -320,8 +333,7 @@ static int wdt_notify_sys(struct notifier_block *this, unsigned long code, void
  *     turn the timebomb registers off.
  */
 
-static struct notifier_block wdt_notifier=
-{
+static struct notifier_block wdt_notifier = {
        .notifier_call = wdt_notify_sys,
 };
 
@@ -344,7 +356,8 @@ static int __init alim7101_wdt_init(void)
        alim7101_pmu = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
                NULL);
        if (!alim7101_pmu) {
-               printk(KERN_INFO PFX "ALi M7101 PMU not present - WDT not set\n");
+               printk(KERN_INFO PFX
+                       "ALi M7101 PMU not present - WDT not set\n");
                return -EBUSY;
        }
 
@@ -354,53 +367,61 @@ static int __init alim7101_wdt_init(void)
        ali1543_south = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
                NULL);
        if (!ali1543_south) {
-               printk(KERN_INFO PFX "ALi 1543 South-Bridge not present - WDT not set\n");
+               printk(KERN_INFO PFX
+                       "ALi 1543 South-Bridge not present - WDT not set\n");
                goto err_out;
        }
        pci_read_config_byte(ali1543_south, 0x5e, &tmp);
        pci_dev_put(ali1543_south);
        if ((tmp & 0x1e) == 0x00) {
                if (!use_gpio) {
-                       printk(KERN_INFO PFX "Detected old alim7101 revision 'a1d'.  If this is a cobalt board, set the 'use_gpio' module parameter.\n");
+                       printk(KERN_INFO PFX
+                               "Detected old alim7101 revision 'a1d'.  "
+                               "If this is a cobalt board, set the 'use_gpio' "
+                               "module parameter.\n");
                        goto err_out;
-               } 
+               }
                nowayout = 1;
        } else if ((tmp & 0x1e) != 0x12 && (tmp & 0x1e) != 0x00) {
-               printk(KERN_INFO PFX "ALi 1543 South-Bridge does not have the correct revision number (???1001?) - WDT not set\n");
+               printk(KERN_INFO PFX
+                       "ALi 1543 South-Bridge does not have the correct "
+                       "revision number (???1001?) - WDT not set\n");
                goto err_out;
        }
 
-       if(timeout < 1 || timeout > 3600) /* arbitrary upper limit */
-       {
+       if (timeout < 1 || timeout > 3600) {
+               /* arbitrary upper limit */
                timeout = WATCHDOG_TIMEOUT;
-               printk(KERN_INFO PFX "timeout value must be 1<=x<=3600, using %d\n",
-                       timeout);
+               printk(KERN_INFO PFX
+                       "timeout value must be 1 <= x <= 3600, using %d\n",
+                                                               timeout);
        }
 
-       rc = misc_register(&wdt_miscdev);
+       rc = register_reboot_notifier(&wdt_notifier);
        if (rc) {
-               printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
-                       wdt_miscdev.minor, rc);
+               printk(KERN_ERR PFX
+                       "cannot register reboot notifier (err=%d)\n", rc);
                goto err_out;
        }
 
-       rc = register_reboot_notifier(&wdt_notifier);
+       rc = misc_register(&wdt_miscdev);
        if (rc) {
-               printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
-                       rc);
-               goto err_out_miscdev;
+               printk(KERN_ERR PFX
+                       "cannot register miscdev on minor=%d (err=%d)\n",
+                       wdt_miscdev.minor, rc);
+               goto err_out_reboot;
        }
 
-       if (nowayout) {
+       if (nowayout)
                __module_get(THIS_MODULE);
-       }
 
-       printk(KERN_INFO PFX "WDT driver for ALi M7101 initialised. timeout=%d sec (nowayout=%d)\n",
+       printk(KERN_INFO PFX "WDT driver for ALi M7101 initialised. "
+                                       "timeout=%d sec (nowayout=%d)\n",
                timeout, nowayout);
        return 0;
 
-err_out_miscdev:
-       misc_deregister(&wdt_miscdev);
+err_out_reboot:
+       unregister_reboot_notifier(&wdt_notifier);
 err_out:
        pci_dev_put(alim7101_pmu);
        return rc;
@@ -409,7 +430,7 @@ err_out:
 module_init(alim7101_wdt_init);
 module_exit(alim7101_wdt_unload);
 
-static struct pci_device_id alim7101_pci_tbl[] __devinitdata = {
+static DEFINE_PCI_DEVICE_TABLE(alim7101_pci_tbl) __used = {
        { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533) },
        { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101) },
        { }