Commit 994fa63c authored by Danny Baumann's avatar Danny Baumann Committed by Rafael J. Wysocki

ACPI / video: Fix applying indexed initial brightness value.

The value initially read via _BQC also needs to be offset by 2 to
compensate for the first 2 special items in _BCL. Introduce a helper
function that does the BQC-value-to-level conversion in order to not
needlessly duplicate code.
Signed-off-by: default avatarDanny Baumann <dannybaumann@web.de>
Reviewed-by: default avatarAaron Lu <aaron.lu@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 2d4128a2
...@@ -458,6 +458,31 @@ static struct dmi_system_id video_dmi_table[] __initdata = { ...@@ -458,6 +458,31 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
{} {}
}; };
static unsigned long long
acpi_video_bqc_value_to_level(struct acpi_video_device *device,
unsigned long long bqc_value)
{
unsigned long long level;
if (device->brightness->flags._BQC_use_index) {
/*
* _BQC returns an index that doesn't account for
* the first 2 items with special meaning, so we need
* to compensate for that by offsetting ourselves
*/
if (device->brightness->flags._BCL_reversed)
bqc_value = device->brightness->count - 3 - bqc_value;
level = device->brightness->levels[bqc_value + 2];
} else {
level = bqc_value;
}
level += bqc_offset_aml_bug_workaround;
return level;
}
static int static int
acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
unsigned long long *level, bool raw) unsigned long long *level, bool raw)
...@@ -480,14 +505,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, ...@@ -480,14 +505,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
return 0; return 0;
} }
if (device->brightness->flags._BQC_use_index) { *level = acpi_video_bqc_value_to_level(device, *level);
if (device->brightness->flags._BCL_reversed)
*level = device->brightness->count
- 3 - (*level);
*level = device->brightness->levels[*level + 2];
}
*level += bqc_offset_aml_bug_workaround;
for (i = 2; i < device->brightness->count; i++) for (i = 2; i < device->brightness->count; i++)
if (device->brightness->levels[i] == *level) { if (device->brightness->levels[i] == *level) {
device->brightness->curr = *level; device->brightness->curr = *level;
...@@ -736,24 +755,19 @@ acpi_video_init_brightness(struct acpi_video_device *device) ...@@ -736,24 +755,19 @@ acpi_video_init_brightness(struct acpi_video_device *device)
br->flags._BQC_use_index = (level == max_level ? 0 : 1); br->flags._BQC_use_index = (level == max_level ? 0 : 1);
if (!br->flags._BQC_use_index) { if (use_bios_initial_backlight) {
level = acpi_video_bqc_value_to_level(device, level_old);
/* /*
* Set the backlight to the initial state. * On some buggy laptops, _BQC returns an uninitialized
* On some buggy laptops, _BQC returns an uninitialized value * value when invoked for the first time, i.e.
* when invoked for the first time, i.e. level_old is invalid. * level_old is invalid (no matter whether it's a level
* set the backlight to max_level in this case * or an index). Set the backlight to max_level in this case.
*/ */
if (use_bios_initial_backlight) { for (i = 2; i < br->count; i++)
for (i = 2; i < br->count; i++) if (level_old == br->levels[i])
if (level_old == br->levels[i]) { break;
level = level_old; if (i == br->count)
break; level = max_level;
}
}
} else {
if (br->flags._BCL_reversed)
level_old = (br->count - 1) - level_old;
level = br->levels[level_old];
} }
set_level: set_level:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment