watchdog: alim7101: register restart handler with kernel restart handler
authorGuenter Roeck <linux@roeck-us.net>
Fri, 26 Sep 2014 00:03:17 +0000 (00:03 +0000)
committerGuenter Roeck <linux@roeck-us.net>
Fri, 26 Sep 2014 07:00:32 +0000 (00:00 -0700)
The kernel core now provides an API to trigger a system restart.  Register
with it to restart the system instead of misusing the reboot notifier.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Heiko Stuebner <heiko@sntech.de>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jonas Jensen <jonas.jensen@gmail.com>
Cc: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tomasz Figa <t.figa@samsung.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Wim Van Sebroeck <wim@iguana.be>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/watchdog/alim7101_wdt.c

index 996b2f7d330e94ec3143e6bebe0c86f74e162943..665e0e7dfe1e2e2e03eb371bc377f58b6f9f5236 100644 (file)
@@ -301,6 +301,28 @@ static struct miscdevice wdt_miscdev = {
        .fops   =       &wdt_fops,
 };
 
+static int wdt_restart_handle(struct notifier_block *this, unsigned long mode,
+                             void *cmd)
+{
+       /*
+        * 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);
+
+       /* loop until the watchdog fires */
+       while (true)
+               ;
+
+       return NOTIFY_DONE;
+}
+
+static struct notifier_block wdt_restart_handler = {
+       .notifier_call = wdt_restart_handle,
+       .priority = 128,
+};
+
 /*
  *     Notifier for system down
  */
@@ -311,15 +333,6 @@ static int wdt_notify_sys(struct notifier_block *this,
        if (code == SYS_DOWN || code == SYS_HALT)
                wdt_turnoff();
 
-       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
-                */
-               wdt_change(WDT_ENABLE);
-               pr_info("Watchdog timer is now enabled with no heartbeat - should reboot in ~1 second\n");
-       }
        return NOTIFY_DONE;
 }
 
@@ -338,6 +351,7 @@ static void __exit alim7101_wdt_unload(void)
        /* Deregister */
        misc_deregister(&wdt_miscdev);
        unregister_reboot_notifier(&wdt_notifier);
+       unregister_restart_handler(&wdt_restart_handler);
        pci_dev_put(alim7101_pmu);
 }
 
@@ -390,11 +404,17 @@ static int __init alim7101_wdt_init(void)
                goto err_out;
        }
 
+       rc = register_restart_handler(&wdt_restart_handler);
+       if (rc) {
+               pr_err("cannot register restart handler (err=%d)\n", rc);
+               goto err_out_reboot;
+       }
+
        rc = misc_register(&wdt_miscdev);
        if (rc) {
                pr_err("cannot register miscdev on minor=%d (err=%d)\n",
                       wdt_miscdev.minor, rc);
-               goto err_out_reboot;
+               goto err_out_restart;
        }
 
        if (nowayout)
@@ -404,6 +424,8 @@ static int __init alim7101_wdt_init(void)
                timeout, nowayout);
        return 0;
 
+err_out_restart:
+       unregister_restart_handler(&wdt_restart_handler);
 err_out_reboot:
        unregister_reboot_notifier(&wdt_notifier);
 err_out: