msm: subsystem_restart: Convert subsystem_list_lock to a spinlock.

Use a spinlock instead of a mutex for subsystem_list_lock,
since this lock may be required in both interrupt and
pre-emptive context. A small list is traversed when this
lock is held, and therefore the penalty of holding this
lock is minimal.

Change-Id: I886747dc77d539c4d572e832fd676314f8e66b9f
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 027aa5b..c98a672 100644
--- a/arch/arm/mach-msm/subsystem_restart.c
+++ b/arch/arm/mach-msm/subsystem_restart.c
@@ -65,7 +65,7 @@
 
 static LIST_HEAD(restart_log_list);
 static LIST_HEAD(subsystem_list);
-static DEFINE_MUTEX(subsystem_list_lock);
+static DEFINE_SPINLOCK(subsystem_list_lock);
 static DEFINE_MUTEX(soc_order_reg_lock);
 static DEFINE_MUTEX(restart_log_mutex);
 
@@ -157,15 +157,16 @@
 static struct subsys_data *_find_subsystem(const char *subsys_name)
 {
 	struct subsys_data *subsys;
+	unsigned long flags;
 
-	mutex_lock(&subsystem_list_lock);
+	spin_lock_irqsave(&subsystem_list_lock, flags);
 	list_for_each_entry(subsys, &subsystem_list, list)
 		if (!strncmp(subsys->name, subsys_name,
 				SUBSYS_NAME_MAX_LENGTH)) {
-			mutex_unlock(&subsystem_list_lock);
+			spin_unlock_irqrestore(&subsystem_list_lock, flags);
 			return subsys;
 		}
-	mutex_unlock(&subsystem_list_lock);
+	spin_unlock_irqrestore(&subsystem_list_lock, flags);
 
 	return NULL;
 }
@@ -488,6 +489,8 @@
 
 int ssr_register_subsystem(struct subsys_data *subsys)
 {
+	unsigned long flags;
+
 	if (!subsys)
 		goto err;
 
@@ -504,9 +507,9 @@
 	mutex_init(&subsys->shutdown_lock);
 	mutex_init(&subsys->powerup_lock);
 
-	mutex_lock(&subsystem_list_lock);
+	spin_lock_irqsave(&subsystem_list_lock, flags);
 	list_add(&subsys->list, &subsystem_list);
-	mutex_unlock(&subsystem_list_lock);
+	spin_unlock_irqrestore(&subsystem_list_lock, flags);
 
 	return 0;