Commit 9caaad2c authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

ACPI: thermal: Rework thermal_get_trend()



Rework the ACPI thermal driver's .get_trend() callback function,
thermal_get_trend(), so that it does not call thermal_get_trip_type()
and thermal_get_trip_temp() which are going to be dropped.

This reduces the overhead of the function too, because it will always
carry out a trip point lookup once after the change.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent ec23c1c4
Loading
Loading
Loading
Loading
+37 −29
Original line number Diff line number Diff line
@@ -598,41 +598,33 @@ static int thermal_get_crit_temp(struct thermal_zone_device *thermal,
}

static int thermal_get_trend(struct thermal_zone_device *thermal,
			     int trip, enum thermal_trend *trend)
			     int trip_index, enum thermal_trend *trend)
{
	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);
	enum thermal_trip_type type;
	int i;
	struct acpi_thermal_trip *acpi_trip;
	int t, i;

	if (thermal_get_trip_type(thermal, trip, &type))
	if (!tz || trip_index < 0)
		return -EINVAL;

	if (type == THERMAL_TRIP_ACTIVE) {
		int trip_temp;
		int temp = deci_kelvin_to_millicelsius_with_offset(
					tz->temperature, tz->kelvin_offset);
		if (thermal_get_trip_temp(thermal, trip, &trip_temp))
			return -EINVAL;
	if (tz->trips.critical.valid)
		trip_index--;

		if (temp > trip_temp) {
			*trend = THERMAL_TREND_RAISING;
			return 0;
		} else {
			/* Fall back on default trend */
			return -EINVAL;
		}
	}
	if (tz->trips.hot.valid)
		trip_index--;

	/*
	 * tz->temperature has already been updated by generic thermal layer,
	 * before this callback being invoked
	 */
	i = tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature) +
	    tz->trips.passive.tc2 * (tz->temperature - tz->trips.passive.trip.temperature);
	if (trip_index < 0)
		return -EINVAL;

	if (i > 0)
	acpi_trip = &tz->trips.passive.trip;
	if (acpi_trip->valid && !trip_index--) {
		t = tz->trips.passive.tc1 * (tz->temperature -
						tz->last_temperature) +
			tz->trips.passive.tc2 * (tz->temperature -
						acpi_trip->temperature);
		if (t > 0)
			*trend = THERMAL_TREND_RAISING;
	else if (i < 0)
		else if (t < 0)
			*trend = THERMAL_TREND_DROPPING;
		else
			*trend = THERMAL_TREND_STABLE;
@@ -640,6 +632,22 @@ static int thermal_get_trend(struct thermal_zone_device *thermal,
		return 0;
	}

	t = acpi_thermal_temp(tz, tz->temperature);

	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
		acpi_trip = &tz->trips.active[i].trip;
		if (acpi_trip->valid && !trip_index--) {
			if (t > acpi_thermal_temp(tz, acpi_trip->temperature)) {
				*trend = THERMAL_TREND_RAISING;
				return 0;
			}
			break;
		}
	}

	return -EINVAL;
}

static void acpi_thermal_zone_device_hot(struct thermal_zone_device *thermal)
{
	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);