@ -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
acpi_video_device_lcd_get_level_current ( struct acpi_video_device * device ,
unsigned long long * level , bool raw )
@ -480,14 +505,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
return 0 ;
}
if ( device - > brightness - > flags . _BQC_use_index ) {
if ( device - > brightness - > flags . _BCL_reversed )
* level = device - > brightness - > count
- 3 - ( * level ) ;
* level = device - > brightness - > levels [ * level + 2 ] ;
* level = acpi_video_bqc_value_to_level ( device , * level ) ;
}
* level + = bqc_offset_aml_bug_workaround ;
for ( i = 2 ; i < device - > brightness - > count ; i + + )
if ( device - > brightness - > levels [ i ] = = * level ) {
device - > brightness - > curr = * level ;
@ -736,24 +755,19 @@ acpi_video_init_brightness(struct acpi_video_device *device)
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 value
* when invoked for the first time , i . e . level_old is invalid .
* s et the backlight to max_level in this case
* On some buggy laptops , _BQC returns an uninitialized
* value when invoked for the first time , i . e .
* level_old is invalid ( no matter whether it ' s a level
* or an index ) . S et the backlight to max_level in this case .
*/
if ( use_bios_initial_backlight ) {
for ( i = 2 ; i < br - > count ; i + + )
if ( level_old = = br - > levels [ i ] ) {
level = level_old ;
break ;
}
}
} else {
if ( br - > flags . _BCL_reversed )
level_old = ( br - > count - 1 ) - level_old ;
level = br - > levels [ level_old ] ;
for ( i = 2 ; i < br - > count ; i + + )
if ( level_old = = br - > levels [ i ] )
break ;
if ( i = = br - > count )
level = max_level ;
}
set_level :