|
@@ -769,6 +769,47 @@ static void acpi_thermal_run(unsigned long data)
|
|
acpi_os_execute(OSL_GPE_HANDLER, acpi_thermal_check, (void *)data);
|
|
acpi_os_execute(OSL_GPE_HANDLER, acpi_thermal_check, (void *)data);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void acpi_thermal_active_off(void *data)
|
|
|
|
+{
|
|
|
|
+ int result = 0;
|
|
|
|
+ struct acpi_thermal *tz = data;
|
|
|
|
+ int i = 0;
|
|
|
|
+ int j = 0;
|
|
|
|
+ struct acpi_thermal_active *active = NULL;
|
|
|
|
+
|
|
|
|
+ if (!tz) {
|
|
|
|
+ printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ result = acpi_thermal_get_temperature(tz);
|
|
|
|
+ if (result)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
|
|
|
|
+ active = &(tz->trips.active[i]);
|
|
|
|
+ if (!active || !active->flags.valid)
|
|
|
|
+ break;
|
|
|
|
+ if (tz->temperature >= active->temperature) {
|
|
|
|
+ /*
|
|
|
|
+ * If the thermal temperature is greater than the
|
|
|
|
+ * active threshod, unnecessary to turn off the
|
|
|
|
+ * the active cooling device.
|
|
|
|
+ */
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ /*
|
|
|
|
+ * Below Threshold?
|
|
|
|
+ * ----------------
|
|
|
|
+ * Turn OFF all cooling devices associated with this
|
|
|
|
+ * threshold.
|
|
|
|
+ */
|
|
|
|
+ for (j = 0; j < active->devices.count; j++)
|
|
|
|
+ result = acpi_bus_set_power(active->devices.handles[j],
|
|
|
|
+ ACPI_STATE_D3);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static void acpi_thermal_check(void *data)
|
|
static void acpi_thermal_check(void *data)
|
|
{
|
|
{
|
|
int result = 0;
|
|
int result = 0;
|
|
@@ -1624,6 +1665,8 @@ static int acpi_thermal_add(struct acpi_device *device)
|
|
|
|
|
|
init_timer(&tz->timer);
|
|
init_timer(&tz->timer);
|
|
|
|
|
|
|
|
+ acpi_thermal_active_off(tz);
|
|
|
|
+
|
|
acpi_thermal_check(tz);
|
|
acpi_thermal_check(tz);
|
|
|
|
|
|
status = acpi_install_notify_handler(device->handle,
|
|
status = acpi_install_notify_handler(device->handle,
|