Commit f844793f authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

thermal: trip: Avoid skipping trips in thermal_zone_set_trips()

Say there are 3 trip points A, B, C sorted in ascending temperature
order with no hysteresis.  If the zone temerature is exactly equal to
B, thermal_zone_set_trips() will set the boundaries to A and C and the
hardware will not catch any crossing of B (either way) until either A
or C is crossed and the boundaries are changed.

To avoid that, use non-strict inequalities when comparing the trip
threshold to the zone temperature in thermal_zone_set_trips().

In the example above, it will cause both boundaries to be set to B,
which is desirable because an interrupt will trigger when the zone
temperature becomes different from B regardless of which way it goes.
That will allow a new interval to be set depending on the direction of
the zone temperature change.

Fixes: 893bae92 ("thermal: trip: Make thermal_zone_set_trips() use trip thresholds")
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/12509184.O9o76ZdvQC@rjwysocki.net
parent 8400291e
...@@ -88,10 +88,10 @@ void thermal_zone_set_trips(struct thermal_zone_device *tz) ...@@ -88,10 +88,10 @@ void thermal_zone_set_trips(struct thermal_zone_device *tz)
return; return;
for_each_trip_desc(tz, td) { for_each_trip_desc(tz, td) {
if (td->threshold < tz->temperature && td->threshold > low) if (td->threshold <= tz->temperature && td->threshold > low)
low = td->threshold; low = td->threshold;
if (td->threshold > tz->temperature && td->threshold < high) if (td->threshold >= tz->temperature && td->threshold < high)
high = td->threshold; high = td->threshold;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment