Merge back thermal control material for v6.11.

This commit is contained in:
Rafael J. Wysocki 2024-06-21 14:42:30 +02:00
commit 3995904d54
3 changed files with 35 additions and 3 deletions

View File

@ -168,11 +168,17 @@ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
static int acpi_thermal_temp(struct acpi_thermal *tz, int temp_deci_k)
{
int temp;
if (temp_deci_k == THERMAL_TEMP_INVALID)
return THERMAL_TEMP_INVALID;
return deci_kelvin_to_millicelsius_with_offset(temp_deci_k,
temp = deci_kelvin_to_millicelsius_with_offset(temp_deci_k,
tz->kelvin_offset);
if (temp <= 0)
return THERMAL_TEMP_INVALID;
return temp;
}
static bool acpi_thermal_trip_valid(struct acpi_thermal_trip *acpi_trip)

View File

@ -93,6 +93,23 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz,
if (instance->initialized && old_target == instance->target)
continue;
if (trip->type == THERMAL_TRIP_PASSIVE) {
/*
* If the target state for this thermal instance
* changes from THERMAL_NO_TARGET to something else,
* ensure that the zone temperature will be updated
* (assuming enabled passive cooling) until it becomes
* THERMAL_NO_TARGET again, or the cooling device may
* not be reset to its initial state.
*/
if (old_target == THERMAL_NO_TARGET &&
instance->target != THERMAL_NO_TARGET)
tz->passive++;
else if (old_target != THERMAL_NO_TARGET &&
instance->target == THERMAL_NO_TARGET)
tz->passive--;
}
instance->initialized = true;
mutex_lock(&instance->cdev->lock);

View File

@ -999,9 +999,17 @@ __thermal_cooling_device_register(struct device_node *np,
if (ret)
goto out_cdev_type;
/*
* The cooling device's current state is only needed for debug
* initialization below, so a failure to get it does not cause
* the entire cooling device initialization to fail. However,
* the debug will not work for the device if its initial state
* cannot be determined and drivers are responsible for ensuring
* that this will not happen.
*/
ret = cdev->ops->get_cur_state(cdev, &current_state);
if (ret)
goto out_cdev_type;
current_state = ULONG_MAX;
thermal_cooling_device_setup_sysfs(cdev);
@ -1016,7 +1024,8 @@ __thermal_cooling_device_register(struct device_node *np,
return ERR_PTR(ret);
}
thermal_debug_cdev_add(cdev, current_state);
if (current_state <= cdev->max_state)
thermal_debug_cdev_add(cdev, current_state);
/* Add 'this' new cdev to the global cdev list */
mutex_lock(&thermal_list_lock);