wifi: iwlwifi: Use generic thermal_zone_get_trip() function
authorDaniel Lezcano <daniel.lezcano@linaro.org>
Fri, 14 Oct 2022 07:32:50 +0000 (09:32 +0200)
committerDaniel Lezcano <daniel.lezcano@kernel.org>
Fri, 6 Jan 2023 13:14:48 +0000 (14:14 +0100)
The thermal framework gives the possibility to register the trip
points with the thermal zone. When that is done, no get_trip_* ops are
needed and they can be removed.

The get_trip_temp, get_trip_hyst and get_trip_type are handled by the
get_trip_point().

The set_trip_temp() generic function does some checks which are no
longer needed in the set_trip_point() ops.

Convert ops content logic into generic trip points and register them
with the thermal zone.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Kalle Valo <kvalo@kernel.org>
Acked-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20221014073253.3719911-1-daniel.lezcano@linaro.org
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/tt.c

index ce6b701f3f4cd2ddc52c6e370199ac36fcd63e02..90bc95d96a78e8894a5b5bc6f0eba4d8ac9037da 100644 (file)
@@ -501,7 +501,7 @@ struct iwl_mvm_tt_mgmt {
  * @tzone: thermal zone device data
 */
 struct iwl_mvm_thermal_device {
-       s16 temp_trips[IWL_MAX_DTS_TRIPS];
+       struct thermal_trip trips[IWL_MAX_DTS_TRIPS];
        u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
        struct thermal_zone_device *tzone;
 };
index 69cf3a37275968d07eaf5ab27684ad6b5361264f..232c200af38fcfec2bf82b7fd562df2fce41431c 100644 (file)
@@ -573,11 +573,11 @@ int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm)
         * and uncompressed, the FW should get it compressed and sorted
         */
 
-       /* compress temp_trips to cmd array, remove uninitialized values*/
+       /* compress trips to cmd array, remove uninitialized values*/
        for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
-               if (mvm->tz_device.temp_trips[i] != S16_MIN) {
+               if (mvm->tz_device.trips[i].temperature != INT_MIN) {
                        cmd.thresholds[idx++] =
-                               cpu_to_le16(mvm->tz_device.temp_trips[i]);
+                               cpu_to_le16((s16)(mvm->tz_device.trips[i].temperature / 1000));
                }
        }
        cmd.num_temps = cpu_to_le32(idx);
@@ -593,8 +593,8 @@ int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm)
         */
        for (i = 0; i < idx; i++) {
                for (j = 0; j < IWL_MAX_DTS_TRIPS; j++) {
-                       if (le16_to_cpu(cmd.thresholds[i]) ==
-                               mvm->tz_device.temp_trips[j])
+                       if ((int)(le16_to_cpu(cmd.thresholds[i]) * 1000) ==
+                           mvm->tz_device.trips[j].temperature)
                                mvm->tz_device.fw_trips_index[i] = j;
                }
        }
@@ -638,37 +638,12 @@ out:
        return ret;
 }
 
-static int iwl_mvm_tzone_get_trip_temp(struct thermal_zone_device *device,
-                                      int trip, int *temp)
-{
-       struct iwl_mvm *mvm = (struct iwl_mvm *)device->devdata;
-
-       if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS)
-               return -EINVAL;
-
-       *temp = mvm->tz_device.temp_trips[trip] * 1000;
-
-       return 0;
-}
-
-static int iwl_mvm_tzone_get_trip_type(struct thermal_zone_device *device,
-                                      int trip, enum thermal_trip_type *type)
-{
-       if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS)
-               return -EINVAL;
-
-       *type = THERMAL_TRIP_PASSIVE;
-
-       return 0;
-}
-
 static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
                                       int trip, int temp)
 {
        struct iwl_mvm *mvm = (struct iwl_mvm *)device->devdata;
        struct iwl_mvm_thermal_device *tzone;
-       int i, ret;
-       s16 temperature;
+       int ret;
 
        mutex_lock(&mvm->mutex);
 
@@ -678,40 +653,17 @@ static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
                goto out;
        }
 
-       if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS) {
-               ret = -EINVAL;
-               goto out;
-       }
-
        if ((temp / 1000) > S16_MAX) {
                ret = -EINVAL;
                goto out;
        }
 
-       temperature = (s16)(temp / 1000);
        tzone = &mvm->tz_device;
-
        if (!tzone) {
                ret = -EIO;
                goto out;
        }
 
-       /* no updates*/
-       if (tzone->temp_trips[trip] == temperature) {
-               ret = 0;
-               goto out;
-       }
-
-       /* already existing temperature */
-       for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
-               if (tzone->temp_trips[i] == temperature) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-       }
-
-       tzone->temp_trips[trip] = temperature;
-
        ret = iwl_mvm_send_temp_report_ths_cmd(mvm);
 out:
        mutex_unlock(&mvm->mutex);
@@ -720,8 +672,6 @@ out:
 
 static  struct thermal_zone_device_ops tzone_ops = {
        .get_temp = iwl_mvm_tzone_get_temp,
-       .get_trip_temp = iwl_mvm_tzone_get_trip_temp,
-       .get_trip_type = iwl_mvm_tzone_get_trip_type,
        .set_trip_temp = iwl_mvm_tzone_set_trip_temp,
 };
 
@@ -743,7 +693,8 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm)
        BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH);
 
        sprintf(name, "iwlwifi_%u", atomic_inc_return(&counter) & 0xFF);
-       mvm->tz_device.tzone = thermal_zone_device_register(name,
+       mvm->tz_device.tzone = thermal_zone_device_register_with_trips(name,
+                                                       mvm->tz_device.trips,
                                                        IWL_MAX_DTS_TRIPS,
                                                        IWL_WRITABLE_TRIPS_MSK,
                                                        mvm, &tzone_ops,
@@ -766,8 +717,10 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm)
        /* 0 is a valid temperature,
         * so initialize the array with S16_MIN which invalid temperature
         */
-       for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++)
-               mvm->tz_device.temp_trips[i] = S16_MIN;
+       for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) {
+               mvm->tz_device.trips[i].temperature = INT_MIN;
+               mvm->tz_device.trips[i].type = THERMAL_TRIP_PASSIVE;
+       }
 }
 
 static int iwl_mvm_tcool_get_max_state(struct thermal_cooling_device *cdev,