ACPI: video: Fix reversed brightness behavior on ThinkPad SL series
Section B.6.2 of ACPI 3.0b specification that defines _BCL method doesn't require the brightness levels returned to be sorted. At least ThinkPad SL300 (and probably all IdeaPads) returns the array reversed (i.e. bightest levels have lowest indexes), which causes the brightness management behave in completely reversed manner on these machines (brightness increases when the laptop is idle, while the display dims when used). Sorting the array by brightness level values after reading the list fixes the issue. http://bugzilla.kernel.org/show_bug.cgi?id=12037 Signed-off-by: Zhang Rui <rui.zhang@intel.com> Tested-by: Lubomir Rintel <lkundrak@v3.sk> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
6c34bc2976
commit
935e5f290e
|
@ -36,6 +36,7 @@
|
|||
#include <linux/backlight.h>
|
||||
#include <linux/thermal.h>
|
||||
#include <linux/video_output.h>
|
||||
#include <linux/sort.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
|
@ -625,6 +626,16 @@ acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
|
|||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple comparison function used to sort backlight levels.
|
||||
*/
|
||||
|
||||
static int
|
||||
acpi_video_cmp_level(const void *a, const void *b)
|
||||
{
|
||||
return *(int *)a - *(int *)b;
|
||||
}
|
||||
|
||||
/*
|
||||
* Arg:
|
||||
* device : video output device (LCD, CRT, ..)
|
||||
|
@ -676,6 +687,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
|
|||
count++;
|
||||
}
|
||||
|
||||
/* don't sort the first two brightness levels */
|
||||
sort(&br->levels[2], count - 2, sizeof(br->levels[2]),
|
||||
acpi_video_cmp_level, NULL);
|
||||
|
||||
if (count < 2)
|
||||
goto out_free_levels;
|
||||
|
||||
|
|
Loading…
Reference in New Issue