aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/video.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/video.c')
-rw-r--r--drivers/acpi/video.c53
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
292static int acpi_video_get_brightness(struct backlight_device *bd) 292static 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
301static int acpi_video_set_brightness(struct backlight_device *bd) 308static 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
1257static int acpi_video_bus_add_fs(struct acpi_device *device) 1263static 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);