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);