mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ACPI: thermal_lib: Add functions returning temperature in deci-Kelvin
Because the ACPI thermal driver generally operates temperature values in deci-Kelvin, it needs the library functions returning temperature for various trip point types to use deci-Kelvin too. To address that, arrange the ACPI thermal library code in three levels of functions where the high-level ones will return temperature in milli-Celsius, as needed by the thermal core and the majority of thermal drivers, the mid-level ones will return temperature in deci-Kelvin and will be called internally by the corresponding high- level functions, and all of the mid-level functions will call the same low-level one, acpi_trip_temp(), to actually evaluate ACPI objects to retrieve themperature values from the platform firmware. Going forward, this will allow the ACPI thermal driver to use the mid-level functions to provide temperature values needed by it, so as to reduce code duplication related to evaluating trip temperature ACPI control methods. No intentional functional impact. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									f475079881
								
							
						
					
					
						commit
						6908097aa5
					
				
					 1 changed files with 60 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -3,8 +3,8 @@
 | 
			
		|||
 * Copyright 2023 Linaro Limited
 | 
			
		||||
 * Copyright 2023 Intel Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * Library routines for populating a generic thermal trip point structure
 | 
			
		||||
 * with data obtained by evaluating a specific object in the ACPI Namespace.
 | 
			
		||||
 * Library routines for retrieving trip point temperature values from the
 | 
			
		||||
 * platform firmware via ACPI.
 | 
			
		||||
 */
 | 
			
		||||
#include <linux/acpi.h>
 | 
			
		||||
#include <linux/units.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -17,11 +17,11 @@
 | 
			
		|||
 * firmware. Any values out of these boundaries may be considered
 | 
			
		||||
 * bogus and we can assume the firmware has no data to provide.
 | 
			
		||||
 */
 | 
			
		||||
#define TEMP_MIN_DECIK	2180
 | 
			
		||||
#define TEMP_MAX_DECIK	4480
 | 
			
		||||
#define TEMP_MIN_DECIK	2180ULL
 | 
			
		||||
#define TEMP_MAX_DECIK	4480ULL
 | 
			
		||||
 | 
			
		||||
static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
 | 
			
		||||
				  int *ret_temp)
 | 
			
		||||
static int acpi_trip_temp(struct acpi_device *adev, char *obj_name,
 | 
			
		||||
			  int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long long temp;
 | 
			
		||||
	acpi_status status;
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if (temp >= TEMP_MIN_DECIK && temp <= TEMP_MAX_DECIK) {
 | 
			
		||||
		*ret_temp = deci_kelvin_to_millicelsius(temp);
 | 
			
		||||
		*ret_temp = temp;
 | 
			
		||||
	} else {
 | 
			
		||||
		acpi_handle_debug(adev->handle, "%s result %llu out of range\n",
 | 
			
		||||
				  obj_name, temp);
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +43,44 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	char obj_name[] = {'_', 'A', 'C', '0' + id, '\0'};
 | 
			
		||||
 | 
			
		||||
	if (id < 0 || id > 9)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return acpi_trip_temp(adev, obj_name, ret_temp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	return acpi_trip_temp(adev, "_PSV", ret_temp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	return acpi_trip_temp(adev, "_HOT", ret_temp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	return acpi_trip_temp(adev, "_CRT", ret_temp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int thermal_temp(int error, int temp_decik, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	if (error)
 | 
			
		||||
		return error;
 | 
			
		||||
 | 
			
		||||
	if (temp_decik == THERMAL_TEMP_INVALID)
 | 
			
		||||
		*ret_temp = THERMAL_TEMP_INVALID;
 | 
			
		||||
	else
 | 
			
		||||
		*ret_temp = deci_kelvin_to_millicelsius(temp_decik);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * thermal_acpi_active_trip_temp - Retrieve active trip point temperature
 | 
			
		||||
 * @adev: Target thermal zone ACPI device object.
 | 
			
		||||
| 
						 | 
				
			
			@ -57,12 +95,10 @@ static int thermal_acpi_trip_temp(struct acpi_device *adev, char *obj_name,
 | 
			
		|||
 */
 | 
			
		||||
int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	char obj_name[] = {'_', 'A', 'C', '0' + id, '\0'};
 | 
			
		||||
	int temp_decik;
 | 
			
		||||
	int ret = acpi_active_trip_temp(adev, id, &temp_decik);
 | 
			
		||||
 | 
			
		||||
	if (id < 0 || id > 9)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return thermal_acpi_trip_temp(adev, obj_name, ret_temp);
 | 
			
		||||
	return thermal_temp(ret, temp_decik, ret_temp);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +114,10 @@ EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp);
 | 
			
		|||
 */
 | 
			
		||||
int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	return thermal_acpi_trip_temp(adev, "_PSV", ret_temp);
 | 
			
		||||
	int temp_decik;
 | 
			
		||||
	int ret = acpi_passive_trip_temp(adev, &temp_decik);
 | 
			
		||||
 | 
			
		||||
	return thermal_temp(ret, temp_decik, ret_temp);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +134,10 @@ EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp);
 | 
			
		|||
 */
 | 
			
		||||
int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	return thermal_acpi_trip_temp(adev, "_HOT", ret_temp);
 | 
			
		||||
	int temp_decik;
 | 
			
		||||
	int ret = acpi_hot_trip_temp(adev, &temp_decik);
 | 
			
		||||
 | 
			
		||||
	return thermal_temp(ret, temp_decik, ret_temp);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -111,6 +153,9 @@ EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp);
 | 
			
		|||
 */
 | 
			
		||||
int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp)
 | 
			
		||||
{
 | 
			
		||||
	return thermal_acpi_trip_temp(adev, "_CRT", ret_temp);
 | 
			
		||||
	int temp_decik;
 | 
			
		||||
	int ret = acpi_critical_trip_temp(adev, &temp_decik);
 | 
			
		||||
 | 
			
		||||
	return thermal_temp(ret, temp_decik, ret_temp);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(thermal_acpi_critical_trip_temp);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue