diff options
Diffstat (limited to 'drivers/acpi/video.c')
-rw-r--r-- | drivers/acpi/video.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index bd77e81e81c1..59639c9c6666 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -292,18 +292,26 @@ static int acpi_video_device_set_state(struct acpi_video_device *device, int sta | |||
292 | static int acpi_video_get_brightness(struct backlight_device *bd) | 292 | static int acpi_video_get_brightness(struct backlight_device *bd) |
293 | { | 293 | { |
294 | unsigned long cur_level; | 294 | unsigned long cur_level; |
295 | int i; | ||
295 | struct acpi_video_device *vd = | 296 | struct acpi_video_device *vd = |
296 | (struct acpi_video_device *)bl_get_data(bd); | 297 | (struct acpi_video_device *)bl_get_data(bd); |
297 | acpi_video_device_lcd_get_level_current(vd, &cur_level); | 298 | acpi_video_device_lcd_get_level_current(vd, &cur_level); |
298 | return (int) cur_level; | 299 | for (i = 2; i < vd->brightness->count; i++) { |
300 | if (vd->brightness->levels[i] == cur_level) | ||
301 | /* The first two entries are special - see page 575 | ||
302 | of the ACPI spec 3.0 */ | ||
303 | return i-2; | ||
304 | } | ||
305 | return 0; | ||
299 | } | 306 | } |
300 | 307 | ||
301 | static int acpi_video_set_brightness(struct backlight_device *bd) | 308 | static int acpi_video_set_brightness(struct backlight_device *bd) |
302 | { | 309 | { |
303 | int request_level = bd->props.brightness; | 310 | int request_level = bd->props.brightness+2; |
304 | struct acpi_video_device *vd = | 311 | struct acpi_video_device *vd = |
305 | (struct acpi_video_device *)bl_get_data(bd); | 312 | (struct acpi_video_device *)bl_get_data(bd); |
306 | acpi_video_device_lcd_set_level(vd, request_level); | 313 | acpi_video_device_lcd_set_level(vd, |
314 | vd->brightness->levels[request_level]); | ||
307 | return 0; | 315 | return 0; |
308 | } | 316 | } |
309 | 317 | ||
@@ -652,7 +660,6 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
652 | kfree(obj); | 660 | kfree(obj); |
653 | 661 | ||
654 | if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){ | 662 | if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){ |
655 | unsigned long tmp; | ||
656 | static int count = 0; | 663 | static int count = 0; |
657 | char *name; | 664 | char *name; |
658 | name = kzalloc(MAX_NAME_LEN, GFP_KERNEL); | 665 | name = kzalloc(MAX_NAME_LEN, GFP_KERNEL); |
@@ -660,11 +667,10 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
660 | return; | 667 | return; |
661 | 668 | ||
662 | sprintf(name, "acpi_video%d", count++); | 669 | sprintf(name, "acpi_video%d", count++); |
663 | acpi_video_device_lcd_get_level_current(device, &tmp); | ||
664 | device->backlight = backlight_device_register(name, | 670 | device->backlight = backlight_device_register(name, |
665 | NULL, device, &acpi_backlight_ops); | 671 | NULL, device, &acpi_backlight_ops); |
666 | device->backlight->props.max_brightness = max_level; | 672 | device->backlight->props.max_brightness = device->brightness->count-3; |
667 | device->backlight->props.brightness = (int)tmp; | 673 | device->backlight->props.brightness = acpi_video_get_brightness(device->backlight); |
668 | backlight_update_status(device->backlight); | 674 | backlight_update_status(device->backlight); |
669 | 675 | ||
670 | kfree(name); | 676 | kfree(name); |