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

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

step_wise: Unify the code for both throttle and dethrottle



Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
parent 3dbfff3d
Loading
Loading
Loading
Loading
+25 −45
Original line number Diff line number Diff line
@@ -99,52 +99,14 @@ static void update_passive_instance(struct thermal_zone_device *tz,
		tz->passive += value;
}

static void update_instance_for_throttle(struct thermal_zone_device *tz,
				int trip, enum thermal_trip_type trip_type,
				enum thermal_trend trend)
{
	struct thermal_instance *instance;

	list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
		if (instance->trip != trip)
			continue;

		instance->target = get_target_state(instance, trend, true);

		/* Activate a passive thermal instance */
		if (instance->target == THERMAL_NO_TARGET)
			update_passive_instance(tz, trip_type, 1);

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

static void update_instance_for_dethrottle(struct thermal_zone_device *tz,
				int trip, enum thermal_trip_type trip_type,
				enum thermal_trend trend)
{
	struct thermal_instance *instance;

	list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
		if (instance->trip != trip ||
			instance->target == THERMAL_NO_TARGET)
			continue;

		instance->target = get_target_state(instance, trend, false);

		/* Deactivate a passive thermal instance */
		if (instance->target == THERMAL_NO_TARGET)
			update_passive_instance(tz, trip_type, -1);

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

static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
{
	long trip_temp;
	enum thermal_trip_type trip_type;
	enum thermal_trend trend;
	struct thermal_instance *instance;
	bool throttle = false;
	int old_target;

	if (trip == THERMAL_TRIPS_NONE) {
		trip_temp = tz->forced_passive;
@@ -156,12 +118,30 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)

	trend = get_tz_trend(tz, trip);

	if (tz->temperature >= trip_temp)
		throttle = true;

	mutex_lock(&tz->lock);

	if (tz->temperature >= trip_temp)
		update_instance_for_throttle(tz, trip, trip_type, trend);
	else
		update_instance_for_dethrottle(tz, trip, trip_type, trend);
	list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
		if (instance->trip != trip)
			continue;

		old_target = instance->target;
		instance->target = get_target_state(instance, trend, throttle);

		/* Activate a passive thermal instance */
		if (old_target == THERMAL_NO_TARGET &&
			instance->target != THERMAL_NO_TARGET)
			update_passive_instance(tz, trip_type, 1);
		/* Deactivate a passive thermal instance */
		else if (old_target != THERMAL_NO_TARGET &&
			instance->target == THERMAL_NO_TARGET)
			update_passive_instance(tz, trip_type, -1);


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

	mutex_unlock(&tz->lock);
}