ACPI / fan: Fix error reading cur_state
On some platforms with ACPI4 variable speed fan, reading cur_state from cooling device returns "invalid value" error. This confuses user space applications. This issue occurs as the current driver doesn't take account of "FineGrainControl" from _FIF(Fan Information). When the "FineGrainControl" is set, _FSL(FSL Set Level) takes argument as a percent, which doesn't have to match from any control value from _FPS(Fan Performance States). It is also possible that the Fan is not actually running at the requested speed returning a lower speed. On some platforms the BIOS is setting fan speed to a level during boot, which will not have an exact match to _FPS control values. The current implementation will treat this level as invalid value. The simple change is to atleast return state corresponding to a maximum control value in the _FPS compared to the current level. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Родитель
c8d2bc9bc3
Коммит
84baf1725d
|
@ -129,8 +129,18 @@ static int fan_get_state_acpi4(struct acpi_device *device, unsigned long *state)
|
|||
|
||||
control = obj->package.elements[1].integer.value;
|
||||
for (i = 0; i < fan->fps_count; i++) {
|
||||
if (control == fan->fps[i].control)
|
||||
/*
|
||||
* When Fine Grain Control is set, return the state
|
||||
* corresponding to maximum fan->fps[i].control
|
||||
* value compared to the current speed. Here the
|
||||
* fan->fps[] is sorted array with increasing speed.
|
||||
*/
|
||||
if (fan->fif.fine_grain_ctrl && control < fan->fps[i].control) {
|
||||
i = (i > 0) ? i - 1 : 0;
|
||||
break;
|
||||
} else if (control == fan->fps[i].control) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == fan->fps_count) {
|
||||
dev_dbg(&device->dev, "Invalid control value returned\n");
|
||||
|
|
Загрузка…
Ссылка в новой задаче