Index: linux-pm/drivers/thermal/thermal_debugfs.c
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_debugfs.c
+++ linux-pm/drivers/thermal/thermal_debugfs.c
@@ -551,8 +551,6 @@ void thermal_debug_tz_trip_up(struct the
 	if (!thermal_dbg)
 		return;
 
-	mutex_lock(&thermal_dbg->lock);
-
 	tz_dbg = &thermal_dbg->tz_dbg;
 
 	/*
@@ -591,7 +589,7 @@ void thermal_debug_tz_trip_up(struct the
 	if (!tz_dbg->nr_trips) {
 		tze = thermal_debugfs_tz_event_alloc(tz, now);
 		if (!tze)
-			goto unlock;
+			return;
 
 		list_add(&tze->node, &tz_dbg->tz_episodes);
 	}
@@ -613,9 +611,6 @@ void thermal_debug_tz_trip_up(struct the
 
 	tze = list_first_entry(&tz_dbg->tz_episodes, struct tz_episode, node);
 	tze->trip_stats[trip_id].timestamp = now;
-
-unlock:
-	mutex_unlock(&thermal_dbg->lock);
 }
 
 void thermal_debug_tz_trip_down(struct thermal_zone_device *tz,
@@ -631,8 +626,6 @@ void thermal_debug_tz_trip_down(struct t
 	if (!thermal_dbg)
 		return;
 
-	mutex_lock(&thermal_dbg->lock);
-
 	tz_dbg = &thermal_dbg->tz_dbg;
 
 	/*
@@ -643,7 +636,7 @@ void thermal_debug_tz_trip_down(struct t
 	 * no mitigation mechanism yet at boot time.
 	 */
 	if (!tz_dbg->nr_trips)
-		goto out;
+		return;
 
 	for (i = tz_dbg->nr_trips - 1; i >= 0; i--) {
 		if (tz_dbg->trips_crossed[i] == trip_id)
@@ -651,7 +644,7 @@ void thermal_debug_tz_trip_down(struct t
 	}
 
 	if (i < 0)
-		goto out;
+		return;
 
 	tz_dbg->nr_trips--;
 
@@ -671,9 +664,6 @@ void thermal_debug_tz_trip_down(struct t
 	 */
 	if (!tz_dbg->nr_trips)
 		tze->duration = ktime_sub(now, tze->timestamp);
-
-out:
-	mutex_unlock(&thermal_dbg->lock);
 }
 
 void thermal_debug_update_trip_stats(struct thermal_zone_device *tz)
@@ -686,12 +676,10 @@ void thermal_debug_update_trip_stats(str
 	if (!thermal_dbg)
 		return;
 
-	mutex_lock(&thermal_dbg->lock);
-
 	tz_dbg = &thermal_dbg->tz_dbg;
 
 	if (!tz_dbg->nr_trips)
-		goto out;
+		return;
 
 	tze = list_first_entry(&tz_dbg->tz_episodes, struct tz_episode, node);
 
@@ -704,19 +692,22 @@ void thermal_debug_update_trip_stats(str
 		trip_stats->avg += (tz->temperature - trip_stats->avg) /
 					++trip_stats->count;
 	}
-out:
-	mutex_unlock(&thermal_dbg->lock);
 }
 
 static void *tze_seq_start(struct seq_file *s, loff_t *pos)
 {
 	struct thermal_zone_device *tz = s->private;
-	struct thermal_debugfs *thermal_dbg = tz->debugfs;
-	struct tz_debugfs *tz_dbg = &thermal_dbg->tz_dbg;
+	struct thermal_debugfs *thermal_dbg;
 
-	mutex_lock(&thermal_dbg->lock);
+	mutex_lock(&tz->lock);
 
-	return seq_list_start(&tz_dbg->tz_episodes, *pos);
+	thermal_dbg = tz->debugfs;
+	if (!thermal_dbg) {
+		mutex_unlock(&tz->lock);
+		return NULL;
+	}
+
+	return seq_list_start(&thermal_dbg->tz_dbg.tz_episodes, *pos);
 }
 
 static void *tze_seq_next(struct seq_file *s, void *v, loff_t *pos)
@@ -731,9 +722,8 @@ static void *tze_seq_next(struct seq_fil
 static void tze_seq_stop(struct seq_file *s, void *v)
 {
 	struct thermal_zone_device *tz = s->private;
-	struct thermal_debugfs *thermal_dbg = tz->debugfs;
 
-	mutex_unlock(&thermal_dbg->lock);
+	mutex_unlock(&tz->lock);
 }
 
 static int tze_seq_show(struct seq_file *s, void *v)
@@ -826,23 +816,33 @@ void thermal_debug_tz_add(struct thermal
 
 	debugfs_create_file("mitigations", 0400, thermal_dbg->d_top, tz, &tze_fops);
 
+	mutex_lock(&tz->lock);
+
 	tz->debugfs = thermal_dbg;
+
+	mutex_unlock(&tz->lock);
 }
 
 void thermal_debug_tz_remove(struct thermal_zone_device *tz)
 {
-	struct thermal_debugfs *thermal_dbg = tz->debugfs;
+	struct thermal_debugfs *thermal_dbg;
 	struct tz_episode *tze, *tmp;
 	struct tz_debugfs *tz_dbg;
 	int *trips_crossed;
 
-	if (!thermal_dbg)
+	mutex_lock(&tz->lock);
+
+	thermal_dbg = tz->debugfs;
+	if (!thermal_dbg) {
+		mutex_unlock(&tz->lock);
 		return;
+	}
 
-	tz_dbg = &thermal_dbg->tz_dbg;
+	tz->debugfs = NULL;
 
-	mutex_lock(&thermal_dbg->lock);
+	mutex_unlock(&tz->lock);
 
+	tz_dbg = &thermal_dbg->tz_dbg;
 	trips_crossed = tz_dbg->trips_crossed;
 
 	list_for_each_entry_safe(tze, tmp, &tz_dbg->tz_episodes, node) {
@@ -850,10 +850,6 @@ void thermal_debug_tz_remove(struct ther
 		kfree(tze);
 	}
 
-	tz->debugfs = NULL;
-
-	mutex_unlock(&thermal_dbg->lock);
-
 	thermal_debugfs_remove_id(thermal_dbg);
 	kfree(trips_crossed);
 }
