summaryrefslogtreecommitdiff
path: root/arch/arm/mach-omap2/omap3-restart.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/omap3-restart.c')
-rw-r--r--arch/arm/mach-omap2/omap3-restart.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/omap3-restart.c b/arch/arm/mach-omap2/omap3-restart.c
index 923c582189e..92a177654e2 100644
--- a/arch/arm/mach-omap2/omap3-restart.c
+++ b/arch/arm/mach-omap2/omap3-restart.c
@@ -28,9 +28,40 @@
* Resets the SoC. For @cmd, see the 'reboot' syscall in
* kernel/sys.c. No return value.
*/
+
+
+static int in_panic;
+
+static int panic_prep_restart(struct notifier_block *this,
+ unsigned long event, void *ptr)
+{
+ in_panic = 1;
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block panic_block = {
+ .notifier_call = panic_prep_restart,
+};
+
void omap3xxx_restart(char mode, const char *cmd)
{
+ if (cmd != NULL) {
+ if ((strncmp(cmd, "bootloader", 10)) &&
+ (strncmp(cmd, "recovery", 8)))
+ cmd = NULL;
+ }
+
+ if (in_panic)
+ cmd = "panic";
+
omap3_ctrl_write_boot_mode((cmd ? (u8)*cmd : 0));
omap3xxx_prm_dpll3_reset(); /* never returns */
while (1);
}
+
+static int __init omap3xxx_restart_init(void)
+{
+ atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
+ return 0;
+}
+early_initcall(omap3xxx_restart_init);