Skip to content

Commit

Permalink
Thermal: initialize thermal zone device correctly
Browse files Browse the repository at this point in the history
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.

CC: <[email protected]> #3.18+
Tested-by: Manuel Krause <[email protected]>
Tested-by: szegad <[email protected]>
Tested-by: prash <[email protected]>
Tested-by: amish <[email protected]>
Tested-by: Matthias <[email protected]>
Reviewed-by: Javi Merino <[email protected]>
Signed-off-by: Zhang Rui <[email protected]>
Signed-off-by: Chen Yu <[email protected]>
  • Loading branch information
zhang-rui committed Dec 29, 2015
1 parent 74bf8ef commit bb431ba
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 4 deletions.
17 changes: 15 additions & 2 deletions drivers/thermal/step_wise.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,19 @@ static unsigned long get_target_state(struct thermal_instance *instance,
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) {
Expand Down Expand Up @@ -149,7 +162,7 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
dev_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 */
Expand All @@ -161,7 +174,7 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
instance->target == THERMAL_NO_TARGET)
update_passive_instance(tz, trip_type, -1);


instance->initialized = true;
instance->cdev->updated = false; /* cdev needs update */
}

Expand Down
19 changes: 17 additions & 2 deletions drivers/thermal/thermal_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -532,8 +532,22 @@ static void update_temperature(struct thermal_zone_device *tz)
mutex_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)
Expand Down Expand Up @@ -1900,6 +1914,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,

INIT_DELAYED_WORK(&(tz->poll_queue), thermal_zone_device_check);

thermal_zone_device_reset(tz);
thermal_zone_device_update(tz);

return tz;
Expand Down
1 change: 1 addition & 0 deletions drivers/thermal/thermal_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
3 changes: 3 additions & 0 deletions include/linux/thermal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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); \
Expand Down

0 comments on commit bb431ba

Please sign in to comment.