diff options
Diffstat (limited to 'drivers/acpi/fan.c')
-rw-r--r-- | drivers/acpi/fan.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index 384cfc3083e1..6cf4988206f2 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c | |||
@@ -129,8 +129,18 @@ static int fan_get_state_acpi4(struct acpi_device *device, unsigned long *state) | |||
129 | 129 | ||
130 | control = obj->package.elements[1].integer.value; | 130 | control = obj->package.elements[1].integer.value; |
131 | for (i = 0; i < fan->fps_count; i++) { | 131 | for (i = 0; i < fan->fps_count; i++) { |
132 | if (control == fan->fps[i].control) | 132 | /* |
133 | * When Fine Grain Control is set, return the state | ||
134 | * corresponding to maximum fan->fps[i].control | ||
135 | * value compared to the current speed. Here the | ||
136 | * fan->fps[] is sorted array with increasing speed. | ||
137 | */ | ||
138 | if (fan->fif.fine_grain_ctrl && control < fan->fps[i].control) { | ||
139 | i = (i > 0) ? i - 1 : 0; | ||
133 | break; | 140 | break; |
141 | } else if (control == fan->fps[i].control) { | ||
142 | break; | ||
143 | } | ||
134 | } | 144 | } |
135 | if (i == fan->fps_count) { | 145 | if (i == fan->fps_count) { |
136 | dev_dbg(&device->dev, "Invalid control value returned\n"); | 146 | dev_dbg(&device->dev, "Invalid control value returned\n"); |