]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
thermal: core: Add flags to struct thermal_trip
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 22 Feb 2024 17:30:49 +0000 (18:30 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 27 Feb 2024 11:02:50 +0000 (12:02 +0100)
In order to allow thermal zone creators to specify the writability of
trip point temperature and hysteresis on a per-trip basis, add a flags
field to struct thermal_trip and define flags to represent the desired
trip properties.

Also make thermal_zone_device_register_with_trips() set the
THERMAL_TRIP_FLAG_RW_TEMP flag for all trips covered by the writable
trips mask passed to it and modify the thermal sysfs code to look at
the trip flags instead of using the writable trips mask directly or
checking the presence of the .set_trip_hyst() zone callback.

Additionally, make trip_point_temp_store() and trip_point_hyst_store()
fail with an error code if the trip passed to one of them has
THERMAL_TRIP_FLAG_RW_TEMP or THERMAL_TRIP_FLAG_RW_HYST,
respectively, clear in its flags.

No intentional functional impact.

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

index 1eabc8ebe27d3f04c12469707c5cf8a82caa78d1..2ab495220c6ef8998dd2792a7ee7454df36ac5f6 100644 (file)
@@ -1278,6 +1278,7 @@ thermal_zone_device_register_with_trips(const char *type,
                                        int passive_delay, int polling_delay)
 {
        struct thermal_zone_device *tz;
+       struct thermal_trip *trip;
        int id;
        int result;
        struct thermal_governor *governor;
@@ -1356,13 +1357,19 @@ thermal_zone_device_register_with_trips(const char *type,
        tz->devdata = devdata;
        tz->num_trips = num_trips;
        memcpy(tz->trips, trips, num_trips * sizeof(*trips));
+       for_each_trip(tz, trip) {
+               if (mask & 1)
+                       trip->flags |= THERMAL_TRIP_FLAG_RW_TEMP;
+
+               mask >>= 1;
+       }
 
        thermal_set_delay_jiffies(&tz->passive_delay_jiffies, passive_delay);
        thermal_set_delay_jiffies(&tz->polling_delay_jiffies, polling_delay);
 
        /* sys I/F */
        /* Add nodes that are always present via .groups */
-       result = thermal_zone_create_device_groups(tz, mask);
+       result = thermal_zone_create_device_groups(tz);
        if (result)
                goto remove_id;
 
index e9c099ecdd0fb9af23e0cf2840cecaaf25c88138..0d8a42bb7ce83389a4fa15a2f2ef862d23dc4223 100644 (file)
@@ -131,7 +131,7 @@ void thermal_zone_trip_updated(struct thermal_zone_device *tz,
 int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
 
 /* sysfs I/F */
-int thermal_zone_create_device_groups(struct thermal_zone_device *, int);
+int thermal_zone_create_device_groups(struct thermal_zone_device *tz);
 void thermal_zone_destroy_device_groups(struct thermal_zone_device *);
 void thermal_cooling_device_setup_sysfs(struct thermal_cooling_device *);
 void thermal_cooling_device_destroy_sysfs(struct thermal_cooling_device *cdev);
index 83914aa2248b67d47a96745da94ca161f7051e53..39dbbdac75d0892e9df5f6b756f0139f69f3bd89 100644 (file)
@@ -392,17 +392,16 @@ static const struct attribute_group *thermal_zone_attribute_groups[] = {
 /**
  * create_trip_attrs() - create attributes for trip points
  * @tz:                the thermal zone device
- * @mask:      Writeable trip point bitmap.
  *
  * helper function to instantiate sysfs entries for every trip
  * point and its properties of a struct thermal_zone_device.
  *
  * Return: 0 on success, the proper error value otherwise.
  */
-static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
+static int create_trip_attrs(struct thermal_zone_device *tz)
 {
+       const struct thermal_trip *trip;
        struct attribute **attrs;
-       int indx;
 
        /* This function works only for zones with at least one trip */
        if (tz->num_trips <= 0)
@@ -437,7 +436,9 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
                return -ENOMEM;
        }
 
-       for (indx = 0; indx < tz->num_trips; indx++) {
+       for_each_trip(tz, trip) {
+               int indx = thermal_zone_trip_id(tz, trip);
+
                /* create trip type attribute */
                snprintf(tz->trip_type_attrs[indx].name, THERMAL_NAME_LENGTH,
                         "trip_point_%d_type", indx);
@@ -458,7 +459,7 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
                                                tz->trip_temp_attrs[indx].name;
                tz->trip_temp_attrs[indx].attr.attr.mode = S_IRUGO;
                tz->trip_temp_attrs[indx].attr.show = trip_point_temp_show;
-               if (mask & (1 << indx)) {
+               if (trip->flags & THERMAL_TRIP_FLAG_RW_TEMP) {
                        tz->trip_temp_attrs[indx].attr.attr.mode |= S_IWUSR;
                        tz->trip_temp_attrs[indx].attr.store =
                                                        trip_point_temp_store;
@@ -473,7 +474,7 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
                                        tz->trip_hyst_attrs[indx].name;
                tz->trip_hyst_attrs[indx].attr.attr.mode = S_IRUGO;
                tz->trip_hyst_attrs[indx].attr.show = trip_point_hyst_show;
-               if (tz->ops.set_trip_hyst) {
+               if (trip->flags & THERMAL_TRIP_FLAG_RW_HYST) {
                        tz->trip_hyst_attrs[indx].attr.attr.mode |= S_IWUSR;
                        tz->trip_hyst_attrs[indx].attr.store =
                                        trip_point_hyst_store;
@@ -505,8 +506,7 @@ static void destroy_trip_attrs(struct thermal_zone_device *tz)
        kfree(tz->trips_attribute_group.attrs);
 }
 
-int thermal_zone_create_device_groups(struct thermal_zone_device *tz,
-                                     int mask)
+int thermal_zone_create_device_groups(struct thermal_zone_device *tz)
 {
        const struct attribute_group **groups;
        int i, size, result;
@@ -522,7 +522,7 @@ int thermal_zone_create_device_groups(struct thermal_zone_device *tz,
                groups[i] = thermal_zone_attribute_groups[i];
 
        if (tz->num_trips) {
-               result = create_trip_attrs(tz, mask);
+               result = create_trip_attrs(tz);
                if (result) {
                        kfree(groups);
 
index ec0559e98d6fc8c7afd46d67a87a8fcc78d43a94..6eb6f3297ea00f12ae1bb1bba9b31009e8ec213a 100644 (file)
@@ -64,15 +64,23 @@ enum thermal_notify_event {
  * @threshold: trip crossing notification threshold miliCelsius
  * @type: trip point type
  * @priv: pointer to driver data associated with this trip
+ * @flags: flags representing binary properties of the trip
  */
 struct thermal_trip {
        int temperature;
        int hysteresis;
        int threshold;
        enum thermal_trip_type type;
+       u8 flags;
        void *priv;
 };
 
+#define THERMAL_TRIP_FLAG_RW_TEMP      BIT(0)
+#define THERMAL_TRIP_FLAG_RW_HYST      BIT(1)
+
+#define THERMAL_TRIP_FLAG_RW   (THERMAL_TRIP_FLAG_RW_TEMP | \
+                                THERMAL_TRIP_FLAG_RW_HYST)
+
 struct thermal_zone_device_ops {
        int (*bind) (struct thermal_zone_device *,
                     struct thermal_cooling_device *);