summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/thermal/thermal_core.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index f43fc7b54a91..d1f5c165c561 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -40,6 +40,8 @@ static DEFINE_MUTEX(thermal_governor_lock);
static struct thermal_governor *def_governor;
+static bool thermal_pm_suspended;
+
/*
* Governor section: set of functions to handle thermal governors
*
@@ -1339,6 +1341,14 @@ static void thermal_zone_init_complete(struct thermal_zone_device *tz)
mutex_lock(&tz->lock);
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);
mutex_unlock(&tz->lock);
@@ -1520,10 +1530,10 @@ thermal_zone_device_register_with_trips(const char *type,
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);
@@ -1746,6 +1756,8 @@ static int thermal_pm_notify(struct notifier_block *nb,
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);
@@ -1756,6 +1768,8 @@ static int thermal_pm_notify(struct notifier_block *nb,
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);