static int acpi_thermal_get_info(struct acpi_thermal *tz) { int result = 0; if (!tz) return -EINVAL; /* Get trip points [_CRT, _PSV, etc.] (required) */ result = acpi_thermal_get_trip_points(tz); if (result) return result; /* Get temperature [_TMP] (required) */ result = acpi_thermal_get_temperature(tz); if (result) return result; /* Set the cooling mode [_SCP] to active cooling (default) */ result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE); if (!result) tz->flags.cooling_mode = 1; /* Get default polling frequency [_TZP] (optional) */ if (tzp) tz->polling_frequency = tzp; else acpi_thermal_get_polling_frequency(tz); return 0; }
static int acpi_thermal_get_info ( struct acpi_thermal *tz) { int result = 0; ACPI_FUNCTION_TRACE("acpi_thermal_get_info"); if (!tz) return_VALUE(-EINVAL); /* Get temperature [_TMP] (required) */ result = acpi_thermal_get_temperature(tz); if (result) return_VALUE(result); /* Get trip points [_CRT, _PSV, etc.] (required) */ result = acpi_thermal_get_trip_points(tz); if (result) return_VALUE(result); /* Set the cooling mode [_SCP] to active cooling (default) */ result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE); if (!result) tz->flags.cooling_mode = 1; else { /* Oh,we have not _SCP method. Generally show cooling_mode by _ACx, _PSV,spec 12.2*/ tz->flags.cooling_mode = 0; if ( tz->trips.active[0].flags.valid && tz->trips.passive.flags.valid ) { if ( tz->trips.passive.temperature > tz->trips.active[0].temperature ) tz->cooling_mode = ACPI_THERMAL_MODE_ACTIVE; else tz->cooling_mode = ACPI_THERMAL_MODE_PASSIVE; } else if ( !tz->trips.active[0].flags.valid && tz->trips.passive.flags.valid ) { tz->cooling_mode = ACPI_THERMAL_MODE_PASSIVE; } else if ( tz->trips.active[0].flags.valid && !tz->trips.passive.flags.valid ) { tz->cooling_mode = ACPI_THERMAL_MODE_ACTIVE; } else { /* _ACx and _PSV are optional, but _CRT is required */ tz->cooling_mode = ACPI_THERMAL_MODE_CRITICAL; } } /* Get default polling frequency [_TZP] (optional) */ acpi_thermal_get_polling_frequency(tz); /* Get devices in this thermal zone [_TZD] (optional) */ result = acpi_thermal_get_devices(tz); if (!result) tz->flags.devices = 1; return_VALUE(0); }
static int thermal_get_temp(struct thermal_zone_device *thermal, unsigned long *temp) { struct acpi_thermal *tz = thermal->devdata; int result; if (!tz) return -EINVAL; result = acpi_thermal_get_temperature(tz); if (result) return result; *temp = KELVIN_TO_MILLICELSIUS(tz->temperature, tz->kelvin_offset); return 0; }
static int acpi_thermal_get_info ( struct acpi_thermal *tz) { int result = 0; ACPI_FUNCTION_TRACE("acpi_thermal_get_info"); if (!tz) return_VALUE(-EINVAL); /* Get temperature [_TMP] (required) */ result = acpi_thermal_get_temperature(tz); if (result) return_VALUE(result); /* Set the cooling mode [_SCP] to active cooling (default) */ result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE); if (!result) tz->flags.cooling_mode = 1; /* Get trip points [_CRT, _PSV, etc.] (required) */ result = acpi_thermal_get_trip_points(tz); if (result) return_VALUE(result); /* Get default polling frequency [_TZP] (optional) */ if (tzp) tz->polling_frequency = tzp; else acpi_thermal_get_polling_frequency(tz); /* Get devices in this thermal zone [_TZD] (optional) */ result = acpi_thermal_get_devices(tz); if (!result) tz->flags.devices = 1; return_VALUE(0); }
static int acpi_thermal_read_temperature ( char *page, char **start, off_t off, int count, int *eof, void *data) { int result = 0; struct acpi_thermal *tz = (struct acpi_thermal *) data; char *p = page; int len = 0; ACPI_FUNCTION_TRACE("acpi_thermal_read_temperature"); if (!tz || (off != 0)) goto end; result = acpi_thermal_get_temperature(tz); if (result) goto end; p += sprintf(p, "temperature: %ld C\n", KELVIN_TO_CELSIUS(tz->temperature)); end: len = (p - page); if (len <= off+count) *eof = 1; *start = page + off; len -= off; if (len>count) len = count; if (len<0) len = 0; return_VALUE(len); }
static void acpi_thermal_check ( void *data) { int result = 0; struct acpi_thermal *tz = (struct acpi_thermal *) data; unsigned long sleep_time = 0; int i = 0; struct acpi_thermal_state state = tz->state; ACPI_FUNCTION_TRACE("acpi_thermal_check"); if (!tz) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid (NULL) context.\n")); return_VOID; } result = acpi_thermal_get_temperature(tz); if (result) return_VOID; memset(&tz->state, 0, sizeof(tz->state)); /* * Check Trip Points * ----------------- * Compare the current temperature to the trip point values to see * if we've entered one of the thermal policy states. Note that * this function determines when a state is entered, but the * individual policy decides when it is exited (e.g. hysteresis). */ if (tz->trips.critical.flags.valid) state.critical |= (tz->temperature >= tz->trips.critical.temperature); if (tz->trips.hot.flags.valid) state.hot |= (tz->temperature >= tz->trips.hot.temperature); if (tz->trips.passive.flags.valid) state.passive |= (tz->temperature >= tz->trips.passive.temperature); for (i=0; i<ACPI_THERMAL_MAX_ACTIVE; i++) if (tz->trips.active[i].flags.valid) state.active |= (tz->temperature >= tz->trips.active[i].temperature); /* * Invoke Policy * ------------- * Separated from the above check to allow individual policy to * determine when to exit a given state. */ if (state.critical) acpi_thermal_critical(tz); if (state.hot) acpi_thermal_hot(tz); if (state.passive) acpi_thermal_passive(tz); if (state.active) acpi_thermal_active(tz); /* * Calculate State * --------------- * Again, separated from the above two to allow independent policy * decisions. */ if (tz->trips.critical.flags.enabled) tz->state.critical = 1; if (tz->trips.hot.flags.enabled) tz->state.hot = 1; if (tz->trips.passive.flags.enabled) tz->state.passive = 1; for (i=0; i<ACPI_THERMAL_MAX_ACTIVE; i++) if (tz->trips.active[i].flags.enabled) tz->state.active = 1; /* * Calculate Sleep Time * -------------------- * If we're in the passive state, use _TSP's value. Otherwise * use the default polling frequency (e.g. _TZP). If no polling * frequency is specified then we'll wait forever (at least until * a thermal event occurs). Note that _TSP and _TZD values are * given in 1/10th seconds (we must covert to milliseconds). */ if (tz->state.passive) sleep_time = tz->trips.passive.tsp * 100; else if (tz->polling_frequency > 0) sleep_time = tz->polling_frequency * 100; ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s: temperature[%lu] sleep[%lu]\n", tz->name, tz->temperature, sleep_time)); /* * Schedule Next Poll * ------------------ */ if (!sleep_time) { if (timer_pending(&(tz->timer))) del_timer(&(tz->timer)); } else { if (timer_pending(&(tz->timer))) mod_timer(&(tz->timer), (HZ * sleep_time) / 1000); else { tz->timer.data = (unsigned long) tz; tz->timer.function = acpi_thermal_run; tz->timer.expires = jiffies + (HZ * sleep_time) / 1000; add_timer(&(tz->timer)); } } return_VOID; }