]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
thermal: core: Introduce .manage() callback for thermal governors
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 10 Apr 2024 16:08:12 +0000 (18:08 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 23 Apr 2024 18:38:41 +0000 (20:38 +0200)
Introduce a new thermal governor callback called .manage() that will be
invoked once per thermal zone update after processing all of the trip
points in the core.

This will allow governors that look at multiple trip points together
to check all of them in a consistent configuration, so they don't need
to play tricks with skipping .throttle() invocations that they are not
interested in and they can avoid carrying out the same computations for
multiple times in one cycle.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
drivers/thermal/thermal_core.c
drivers/thermal/thermal_core.h

index 62fe062d7ff5497e32d83bc24a7d2d409d120bd7..221e1924240d874d7eea2a8aa76b60628c7bb300 100644 (file)
@@ -516,6 +516,9 @@ void __thermal_zone_device_update(struct thermal_zone_device *tz,
                        governor->trip_crossed(tz, &td->trip, false);
        }
 
+       if (governor->manage)
+               governor->manage(tz);
+
        monitor_thermal_zone(tz);
 }
 
index 9a3585492558d3195ce35d52d6e99df886d77aab..95cbf7a3d169e2b26b1b6d72ef28896f6be5b199 100644 (file)
@@ -31,6 +31,7 @@ struct thermal_trip_desc {
  * @unbind_from_tz:    callback called when a governor is unbound from a
  *                     thermal zone.
  * @trip_crossed:      called for trip points that have just been crossed
+ * @manage:    called on thermal zone temperature updates
  * @throttle:  callback called for every trip point even if temperature is
  *             below the trip point temperature
  * @update_tz: callback called when thermal zone internals have changed, e.g.
@@ -44,6 +45,7 @@ struct thermal_governor {
        void (*trip_crossed)(struct thermal_zone_device *tz,
                             const struct thermal_trip *trip,
                             bool crossed_up);
+       void (*manage)(struct thermal_zone_device *tz);
        int (*throttle)(struct thermal_zone_device *tz,
                        const struct thermal_trip *trip);
        void (*update_tz)(struct thermal_zone_device *tz,