MIPS: Loongson: Cleanup the halt and poweroff action
authorWu Zhangjin <wuzhangjin@gmail.com>
Wed, 27 Jan 2010 14:39:46 +0000 (22:39 +0800)
committerRalf Baechle <ralf@linux-mips.org>
Sat, 27 Feb 2010 11:53:17 +0000 (12:53 +0100)
In the old source code, I have let halt and poweroff do the same action,
but in reality, they have different meanings.

As the manpage of shutdown shows:

-r     Reboot after shutdown.
-H     Halt action is to halt or drop into boot monitor on systems that support it.
-P     Halt action is to turn off the power.

and in the real world, some machines(e.g. NAS) did not provide a power
button and the shutdown works as reset, so, we need to provide a
mechanism to let the users turn off the power safely without breaking
the system, such a mechanism is "halt", which only put the system into a
dead loop or a power-save mode and print some information to the screen
to tell the users to turn off the power safely.

$ shutdown -hH now /* loongson_halt, not turn off the power */
$ shutdown -hP now /* loongson_poweroff, work as poweroff */

Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
Tested-by: Liu Shiwei <liushiwei@gmail.com>
Cc: Liu Shiwei <liushiwei@gmail.com>
Cc: linux-mips <linux-mips@linux-mips.org>
Patchwork: http://patchwork.linux-mips.org/patch/883/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/loongson/common/reset.c

index 33dff18..4bd9c18 100644 (file)
@@ -25,17 +25,26 @@ static void loongson_restart(char *command)
        ((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) ();
 }
 
-static void loongson_halt(void)
+static void loongson_poweroff(void)
 {
        mach_prepare_shutdown();
        unreachable();
 }
 
+static void loongson_halt(void)
+{
+       pr_notice("\n\n** You can safely turn off the power now **\n\n");
+       while (1) {
+               if (cpu_wait)
+                       cpu_wait();
+       }
+}
+
 static int __init mips_reboot_setup(void)
 {
        _machine_restart = loongson_restart;
        _machine_halt = loongson_halt;
-       pm_power_off = loongson_halt;
+       pm_power_off = loongson_poweroff;
 
        return 0;
 }