msm: subsystem_restart: Add a panic handler

Call crash_shutdown for each subsystem inside a panic
notifier handler.

Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
diff --git a/arch/arm/mach-msm/subsystem_restart.c b/arch/arm/mach-msm/subsystem_restart.c
index 40e6e0c..fef65ff 100644
--- a/arch/arm/mach-msm/subsystem_restart.c
+++ b/arch/arm/mach-msm/subsystem_restart.c
@@ -497,14 +497,7 @@
 		break;
 
 	case RESET_SOC:
-
-		mutex_lock(&subsystem_list_lock);
-		list_for_each_entry(subsys, &subsystem_list, list)
-			if (subsys->crash_shutdown)
-				subsys->crash_shutdown(subsys);
-		mutex_unlock(&subsystem_list_lock);
-
-		panic("Resetting the SOC");
+		panic("subsys-restart: Resetting the SoC");
 		break;
 
 	default:
@@ -546,10 +539,28 @@
 }
 EXPORT_SYMBOL(ssr_register_subsystem);
 
+static int ssr_panic_handler(struct notifier_block *this,
+				unsigned long event, void *ptr)
+{
+	struct subsys_data *subsys;
+
+	list_for_each_entry(subsys, &subsystem_list, list)
+		if (subsys->crash_shutdown)
+			subsys->crash_shutdown(subsys);
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block panic_nb = {
+	.notifier_call  = ssr_panic_handler,
+};
+
 static int __init ssr_init_soc_restart_orders(void)
 {
 	int i;
 
+	atomic_notifier_chain_register(&panic_notifier_list,
+			&panic_nb);
+
 	if (cpu_is_msm8x60()) {
 		for (i = 0; i < ARRAY_SIZE(orders_8x60_all); i++) {
 			mutex_init(&orders_8x60_all[i]->powerup_lock);