clk: imx8mn: A53 core clock no need to be critical
[linux-2.6-microblaze.git] / drivers / watchdog / watchdog_core.c
index 21e8085..861daf4 100644 (file)
@@ -147,6 +147,25 @@ int watchdog_init_timeout(struct watchdog_device *wdd,
 }
 EXPORT_SYMBOL_GPL(watchdog_init_timeout);
 
+static int watchdog_reboot_notifier(struct notifier_block *nb,
+                                   unsigned long code, void *data)
+{
+       struct watchdog_device *wdd;
+
+       wdd = container_of(nb, struct watchdog_device, reboot_nb);
+       if (code == SYS_DOWN || code == SYS_HALT) {
+               if (watchdog_active(wdd)) {
+                       int ret;
+
+                       ret = wdd->ops->stop(wdd);
+                       if (ret)
+                               return NOTIFY_BAD;
+               }
+       }
+
+       return NOTIFY_DONE;
+}
+
 static int watchdog_restart_notifier(struct notifier_block *nb,
                                     unsigned long action, void *data)
 {
@@ -235,6 +254,19 @@ static int __watchdog_register_device(struct watchdog_device *wdd)
                }
        }
 
+       if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) {
+               wdd->reboot_nb.notifier_call = watchdog_reboot_notifier;
+
+               ret = register_reboot_notifier(&wdd->reboot_nb);
+               if (ret) {
+                       pr_err("watchdog%d: Cannot register reboot notifier (%d)\n",
+                              wdd->id, ret);
+                       watchdog_dev_unregister(wdd);
+                       ida_simple_remove(&watchdog_ida, id);
+                       return ret;
+               }
+       }
+
        if (wdd->ops->restart) {
                wdd->restart_nb.notifier_call = watchdog_restart_notifier;
 
@@ -289,6 +321,9 @@ static void __watchdog_unregister_device(struct watchdog_device *wdd)
        if (wdd->ops->restart)
                unregister_restart_handler(&wdd->restart_nb);
 
+       if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status))
+               unregister_reboot_notifier(&wdd->reboot_nb);
+
        watchdog_dev_unregister(wdd);
        ida_simple_remove(&watchdog_ida, wdd->id);
 }