1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * video.c - ACPI Video Driver 4 * 5 * Copyright (C) 2004 Luming Yu <luming.yu@intel.com> 6 * Copyright (C) 2004 Bruno Ducrot <ducrot@poupinou.org> 7 * Copyright (C) 2006 Thomas Tuttle <linux-kernel@ttuttle.net> 8 */ 9 10 #include <linux/kernel.h> 11 #include <linux/module.h> 12 #include <linux/init.h> 13 #include <linux/types.h> 14 #include <linux/list.h> 15 #include <linux/mutex.h> 16 #include <linux/input.h> 17 #include <linux/backlight.h> 18 #include <linux/thermal.h> 19 #include <linux/sort.h> 20 #include <linux/pci.h> 21 #include <linux/pci_ids.h> 22 #include <linux/slab.h> 23 #include <linux/dmi.h> 24 #include <linux/suspend.h> 25 #include <linux/acpi.h> 26 #include <acpi/video.h> 27 #include <linux/uaccess.h> 28 29 #define PREFIX "ACPI: " 30 31 #define ACPI_VIDEO_BUS_NAME "Video Bus" 32 #define ACPI_VIDEO_DEVICE_NAME "Video Device" 33 34 #define MAX_NAME_LEN 20 35 36 #define _COMPONENT ACPI_VIDEO_COMPONENT 37 ACPI_MODULE_NAME("video"); 38 39 MODULE_AUTHOR("Bruno Ducrot"); 40 MODULE_DESCRIPTION("ACPI Video Driver"); 41 MODULE_LICENSE("GPL"); 42 43 static bool brightness_switch_enabled = true; 44 module_param(brightness_switch_enabled, bool, 0644); 45 46 /* 47 * By default, we don't allow duplicate ACPI video bus devices 48 * under the same VGA controller 49 */ 50 static bool allow_duplicates; 51 module_param(allow_duplicates, bool, 0644); 52 53 static int disable_backlight_sysfs_if = -1; 54 module_param(disable_backlight_sysfs_if, int, 0444); 55 56 #define REPORT_OUTPUT_KEY_EVENTS 0x01 57 #define REPORT_BRIGHTNESS_KEY_EVENTS 0x02 58 static int report_key_events = -1; 59 module_param(report_key_events, int, 0644); 60 MODULE_PARM_DESC(report_key_events, 61 "0: none, 1: output changes, 2: brightness changes, 3: all"); 62 63 static int hw_changes_brightness = -1; 64 module_param(hw_changes_brightness, int, 0644); 65 MODULE_PARM_DESC(hw_changes_brightness, 66 "Set this to 1 on buggy hw which changes the brightness itself when " 67 "a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness"); 68 69 /* 70 * Whether the struct acpi_video_device_attrib::device_id_scheme bit should be 71 * assumed even if not actually set. 72 */ 73 static bool device_id_scheme = false; 74 module_param(device_id_scheme, bool, 0444); 75 76 static int only_lcd = -1; 77 module_param(only_lcd, int, 0444); 78 79 static int register_count; 80 static DEFINE_MUTEX(register_count_mutex); 81 static DEFINE_MUTEX(video_list_lock); 82 static LIST_HEAD(video_bus_head); 83 static int acpi_video_bus_add(struct acpi_device *device); 84 static int acpi_video_bus_remove(struct acpi_device *device); 85 static void acpi_video_bus_notify(struct acpi_device *device, u32 event); 86 void acpi_video_detect_exit(void); 87 88 /* 89 * Indices in the _BCL method response: the first two items are special, 90 * the rest are all supported levels. 91 * 92 * See page 575 of the ACPI spec 3.0 93 */ 94 enum acpi_video_level_idx { 95 ACPI_VIDEO_AC_LEVEL, /* level when machine has full power */ 96 ACPI_VIDEO_BATTERY_LEVEL, /* level when machine is on batteries */ 97 ACPI_VIDEO_FIRST_LEVEL, /* actual supported levels begin here */ 98 }; 99 100 static const struct acpi_device_id video_device_ids[] = { 101 {ACPI_VIDEO_HID, 0}, 102 {"", 0}, 103 }; 104 MODULE_DEVICE_TABLE(acpi, video_device_ids); 105 106 static struct acpi_driver acpi_video_bus = { 107 .name = "video", 108 .class = ACPI_VIDEO_CLASS, 109 .ids = video_device_ids, 110 .ops = { 111 .add = acpi_video_bus_add, 112 .remove = acpi_video_bus_remove, 113 .notify = acpi_video_bus_notify, 114 }, 115 }; 116 117 struct acpi_video_bus_flags { 118 u8 multihead:1; /* can switch video heads */ 119 u8 rom:1; /* can retrieve a video rom */ 120 u8 post:1; /* can configure the head to */ 121 u8 reserved:5; 122 }; 123 124 struct acpi_video_bus_cap { 125 u8 _DOS:1; /* Enable/Disable output switching */ 126 u8 _DOD:1; /* Enumerate all devices attached to display adapter */ 127 u8 _ROM:1; /* Get ROM Data */ 128 u8 _GPD:1; /* Get POST Device */ 129 u8 _SPD:1; /* Set POST Device */ 130 u8 _VPO:1; /* Video POST Options */ 131 u8 reserved:2; 132 }; 133 134 struct acpi_video_device_attrib { 135 u32 display_index:4; /* A zero-based instance of the Display */ 136 u32 display_port_attachment:4; /* This field differentiates the display type */ 137 u32 display_type:4; /* Describe the specific type in use */ 138 u32 vendor_specific:4; /* Chipset Vendor Specific */ 139 u32 bios_can_detect:1; /* BIOS can detect the device */ 140 u32 depend_on_vga:1; /* Non-VGA output device whose power is related to 141 the VGA device. */ 142 u32 pipe_id:3; /* For VGA multiple-head devices. */ 143 u32 reserved:10; /* Must be 0 */ 144 145 /* 146 * The device ID might not actually follow the scheme described by this 147 * struct acpi_video_device_attrib. If it does, then this bit 148 * device_id_scheme is set; otherwise, other fields should be ignored. 149 * 150 * (but also see the global flag device_id_scheme) 151 */ 152 u32 device_id_scheme:1; 153 }; 154 155 struct acpi_video_enumerated_device { 156 union { 157 u32 int_val; 158 struct acpi_video_device_attrib attrib; 159 } value; 160 struct acpi_video_device *bind_info; 161 }; 162 163 struct acpi_video_bus { 164 struct acpi_device *device; 165 bool backlight_registered; 166 u8 dos_setting; 167 struct acpi_video_enumerated_device *attached_array; 168 u8 attached_count; 169 u8 child_count; 170 struct acpi_video_bus_cap cap; 171 struct acpi_video_bus_flags flags; 172 struct list_head video_device_list; 173 struct mutex device_list_lock; /* protects video_device_list */ 174 struct list_head entry; 175 struct input_dev *input; 176 char phys[32]; /* for input device */ 177 struct notifier_block pm_nb; 178 }; 179 180 struct acpi_video_device_flags { 181 u8 crt:1; 182 u8 lcd:1; 183 u8 tvout:1; 184 u8 dvi:1; 185 u8 bios:1; 186 u8 unknown:1; 187 u8 notify:1; 188 u8 reserved:1; 189 }; 190 191 struct acpi_video_device_cap { 192 u8 _ADR:1; /* Return the unique ID */ 193 u8 _BCL:1; /* Query list of brightness control levels supported */ 194 u8 _BCM:1; /* Set the brightness level */ 195 u8 _BQC:1; /* Get current brightness level */ 196 u8 _BCQ:1; /* Some buggy BIOS uses _BCQ instead of _BQC */ 197 u8 _DDC:1; /* Return the EDID for this device */ 198 }; 199 200 struct acpi_video_device { 201 unsigned long device_id; 202 struct acpi_video_device_flags flags; 203 struct acpi_video_device_cap cap; 204 struct list_head entry; 205 struct delayed_work switch_brightness_work; 206 int switch_brightness_event; 207 struct acpi_video_bus *video; 208 struct acpi_device *dev; 209 struct acpi_video_device_brightness *brightness; 210 struct backlight_device *backlight; 211 struct thermal_cooling_device *cooling_dev; 212 }; 213 214 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data); 215 static void acpi_video_device_rebind(struct acpi_video_bus *video); 216 static void acpi_video_device_bind(struct acpi_video_bus *video, 217 struct acpi_video_device *device); 218 static int acpi_video_device_enumerate(struct acpi_video_bus *video); 219 static int acpi_video_device_lcd_set_level(struct acpi_video_device *device, 220 int level); 221 static int acpi_video_device_lcd_get_level_current( 222 struct acpi_video_device *device, 223 unsigned long long *level, bool raw); 224 static int acpi_video_get_next_level(struct acpi_video_device *device, 225 u32 level_current, u32 event); 226 static void acpi_video_switch_brightness(struct work_struct *work); 227 228 /* backlight device sysfs support */ 229 static int acpi_video_get_brightness(struct backlight_device *bd) 230 { 231 unsigned long long cur_level; 232 int i; 233 struct acpi_video_device *vd = bl_get_data(bd); 234 235 if (acpi_video_device_lcd_get_level_current(vd, &cur_level, false)) 236 return -EINVAL; 237 for (i = ACPI_VIDEO_FIRST_LEVEL; i < vd->brightness->count; i++) { 238 if (vd->brightness->levels[i] == cur_level) 239 return i - ACPI_VIDEO_FIRST_LEVEL; 240 } 241 return 0; 242 } 243 244 static int acpi_video_set_brightness(struct backlight_device *bd) 245 { 246 int request_level = bd->props.brightness + ACPI_VIDEO_FIRST_LEVEL; 247 struct acpi_video_device *vd = bl_get_data(bd); 248 249 cancel_delayed_work(&vd->switch_brightness_work); 250 return acpi_video_device_lcd_set_level(vd, 251 vd->brightness->levels[request_level]); 252 } 253 254 static const struct backlight_ops acpi_backlight_ops = { 255 .get_brightness = acpi_video_get_brightness, 256 .update_status = acpi_video_set_brightness, 257 }; 258 259 /* thermal cooling device callbacks */ 260 static int video_get_max_state(struct thermal_cooling_device *cooling_dev, 261 unsigned long *state) 262 { 263 struct acpi_device *device = cooling_dev->devdata; 264 struct acpi_video_device *video = acpi_driver_data(device); 265 266 *state = video->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1; 267 return 0; 268 } 269 270 static int video_get_cur_state(struct thermal_cooling_device *cooling_dev, 271 unsigned long *state) 272 { 273 struct acpi_device *device = cooling_dev->devdata; 274 struct acpi_video_device *video = acpi_driver_data(device); 275 unsigned long long level; 276 int offset; 277 278 if (acpi_video_device_lcd_get_level_current(video, &level, false)) 279 return -EINVAL; 280 for (offset = ACPI_VIDEO_FIRST_LEVEL; offset < video->brightness->count; 281 offset++) 282 if (level == video->brightness->levels[offset]) { 283 *state = video->brightness->count - offset - 1; 284 return 0; 285 } 286 287 return -EINVAL; 288 } 289 290 static int 291 video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long state) 292 { 293 struct acpi_device *device = cooling_dev->devdata; 294 struct acpi_video_device *video = acpi_driver_data(device); 295 int level; 296 297 if (state >= video->brightness->count - ACPI_VIDEO_FIRST_LEVEL) 298 return -EINVAL; 299 300 state = video->brightness->count - state; 301 level = video->brightness->levels[state - 1]; 302 return acpi_video_device_lcd_set_level(video, level); 303 } 304 305 static const struct thermal_cooling_device_ops video_cooling_ops = { 306 .get_max_state = video_get_max_state, 307 .get_cur_state = video_get_cur_state, 308 .set_cur_state = video_set_cur_state, 309 }; 310 311 /* 312 * -------------------------------------------------------------------------- 313 * Video Management 314 * -------------------------------------------------------------------------- 315 */ 316 317 static int 318 acpi_video_device_lcd_query_levels(acpi_handle handle, 319 union acpi_object **levels) 320 { 321 int status; 322 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 323 union acpi_object *obj; 324 325 326 *levels = NULL; 327 328 status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer); 329 if (!ACPI_SUCCESS(status)) 330 return status; 331 obj = (union acpi_object *)buffer.pointer; 332 if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) { 333 printk(KERN_ERR PREFIX "Invalid _BCL data\n"); 334 status = -EFAULT; 335 goto err; 336 } 337 338 *levels = obj; 339 340 return 0; 341 342 err: 343 kfree(buffer.pointer); 344 345 return status; 346 } 347 348 static int 349 acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level) 350 { 351 int status; 352 int state; 353 354 status = acpi_execute_simple_method(device->dev->handle, 355 "_BCM", level); 356 if (ACPI_FAILURE(status)) { 357 ACPI_ERROR((AE_INFO, "Evaluating _BCM failed")); 358 return -EIO; 359 } 360 361 device->brightness->curr = level; 362 for (state = ACPI_VIDEO_FIRST_LEVEL; state < device->brightness->count; 363 state++) 364 if (level == device->brightness->levels[state]) { 365 if (device->backlight) 366 device->backlight->props.brightness = 367 state - ACPI_VIDEO_FIRST_LEVEL; 368 return 0; 369 } 370 371 ACPI_ERROR((AE_INFO, "Current brightness invalid")); 372 return -EINVAL; 373 } 374 375 /* 376 * For some buggy _BQC methods, we need to add a constant value to 377 * the _BQC return value to get the actual current brightness level 378 */ 379 380 static int bqc_offset_aml_bug_workaround; 381 static int video_set_bqc_offset(const struct dmi_system_id *d) 382 { 383 bqc_offset_aml_bug_workaround = 9; 384 return 0; 385 } 386 387 static int video_disable_backlight_sysfs_if( 388 const struct dmi_system_id *d) 389 { 390 if (disable_backlight_sysfs_if == -1) 391 disable_backlight_sysfs_if = 1; 392 return 0; 393 } 394 395 static int video_set_device_id_scheme(const struct dmi_system_id *d) 396 { 397 device_id_scheme = true; 398 return 0; 399 } 400 401 static int video_enable_only_lcd(const struct dmi_system_id *d) 402 { 403 only_lcd = true; 404 return 0; 405 } 406 407 static int video_set_report_key_events(const struct dmi_system_id *id) 408 { 409 if (report_key_events == -1) 410 report_key_events = (uintptr_t)id->driver_data; 411 return 0; 412 } 413 414 static int video_hw_changes_brightness( 415 const struct dmi_system_id *d) 416 { 417 if (hw_changes_brightness == -1) 418 hw_changes_brightness = 1; 419 return 0; 420 } 421 422 static const struct dmi_system_id video_dmi_table[] = { 423 /* 424 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 425 */ 426 { 427 .callback = video_set_bqc_offset, 428 .ident = "Acer Aspire 5720", 429 .matches = { 430 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 431 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), 432 }, 433 }, 434 { 435 .callback = video_set_bqc_offset, 436 .ident = "Acer Aspire 5710Z", 437 .matches = { 438 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 439 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710Z"), 440 }, 441 }, 442 { 443 .callback = video_set_bqc_offset, 444 .ident = "eMachines E510", 445 .matches = { 446 DMI_MATCH(DMI_BOARD_VENDOR, "EMACHINES"), 447 DMI_MATCH(DMI_PRODUCT_NAME, "eMachines E510"), 448 }, 449 }, 450 { 451 .callback = video_set_bqc_offset, 452 .ident = "Acer Aspire 5315", 453 .matches = { 454 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 455 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"), 456 }, 457 }, 458 { 459 .callback = video_set_bqc_offset, 460 .ident = "Acer Aspire 7720", 461 .matches = { 462 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 463 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), 464 }, 465 }, 466 467 /* 468 * Some machines have a broken acpi-video interface for brightness 469 * control, but still need an acpi_video_device_lcd_set_level() call 470 * on resume to turn the backlight power on. We Enable backlight 471 * control on these systems, but do not register a backlight sysfs 472 * as brightness control does not work. 473 */ 474 { 475 /* https://bugzilla.kernel.org/show_bug.cgi?id=21012 */ 476 .callback = video_disable_backlight_sysfs_if, 477 .ident = "Toshiba Portege R700", 478 .matches = { 479 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 480 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R700"), 481 }, 482 }, 483 { 484 /* https://bugs.freedesktop.org/show_bug.cgi?id=82634 */ 485 .callback = video_disable_backlight_sysfs_if, 486 .ident = "Toshiba Portege R830", 487 .matches = { 488 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 489 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R830"), 490 }, 491 }, 492 { 493 /* https://bugzilla.kernel.org/show_bug.cgi?id=21012 */ 494 .callback = video_disable_backlight_sysfs_if, 495 .ident = "Toshiba Satellite R830", 496 .matches = { 497 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 498 DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE R830"), 499 }, 500 }, 501 /* 502 * Some machine's _DOD IDs don't have bit 31(Device ID Scheme) set 503 * but the IDs actually follow the Device ID Scheme. 504 */ 505 { 506 /* https://bugzilla.kernel.org/show_bug.cgi?id=104121 */ 507 .callback = video_set_device_id_scheme, 508 .ident = "ESPRIMO Mobile M9410", 509 .matches = { 510 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 511 DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"), 512 }, 513 }, 514 /* 515 * Some machines have multiple video output devices, but only the one 516 * that is the type of LCD can do the backlight control so we should not 517 * register backlight interface for other video output devices. 518 */ 519 { 520 /* https://bugzilla.kernel.org/show_bug.cgi?id=104121 */ 521 .callback = video_enable_only_lcd, 522 .ident = "ESPRIMO Mobile M9410", 523 .matches = { 524 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 525 DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"), 526 }, 527 }, 528 /* 529 * Some machines report wrong key events on the acpi-bus, suppress 530 * key event reporting on these. Note this is only intended to work 531 * around events which are plain wrong. In some cases we get double 532 * events, in this case acpi-video is considered the canonical source 533 * and the events from the other source should be filtered. E.g. 534 * by calling acpi_video_handles_brightness_key_presses() from the 535 * vendor acpi/wmi driver or by using /lib/udev/hwdb.d/60-keyboard.hwdb 536 */ 537 { 538 .callback = video_set_report_key_events, 539 .driver_data = (void *)((uintptr_t)REPORT_OUTPUT_KEY_EVENTS), 540 .ident = "Dell Vostro V131", 541 .matches = { 542 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 543 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"), 544 }, 545 }, 546 /* 547 * Some machines change the brightness themselves when a brightness 548 * hotkey gets pressed, despite us telling them not to. In this case 549 * acpi_video_device_notify() should only call backlight_force_update( 550 * BACKLIGHT_UPDATE_HOTKEY) and not do anything else. 551 */ 552 { 553 /* https://bugzilla.kernel.org/show_bug.cgi?id=204077 */ 554 .callback = video_hw_changes_brightness, 555 .ident = "Packard Bell EasyNote MZ35", 556 .matches = { 557 DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"), 558 DMI_MATCH(DMI_PRODUCT_NAME, "EasyNote MZ35"), 559 }, 560 }, 561 {} 562 }; 563 564 static unsigned long long 565 acpi_video_bqc_value_to_level(struct acpi_video_device *device, 566 unsigned long long bqc_value) 567 { 568 unsigned long long level; 569 570 if (device->brightness->flags._BQC_use_index) { 571 /* 572 * _BQC returns an index that doesn't account for the first 2 573 * items with special meaning (see enum acpi_video_level_idx), 574 * so we need to compensate for that by offsetting ourselves 575 */ 576 if (device->brightness->flags._BCL_reversed) 577 bqc_value = device->brightness->count - 578 ACPI_VIDEO_FIRST_LEVEL - 1 - bqc_value; 579 580 level = device->brightness->levels[bqc_value + 581 ACPI_VIDEO_FIRST_LEVEL]; 582 } else { 583 level = bqc_value; 584 } 585 586 level += bqc_offset_aml_bug_workaround; 587 588 return level; 589 } 590 591 static int 592 acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, 593 unsigned long long *level, bool raw) 594 { 595 acpi_status status = AE_OK; 596 int i; 597 598 if (device->cap._BQC || device->cap._BCQ) { 599 char *buf = device->cap._BQC ? "_BQC" : "_BCQ"; 600 601 status = acpi_evaluate_integer(device->dev->handle, buf, 602 NULL, level); 603 if (ACPI_SUCCESS(status)) { 604 if (raw) { 605 /* 606 * Caller has indicated he wants the raw 607 * value returned by _BQC, so don't furtherly 608 * mess with the value. 609 */ 610 return 0; 611 } 612 613 *level = acpi_video_bqc_value_to_level(device, *level); 614 615 for (i = ACPI_VIDEO_FIRST_LEVEL; 616 i < device->brightness->count; i++) 617 if (device->brightness->levels[i] == *level) { 618 device->brightness->curr = *level; 619 return 0; 620 } 621 /* 622 * BQC returned an invalid level. 623 * Stop using it. 624 */ 625 ACPI_WARNING((AE_INFO, 626 "%s returned an invalid level", 627 buf)); 628 device->cap._BQC = device->cap._BCQ = 0; 629 } else { 630 /* 631 * Fixme: 632 * should we return an error or ignore this failure? 633 * dev->brightness->curr is a cached value which stores 634 * the correct current backlight level in most cases. 635 * ACPI video backlight still works w/ buggy _BQC. 636 * http://bugzilla.kernel.org/show_bug.cgi?id=12233 637 */ 638 ACPI_WARNING((AE_INFO, "Evaluating %s failed", buf)); 639 device->cap._BQC = device->cap._BCQ = 0; 640 } 641 } 642 643 *level = device->brightness->curr; 644 return 0; 645 } 646 647 static int 648 acpi_video_device_EDID(struct acpi_video_device *device, 649 union acpi_object **edid, ssize_t length) 650 { 651 int status; 652 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 653 union acpi_object *obj; 654 union acpi_object arg0 = { ACPI_TYPE_INTEGER }; 655 struct acpi_object_list args = { 1, &arg0 }; 656 657 658 *edid = NULL; 659 660 if (!device) 661 return -ENODEV; 662 if (length == 128) 663 arg0.integer.value = 1; 664 else if (length == 256) 665 arg0.integer.value = 2; 666 else 667 return -EINVAL; 668 669 status = acpi_evaluate_object(device->dev->handle, "_DDC", &args, &buffer); 670 if (ACPI_FAILURE(status)) 671 return -ENODEV; 672 673 obj = buffer.pointer; 674 675 if (obj && obj->type == ACPI_TYPE_BUFFER) 676 *edid = obj; 677 else { 678 printk(KERN_ERR PREFIX "Invalid _DDC data\n"); 679 status = -EFAULT; 680 kfree(obj); 681 } 682 683 return status; 684 } 685 686 /* bus */ 687 688 /* 689 * Arg: 690 * video : video bus device pointer 691 * bios_flag : 692 * 0. The system BIOS should NOT automatically switch(toggle) 693 * the active display output. 694 * 1. The system BIOS should automatically switch (toggle) the 695 * active display output. No switch event. 696 * 2. The _DGS value should be locked. 697 * 3. The system BIOS should not automatically switch (toggle) the 698 * active display output, but instead generate the display switch 699 * event notify code. 700 * lcd_flag : 701 * 0. The system BIOS should automatically control the brightness level 702 * of the LCD when: 703 * - the power changes from AC to DC (ACPI appendix B) 704 * - a brightness hotkey gets pressed (implied by Win7/8 backlight docs) 705 * 1. The system BIOS should NOT automatically control the brightness 706 * level of the LCD when: 707 * - the power changes from AC to DC (ACPI appendix B) 708 * - a brightness hotkey gets pressed (implied by Win7/8 backlight docs) 709 * Return Value: 710 * -EINVAL wrong arg. 711 */ 712 713 static int 714 acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) 715 { 716 acpi_status status; 717 718 if (!video->cap._DOS) 719 return 0; 720 721 if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1) 722 return -EINVAL; 723 video->dos_setting = (lcd_flag << 2) | bios_flag; 724 status = acpi_execute_simple_method(video->device->handle, "_DOS", 725 (lcd_flag << 2) | bios_flag); 726 if (ACPI_FAILURE(status)) 727 return -EIO; 728 729 return 0; 730 } 731 732 /* 733 * Simple comparison function used to sort backlight levels. 734 */ 735 736 static int 737 acpi_video_cmp_level(const void *a, const void *b) 738 { 739 return *(int *)a - *(int *)b; 740 } 741 742 /* 743 * Decides if _BQC/_BCQ for this system is usable 744 * 745 * We do this by changing the level first and then read out the current 746 * brightness level, if the value does not match, find out if it is using 747 * index. If not, clear the _BQC/_BCQ capability. 748 */ 749 static int acpi_video_bqc_quirk(struct acpi_video_device *device, 750 int max_level, int current_level) 751 { 752 struct acpi_video_device_brightness *br = device->brightness; 753 int result; 754 unsigned long long level; 755 int test_level; 756 757 /* don't mess with existing known broken systems */ 758 if (bqc_offset_aml_bug_workaround) 759 return 0; 760 761 /* 762 * Some systems always report current brightness level as maximum 763 * through _BQC, we need to test another value for them. However, 764 * there is a subtlety: 765 * 766 * If the _BCL package ordering is descending, the first level 767 * (br->levels[2]) is likely to be 0, and if the number of levels 768 * matches the number of steps, we might confuse a returned level to 769 * mean the index. 770 * 771 * For example: 772 * 773 * current_level = max_level = 100 774 * test_level = 0 775 * returned level = 100 776 * 777 * In this case 100 means the level, not the index, and _BCM failed. 778 * Still, if the _BCL package ordering is descending, the index of 779 * level 0 is also 100, so we assume _BQC is indexed, when it's not. 780 * 781 * This causes all _BQC calls to return bogus values causing weird 782 * behavior from the user's perspective. For example: 783 * 784 * xbacklight -set 10; xbacklight -set 20; 785 * 786 * would flash to 90% and then slowly down to the desired level (20). 787 * 788 * The solution is simple; test anything other than the first level 789 * (e.g. 1). 790 */ 791 test_level = current_level == max_level 792 ? br->levels[ACPI_VIDEO_FIRST_LEVEL + 1] 793 : max_level; 794 795 result = acpi_video_device_lcd_set_level(device, test_level); 796 if (result) 797 return result; 798 799 result = acpi_video_device_lcd_get_level_current(device, &level, true); 800 if (result) 801 return result; 802 803 if (level != test_level) { 804 /* buggy _BQC found, need to find out if it uses index */ 805 if (level < br->count) { 806 if (br->flags._BCL_reversed) 807 level = br->count - ACPI_VIDEO_FIRST_LEVEL - 1 - level; 808 if (br->levels[level + ACPI_VIDEO_FIRST_LEVEL] == test_level) 809 br->flags._BQC_use_index = 1; 810 } 811 812 if (!br->flags._BQC_use_index) 813 device->cap._BQC = device->cap._BCQ = 0; 814 } 815 816 return 0; 817 } 818 819 int acpi_video_get_levels(struct acpi_device *device, 820 struct acpi_video_device_brightness **dev_br, 821 int *pmax_level) 822 { 823 union acpi_object *obj = NULL; 824 int i, max_level = 0, count = 0, level_ac_battery = 0; 825 union acpi_object *o; 826 struct acpi_video_device_brightness *br = NULL; 827 int result = 0; 828 u32 value; 829 830 if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device->handle, 831 &obj))) { 832 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " 833 "LCD brightness level\n")); 834 result = -ENODEV; 835 goto out; 836 } 837 838 if (obj->package.count < ACPI_VIDEO_FIRST_LEVEL) { 839 result = -EINVAL; 840 goto out; 841 } 842 843 br = kzalloc(sizeof(*br), GFP_KERNEL); 844 if (!br) { 845 printk(KERN_ERR "can't allocate memory\n"); 846 result = -ENOMEM; 847 goto out; 848 } 849 850 /* 851 * Note that we have to reserve 2 extra items (ACPI_VIDEO_FIRST_LEVEL), 852 * in order to account for buggy BIOS which don't export the first two 853 * special levels (see below) 854 */ 855 br->levels = kmalloc_array(obj->package.count + ACPI_VIDEO_FIRST_LEVEL, 856 sizeof(*br->levels), 857 GFP_KERNEL); 858 if (!br->levels) { 859 result = -ENOMEM; 860 goto out_free; 861 } 862 863 for (i = 0; i < obj->package.count; i++) { 864 o = (union acpi_object *)&obj->package.elements[i]; 865 if (o->type != ACPI_TYPE_INTEGER) { 866 printk(KERN_ERR PREFIX "Invalid data\n"); 867 continue; 868 } 869 value = (u32) o->integer.value; 870 /* Skip duplicate entries */ 871 if (count > ACPI_VIDEO_FIRST_LEVEL 872 && br->levels[count - 1] == value) 873 continue; 874 875 br->levels[count] = value; 876 877 if (br->levels[count] > max_level) 878 max_level = br->levels[count]; 879 count++; 880 } 881 882 /* 883 * some buggy BIOS don't export the levels 884 * when machine is on AC/Battery in _BCL package. 885 * In this case, the first two elements in _BCL packages 886 * are also supported brightness levels that OS should take care of. 887 */ 888 for (i = ACPI_VIDEO_FIRST_LEVEL; i < count; i++) { 889 if (br->levels[i] == br->levels[ACPI_VIDEO_AC_LEVEL]) 890 level_ac_battery++; 891 if (br->levels[i] == br->levels[ACPI_VIDEO_BATTERY_LEVEL]) 892 level_ac_battery++; 893 } 894 895 if (level_ac_battery < ACPI_VIDEO_FIRST_LEVEL) { 896 level_ac_battery = ACPI_VIDEO_FIRST_LEVEL - level_ac_battery; 897 br->flags._BCL_no_ac_battery_levels = 1; 898 for (i = (count - 1 + level_ac_battery); 899 i >= ACPI_VIDEO_FIRST_LEVEL; i--) 900 br->levels[i] = br->levels[i - level_ac_battery]; 901 count += level_ac_battery; 902 } else if (level_ac_battery > ACPI_VIDEO_FIRST_LEVEL) 903 ACPI_ERROR((AE_INFO, "Too many duplicates in _BCL package")); 904 905 /* Check if the _BCL package is in a reversed order */ 906 if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) { 907 br->flags._BCL_reversed = 1; 908 sort(&br->levels[ACPI_VIDEO_FIRST_LEVEL], 909 count - ACPI_VIDEO_FIRST_LEVEL, 910 sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]), 911 acpi_video_cmp_level, NULL); 912 } else if (max_level != br->levels[count - 1]) 913 ACPI_ERROR((AE_INFO, 914 "Found unordered _BCL package")); 915 916 br->count = count; 917 *dev_br = br; 918 if (pmax_level) 919 *pmax_level = max_level; 920 921 out: 922 kfree(obj); 923 return result; 924 out_free: 925 kfree(br); 926 goto out; 927 } 928 EXPORT_SYMBOL(acpi_video_get_levels); 929 930 /* 931 * Arg: 932 * device : video output device (LCD, CRT, ..) 933 * 934 * Return Value: 935 * Maximum brightness level 936 * 937 * Allocate and initialize device->brightness. 938 */ 939 940 static int 941 acpi_video_init_brightness(struct acpi_video_device *device) 942 { 943 int i, max_level = 0; 944 unsigned long long level, level_old; 945 struct acpi_video_device_brightness *br = NULL; 946 int result = -EINVAL; 947 948 result = acpi_video_get_levels(device->dev, &br, &max_level); 949 if (result) 950 return result; 951 device->brightness = br; 952 953 /* _BQC uses INDEX while _BCL uses VALUE in some laptops */ 954 br->curr = level = max_level; 955 956 if (!device->cap._BQC) 957 goto set_level; 958 959 result = acpi_video_device_lcd_get_level_current(device, 960 &level_old, true); 961 if (result) 962 goto out_free_levels; 963 964 result = acpi_video_bqc_quirk(device, max_level, level_old); 965 if (result) 966 goto out_free_levels; 967 /* 968 * cap._BQC may get cleared due to _BQC is found to be broken 969 * in acpi_video_bqc_quirk, so check again here. 970 */ 971 if (!device->cap._BQC) 972 goto set_level; 973 974 level = acpi_video_bqc_value_to_level(device, level_old); 975 /* 976 * On some buggy laptops, _BQC returns an uninitialized 977 * value when invoked for the first time, i.e. 978 * level_old is invalid (no matter whether it's a level 979 * or an index). Set the backlight to max_level in this case. 980 */ 981 for (i = ACPI_VIDEO_FIRST_LEVEL; i < br->count; i++) 982 if (level == br->levels[i]) 983 break; 984 if (i == br->count || !level) 985 level = max_level; 986 987 set_level: 988 result = acpi_video_device_lcd_set_level(device, level); 989 if (result) 990 goto out_free_levels; 991 992 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 993 "found %d brightness levels\n", 994 br->count - ACPI_VIDEO_FIRST_LEVEL)); 995 return 0; 996 997 out_free_levels: 998 kfree(br->levels); 999 kfree(br); 1000 device->brightness = NULL; 1001 return result; 1002 } 1003 1004 /* 1005 * Arg: 1006 * device : video output device (LCD, CRT, ..) 1007 * 1008 * Return Value: 1009 * None 1010 * 1011 * Find out all required AML methods defined under the output 1012 * device. 1013 */ 1014 1015 static void acpi_video_device_find_cap(struct acpi_video_device *device) 1016 { 1017 if (acpi_has_method(device->dev->handle, "_ADR")) 1018 device->cap._ADR = 1; 1019 if (acpi_has_method(device->dev->handle, "_BCL")) 1020 device->cap._BCL = 1; 1021 if (acpi_has_method(device->dev->handle, "_BCM")) 1022 device->cap._BCM = 1; 1023 if (acpi_has_method(device->dev->handle, "_BQC")) { 1024 device->cap._BQC = 1; 1025 } else if (acpi_has_method(device->dev->handle, "_BCQ")) { 1026 printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n"); 1027 device->cap._BCQ = 1; 1028 } 1029 1030 if (acpi_has_method(device->dev->handle, "_DDC")) 1031 device->cap._DDC = 1; 1032 } 1033 1034 /* 1035 * Arg: 1036 * device : video output device (VGA) 1037 * 1038 * Return Value: 1039 * None 1040 * 1041 * Find out all required AML methods defined under the video bus device. 1042 */ 1043 1044 static void acpi_video_bus_find_cap(struct acpi_video_bus *video) 1045 { 1046 if (acpi_has_method(video->device->handle, "_DOS")) 1047 video->cap._DOS = 1; 1048 if (acpi_has_method(video->device->handle, "_DOD")) 1049 video->cap._DOD = 1; 1050 if (acpi_has_method(video->device->handle, "_ROM")) 1051 video->cap._ROM = 1; 1052 if (acpi_has_method(video->device->handle, "_GPD")) 1053 video->cap._GPD = 1; 1054 if (acpi_has_method(video->device->handle, "_SPD")) 1055 video->cap._SPD = 1; 1056 if (acpi_has_method(video->device->handle, "_VPO")) 1057 video->cap._VPO = 1; 1058 } 1059 1060 /* 1061 * Check whether the video bus device has required AML method to 1062 * support the desired features 1063 */ 1064 1065 static int acpi_video_bus_check(struct acpi_video_bus *video) 1066 { 1067 acpi_status status = -ENOENT; 1068 struct pci_dev *dev; 1069 1070 if (!video) 1071 return -EINVAL; 1072 1073 dev = acpi_get_pci_dev(video->device->handle); 1074 if (!dev) 1075 return -ENODEV; 1076 pci_dev_put(dev); 1077 1078 /* 1079 * Since there is no HID, CID and so on for VGA driver, we have 1080 * to check well known required nodes. 1081 */ 1082 1083 /* Does this device support video switching? */ 1084 if (video->cap._DOS || video->cap._DOD) { 1085 if (!video->cap._DOS) { 1086 printk(KERN_WARNING FW_BUG 1087 "ACPI(%s) defines _DOD but not _DOS\n", 1088 acpi_device_bid(video->device)); 1089 } 1090 video->flags.multihead = 1; 1091 status = 0; 1092 } 1093 1094 /* Does this device support retrieving a video ROM? */ 1095 if (video->cap._ROM) { 1096 video->flags.rom = 1; 1097 status = 0; 1098 } 1099 1100 /* Does this device support configuring which video device to POST? */ 1101 if (video->cap._GPD && video->cap._SPD && video->cap._VPO) { 1102 video->flags.post = 1; 1103 status = 0; 1104 } 1105 1106 return status; 1107 } 1108 1109 /* 1110 * -------------------------------------------------------------------------- 1111 * Driver Interface 1112 * -------------------------------------------------------------------------- 1113 */ 1114 1115 /* device interface */ 1116 static struct acpi_video_device_attrib * 1117 acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id) 1118 { 1119 struct acpi_video_enumerated_device *ids; 1120 int i; 1121 1122 for (i = 0; i < video->attached_count; i++) { 1123 ids = &video->attached_array[i]; 1124 if ((ids->value.int_val & 0xffff) == device_id) 1125 return &ids->value.attrib; 1126 } 1127 1128 return NULL; 1129 } 1130 1131 static int 1132 acpi_video_get_device_type(struct acpi_video_bus *video, 1133 unsigned long device_id) 1134 { 1135 struct acpi_video_enumerated_device *ids; 1136 int i; 1137 1138 for (i = 0; i < video->attached_count; i++) { 1139 ids = &video->attached_array[i]; 1140 if ((ids->value.int_val & 0xffff) == device_id) 1141 return ids->value.int_val; 1142 } 1143 1144 return 0; 1145 } 1146 1147 static int 1148 acpi_video_bus_get_one_device(struct acpi_device *device, 1149 struct acpi_video_bus *video) 1150 { 1151 unsigned long long device_id; 1152 int status, device_type; 1153 struct acpi_video_device *data; 1154 struct acpi_video_device_attrib *attribute; 1155 1156 status = 1157 acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); 1158 /* Some device omits _ADR, we skip them instead of fail */ 1159 if (ACPI_FAILURE(status)) 1160 return 0; 1161 1162 data = kzalloc(sizeof(struct acpi_video_device), GFP_KERNEL); 1163 if (!data) 1164 return -ENOMEM; 1165 1166 strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME); 1167 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS); 1168 device->driver_data = data; 1169 1170 data->device_id = device_id; 1171 data->video = video; 1172 data->dev = device; 1173 INIT_DELAYED_WORK(&data->switch_brightness_work, 1174 acpi_video_switch_brightness); 1175 1176 attribute = acpi_video_get_device_attr(video, device_id); 1177 1178 if (attribute && (attribute->device_id_scheme || device_id_scheme)) { 1179 switch (attribute->display_type) { 1180 case ACPI_VIDEO_DISPLAY_CRT: 1181 data->flags.crt = 1; 1182 break; 1183 case ACPI_VIDEO_DISPLAY_TV: 1184 data->flags.tvout = 1; 1185 break; 1186 case ACPI_VIDEO_DISPLAY_DVI: 1187 data->flags.dvi = 1; 1188 break; 1189 case ACPI_VIDEO_DISPLAY_LCD: 1190 data->flags.lcd = 1; 1191 break; 1192 default: 1193 data->flags.unknown = 1; 1194 break; 1195 } 1196 if (attribute->bios_can_detect) 1197 data->flags.bios = 1; 1198 } else { 1199 /* Check for legacy IDs */ 1200 device_type = acpi_video_get_device_type(video, device_id); 1201 /* Ignore bits 16 and 18-20 */ 1202 switch (device_type & 0xffe2ffff) { 1203 case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR: 1204 data->flags.crt = 1; 1205 break; 1206 case ACPI_VIDEO_DISPLAY_LEGACY_PANEL: 1207 data->flags.lcd = 1; 1208 break; 1209 case ACPI_VIDEO_DISPLAY_LEGACY_TV: 1210 data->flags.tvout = 1; 1211 break; 1212 default: 1213 data->flags.unknown = 1; 1214 } 1215 } 1216 1217 acpi_video_device_bind(video, data); 1218 acpi_video_device_find_cap(data); 1219 1220 mutex_lock(&video->device_list_lock); 1221 list_add_tail(&data->entry, &video->video_device_list); 1222 mutex_unlock(&video->device_list_lock); 1223 1224 return status; 1225 } 1226 1227 /* 1228 * Arg: 1229 * video : video bus device 1230 * 1231 * Return: 1232 * none 1233 * 1234 * Enumerate the video device list of the video bus, 1235 * bind the ids with the corresponding video devices 1236 * under the video bus. 1237 */ 1238 1239 static void acpi_video_device_rebind(struct acpi_video_bus *video) 1240 { 1241 struct acpi_video_device *dev; 1242 1243 mutex_lock(&video->device_list_lock); 1244 1245 list_for_each_entry(dev, &video->video_device_list, entry) 1246 acpi_video_device_bind(video, dev); 1247 1248 mutex_unlock(&video->device_list_lock); 1249 } 1250 1251 /* 1252 * Arg: 1253 * video : video bus device 1254 * device : video output device under the video 1255 * bus 1256 * 1257 * Return: 1258 * none 1259 * 1260 * Bind the ids with the corresponding video devices 1261 * under the video bus. 1262 */ 1263 1264 static void 1265 acpi_video_device_bind(struct acpi_video_bus *video, 1266 struct acpi_video_device *device) 1267 { 1268 struct acpi_video_enumerated_device *ids; 1269 int i; 1270 1271 for (i = 0; i < video->attached_count; i++) { 1272 ids = &video->attached_array[i]; 1273 if (device->device_id == (ids->value.int_val & 0xffff)) { 1274 ids->bind_info = device; 1275 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "device_bind %d\n", i)); 1276 } 1277 } 1278 } 1279 1280 static bool acpi_video_device_in_dod(struct acpi_video_device *device) 1281 { 1282 struct acpi_video_bus *video = device->video; 1283 int i; 1284 1285 /* 1286 * If we have a broken _DOD or we have more than 8 output devices 1287 * under the graphics controller node that we can't proper deal with 1288 * in the operation region code currently, no need to test. 1289 */ 1290 if (!video->attached_count || video->child_count > 8) 1291 return true; 1292 1293 for (i = 0; i < video->attached_count; i++) { 1294 if ((video->attached_array[i].value.int_val & 0xfff) == 1295 (device->device_id & 0xfff)) 1296 return true; 1297 } 1298 1299 return false; 1300 } 1301 1302 /* 1303 * Arg: 1304 * video : video bus device 1305 * 1306 * Return: 1307 * < 0 : error 1308 * 1309 * Call _DOD to enumerate all devices attached to display adapter 1310 * 1311 */ 1312 1313 static int acpi_video_device_enumerate(struct acpi_video_bus *video) 1314 { 1315 int status; 1316 int count; 1317 int i; 1318 struct acpi_video_enumerated_device *active_list; 1319 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 1320 union acpi_object *dod = NULL; 1321 union acpi_object *obj; 1322 1323 if (!video->cap._DOD) 1324 return AE_NOT_EXIST; 1325 1326 status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer); 1327 if (!ACPI_SUCCESS(status)) { 1328 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _DOD")); 1329 return status; 1330 } 1331 1332 dod = buffer.pointer; 1333 if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) { 1334 ACPI_EXCEPTION((AE_INFO, status, "Invalid _DOD data")); 1335 status = -EFAULT; 1336 goto out; 1337 } 1338 1339 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d video heads in _DOD\n", 1340 dod->package.count)); 1341 1342 active_list = kcalloc(1 + dod->package.count, 1343 sizeof(struct acpi_video_enumerated_device), 1344 GFP_KERNEL); 1345 if (!active_list) { 1346 status = -ENOMEM; 1347 goto out; 1348 } 1349 1350 count = 0; 1351 for (i = 0; i < dod->package.count; i++) { 1352 obj = &dod->package.elements[i]; 1353 1354 if (obj->type != ACPI_TYPE_INTEGER) { 1355 printk(KERN_ERR PREFIX 1356 "Invalid _DOD data in element %d\n", i); 1357 continue; 1358 } 1359 1360 active_list[count].value.int_val = obj->integer.value; 1361 active_list[count].bind_info = NULL; 1362 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "dod element[%d] = %d\n", i, 1363 (int)obj->integer.value)); 1364 count++; 1365 } 1366 1367 kfree(video->attached_array); 1368 1369 video->attached_array = active_list; 1370 video->attached_count = count; 1371 1372 out: 1373 kfree(buffer.pointer); 1374 return status; 1375 } 1376 1377 static int 1378 acpi_video_get_next_level(struct acpi_video_device *device, 1379 u32 level_current, u32 event) 1380 { 1381 int min, max, min_above, max_below, i, l, delta = 255; 1382 max = max_below = 0; 1383 min = min_above = 255; 1384 /* Find closest level to level_current */ 1385 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) { 1386 l = device->brightness->levels[i]; 1387 if (abs(l - level_current) < abs(delta)) { 1388 delta = l - level_current; 1389 if (!delta) 1390 break; 1391 } 1392 } 1393 /* Ajust level_current to closest available level */ 1394 level_current += delta; 1395 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) { 1396 l = device->brightness->levels[i]; 1397 if (l < min) 1398 min = l; 1399 if (l > max) 1400 max = l; 1401 if (l < min_above && l > level_current) 1402 min_above = l; 1403 if (l > max_below && l < level_current) 1404 max_below = l; 1405 } 1406 1407 switch (event) { 1408 case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: 1409 return (level_current < max) ? min_above : min; 1410 case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: 1411 return (level_current < max) ? min_above : max; 1412 case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: 1413 return (level_current > min) ? max_below : min; 1414 case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: 1415 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: 1416 return 0; 1417 default: 1418 return level_current; 1419 } 1420 } 1421 1422 static void 1423 acpi_video_switch_brightness(struct work_struct *work) 1424 { 1425 struct acpi_video_device *device = container_of(to_delayed_work(work), 1426 struct acpi_video_device, switch_brightness_work); 1427 unsigned long long level_current, level_next; 1428 int event = device->switch_brightness_event; 1429 int result = -EINVAL; 1430 1431 /* no warning message if acpi_backlight=vendor or a quirk is used */ 1432 if (!device->backlight) 1433 return; 1434 1435 if (!device->brightness) 1436 goto out; 1437 1438 result = acpi_video_device_lcd_get_level_current(device, 1439 &level_current, 1440 false); 1441 if (result) 1442 goto out; 1443 1444 level_next = acpi_video_get_next_level(device, level_current, event); 1445 1446 result = acpi_video_device_lcd_set_level(device, level_next); 1447 1448 if (!result) 1449 backlight_force_update(device->backlight, 1450 BACKLIGHT_UPDATE_HOTKEY); 1451 1452 out: 1453 if (result) 1454 printk(KERN_ERR PREFIX "Failed to switch the brightness\n"); 1455 } 1456 1457 int acpi_video_get_edid(struct acpi_device *device, int type, int device_id, 1458 void **edid) 1459 { 1460 struct acpi_video_bus *video; 1461 struct acpi_video_device *video_device; 1462 union acpi_object *buffer = NULL; 1463 acpi_status status; 1464 int i, length; 1465 1466 if (!device || !acpi_driver_data(device)) 1467 return -EINVAL; 1468 1469 video = acpi_driver_data(device); 1470 1471 for (i = 0; i < video->attached_count; i++) { 1472 video_device = video->attached_array[i].bind_info; 1473 length = 256; 1474 1475 if (!video_device) 1476 continue; 1477 1478 if (!video_device->cap._DDC) 1479 continue; 1480 1481 if (type) { 1482 switch (type) { 1483 case ACPI_VIDEO_DISPLAY_CRT: 1484 if (!video_device->flags.crt) 1485 continue; 1486 break; 1487 case ACPI_VIDEO_DISPLAY_TV: 1488 if (!video_device->flags.tvout) 1489 continue; 1490 break; 1491 case ACPI_VIDEO_DISPLAY_DVI: 1492 if (!video_device->flags.dvi) 1493 continue; 1494 break; 1495 case ACPI_VIDEO_DISPLAY_LCD: 1496 if (!video_device->flags.lcd) 1497 continue; 1498 break; 1499 } 1500 } else if (video_device->device_id != device_id) { 1501 continue; 1502 } 1503 1504 status = acpi_video_device_EDID(video_device, &buffer, length); 1505 1506 if (ACPI_FAILURE(status) || !buffer || 1507 buffer->type != ACPI_TYPE_BUFFER) { 1508 length = 128; 1509 status = acpi_video_device_EDID(video_device, &buffer, 1510 length); 1511 if (ACPI_FAILURE(status) || !buffer || 1512 buffer->type != ACPI_TYPE_BUFFER) { 1513 continue; 1514 } 1515 } 1516 1517 *edid = buffer->buffer.pointer; 1518 return length; 1519 } 1520 1521 return -ENODEV; 1522 } 1523 EXPORT_SYMBOL(acpi_video_get_edid); 1524 1525 static int 1526 acpi_video_bus_get_devices(struct acpi_video_bus *video, 1527 struct acpi_device *device) 1528 { 1529 int status = 0; 1530 struct acpi_device *dev; 1531 1532 /* 1533 * There are systems where video module known to work fine regardless 1534 * of broken _DOD and ignoring returned value here doesn't cause 1535 * any issues later. 1536 */ 1537 acpi_video_device_enumerate(video); 1538 1539 list_for_each_entry(dev, &device->children, node) { 1540 1541 status = acpi_video_bus_get_one_device(dev, video); 1542 if (status) { 1543 dev_err(&dev->dev, "Can't attach device\n"); 1544 break; 1545 } 1546 video->child_count++; 1547 } 1548 return status; 1549 } 1550 1551 /* acpi_video interface */ 1552 1553 /* 1554 * Win8 requires setting bit2 of _DOS to let firmware know it shouldn't 1555 * preform any automatic brightness change on receiving a notification. 1556 */ 1557 static int acpi_video_bus_start_devices(struct acpi_video_bus *video) 1558 { 1559 return acpi_video_bus_DOS(video, 0, 1560 acpi_osi_is_win8() ? 1 : 0); 1561 } 1562 1563 static int acpi_video_bus_stop_devices(struct acpi_video_bus *video) 1564 { 1565 return acpi_video_bus_DOS(video, 0, 1566 acpi_osi_is_win8() ? 0 : 1); 1567 } 1568 1569 static void acpi_video_bus_notify(struct acpi_device *device, u32 event) 1570 { 1571 struct acpi_video_bus *video = acpi_driver_data(device); 1572 struct input_dev *input; 1573 int keycode = 0; 1574 1575 if (!video || !video->input) 1576 return; 1577 1578 input = video->input; 1579 1580 switch (event) { 1581 case ACPI_VIDEO_NOTIFY_SWITCH: /* User requested a switch, 1582 * most likely via hotkey. */ 1583 keycode = KEY_SWITCHVIDEOMODE; 1584 break; 1585 1586 case ACPI_VIDEO_NOTIFY_PROBE: /* User plugged in or removed a video 1587 * connector. */ 1588 acpi_video_device_enumerate(video); 1589 acpi_video_device_rebind(video); 1590 keycode = KEY_SWITCHVIDEOMODE; 1591 break; 1592 1593 case ACPI_VIDEO_NOTIFY_CYCLE: /* Cycle Display output hotkey pressed. */ 1594 keycode = KEY_SWITCHVIDEOMODE; 1595 break; 1596 case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: /* Next Display output hotkey pressed. */ 1597 keycode = KEY_VIDEO_NEXT; 1598 break; 1599 case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: /* previous Display output hotkey pressed. */ 1600 keycode = KEY_VIDEO_PREV; 1601 break; 1602 1603 default: 1604 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 1605 "Unsupported event [0x%x]\n", event)); 1606 break; 1607 } 1608 1609 if (acpi_notifier_call_chain(device, event, 0)) 1610 /* Something vetoed the keypress. */ 1611 keycode = 0; 1612 1613 if (keycode && (report_key_events & REPORT_OUTPUT_KEY_EVENTS)) { 1614 input_report_key(input, keycode, 1); 1615 input_sync(input); 1616 input_report_key(input, keycode, 0); 1617 input_sync(input); 1618 } 1619 1620 return; 1621 } 1622 1623 static void brightness_switch_event(struct acpi_video_device *video_device, 1624 u32 event) 1625 { 1626 if (!brightness_switch_enabled) 1627 return; 1628 1629 video_device->switch_brightness_event = event; 1630 schedule_delayed_work(&video_device->switch_brightness_work, HZ / 10); 1631 } 1632 1633 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data) 1634 { 1635 struct acpi_video_device *video_device = data; 1636 struct acpi_device *device = NULL; 1637 struct acpi_video_bus *bus; 1638 struct input_dev *input; 1639 int keycode = 0; 1640 1641 if (!video_device) 1642 return; 1643 1644 device = video_device->dev; 1645 bus = video_device->video; 1646 input = bus->input; 1647 1648 if (hw_changes_brightness > 0) { 1649 if (video_device->backlight) 1650 backlight_force_update(video_device->backlight, 1651 BACKLIGHT_UPDATE_HOTKEY); 1652 acpi_notifier_call_chain(device, event, 0); 1653 return; 1654 } 1655 1656 switch (event) { 1657 case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */ 1658 brightness_switch_event(video_device, event); 1659 keycode = KEY_BRIGHTNESS_CYCLE; 1660 break; 1661 case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: /* Increase brightness */ 1662 brightness_switch_event(video_device, event); 1663 keycode = KEY_BRIGHTNESSUP; 1664 break; 1665 case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: /* Decrease brightness */ 1666 brightness_switch_event(video_device, event); 1667 keycode = KEY_BRIGHTNESSDOWN; 1668 break; 1669 case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightness */ 1670 brightness_switch_event(video_device, event); 1671 keycode = KEY_BRIGHTNESS_ZERO; 1672 break; 1673 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */ 1674 brightness_switch_event(video_device, event); 1675 keycode = KEY_DISPLAY_OFF; 1676 break; 1677 default: 1678 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 1679 "Unsupported event [0x%x]\n", event)); 1680 break; 1681 } 1682 1683 acpi_notifier_call_chain(device, event, 0); 1684 1685 if (keycode && (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS)) { 1686 input_report_key(input, keycode, 1); 1687 input_sync(input); 1688 input_report_key(input, keycode, 0); 1689 input_sync(input); 1690 } 1691 1692 return; 1693 } 1694 1695 static int acpi_video_resume(struct notifier_block *nb, 1696 unsigned long val, void *ign) 1697 { 1698 struct acpi_video_bus *video; 1699 struct acpi_video_device *video_device; 1700 int i; 1701 1702 switch (val) { 1703 case PM_HIBERNATION_PREPARE: 1704 case PM_SUSPEND_PREPARE: 1705 case PM_RESTORE_PREPARE: 1706 return NOTIFY_DONE; 1707 } 1708 1709 video = container_of(nb, struct acpi_video_bus, pm_nb); 1710 1711 dev_info(&video->device->dev, "Restoring backlight state\n"); 1712 1713 for (i = 0; i < video->attached_count; i++) { 1714 video_device = video->attached_array[i].bind_info; 1715 if (video_device && video_device->brightness) 1716 acpi_video_device_lcd_set_level(video_device, 1717 video_device->brightness->curr); 1718 } 1719 1720 return NOTIFY_OK; 1721 } 1722 1723 static acpi_status 1724 acpi_video_bus_match(acpi_handle handle, u32 level, void *context, 1725 void **return_value) 1726 { 1727 struct acpi_device *device = context; 1728 struct acpi_device *sibling; 1729 int result; 1730 1731 if (handle == device->handle) 1732 return AE_CTRL_TERMINATE; 1733 1734 result = acpi_bus_get_device(handle, &sibling); 1735 if (result) 1736 return AE_OK; 1737 1738 if (!strcmp(acpi_device_name(sibling), ACPI_VIDEO_BUS_NAME)) 1739 return AE_ALREADY_EXISTS; 1740 1741 return AE_OK; 1742 } 1743 1744 static void acpi_video_dev_register_backlight(struct acpi_video_device *device) 1745 { 1746 struct backlight_properties props; 1747 struct pci_dev *pdev; 1748 acpi_handle acpi_parent; 1749 struct device *parent = NULL; 1750 int result; 1751 static int count; 1752 char *name; 1753 1754 result = acpi_video_init_brightness(device); 1755 if (result) 1756 return; 1757 1758 if (disable_backlight_sysfs_if > 0) 1759 return; 1760 1761 name = kasprintf(GFP_KERNEL, "acpi_video%d", count); 1762 if (!name) 1763 return; 1764 count++; 1765 1766 acpi_get_parent(device->dev->handle, &acpi_parent); 1767 1768 pdev = acpi_get_pci_dev(acpi_parent); 1769 if (pdev) { 1770 parent = &pdev->dev; 1771 pci_dev_put(pdev); 1772 } 1773 1774 memset(&props, 0, sizeof(struct backlight_properties)); 1775 props.type = BACKLIGHT_FIRMWARE; 1776 props.max_brightness = 1777 device->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1; 1778 device->backlight = backlight_device_register(name, 1779 parent, 1780 device, 1781 &acpi_backlight_ops, 1782 &props); 1783 kfree(name); 1784 if (IS_ERR(device->backlight)) { 1785 device->backlight = NULL; 1786 return; 1787 } 1788 1789 /* 1790 * Save current brightness level in case we have to restore it 1791 * before acpi_video_device_lcd_set_level() is called next time. 1792 */ 1793 device->backlight->props.brightness = 1794 acpi_video_get_brightness(device->backlight); 1795 1796 device->cooling_dev = thermal_cooling_device_register("LCD", 1797 device->dev, &video_cooling_ops); 1798 if (IS_ERR(device->cooling_dev)) { 1799 /* 1800 * Set cooling_dev to NULL so we don't crash trying to free it. 1801 * Also, why the hell we are returning early and not attempt to 1802 * register video output if cooling device registration failed? 1803 * -- dtor 1804 */ 1805 device->cooling_dev = NULL; 1806 return; 1807 } 1808 1809 dev_info(&device->dev->dev, "registered as cooling_device%d\n", 1810 device->cooling_dev->id); 1811 result = sysfs_create_link(&device->dev->dev.kobj, 1812 &device->cooling_dev->device.kobj, 1813 "thermal_cooling"); 1814 if (result) 1815 printk(KERN_ERR PREFIX "Create sysfs link\n"); 1816 result = sysfs_create_link(&device->cooling_dev->device.kobj, 1817 &device->dev->dev.kobj, "device"); 1818 if (result) 1819 printk(KERN_ERR PREFIX "Create sysfs link\n"); 1820 } 1821 1822 static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video) 1823 { 1824 struct acpi_video_device *dev; 1825 union acpi_object *levels; 1826 1827 mutex_lock(&video->device_list_lock); 1828 list_for_each_entry(dev, &video->video_device_list, entry) { 1829 if (!acpi_video_device_lcd_query_levels(dev->dev->handle, &levels)) 1830 kfree(levels); 1831 } 1832 mutex_unlock(&video->device_list_lock); 1833 } 1834 1835 static bool acpi_video_should_register_backlight(struct acpi_video_device *dev) 1836 { 1837 /* 1838 * Do not create backlight device for video output 1839 * device that is not in the enumerated list. 1840 */ 1841 if (!acpi_video_device_in_dod(dev)) { 1842 dev_dbg(&dev->dev->dev, "not in _DOD list, ignore\n"); 1843 return false; 1844 } 1845 1846 if (only_lcd) 1847 return dev->flags.lcd; 1848 return true; 1849 } 1850 1851 static int acpi_video_bus_register_backlight(struct acpi_video_bus *video) 1852 { 1853 struct acpi_video_device *dev; 1854 1855 if (video->backlight_registered) 1856 return 0; 1857 1858 acpi_video_run_bcl_for_osi(video); 1859 1860 if (acpi_video_get_backlight_type() != acpi_backlight_video) 1861 return 0; 1862 1863 mutex_lock(&video->device_list_lock); 1864 list_for_each_entry(dev, &video->video_device_list, entry) { 1865 if (acpi_video_should_register_backlight(dev)) 1866 acpi_video_dev_register_backlight(dev); 1867 } 1868 mutex_unlock(&video->device_list_lock); 1869 1870 video->backlight_registered = true; 1871 1872 video->pm_nb.notifier_call = acpi_video_resume; 1873 video->pm_nb.priority = 0; 1874 return register_pm_notifier(&video->pm_nb); 1875 } 1876 1877 static void acpi_video_dev_unregister_backlight(struct acpi_video_device *device) 1878 { 1879 if (device->backlight) { 1880 backlight_device_unregister(device->backlight); 1881 device->backlight = NULL; 1882 } 1883 if (device->brightness) { 1884 kfree(device->brightness->levels); 1885 kfree(device->brightness); 1886 device->brightness = NULL; 1887 } 1888 if (device->cooling_dev) { 1889 sysfs_remove_link(&device->dev->dev.kobj, "thermal_cooling"); 1890 sysfs_remove_link(&device->cooling_dev->device.kobj, "device"); 1891 thermal_cooling_device_unregister(device->cooling_dev); 1892 device->cooling_dev = NULL; 1893 } 1894 } 1895 1896 static int acpi_video_bus_unregister_backlight(struct acpi_video_bus *video) 1897 { 1898 struct acpi_video_device *dev; 1899 int error; 1900 1901 if (!video->backlight_registered) 1902 return 0; 1903 1904 error = unregister_pm_notifier(&video->pm_nb); 1905 1906 mutex_lock(&video->device_list_lock); 1907 list_for_each_entry(dev, &video->video_device_list, entry) 1908 acpi_video_dev_unregister_backlight(dev); 1909 mutex_unlock(&video->device_list_lock); 1910 1911 video->backlight_registered = false; 1912 1913 return error; 1914 } 1915 1916 static void acpi_video_dev_add_notify_handler(struct acpi_video_device *device) 1917 { 1918 acpi_status status; 1919 struct acpi_device *adev = device->dev; 1920 1921 status = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY, 1922 acpi_video_device_notify, device); 1923 if (ACPI_FAILURE(status)) 1924 dev_err(&adev->dev, "Error installing notify handler\n"); 1925 else 1926 device->flags.notify = 1; 1927 } 1928 1929 static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video) 1930 { 1931 struct input_dev *input; 1932 struct acpi_video_device *dev; 1933 int error; 1934 1935 video->input = input = input_allocate_device(); 1936 if (!input) { 1937 error = -ENOMEM; 1938 goto out; 1939 } 1940 1941 error = acpi_video_bus_start_devices(video); 1942 if (error) 1943 goto err_free_input; 1944 1945 snprintf(video->phys, sizeof(video->phys), 1946 "%s/video/input0", acpi_device_hid(video->device)); 1947 1948 input->name = acpi_device_name(video->device); 1949 input->phys = video->phys; 1950 input->id.bustype = BUS_HOST; 1951 input->id.product = 0x06; 1952 input->dev.parent = &video->device->dev; 1953 input->evbit[0] = BIT(EV_KEY); 1954 set_bit(KEY_SWITCHVIDEOMODE, input->keybit); 1955 set_bit(KEY_VIDEO_NEXT, input->keybit); 1956 set_bit(KEY_VIDEO_PREV, input->keybit); 1957 set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit); 1958 set_bit(KEY_BRIGHTNESSUP, input->keybit); 1959 set_bit(KEY_BRIGHTNESSDOWN, input->keybit); 1960 set_bit(KEY_BRIGHTNESS_ZERO, input->keybit); 1961 set_bit(KEY_DISPLAY_OFF, input->keybit); 1962 1963 error = input_register_device(input); 1964 if (error) 1965 goto err_stop_dev; 1966 1967 mutex_lock(&video->device_list_lock); 1968 list_for_each_entry(dev, &video->video_device_list, entry) 1969 acpi_video_dev_add_notify_handler(dev); 1970 mutex_unlock(&video->device_list_lock); 1971 1972 return 0; 1973 1974 err_stop_dev: 1975 acpi_video_bus_stop_devices(video); 1976 err_free_input: 1977 input_free_device(input); 1978 video->input = NULL; 1979 out: 1980 return error; 1981 } 1982 1983 static void acpi_video_dev_remove_notify_handler(struct acpi_video_device *dev) 1984 { 1985 if (dev->flags.notify) { 1986 acpi_remove_notify_handler(dev->dev->handle, ACPI_DEVICE_NOTIFY, 1987 acpi_video_device_notify); 1988 dev->flags.notify = 0; 1989 } 1990 } 1991 1992 static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video) 1993 { 1994 struct acpi_video_device *dev; 1995 1996 mutex_lock(&video->device_list_lock); 1997 list_for_each_entry(dev, &video->video_device_list, entry) 1998 acpi_video_dev_remove_notify_handler(dev); 1999 mutex_unlock(&video->device_list_lock); 2000 2001 acpi_video_bus_stop_devices(video); 2002 input_unregister_device(video->input); 2003 video->input = NULL; 2004 } 2005 2006 static int acpi_video_bus_put_devices(struct acpi_video_bus *video) 2007 { 2008 struct acpi_video_device *dev, *next; 2009 2010 mutex_lock(&video->device_list_lock); 2011 list_for_each_entry_safe(dev, next, &video->video_device_list, entry) { 2012 list_del(&dev->entry); 2013 kfree(dev); 2014 } 2015 mutex_unlock(&video->device_list_lock); 2016 2017 return 0; 2018 } 2019 2020 static int instance; 2021 2022 static int acpi_video_bus_add(struct acpi_device *device) 2023 { 2024 struct acpi_video_bus *video; 2025 int error; 2026 acpi_status status; 2027 2028 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, 2029 device->parent->handle, 1, 2030 acpi_video_bus_match, NULL, 2031 device, NULL); 2032 if (status == AE_ALREADY_EXISTS) { 2033 printk(KERN_WARNING FW_BUG 2034 "Duplicate ACPI video bus devices for the" 2035 " same VGA controller, please try module " 2036 "parameter \"video.allow_duplicates=1\"" 2037 "if the current driver doesn't work.\n"); 2038 if (!allow_duplicates) 2039 return -ENODEV; 2040 } 2041 2042 video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL); 2043 if (!video) 2044 return -ENOMEM; 2045 2046 /* a hack to fix the duplicate name "VID" problem on T61 */ 2047 if (!strcmp(device->pnp.bus_id, "VID")) { 2048 if (instance) 2049 device->pnp.bus_id[3] = '0' + instance; 2050 instance++; 2051 } 2052 /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */ 2053 if (!strcmp(device->pnp.bus_id, "VGA")) { 2054 if (instance) 2055 device->pnp.bus_id[3] = '0' + instance; 2056 instance++; 2057 } 2058 2059 video->device = device; 2060 strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME); 2061 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS); 2062 device->driver_data = video; 2063 2064 acpi_video_bus_find_cap(video); 2065 error = acpi_video_bus_check(video); 2066 if (error) 2067 goto err_free_video; 2068 2069 mutex_init(&video->device_list_lock); 2070 INIT_LIST_HEAD(&video->video_device_list); 2071 2072 error = acpi_video_bus_get_devices(video, device); 2073 if (error) 2074 goto err_put_video; 2075 2076 printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s rom: %s post: %s)\n", 2077 ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device), 2078 video->flags.multihead ? "yes" : "no", 2079 video->flags.rom ? "yes" : "no", 2080 video->flags.post ? "yes" : "no"); 2081 mutex_lock(&video_list_lock); 2082 list_add_tail(&video->entry, &video_bus_head); 2083 mutex_unlock(&video_list_lock); 2084 2085 acpi_video_bus_register_backlight(video); 2086 acpi_video_bus_add_notify_handler(video); 2087 2088 return 0; 2089 2090 err_put_video: 2091 acpi_video_bus_put_devices(video); 2092 kfree(video->attached_array); 2093 err_free_video: 2094 kfree(video); 2095 device->driver_data = NULL; 2096 2097 return error; 2098 } 2099 2100 static int acpi_video_bus_remove(struct acpi_device *device) 2101 { 2102 struct acpi_video_bus *video = NULL; 2103 2104 2105 if (!device || !acpi_driver_data(device)) 2106 return -EINVAL; 2107 2108 video = acpi_driver_data(device); 2109 2110 acpi_video_bus_remove_notify_handler(video); 2111 acpi_video_bus_unregister_backlight(video); 2112 acpi_video_bus_put_devices(video); 2113 2114 mutex_lock(&video_list_lock); 2115 list_del(&video->entry); 2116 mutex_unlock(&video_list_lock); 2117 2118 kfree(video->attached_array); 2119 kfree(video); 2120 2121 return 0; 2122 } 2123 2124 static int __init is_i740(struct pci_dev *dev) 2125 { 2126 if (dev->device == 0x00D1) 2127 return 1; 2128 if (dev->device == 0x7000) 2129 return 1; 2130 return 0; 2131 } 2132 2133 static int __init intel_opregion_present(void) 2134 { 2135 int opregion = 0; 2136 struct pci_dev *dev = NULL; 2137 u32 address; 2138 2139 for_each_pci_dev(dev) { 2140 if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) 2141 continue; 2142 if (dev->vendor != PCI_VENDOR_ID_INTEL) 2143 continue; 2144 /* We don't want to poke around undefined i740 registers */ 2145 if (is_i740(dev)) 2146 continue; 2147 pci_read_config_dword(dev, 0xfc, &address); 2148 if (!address) 2149 continue; 2150 opregion = 1; 2151 } 2152 return opregion; 2153 } 2154 2155 /* Check if the chassis-type indicates there is no builtin LCD panel */ 2156 static bool dmi_is_desktop(void) 2157 { 2158 const char *chassis_type; 2159 unsigned long type; 2160 2161 chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE); 2162 if (!chassis_type) 2163 return false; 2164 2165 if (kstrtoul(chassis_type, 10, &type) != 0) 2166 return false; 2167 2168 switch (type) { 2169 case 0x03: /* Desktop */ 2170 case 0x04: /* Low Profile Desktop */ 2171 case 0x05: /* Pizza Box */ 2172 case 0x06: /* Mini Tower */ 2173 case 0x07: /* Tower */ 2174 case 0x10: /* Lunch Box */ 2175 case 0x11: /* Main Server Chassis */ 2176 return true; 2177 } 2178 2179 return false; 2180 } 2181 2182 int acpi_video_register(void) 2183 { 2184 int ret = 0; 2185 2186 mutex_lock(®ister_count_mutex); 2187 if (register_count) { 2188 /* 2189 * if the function of acpi_video_register is already called, 2190 * don't register the acpi_vide_bus again and return no error. 2191 */ 2192 goto leave; 2193 } 2194 2195 /* 2196 * We're seeing a lot of bogus backlight interfaces on newer machines 2197 * without a LCD such as desktops, servers and HDMI sticks. Checking 2198 * the lcd flag fixes this, so enable this on any machines which are 2199 * win8 ready (where we also prefer the native backlight driver, so 2200 * normally the acpi_video code should not register there anyways). 2201 */ 2202 if (only_lcd == -1) { 2203 if (dmi_is_desktop() && acpi_osi_is_win8()) 2204 only_lcd = true; 2205 else 2206 only_lcd = false; 2207 } 2208 2209 dmi_check_system(video_dmi_table); 2210 2211 ret = acpi_bus_register_driver(&acpi_video_bus); 2212 if (ret) 2213 goto leave; 2214 2215 /* 2216 * When the acpi_video_bus is loaded successfully, increase 2217 * the counter reference. 2218 */ 2219 register_count = 1; 2220 2221 leave: 2222 mutex_unlock(®ister_count_mutex); 2223 return ret; 2224 } 2225 EXPORT_SYMBOL(acpi_video_register); 2226 2227 void acpi_video_unregister(void) 2228 { 2229 mutex_lock(®ister_count_mutex); 2230 if (register_count) { 2231 acpi_bus_unregister_driver(&acpi_video_bus); 2232 register_count = 0; 2233 } 2234 mutex_unlock(®ister_count_mutex); 2235 } 2236 EXPORT_SYMBOL(acpi_video_unregister); 2237 2238 void acpi_video_unregister_backlight(void) 2239 { 2240 struct acpi_video_bus *video; 2241 2242 mutex_lock(®ister_count_mutex); 2243 if (register_count) { 2244 mutex_lock(&video_list_lock); 2245 list_for_each_entry(video, &video_bus_head, entry) 2246 acpi_video_bus_unregister_backlight(video); 2247 mutex_unlock(&video_list_lock); 2248 } 2249 mutex_unlock(®ister_count_mutex); 2250 } 2251 2252 bool acpi_video_handles_brightness_key_presses(void) 2253 { 2254 bool have_video_busses; 2255 2256 mutex_lock(&video_list_lock); 2257 have_video_busses = !list_empty(&video_bus_head); 2258 mutex_unlock(&video_list_lock); 2259 2260 return have_video_busses && 2261 (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS); 2262 } 2263 EXPORT_SYMBOL(acpi_video_handles_brightness_key_presses); 2264 2265 /* 2266 * This is kind of nasty. Hardware using Intel chipsets may require 2267 * the video opregion code to be run first in order to initialise 2268 * state before any ACPI video calls are made. To handle this we defer 2269 * registration of the video class until the opregion code has run. 2270 */ 2271 2272 static int __init acpi_video_init(void) 2273 { 2274 /* 2275 * Let the module load even if ACPI is disabled (e.g. due to 2276 * a broken BIOS) so that i915.ko can still be loaded on such 2277 * old systems without an AcpiOpRegion. 2278 * 2279 * acpi_video_register() will report -ENODEV later as well due 2280 * to acpi_disabled when i915.ko tries to register itself afterwards. 2281 */ 2282 if (acpi_disabled) 2283 return 0; 2284 2285 if (intel_opregion_present()) 2286 return 0; 2287 2288 return acpi_video_register(); 2289 } 2290 2291 static void __exit acpi_video_exit(void) 2292 { 2293 acpi_video_detect_exit(); 2294 acpi_video_unregister(); 2295 2296 return; 2297 } 2298 2299 module_init(acpi_video_init); 2300 module_exit(acpi_video_exit); 2301