===================================================================
@@ -39,6 +39,8 @@ static DEFINE_MUTEX(thermal_governor_loc
static struct thermal_governor *def_governor;
+static bool thermal_pm_suspended;
+
/*
* Governor section: set of functions to handle thermal governors
*
@@ -1323,6 +1325,14 @@ static void thermal_zone_init_complete(s
guard(thermal_zone)(tz);
tz->state &= ~TZ_STATE_FLAG_INIT;
+ /*
+ * If system suspend or resume is in progress at this point, the
+ * new thermal zone needs to be marked as suspended because
+ * thermal_pm_notify() has run already.
+ */
+ if (thermal_pm_suspended)
+ tz->state |= TZ_STATE_FLAG_SUSPENDED;
+
__thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
}
@@ -1494,10 +1504,10 @@ thermal_zone_device_register_with_trips(
list_for_each_entry(cdev, &thermal_cdev_list, node)
thermal_zone_cdev_bind(tz, cdev);
- mutex_unlock(&thermal_list_lock);
-
thermal_zone_init_complete(tz);
+ mutex_unlock(&thermal_list_lock);
+
thermal_notify_tz_create(tz);
thermal_debug_tz_add(tz);
@@ -1718,6 +1728,8 @@ static int thermal_pm_notify(struct noti
case PM_SUSPEND_PREPARE:
mutex_lock(&thermal_list_lock);
+ thermal_pm_suspended = true;
+
list_for_each_entry(tz, &thermal_tz_list, node)
thermal_zone_pm_prepare(tz);
@@ -1728,6 +1740,8 @@ static int thermal_pm_notify(struct noti
case PM_POST_SUSPEND:
mutex_lock(&thermal_list_lock);
+ thermal_pm_suspended = false;
+
list_for_each_entry(tz, &thermal_tz_list, node)
thermal_zone_pm_complete(tz);