Patch "Thermal: initialize thermal zone device correctly" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
Thermal: initialize thermal zone device correctly
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
thermal-initialize-thermal-zone-device-correctly.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
bb431ba26c5cd0a17c941ca6c3a195a3a6d5d461Mon Sep 17 00:00:00 2001
From: Zhang Rui <[email protected]>
Date: Fri, 30 Oct 2015 16:31:47 +0800
Subject: Thermal: initialize thermal zone device correctly
From: Zhang Rui <[email protected]>
commit bb431ba26c5cd0a17c941ca6c3a195a3a6d5d461 upstream.
After thermal zone device registered, as we have not read any temperature before, thus tz->temperature should not be 0, which actually means 0C, and thermal trend is not available. In this case, we need specially handling for the first thermal_zone_device_update().
Both thermal core framework and step_wise governor is enhanced to handle this. And since the step_wise governor is the only one that uses trends, so it's the only thermal governor that needs to be updated.
--- drivers/thermal/step_wise.c | 17 +++++++++++++++-- drivers/thermal/thermal_core.c | 19 +++++++++++++++++-- drivers/thermal/thermal_core.h | 1 + include/linux/thermal.h | 3 +++ 4 files changed, 36 insertions(+), 4 deletions(-)
drivers/thermal/step_wise.c +15 -2
@@ -63,6 +63,19 @@ static unsigned long get_target_state(st next_target = instance->target;dev_dbg (&cdev->device,"cur_state=%ld\n" , cur_state); +if (!instance->initialized) { +if (throttle) { + next_target = (cur_state +1 ) >= instance->upper ? + instance->upper : + ((cur_state +1 ) < instance->lower ? + instance->lower : (cur_state +1 )); + }else { + next_target =THERMAL_NO_TARGET ; + } + +return next_target; + } +switch (trend) {case THERMAL_TREND_RAISING :if (throttle) {
@@ -149,7 +162,7 @@ static void thermal_zone_trip_update(strdev_dbg (&instance->cdev->device,"old_target=%d, target=%d\n" , old_target, (int )instance->target); -if (old_target == instance->target) +if (instance->initialized && old_target == instance->target)continue ;/* Activate a passive thermal instance */
@@ -161,7 +174,7 @@ static void thermal_zone_trip_update(str instance->target == THERMAL_NO_TARGET)update_passive_instance (tz, trip_type,-1 ); - + instance->initialized = true; instance->cdev->updated = false;/* cdev needs update */ }
drivers/thermal/thermal_core.c +17 -2
@@ -532,8 +532,22 @@ static void update_temperature(struct thmutex_unlock (&tz->lock);trace_thermal_temperature (tz); -dev_dbg (&tz->device,"last_temperature=%d, current_temperature=%d\n" , - tz->last_temperature, tz->temperature); +if (tz->last_temperature ==THERMAL_TEMP_INVALID ) +dev_dbg (&tz->device,"last_temperature N/A, current_temperature=%d\n" , + tz->temperature); +else +dev_dbg (&tz->device,"last_temperature=%d, current_temperature=%d\n" , + tz->last_temperature, tz->temperature); +} + +static void thermal_zone_device_reset (struct thermal_zone_device *tz) +{ +struct thermal_instance *pos; + + tz->temperature =THERMAL_TEMP_INVALID ; + tz->passive =0 ; +list_for_each_entry (pos, &tz->thermal_instances, tz_node) + pos->initialized = false; }void thermal_zone_device_update (struct thermal_zone_device *tz)
@@ -1900,6 +1914,7 @@ struct thermal_zone_device *thermal_zoneINIT_DELAYED_WORK (&(tz->poll_queue), thermal_zone_device_check); +thermal_zone_device_reset (tz);thermal_zone_device_update (tz);return tz;
drivers/thermal/thermal_core.h +1 -0
@@ -41,6 +41,7 @@ struct thermal_instance {struct thermal_zone_device *tz;struct thermal_cooling_device *cdev;int trip; +bool initialized;unsigned long upper;/* Highest cooling state for this trip point */ unsigned long lower;/* Lowest cooling state for this trip point */ unsigned long target;/* expected cooling state */
include/linux/thermal.h +3 -0
@@ -43,6 +43,9 @@/* Default weight of a bound cooling device */ #define THERMAL_WEIGHT_DEFAULT 0 +/* use value, which < 0K, to indicate an invalid/uninitialized temperature */ +#define THERMAL_TEMP_INVALID -274000 +/* Unit conversion macros */ #define DECI_KELVIN_TO_CELSIUS (t) ({ \ long _t = (t); \
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/thermal-do-thermal-zone-update-after-a-cooling-device-registered.patch queue-4.4/thermal-handle-thermal-zone-device-properly-during-system-sleep.patch queue-4.4/thermal-initialize-thermal-zone-device-correctly.patch