ARM: sunxi_defconfig: enable CONFIG_REGULATOR
[cascardo/linux.git] / kernel / reboot.c
index a3a9e24..5925f5a 100644 (file)
@@ -104,6 +104,87 @@ int unregister_reboot_notifier(struct notifier_block *nb)
 }
 EXPORT_SYMBOL(unregister_reboot_notifier);
 
+/*
+ *     Notifier list for kernel code which wants to be called
+ *     to restart the system.
+ */
+static ATOMIC_NOTIFIER_HEAD(restart_handler_list);
+
+/**
+ *     register_restart_handler - Register function to be called to reset
+ *                                the system
+ *     @nb: Info about handler function to be called
+ *     @nb->priority:  Handler priority. Handlers should follow the
+ *                     following guidelines for setting priorities.
+ *                     0:      Restart handler of last resort,
+ *                             with limited restart capabilities
+ *                     128:    Default restart handler; use if no other
+ *                             restart handler is expected to be available,
+ *                             and/or if restart functionality is
+ *                             sufficient to restart the entire system
+ *                     255:    Highest priority restart handler, will
+ *                             preempt all other restart handlers
+ *
+ *     Registers a function with code to be called to restart the
+ *     system.
+ *
+ *     Registered functions will be called from machine_restart as last
+ *     step of the restart sequence (if the architecture specific
+ *     machine_restart function calls do_kernel_restart - see below
+ *     for details).
+ *     Registered functions are expected to restart the system immediately.
+ *     If more than one function is registered, the restart handler priority
+ *     selects which function will be called first.
+ *
+ *     Restart handlers are expected to be registered from non-architecture
+ *     code, typically from drivers. A typical use case would be a system
+ *     where restart functionality is provided through a watchdog. Multiple
+ *     restart handlers may exist; for example, one restart handler might
+ *     restart the entire system, while another only restarts the CPU.
+ *     In such cases, the restart handler which only restarts part of the
+ *     hardware is expected to register with low priority to ensure that
+ *     it only runs if no other means to restart the system is available.
+ *
+ *     Currently always returns zero, as atomic_notifier_chain_register()
+ *     always returns zero.
+ */
+int register_restart_handler(struct notifier_block *nb)
+{
+       return atomic_notifier_chain_register(&restart_handler_list, nb);
+}
+EXPORT_SYMBOL(register_restart_handler);
+
+/**
+ *     unregister_restart_handler - Unregister previously registered
+ *                                  restart handler
+ *     @nb: Hook to be unregistered
+ *
+ *     Unregisters a previously registered restart handler function.
+ *
+ *     Returns zero on success, or %-ENOENT on failure.
+ */
+int unregister_restart_handler(struct notifier_block *nb)
+{
+       return atomic_notifier_chain_unregister(&restart_handler_list, nb);
+}
+EXPORT_SYMBOL(unregister_restart_handler);
+
+/**
+ *     do_kernel_restart - Execute kernel restart handler call chain
+ *
+ *     Calls functions registered with register_restart_handler.
+ *
+ *     Expected to be called from machine_restart as last step of the restart
+ *     sequence.
+ *
+ *     Restarts the system immediately if a restart handler function has been
+ *     registered. Otherwise does nothing.
+ */
+void do_kernel_restart(char *cmd)
+{
+       atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd);
+}
+
 void migrate_to_reboot_cpu(void)
 {
        /* The boot cpu is always logical cpu 0 */