[WATCHDOG] i6300esb.c: convert to platform device driver
authorWim Van Sebroeck <wim@iguana.be>
Thu, 19 Mar 2009 19:02:44 +0000 (19:02 +0000)
committerWim Van Sebroeck <wim@iguana.be>
Wed, 25 Mar 2009 09:10:45 +0000 (09:10 +0000)
Convert the Intel 6300ESB watchdog timer to a platform device driver.

Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
drivers/watchdog/i6300esb.c

index 97ac6bf42224084542d00c1edf3f35179d0b0e08..fbe85285324815722847228ec676c1019867d107 100644 (file)
@@ -13,7 +13,7 @@
  *
  *     The timer is implemented in the following I/O controller hubs:
  *     (See the intel documentation on http://developer.intel.com.)
- *     6300ESB chip : document number 300641-003
+ *     6300ESB chip : document number 300641-004
  *
  *  2004YYZZ Ross Biro
  *     Initial version 0.01
@@ -34,7 +34,7 @@
 #include <linux/mm.h>
 #include <linux/miscdevice.h>
 #include <linux/watchdog.h>
-#include <linux/reboot.h>
+#include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
@@ -42,7 +42,7 @@
 #include <linux/io.h>
 
 /* Module and version information */
-#define ESB_VERSION "0.03"
+#define ESB_VERSION "0.04"
 #define ESB_MODULE_NAME "i6300ESB timer"
 #define ESB_DRIVER_NAME ESB_MODULE_NAME ", v" ESB_VERSION
 #define PFX ESB_MODULE_NAME ": "
@@ -81,6 +81,8 @@ static unsigned long timer_alive;
 static struct pci_dev *esb_pci;
 static unsigned short triggered; /* The status of the watchdog upon boot */
 static char esb_expect_close;
+static struct platform_device *esb_platform_device;
+
 
 /* module parameters */
 /* 30 sec default heartbeat (1 < heartbeat < 2*1023) */
@@ -319,19 +321,6 @@ static long esb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        }
 }
 
-/*
- *      Notify system
- */
-
-static int esb_notify_sys(struct notifier_block *this,
-                                       unsigned long code, void *unused)
-{
-       if (code == SYS_DOWN || code == SYS_HALT)
-               esb_timer_stop();       /* Turn the WDT off */
-
-       return NOTIFY_DONE;
-}
-
 /*
  *      Kernel Interfaces
  */
@@ -351,10 +340,6 @@ static struct miscdevice esb_miscdev = {
        .fops = &esb_fops,
 };
 
-static struct notifier_block esb_notifier = {
-       .notifier_call = esb_notify_sys,
-};
-
 /*
  * Data for PCI driver interface
  *
@@ -373,7 +358,7 @@ MODULE_DEVICE_TABLE(pci, esb_pci_tbl);
  *      Init & exit routines
  */
 
-static unsigned char __init esb_getdevice(void)
+static unsigned char __devinit esb_getdevice(void)
 {
        u8 val1;
        unsigned short val2;
@@ -444,7 +429,7 @@ err_devput:
        return 0;
 }
 
-static int __init watchdog_init(void)
+static int __devinit esb_probe(struct platform_device *dev)
 {
        int ret;
 
@@ -460,19 +445,13 @@ static int __init watchdog_init(void)
                        "heartbeat value must be 1<heartbeat<2046, using %d\n",
                                                                heartbeat);
        }
-       ret = register_reboot_notifier(&esb_notifier);
-       if (ret != 0) {
-               printk(KERN_ERR PFX
-                       "cannot register reboot notifier (err=%d)\n", ret);
-               goto err_unmap;
-       }
 
        ret = misc_register(&esb_miscdev);
        if (ret != 0) {
                printk(KERN_ERR PFX
                        "cannot register miscdev on minor=%d (err=%d)\n",
                                                        WATCHDOG_MINOR, ret);
-               goto err_notifier;
+               goto err_unmap;
        }
        esb_timer_stop();
        printk(KERN_INFO PFX
@@ -480,8 +459,6 @@ static int __init watchdog_init(void)
                                                BASEADDR, heartbeat, nowayout);
        return 0;
 
-err_notifier:
-       unregister_reboot_notifier(&esb_notifier);
 err_unmap:
        iounmap(BASEADDR);
 /* err_release: */
@@ -493,7 +470,7 @@ err_unmap:
        return ret;
 }
 
-static void __exit watchdog_cleanup(void)
+static int __devexit esb_remove(struct platform_device *dev)
 {
        /* Stop the timer before we leave */
        if (!nowayout)
@@ -501,11 +478,58 @@ static void __exit watchdog_cleanup(void)
 
        /* Deregister */
        misc_deregister(&esb_miscdev);
-       unregister_reboot_notifier(&esb_notifier);
        iounmap(BASEADDR);
        pci_release_region(esb_pci, 0);
        pci_disable_device(esb_pci);
        pci_dev_put(esb_pci);
+       return 0;
+}
+
+static void esb_shutdown(struct platform_device *dev)
+{
+       esb_timer_stop();
+}
+
+static struct platform_driver esb_platform_driver = {
+       .probe          = esb_probe,
+       .remove         = __devexit_p(esb_remove),
+       .shutdown       = esb_shutdown,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = ESB_MODULE_NAME,
+       },
+};
+
+static int __init watchdog_init(void)
+{
+       int err;
+
+       printk(KERN_INFO PFX "Intel 6300ESB WatchDog Timer Driver v%s\n",
+               ESB_VERSION);
+
+       err = platform_driver_register(&esb_platform_driver);
+       if (err)
+               return err;
+
+       esb_platform_device = platform_device_register_simple(ESB_MODULE_NAME,
+                                                               -1, NULL, 0);
+       if (IS_ERR(esb_platform_device)) {
+               err = PTR_ERR(esb_platform_device);
+               goto unreg_platform_driver;
+       }
+
+       return 0;
+
+unreg_platform_driver:
+       platform_driver_unregister(&esb_platform_driver);
+       return err;
+}
+
+static void __exit watchdog_cleanup(void)
+{
+       platform_device_unregister(esb_platform_device);
+       platform_driver_unregister(&esb_platform_driver);
+       printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
 }
 
 module_init(watchdog_init);