summaryrefslogtreecommitdiff
path: root/drivers/thermal/thermal_core.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2024-04-10 19:10:53 +0300
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2024-04-19 23:11:06 +0300
commit80f5fd45c764816fe9dbe8e94bd2677b4a8a3f4d (patch)
treef30f73116a84a95d756f72443371dd165a715032 /drivers/thermal/thermal_core.c
parent5c897a9a1237155822183b8979005d06c14a996a (diff)
downloadlinux-80f5fd45c764816fe9dbe8e94bd2677b4a8a3f4d.tar.xz
thermal: core: Introduce .trip_crossed() callback for thermal governors
Introduce a new thermal governor callback called .trip_crossed() that will be invoked whenever a trip point is crossed by the zone temperature, either on the way up or on the way down. The trip crossing direction information will be passed to it and if multiple trips are crossed in the same direction during one thermal zone update, the new callback will be invoked for them in temperature order, either ascending or descending, depending on the trip crossing direction. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
Diffstat (limited to 'drivers/thermal/thermal_core.c')
-rw-r--r--drivers/thermal/thermal_core.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 58e60bcdc0a5..62fe062d7ff5 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -302,11 +302,21 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz)
thermal_zone_device_set_polling(tz, tz->polling_delay_jiffies);
}
+static struct thermal_governor *thermal_get_tz_governor(struct thermal_zone_device *tz)
+{
+ if (tz->governor)
+ return tz->governor;
+
+ return def_governor;
+}
+
static void handle_non_critical_trips(struct thermal_zone_device *tz,
const struct thermal_trip *trip)
{
- tz->governor ? tz->governor->throttle(tz, trip) :
- def_governor->throttle(tz, trip);
+ struct thermal_governor *governor = thermal_get_tz_governor(tz);
+
+ if (governor->throttle)
+ governor->throttle(tz, trip);
}
void thermal_governor_update_tz(struct thermal_zone_device *tz,
@@ -470,6 +480,7 @@ static int thermal_trip_notify_cmp(void *ascending, const struct list_head *a,
void __thermal_zone_device_update(struct thermal_zone_device *tz,
enum thermal_notify_event event)
{
+ struct thermal_governor *governor = thermal_get_tz_governor(tz);
struct thermal_trip_desc *td;
LIST_HEAD(way_down_list);
LIST_HEAD(way_up_list);
@@ -493,12 +504,16 @@ void __thermal_zone_device_update(struct thermal_zone_device *tz,
list_for_each_entry(td, &way_up_list, notify_list_node) {
thermal_notify_tz_trip_up(tz, &td->trip);
thermal_debug_tz_trip_up(tz, &td->trip);
+ if (governor->trip_crossed)
+ governor->trip_crossed(tz, &td->trip, true);
}
list_sort(NULL, &way_down_list, thermal_trip_notify_cmp);
list_for_each_entry(td, &way_down_list, notify_list_node) {
thermal_notify_tz_trip_down(tz, &td->trip);
thermal_debug_tz_trip_down(tz, &td->trip);
+ if (governor->trip_crossed)
+ governor->trip_crossed(tz, &td->trip, false);
}
monitor_thermal_zone(tz);