From: Domenico Andreoli <[email-masked]>

Proof of concept: ARM as a consumer of the machine reset hooks.

Cc: Russell King <[email-masked]>
Cc: Arnd Bergmann <[email-masked]>
Cc: Olof Johansson <[email-masked]>
Cc: Will Deacon <[email-masked]>
Cc: [email-masked]
Cc: [email-masked]
Signed-off-by: Domenico Andreoli <[email-masked]>
---
 arch/arm/kernel/process.c |   14 ++++++++------
 kernel/power/Kconfig      |    1 +
 2 files changed, 9 insertions(+), 6 deletions(-)

Index: b/arch/arm/kernel/process.c
===================================================================
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -33,6 +33,7 @@
 #include <linux/cpuidle.h>
 #include <linux/leds.h>
 #include <linux/reboot.h>
+#include <linux/machine_reset.h>
 
 #include <asm/cacheflush.h>
 #include <asm/idmap.h>
@@ -114,17 +115,13 @@ void soft_restart(unsigned long addr)
 	BUG();
 }
 
-static void null_restart(enum reboot_mode reboot_mode, const char *cmd)
-{
-}
-
 /*
  * Function pointers to optional machine specific functions
  */
 void (*pm_power_off)(void);
 EXPORT_SYMBOL(pm_power_off);
 
-void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd) = null_restart;
+void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
 EXPORT_SYMBOL_GPL(arm_pm_restart);
 
 /*
@@ -217,6 +214,8 @@ void machine_power_off(void)
 
 	if (pm_power_off)
 		pm_power_off();
+	else
+		default_power_off();
 }
 
 /*
@@ -235,7 +234,10 @@ void machine_restart(char *cmd)
 	local_irq_disable();
 	smp_send_stop();
 
-	arm_pm_restart(reboot_mode, cmd);
+	if (arm_pm_restart)
+		arm_pm_restart(reboot_mode, cmd);
+	else
+		default_restart(reboot_mode, cmd);
 
 	/* Give a grace period for failure to restart of 1s */
 	mdelay(1000);
Index: b/kernel/power/Kconfig
===================================================================
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -297,3 +297,4 @@ config CPU_PM
 config MACHINE_RESET
 	bool
 	default n
+	depends on ARM