diff options
Diffstat (limited to 'drivers/acpi/video.c')
-rw-r--r-- | drivers/acpi/video.c | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 44a0d9ba9bd6..a54ff6bce8fa 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 | ||
@@ -577,7 +585,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
577 | struct acpi_video_device_brightness *br = NULL; | 585 | struct acpi_video_device_brightness *br = NULL; |
578 | 586 | ||
579 | 587 | ||
580 | memset(&device->cap, 0, 4); | 588 | memset(&device->cap, 0, sizeof(device->cap)); |
581 | 589 | ||
582 | if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_ADR", &h_dummy1))) { | 590 | if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_ADR", &h_dummy1))) { |
583 | device->cap._ADR = 1; | 591 | device->cap._ADR = 1; |
@@ -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); |
@@ -697,7 +703,7 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video) | |||
697 | { | 703 | { |
698 | acpi_handle h_dummy1; | 704 | acpi_handle h_dummy1; |
699 | 705 | ||
700 | memset(&video->cap, 0, 4); | 706 | memset(&video->cap, 0, sizeof(video->cap)); |
701 | if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_DOS", &h_dummy1))) { | 707 | if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_DOS", &h_dummy1))) { |
702 | video->cap._DOS = 1; | 708 | video->cap._DOS = 1; |
703 | } | 709 | } |
@@ -1256,8 +1262,37 @@ acpi_video_bus_write_DOS(struct file *file, | |||
1256 | 1262 | ||
1257 | static int acpi_video_bus_add_fs(struct acpi_device *device) | 1263 | static int acpi_video_bus_add_fs(struct acpi_device *device) |
1258 | { | 1264 | { |
1265 | long device_id; | ||
1266 | int status; | ||
1259 | struct proc_dir_entry *entry = NULL; | 1267 | struct proc_dir_entry *entry = NULL; |
1260 | struct acpi_video_bus *video; | 1268 | struct acpi_video_bus *video; |
1269 | struct device *dev; | ||
1270 | |||
1271 | status = | ||
1272 | acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); | ||
1273 | |||
1274 | if (!ACPI_SUCCESS(status)) | ||
1275 | return -ENODEV; | ||
1276 | |||
1277 | /* We need to attempt to determine whether the _ADR refers to a | ||
1278 | PCI device or not. There's no terribly good way to do this, | ||
1279 | so the best we can hope for is to assume that there'll never | ||
1280 | be a video device in the host bridge */ | ||
1281 | if (device_id >= 0x10000) { | ||
1282 | /* It looks like a PCI device. Does it exist? */ | ||
1283 | dev = acpi_get_physical_device(device->handle); | ||
1284 | } else { | ||
1285 | /* It doesn't look like a PCI device. Does its parent | ||
1286 | exist? */ | ||
1287 | acpi_handle phandle; | ||
1288 | if (acpi_get_parent(device->handle, &phandle)) | ||
1289 | return -ENODEV; | ||
1290 | dev = acpi_get_physical_device(phandle); | ||
1291 | } | ||
1292 | if (!dev) | ||
1293 | return -ENODEV; | ||
1294 | put_device(dev); | ||
1295 | |||
1261 | 1296 | ||
1262 | 1297 | ||
1263 | video = acpi_driver_data(device); | 1298 | video = acpi_driver_data(device); |