Commit 3d2f20ad authored by Daniel Lezcano's avatar Daniel Lezcano Committed by Daniel Lezcano

wifi: iwlwifi: Use generic thermal_zone_get_trip() function

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: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: default avatarKalle Valo <kvalo@kernel.org>
Acked-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20221014073253.3719911-1-daniel.lezcano@linaro.org
parent 5f28ecc1
...@@ -501,7 +501,7 @@ struct iwl_mvm_tt_mgmt { ...@@ -501,7 +501,7 @@ struct iwl_mvm_tt_mgmt {
* @tzone: thermal zone device data * @tzone: thermal zone device data
*/ */
struct iwl_mvm_thermal_device { 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]; u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
struct thermal_zone_device *tzone; struct thermal_zone_device *tzone;
}; };
......
...@@ -573,11 +573,11 @@ int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm) ...@@ -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 * 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++) { 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++] = 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); cmd.num_temps = cpu_to_le32(idx);
...@@ -593,8 +593,8 @@ int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm) ...@@ -593,8 +593,8 @@ int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm)
*/ */
for (i = 0; i < idx; i++) { for (i = 0; i < idx; i++) {
for (j = 0; j < IWL_MAX_DTS_TRIPS; j++) { for (j = 0; j < IWL_MAX_DTS_TRIPS; j++) {
if (le16_to_cpu(cmd.thresholds[i]) == if ((int)(le16_to_cpu(cmd.thresholds[i]) * 1000) ==
mvm->tz_device.temp_trips[j]) mvm->tz_device.trips[j].temperature)
mvm->tz_device.fw_trips_index[i] = j; mvm->tz_device.fw_trips_index[i] = j;
} }
} }
...@@ -638,37 +638,12 @@ static int iwl_mvm_tzone_get_temp(struct thermal_zone_device *device, ...@@ -638,37 +638,12 @@ static int iwl_mvm_tzone_get_temp(struct thermal_zone_device *device,
return ret; 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, static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
int trip, int temp) int trip, int temp)
{ {
struct iwl_mvm *mvm = (struct iwl_mvm *)device->devdata; struct iwl_mvm *mvm = (struct iwl_mvm *)device->devdata;
struct iwl_mvm_thermal_device *tzone; struct iwl_mvm_thermal_device *tzone;
int i, ret; int ret;
s16 temperature;
mutex_lock(&mvm->mutex); mutex_lock(&mvm->mutex);
...@@ -678,40 +653,17 @@ static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device, ...@@ -678,40 +653,17 @@ static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
goto out; goto out;
} }
if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS) {
ret = -EINVAL;
goto out;
}
if ((temp / 1000) > S16_MAX) { if ((temp / 1000) > S16_MAX) {
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
temperature = (s16)(temp / 1000);
tzone = &mvm->tz_device; tzone = &mvm->tz_device;
if (!tzone) { if (!tzone) {
ret = -EIO; ret = -EIO;
goto out; 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); ret = iwl_mvm_send_temp_report_ths_cmd(mvm);
out: out:
mutex_unlock(&mvm->mutex); mutex_unlock(&mvm->mutex);
...@@ -720,8 +672,6 @@ static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device, ...@@ -720,8 +672,6 @@ static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
static struct thermal_zone_device_ops tzone_ops = { static struct thermal_zone_device_ops tzone_ops = {
.get_temp = iwl_mvm_tzone_get_temp, .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, .set_trip_temp = iwl_mvm_tzone_set_trip_temp,
}; };
...@@ -743,7 +693,8 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm) ...@@ -743,7 +693,8 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm)
BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH); BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH);
sprintf(name, "iwlwifi_%u", atomic_inc_return(&counter) & 0xFF); 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_MAX_DTS_TRIPS,
IWL_WRITABLE_TRIPS_MSK, IWL_WRITABLE_TRIPS_MSK,
mvm, &tzone_ops, mvm, &tzone_ops,
...@@ -766,8 +717,10 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm) ...@@ -766,8 +717,10 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm)
/* 0 is a valid temperature, /* 0 is a valid temperature,
* so initialize the array with S16_MIN which invalid temperature * so initialize the array with S16_MIN which invalid temperature
*/ */
for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) {
mvm->tz_device.temp_trips[i] = S16_MIN; 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, static int iwl_mvm_tcool_get_max_state(struct thermal_cooling_device *cdev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment