summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2023-08-10 21:13:25 +0200
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2023-08-11 18:44:45 +0200
commit51f2aaf0dfb1a21281e2d47c94b1a5b245b033fa (patch)
tree39de6480e9a5ce5c58448911aac574c6ffe417aa
parentcbc280570438ce0e6bcb10288048eaa00762b3db (diff)
thermal: intel: intel_soc_dts_iosf: Change initialization ordering
The initial configuration of trip points in intel_soc_dts_iosf_init() takes place after registering the sensor thermal zones which is potentially problematic, because it may race with the setting of trip point temperatures via sysfs, as there is no synchronization between it and sys_set_trip_temp(). To address this, change the initialization ordering so that the trip points are configured prior to the registration of thermal zones. Accordingly, change the cleanup ordering in intel_soc_dts_iosf_exit() to remove the thermal zones before resetting the trip points. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
-rw-r--r--drivers/thermal/intel/intel_soc_dts_iosf.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/thermal/intel/intel_soc_dts_iosf.c b/drivers/thermal/intel/intel_soc_dts_iosf.c
index afd1cbe280bf..5ca2e565f9a3 100644
--- a/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ b/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -398,30 +398,37 @@ struct intel_soc_dts_sensors *intel_soc_dts_iosf_init(
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
sensors->soc_dts[i].sensors = sensors;
- ret = add_dts_thermal_zone(i, &sensors->soc_dts[i],
- read_only_trip_count);
- if (ret)
- goto err_free;
- }
- for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
ret = configure_trip(&sensors->soc_dts[i], 0,
THERMAL_TRIP_PASSIVE, 0);
if (ret)
- goto err_remove_zone;
+ goto err_reset_trips;
ret = configure_trip(&sensors->soc_dts[i], 1,
THERMAL_TRIP_PASSIVE, 0);
if (ret)
+ goto err_reset_trips;
+ }
+
+ for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
+ ret = add_dts_thermal_zone(i, &sensors->soc_dts[i],
+ read_only_trip_count);
+ if (ret)
goto err_remove_zone;
}
return sensors;
+
err_remove_zone:
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i)
remove_dts_thermal_zone(&sensors->soc_dts[i]);
-err_free:
+err_reset_trips:
+ for (i = 0; i < SOC_MAX_DTS_SENSORS; i++) {
+ configure_trip(&sensors->soc_dts[i], 0, 0, 0);
+ configure_trip(&sensors->soc_dts[i], 1, 0, 0);
+ }
+
kfree(sensors);
return ERR_PTR(ret);
}
@@ -432,9 +439,9 @@ void intel_soc_dts_iosf_exit(struct intel_soc_dts_sensors *sensors)
int i;
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
+ remove_dts_thermal_zone(&sensors->soc_dts[i]);
configure_trip(&sensors->soc_dts[i], 0, 0, 0);
configure_trip(&sensors->soc_dts[i], 1, 0, 0);
- remove_dts_thermal_zone(&sensors->soc_dts[i]);
}
kfree(sensors);
}