Skip to content

Commit

Permalink
thermal: intel: intel_soc_dts_iosf: Change initialization ordering
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rafael J. Wysocki committed Aug 11, 2023
1 parent cbc2805 commit 51f2aaf
Showing 1 changed file with 16 additions and 9 deletions.
25 changes: 16 additions & 9 deletions drivers/thermal/intel/intel_soc_dts_iosf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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);
}
Expand Down

0 comments on commit 51f2aaf

Please sign in to comment.