thermal: trip: Make thermal_zone_set_trips() use trip thresholds

Modify thermal_zone_set_trips() to use trip thresholds instead of
computing the low temperature for each trip to avoid deriving both
the high and low temperature levels from the same trip (which may
happen if the zone temperature falls into the hysteresis range of
one trip).

Accordingly, make __thermal_zone_device_update() call
thermal_zone_set_trips() later, when threshold values have been
updated for all trips.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
This commit is contained in:
Rafael J. Wysocki 2024-05-28 18:51:11 +02:00
parent 28d5cc1267
commit 893bae9223
2 changed files with 6 additions and 12 deletions

View File

@ -513,13 +513,13 @@ void __thermal_zone_device_update(struct thermal_zone_device *tz,
if (tz->temperature == THERMAL_TEMP_INVALID) if (tz->temperature == THERMAL_TEMP_INVALID)
return; return;
thermal_zone_set_trips(tz);
tz->notify_event = event; tz->notify_event = event;
for_each_trip_desc(tz, td) for_each_trip_desc(tz, td)
handle_thermal_trip(tz, td, &way_up_list, &way_down_list); handle_thermal_trip(tz, td, &way_up_list, &way_down_list);
thermal_zone_set_trips(tz);
list_sort(&way_up_list, &way_up_list, thermal_trip_notify_cmp); list_sort(&way_up_list, &way_up_list, thermal_trip_notify_cmp);
list_for_each_entry(td, &way_up_list, notify_list_node) list_for_each_entry(td, &way_up_list, notify_list_node)
thermal_trip_crossed(tz, &td->trip, governor, true); thermal_trip_crossed(tz, &td->trip, governor, true);

View File

@ -88,17 +88,11 @@ void thermal_zone_set_trips(struct thermal_zone_device *tz)
return; return;
for_each_trip_desc(tz, td) { for_each_trip_desc(tz, td) {
const struct thermal_trip *trip = &td->trip; if (td->threshold < tz->temperature && td->threshold > low)
int trip_low; low = td->threshold;
trip_low = trip->temperature - trip->hysteresis; if (td->threshold > tz->temperature && td->threshold < high)
high = td->threshold;
if (trip_low < tz->temperature && trip_low > low)
low = trip_low;
if (trip->temperature > tz->temperature &&
trip->temperature < high)
high = trip->temperature;
} }
/* No need to change trip points */ /* No need to change trip points */