static int processor_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) { struct acpi_device *device = cdev->devdata; struct acpi_processor *pr; int result = 0; int max_pstate; if (!device) return -EINVAL; pr = acpi_driver_data(device); if (!pr) return -EINVAL; max_pstate = cpufreq_get_max_state(pr->id); if (state > acpi_processor_max_state(pr)) return -EINVAL; if (state <= max_pstate) { if (pr->flags.throttling && pr->throttling.state) result = acpi_processor_set_throttling(pr, 0, false); cpufreq_set_cur_state(pr->id, state); } else { cpufreq_set_cur_state(pr->id, max_pstate); result = acpi_processor_set_throttling(pr, state - max_pstate, false); } return result; }
/* thermal coolign device callbacks */ static int acpi_processor_max_state(struct acpi_processor *pr) { int max_state = 0; /* * There exists four states according to * cpufreq_thermal_reduction_ptg. 0, 1, 2, 3 */ max_state += cpufreq_get_max_state(pr->id); if (pr->flags.throttling) max_state += (pr->throttling.state_count -1); return max_state; }
static int acpi_processor_max_state(struct acpi_processor *pr) { int max_state = 0; /* */ max_state += cpufreq_get_max_state(pr->id); if (pr->flags.throttling) max_state += (pr->throttling.state_count -1); return max_state; }