Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb431ba2 authored by Zhang Rui's avatar Zhang Rui
Browse files

Thermal: initialize thermal zone device correctly



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: <stable@vger.kernel.org> #3.18+
Tested-by: default avatarManuel Krause <manuelkrause@netscape.net>
Tested-by: default avatarszegad <szegadlo@poczta.onet.pl>
Tested-by: default avatarprash <prash.n.rao@gmail.com>
Tested-by: default avataramish <ammdispose-arch@yahoo.com>
Tested-by: default avatarMatthias <morpheusxyz123@yahoo.de>
Reviewed-by: default avatarJavi Merino <javi.merino@arm.com>
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
Signed-off-by: default avatarChen Yu <yu.c.chen@intel.com>
parent 74bf8efb
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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) {
@@ -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 */
@@ -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 */
	}

+17 −2
Original line number Diff line number Diff line
@@ -532,10 +532,24 @@ static void update_temperature(struct thermal_zone_device *tz)
	mutex_unlock(&tz->lock);

	trace_thermal_temperature(tz);
	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)
{
	int count;
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+3 −0
Original line number Diff line number Diff line
@@ -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);						\