thermal: core: Rework .get_trend() thermal zone callback
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 22 Aug 2023 11:40:06 +0000 (13:40 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 29 Aug 2023 18:48:35 +0000 (20:48 +0200)
Passing a struct thermal_trip pointer instead of a trip index to the
.get_trend() thermal zone callback allows one of its 2 implementations,
the thermal_get_trend() function in the ACPI thermal driver, to be
simplified quite a bit, and the other implementation of it in the
ti-soc-thermal driver does not even use the relevant callback argument.

For this reason, change the .get_trend() thermal zone callback
definition and adjust the related code accordingly.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/thermal.c
drivers/thermal/thermal_core.h
drivers/thermal/thermal_helpers.c
drivers/thermal/ti-soc-thermal/ti-thermal-common.c
include/linux/thermal.h

index 419590f41ed5f172c21b3510ad3c4e4a8bdd6323..f14e68266ccd473db98bef2bcfe118bfae47afc5 100644 (file)
@@ -492,26 +492,22 @@ static int thermal_get_temp(struct thermal_zone_device *thermal, int *temp)
 }
 
 static int thermal_get_trend(struct thermal_zone_device *thermal,
-                            int trip_index, enum thermal_trend *trend)
+                            struct thermal_trip *trip,
+                            enum thermal_trend *trend)
 {
        struct acpi_thermal *tz = thermal_zone_device_priv(thermal);
        struct acpi_thermal_trip *acpi_trip;
-       int t, i;
+       int t;
 
-       if (!tz || trip_index < 0)
+       if (!tz || !trip)
                return -EINVAL;
 
-       if (tz->trips.critical.valid)
-               trip_index--;
-
-       if (tz->trips.hot.valid)
-               trip_index--;
-
-       if (trip_index < 0)
+       acpi_trip = trip->priv;
+       if (!acpi_trip || !acpi_trip->valid)
                return -EINVAL;
 
-       acpi_trip = &tz->trips.passive.trip;
-       if (acpi_trip->valid && !trip_index--) {
+       switch (trip->type) {
+       case THERMAL_TRIP_PASSIVE:
                t = tz->trips.passive.tc1 * (tz->temperature -
                                                tz->last_temperature) +
                        tz->trips.passive.tc2 * (tz->temperature -
@@ -524,19 +520,18 @@ static int thermal_get_trend(struct thermal_zone_device *thermal,
                        *trend = THERMAL_TREND_STABLE;
 
                return 0;
-       }
-
-       t = acpi_thermal_temp(tz, tz->temperature);
 
-       for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
-               acpi_trip = &tz->trips.active[i].trip;
-               if (acpi_trip->valid && !trip_index--) {
-                       if (t > acpi_thermal_temp(tz, acpi_trip->temperature)) {
-                               *trend = THERMAL_TREND_RAISING;
-                               return 0;
-                       }
+       case THERMAL_TRIP_ACTIVE:
+               t = acpi_thermal_temp(tz, tz->temperature);
+               if (t <= trip->temperature)
                        break;
-               }
+
+               *trend = THERMAL_TREND_RAISING;
+
+               return 0;
+
+       default:
+               break;
        }
 
        return -EINVAL;
index 04513f9fbfa1803b93c669a3abd86e5d4ce4cb5c..de884bea28b66cd104565f275a5842e615a3341a 100644 (file)
@@ -70,7 +70,7 @@ static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
 void thermal_cdev_update(struct thermal_cooling_device *);
 void __thermal_cdev_update(struct thermal_cooling_device *cdev);
 
-int get_tz_trend(struct thermal_zone_device *tz, int trip);
+int get_tz_trend(struct thermal_zone_device *tz, int trip_index);
 
 struct thermal_instance *
 get_thermal_instance(struct thermal_zone_device *tz,
index cfba0965a22da0ba638a90f9075bae2915ee5c1f..4d66372c962952bea2167904b1200f6d39721838 100644 (file)
@@ -22,8 +22,9 @@
 #include "thermal_core.h"
 #include "thermal_trace.h"
 
-int get_tz_trend(struct thermal_zone_device *tz, int trip)
+int get_tz_trend(struct thermal_zone_device *tz, int trip_index)
 {
+       struct thermal_trip *trip = tz->trips ? &tz->trips[trip_index] : NULL;
        enum thermal_trend trend;
 
        if (tz->emul_temperature || !tz->ops->get_trend ||
index d414a4b7a94a454a88df5207fd07bc9653c11926..6ba2613627e135bde426de1fc6148ece29ac9298 100644 (file)
@@ -109,7 +109,8 @@ static inline int __ti_thermal_get_temp(struct thermal_zone_device *tz, int *tem
        return ret;
 }
 
-static int __ti_thermal_get_trend(struct thermal_zone_device *tz, int trip, enum thermal_trend *trend)
+static int __ti_thermal_get_trend(struct thermal_zone_device *tz,
+                                 struct thermal_trip *trip, enum thermal_trend *trend)
 {
        struct ti_thermal_data *data = thermal_zone_device_priv(tz);
        struct ti_bandgap *bgp;
index e6bd3b7c9eda58a31fb8eafdc90128e05f80c0b1..eb17495c8acc814cab3773149314950a1a040264 100644 (file)
@@ -53,6 +53,20 @@ enum thermal_notify_event {
        THERMAL_EVENT_KEEP_ALIVE, /* Request for user space handler to respond */
 };
 
+/**
+ * struct thermal_trip - representation of a point in temperature domain
+ * @temperature: temperature value in miliCelsius
+ * @hysteresis: relative hysteresis in miliCelsius
+ * @type: trip point type
+ * @priv: pointer to driver data associated with this trip
+ */
+struct thermal_trip {
+       int temperature;
+       int hysteresis;
+       enum thermal_trip_type type;
+       void *priv;
+};
+
 struct thermal_zone_device_ops {
        int (*bind) (struct thermal_zone_device *,
                     struct thermal_cooling_device *);
@@ -66,26 +80,12 @@ struct thermal_zone_device_ops {
        int (*set_trip_hyst) (struct thermal_zone_device *, int, int);
        int (*get_crit_temp) (struct thermal_zone_device *, int *);
        int (*set_emul_temp) (struct thermal_zone_device *, int);
-       int (*get_trend) (struct thermal_zone_device *, int,
+       int (*get_trend) (struct thermal_zone_device *, struct thermal_trip *,
                          enum thermal_trend *);
        void (*hot)(struct thermal_zone_device *);
        void (*critical)(struct thermal_zone_device *);
 };
 
-/**
- * struct thermal_trip - representation of a point in temperature domain
- * @temperature: temperature value in miliCelsius
- * @hysteresis: relative hysteresis in miliCelsius
- * @type: trip point type
- * @priv: pointer to driver data associated with this trip
- */
-struct thermal_trip {
-       int temperature;
-       int hysteresis;
-       enum thermal_trip_type type;
-       void *priv;
-};
-
 struct thermal_cooling_device_ops {
        int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
        int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);