@@ -246,113 +246,120 @@ do { \
"Please report to linux-acpi@vger.kernel.org\n", str); \
} while (0)
-static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+static int acpi_thermal_trips_update_critical(struct acpi_thermal *tz, int flag)
{
- acpi_status status;
+ acpi_status status = AE_OK;
unsigned long long tmp;
- struct acpi_handle_list devices;
- int valid = 0;
- int i;
- /* Critical Shutdown */
- if (flag & ACPI_TRIPS_CRITICAL) {
- status = acpi_evaluate_integer(tz->device->handle, "_CRT", NULL, &tmp);
- tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature = tmp;
-
- /*
- * Treat freezing temperatures as invalid as well; some
- * BIOSes return really low values and cause reboots at startup.
- * Below zero (Celsius) values clearly aren't right for sure..
- * ... so lets discard those as invalid.
- */
- if (ACPI_FAILURE(status)) {
- tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid = 0;
- acpi_handle_debug(tz->device->handle,
- "No critical threshold\n");
- } else if (tmp <= 2732) {
- pr_info(FW_BUG "Invalid critical threshold (%llu)\n", tmp);
+ status = acpi_evaluate_integer(tz->device->handle, "_CRT", NULL, &tmp);
+ tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature = tmp;
+ /*
+ * Treat freezing temperatures as invalid as well; some
+ * BIOSes return really low values and cause reboots at startup.
+ * Below zero (Celsius) values clearly aren't right for sure..
+ * ... so lets discard those as invalid.
+ */
+ if (ACPI_FAILURE(status)) {
+ tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid = 0;
+ acpi_handle_debug(tz->device->handle,
+ "No critical threshold\n");
+ } else if (tmp <= 2732) {
+ pr_info(FW_BUG "Invalid critical threshold (%llu)\n", tmp);
+ tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid = 0;
+ } else {
+ tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid = 1;
+ acpi_handle_debug(tz->device->handle,
+ "Found critical threshold [%lu]\n",
+ tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature);
+ }
+ if (tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid == 1) {
+ if (crt == -1) {
tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid = 0;
- } else {
- tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid = 1;
- acpi_handle_debug(tz->device->handle,
- "Found critical threshold [%lu]\n",
- tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature);
- }
-
- if (tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid) {
- if (crt == -1) {
- tz->trips[ACPI_THERMAL_TRIP_CRITICAL].flags.valid = 0;
- } else if (crt > 0) {
- unsigned long crt_k = celsius_to_deci_kelvin(crt);
+ } else if (crt > 0) {
+ unsigned long crt_k = celsius_to_deci_kelvin(crt);
- /*
- * Allow override critical threshold
- */
- if (crt_k > tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature)
- pr_info("Critical threshold %d C\n", crt);
+ /*
+ * Allow override critical threshold
+ */
+ if (crt_k > tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature)
+ pr_info("Critical threshold %d C\n", crt);
- tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature = crt_k;
- }
+ tz->trips[ACPI_THERMAL_TRIP_CRITICAL].temperature = crt_k;
}
}
- /* Critical Sleep (optional) */
- if (flag & ACPI_TRIPS_HOT) {
- status = acpi_evaluate_integer(tz->device->handle, "_HOT", NULL, &tmp);
- if (ACPI_FAILURE(status)) {
- tz->trips[ACPI_THERMAL_TRIP_HOT].flags.valid = 0;
- acpi_handle_debug(tz->device->handle,
- "No hot threshold\n");
- } else {
- tz->trips[ACPI_THERMAL_TRIP_HOT].temperature = tmp;
- tz->trips[ACPI_THERMAL_TRIP_HOT].flags.valid = 1;
- acpi_handle_debug(tz->device->handle,
- "Found hot threshold [%lu]\n",
- tz->trips[ACPI_THERMAL_TRIP_HOT].temperature);
- }
+ return 0;
+}
+
+static int acpi_thermal_trips_update_hot(struct acpi_thermal *tz, int flag)
+{
+ acpi_status status = AE_OK;
+ unsigned long long tmp;
+
+ status = acpi_evaluate_integer(tz->device->handle,
+ "_HOT", NULL, &tmp);
+ if (ACPI_FAILURE(status)) {
+ tz->trips[ACPI_THERMAL_TRIP_HOT].flags.valid = 0;
+ acpi_handle_debug(tz->device->handle,
+ "No hot threshold\n");
+ } else {
+ tz->trips[ACPI_THERMAL_TRIP_HOT].temperature = tmp;
+ tz->trips[ACPI_THERMAL_TRIP_HOT].flags.valid = 1;
+ acpi_handle_debug(tz->device->handle,
+ "Found hot threshold [%lu]\n",
+ tz->trips[ACPI_THERMAL_TRIP_HOT].temperature);
}
- /* Passive (optional) */
- if (((flag & ACPI_TRIPS_PASSIVE) && tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid) ||
- flag == ACPI_TRIPS_INIT) {
- valid = tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid;
- if (psv == -1) {
- status = AE_SUPPORT;
- } else if (psv > 0) {
- tmp = celsius_to_deci_kelvin(psv);
- status = AE_OK;
- } else {
- status = acpi_evaluate_integer(tz->device->handle,
- "_PSV", NULL, &tmp);
- }
+ return 0;
+}
- if (ACPI_FAILURE(status)) {
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
- } else {
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].temperature = tmp;
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 1;
- if (flag == ACPI_TRIPS_INIT) {
- status = acpi_evaluate_integer(tz->device->handle,
- "_TC1", NULL, &tmp);
- if (ACPI_FAILURE(status))
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
- else
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].tc1 = tmp;
- status = acpi_evaluate_integer(tz->device->handle,
- "_TC2", NULL, &tmp);
- if (ACPI_FAILURE(status))
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
- else
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].tc2 = tmp;
- status = acpi_evaluate_integer(tz->device->handle,
- "_TSP", NULL, &tmp);
- if (ACPI_FAILURE(status))
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
- else
- tz->trips[ACPI_THERMAL_TRIP_PASSIVE].tsp = tmp;
- }
+static int acpi_thermal_trips_update_passive(struct acpi_thermal *tz, int flag)
+{
+ acpi_status status;
+ unsigned long long tmp;
+ struct acpi_handle_list devices;
+ int valid = 0;
+
+ valid = tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid;
+ if (psv == -1) {
+ status = AE_SUPPORT;
+ } else if (psv > 0) {
+ tmp = celsius_to_deci_kelvin(psv);
+ status = AE_OK;
+ } else {
+ status = acpi_evaluate_integer(tz->device->handle, "_PSV", NULL, &tmp);
+ }
+
+ if (ACPI_FAILURE(status))
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
+ else {
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].temperature = tmp;
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 1;
+ if (flag == ACPI_TRIPS_INIT) {
+ status = acpi_evaluate_integer(
+ tz->device->handle, "_TC1",
+ NULL, &tmp);
+ if (ACPI_FAILURE(status))
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
+ else
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].tc1 = tmp;
+ status = acpi_evaluate_integer(
+ tz->device->handle, "_TC2",
+ NULL, &tmp);
+ if (ACPI_FAILURE(status))
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
+ else
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].tc2 = tmp;
+ status = acpi_evaluate_integer(
+ tz->device->handle, "_TSP",
+ NULL, &tmp);
+ if (ACPI_FAILURE(status))
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid = 0;
+ else
+ tz->trips[ACPI_THERMAL_TRIP_PASSIVE].tsp = tmp;
}
}
+
if ((flag & ACPI_TRIPS_DEVICES) && tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid) {
memset(&devices, 0, sizeof(struct acpi_handle_list));
status = acpi_evaluate_reference(tz->device->handle, "_PSL",
@@ -372,12 +379,23 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "device");
}
}
+
if ((flag & ACPI_TRIPS_PASSIVE) || (flag & ACPI_TRIPS_DEVICES)) {
if (valid != tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid)
ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "state");
}
- /* Active (optional) */
+ return 0;
+}
+
+static int acpi_thermal_trips_update_active(struct acpi_thermal *tz, int flag)
+{
+ acpi_status status = AE_OK;
+ unsigned long long tmp;
+ struct acpi_handle_list devices;
+ int valid = 0;
+ int i;
+
for (i = ACPI_THERMAL_TRIP_ACTIVE; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
char name[5] = { '_', 'A', 'C', ('0' + i), '\0' };
valid = tz->trips[i].flags.valid;
@@ -445,17 +463,50 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
break;
}
- if (flag & ACPI_TRIPS_DEVICES) {
- memset(&devices, 0, sizeof(devices));
- status = acpi_evaluate_reference(tz->device->handle, "_TZD",
- NULL, &devices);
- if (ACPI_SUCCESS(status) &&
- memcmp(&tz->devices, &devices, sizeof(devices))) {
- tz->devices = devices;
- ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "device");
- }
+ return 0;
+}
+
+static int acpi_thermal_trips_update_devices(struct acpi_thermal *tz, int flag)
+{
+ acpi_status status = AE_OK;
+ struct acpi_handle_list devices;
+
+ memset(&devices, 0, sizeof(devices));
+ status = acpi_evaluate_reference(tz->device->handle, "_TZD", NULL, &devices);
+ if (ACPI_SUCCESS(status)
+ && memcmp(&tz->devices, &devices, sizeof(devices))) {
+ tz->devices = devices;
+ ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "device");
+ }
+
+ return 0;
+}
+
+static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+{
+ /* Critical Shutdown */
+ if (flag & ACPI_TRIPS_CRITICAL) {
+ acpi_thermal_trips_update_critical(tz, flag);
}
+ /* Critical Sleep (optional) */
+ if (flag & ACPI_TRIPS_HOT) {
+ acpi_thermal_trips_update_hot(tz, flag);
+ }
+
+ /* Passive (optional) */
+ if (((flag & ACPI_TRIPS_PASSIVE) && tz->trips[ACPI_THERMAL_TRIP_PASSIVE].flags.valid) ||
+ (flag == ACPI_TRIPS_INIT)) {
+ acpi_thermal_trips_update_passive(tz, flag);
+ }
+
+ /* Active (optional) */
+ acpi_thermal_trips_update_active(tz, flag);
+
+ if (flag & ACPI_TRIPS_DEVICES) {
+ acpi_thermal_trips_update_devices(tz, flag);
+ }
+
return 0;
}
The thermal trip update function is a bit difficult to read, it is very long and has everything put in there to initialize the trip points. In order to improve its readability, let's encapuslate the different parts into dedicated functions. So we can act individually per trip type changes and will make easier to review the next changes. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> --- drivers/acpi/thermal.c | 257 ++++++++++++++++++++++++----------------- 1 file changed, 154 insertions(+), 103 deletions(-)