]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
thermal: trip: Make thermal_zone_set_trips() use trip thresholds
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 28 May 2024 16:51:11 +0000 (18:51 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 11 Jun 2024 19:04:56 +0000 (21:04 +0200)
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>
drivers/thermal/thermal_core.c
drivers/thermal/thermal_trip.c

index 6acaa4b50273950c4648f76123a4c16b22455227..57f20326aa9193cbb3fad92e735edb21c87f232c 100644 (file)
@@ -513,13 +513,13 @@ void __thermal_zone_device_update(struct thermal_zone_device *tz,
        if (tz->temperature == THERMAL_TEMP_INVALID)
                return;
 
-       thermal_zone_set_trips(tz);
-
        tz->notify_event = event;
 
        for_each_trip_desc(tz, td)
                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_for_each_entry(td, &way_up_list, notify_list_node)
                thermal_trip_crossed(tz, &td->trip, governor, true);
index 6ab1beb9bf0d8ec77279c28341fc0b505acadb6c..86f408f84f177588d1ac1c86664b0b82faafec6d 100644 (file)
@@ -88,17 +88,11 @@ void thermal_zone_set_trips(struct thermal_zone_device *tz)
                return;
 
        for_each_trip_desc(tz, td) {
-               const struct thermal_trip *trip = &td->trip;
-               int trip_low;
+               if (td->threshold < tz->temperature && td->threshold > low)
+                       low = td->threshold;
 
-               trip_low = trip->temperature - trip->hysteresis;
-
-               if (trip_low < tz->temperature && trip_low > low)
-                       low = trip_low;
-
-               if (trip->temperature > tz->temperature &&
-                   trip->temperature < high)
-                       high = trip->temperature;
+               if (td->threshold > tz->temperature && td->threshold < high)
+                       high = td->threshold;
        }
 
        /* No need to change trip points */