Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.3-rc6 1821 lines 47 kB view raw
1/* 2 * video.c - ACPI Video Driver ($Revision:$) 3 * 4 * Copyright (C) 2004 Luming Yu <luming.yu@intel.com> 5 * Copyright (C) 2004 Bruno Ducrot <ducrot@poupinou.org> 6 * Copyright (C) 2006 Thomas Tuttle <linux-kernel@ttuttle.net> 7 * 8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or (at 13 * your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License along 21 * with this program; if not, write to the Free Software Foundation, Inc., 22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 23 * 24 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 */ 26 27#include <linux/kernel.h> 28#include <linux/module.h> 29#include <linux/init.h> 30#include <linux/types.h> 31#include <linux/list.h> 32#include <linux/mutex.h> 33#include <linux/input.h> 34#include <linux/backlight.h> 35#include <linux/thermal.h> 36#include <linux/sort.h> 37#include <linux/pci.h> 38#include <linux/pci_ids.h> 39#include <linux/slab.h> 40#include <asm/uaccess.h> 41#include <linux/dmi.h> 42#include <acpi/acpi_bus.h> 43#include <acpi/acpi_drivers.h> 44#include <linux/suspend.h> 45#include <acpi/video.h> 46 47#define PREFIX "ACPI: " 48 49#define ACPI_VIDEO_BUS_NAME "Video Bus" 50#define ACPI_VIDEO_DEVICE_NAME "Video Device" 51#define ACPI_VIDEO_NOTIFY_SWITCH 0x80 52#define ACPI_VIDEO_NOTIFY_PROBE 0x81 53#define ACPI_VIDEO_NOTIFY_CYCLE 0x82 54#define ACPI_VIDEO_NOTIFY_NEXT_OUTPUT 0x83 55#define ACPI_VIDEO_NOTIFY_PREV_OUTPUT 0x84 56 57#define ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS 0x85 58#define ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS 0x86 59#define ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS 0x87 60#define ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS 0x88 61#define ACPI_VIDEO_NOTIFY_DISPLAY_OFF 0x89 62 63#define MAX_NAME_LEN 20 64 65#define _COMPONENT ACPI_VIDEO_COMPONENT 66ACPI_MODULE_NAME("video"); 67 68MODULE_AUTHOR("Bruno Ducrot"); 69MODULE_DESCRIPTION("ACPI Video Driver"); 70MODULE_LICENSE("GPL"); 71 72static bool brightness_switch_enabled = 1; 73module_param(brightness_switch_enabled, bool, 0644); 74 75/* 76 * By default, we don't allow duplicate ACPI video bus devices 77 * under the same VGA controller 78 */ 79static bool allow_duplicates; 80module_param(allow_duplicates, bool, 0644); 81 82/* 83 * Some BIOSes claim they use minimum backlight at boot, 84 * and this may bring dimming screen after boot 85 */ 86static bool use_bios_initial_backlight = 1; 87module_param(use_bios_initial_backlight, bool, 0644); 88 89static int register_count = 0; 90static int acpi_video_bus_add(struct acpi_device *device); 91static int acpi_video_bus_remove(struct acpi_device *device, int type); 92static void acpi_video_bus_notify(struct acpi_device *device, u32 event); 93 94static const struct acpi_device_id video_device_ids[] = { 95 {ACPI_VIDEO_HID, 0}, 96 {"", 0}, 97}; 98MODULE_DEVICE_TABLE(acpi, video_device_ids); 99 100static struct acpi_driver acpi_video_bus = { 101 .name = "video", 102 .class = ACPI_VIDEO_CLASS, 103 .ids = video_device_ids, 104 .ops = { 105 .add = acpi_video_bus_add, 106 .remove = acpi_video_bus_remove, 107 .notify = acpi_video_bus_notify, 108 }, 109}; 110 111struct acpi_video_bus_flags { 112 u8 multihead:1; /* can switch video heads */ 113 u8 rom:1; /* can retrieve a video rom */ 114 u8 post:1; /* can configure the head to */ 115 u8 reserved:5; 116}; 117 118struct acpi_video_bus_cap { 119 u8 _DOS:1; /*Enable/Disable output switching */ 120 u8 _DOD:1; /*Enumerate all devices attached to display adapter */ 121 u8 _ROM:1; /*Get ROM Data */ 122 u8 _GPD:1; /*Get POST Device */ 123 u8 _SPD:1; /*Set POST Device */ 124 u8 _VPO:1; /*Video POST Options */ 125 u8 reserved:2; 126}; 127 128struct acpi_video_device_attrib { 129 u32 display_index:4; /* A zero-based instance of the Display */ 130 u32 display_port_attachment:4; /*This field differentiates the display type */ 131 u32 display_type:4; /*Describe the specific type in use */ 132 u32 vendor_specific:4; /*Chipset Vendor Specific */ 133 u32 bios_can_detect:1; /*BIOS can detect the device */ 134 u32 depend_on_vga:1; /*Non-VGA output device whose power is related to 135 the VGA device. */ 136 u32 pipe_id:3; /*For VGA multiple-head devices. */ 137 u32 reserved:10; /*Must be 0 */ 138 u32 device_id_scheme:1; /*Device ID Scheme */ 139}; 140 141struct acpi_video_enumerated_device { 142 union { 143 u32 int_val; 144 struct acpi_video_device_attrib attrib; 145 } value; 146 struct acpi_video_device *bind_info; 147}; 148 149struct acpi_video_bus { 150 struct acpi_device *device; 151 u8 dos_setting; 152 struct acpi_video_enumerated_device *attached_array; 153 u8 attached_count; 154 struct acpi_video_bus_cap cap; 155 struct acpi_video_bus_flags flags; 156 struct list_head video_device_list; 157 struct mutex device_list_lock; /* protects video_device_list */ 158 struct input_dev *input; 159 char phys[32]; /* for input device */ 160 struct notifier_block pm_nb; 161}; 162 163struct acpi_video_device_flags { 164 u8 crt:1; 165 u8 lcd:1; 166 u8 tvout:1; 167 u8 dvi:1; 168 u8 bios:1; 169 u8 unknown:1; 170 u8 reserved:2; 171}; 172 173struct acpi_video_device_cap { 174 u8 _ADR:1; /*Return the unique ID */ 175 u8 _BCL:1; /*Query list of brightness control levels supported */ 176 u8 _BCM:1; /*Set the brightness level */ 177 u8 _BQC:1; /* Get current brightness level */ 178 u8 _BCQ:1; /* Some buggy BIOS uses _BCQ instead of _BQC */ 179 u8 _DDC:1; /*Return the EDID for this device */ 180}; 181 182struct acpi_video_brightness_flags { 183 u8 _BCL_no_ac_battery_levels:1; /* no AC/Battery levels in _BCL */ 184 u8 _BCL_reversed:1; /* _BCL package is in a reversed order*/ 185 u8 _BCL_use_index:1; /* levels in _BCL are index values */ 186 u8 _BCM_use_index:1; /* input of _BCM is an index value */ 187 u8 _BQC_use_index:1; /* _BQC returns an index value */ 188}; 189 190struct acpi_video_device_brightness { 191 int curr; 192 int count; 193 int *levels; 194 struct acpi_video_brightness_flags flags; 195}; 196 197struct acpi_video_device { 198 unsigned long device_id; 199 struct acpi_video_device_flags flags; 200 struct acpi_video_device_cap cap; 201 struct list_head entry; 202 struct acpi_video_bus *video; 203 struct acpi_device *dev; 204 struct acpi_video_device_brightness *brightness; 205 struct backlight_device *backlight; 206 struct thermal_cooling_device *cooling_dev; 207}; 208 209static const char device_decode[][30] = { 210 "motherboard VGA device", 211 "PCI VGA device", 212 "AGP VGA device", 213 "UNKNOWN", 214}; 215 216static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data); 217static void acpi_video_device_rebind(struct acpi_video_bus *video); 218static void acpi_video_device_bind(struct acpi_video_bus *video, 219 struct acpi_video_device *device); 220static int acpi_video_device_enumerate(struct acpi_video_bus *video); 221static int acpi_video_device_lcd_set_level(struct acpi_video_device *device, 222 int level); 223static int acpi_video_device_lcd_get_level_current( 224 struct acpi_video_device *device, 225 unsigned long long *level, int init); 226static int acpi_video_get_next_level(struct acpi_video_device *device, 227 u32 level_current, u32 event); 228static int acpi_video_switch_brightness(struct acpi_video_device *device, 229 int event); 230 231/*backlight device sysfs support*/ 232static int acpi_video_get_brightness(struct backlight_device *bd) 233{ 234 unsigned long long cur_level; 235 int i; 236 struct acpi_video_device *vd = 237 (struct acpi_video_device *)bl_get_data(bd); 238 239 if (acpi_video_device_lcd_get_level_current(vd, &cur_level, 0)) 240 return -EINVAL; 241 for (i = 2; i < vd->brightness->count; i++) { 242 if (vd->brightness->levels[i] == cur_level) 243 /* The first two entries are special - see page 575 244 of the ACPI spec 3.0 */ 245 return i-2; 246 } 247 return 0; 248} 249 250static int acpi_video_set_brightness(struct backlight_device *bd) 251{ 252 int request_level = bd->props.brightness + 2; 253 struct acpi_video_device *vd = 254 (struct acpi_video_device *)bl_get_data(bd); 255 256 return acpi_video_device_lcd_set_level(vd, 257 vd->brightness->levels[request_level]); 258} 259 260static const struct backlight_ops acpi_backlight_ops = { 261 .get_brightness = acpi_video_get_brightness, 262 .update_status = acpi_video_set_brightness, 263}; 264 265/* thermal cooling device callbacks */ 266static int video_get_max_state(struct thermal_cooling_device *cooling_dev, unsigned 267 long *state) 268{ 269 struct acpi_device *device = cooling_dev->devdata; 270 struct acpi_video_device *video = acpi_driver_data(device); 271 272 *state = video->brightness->count - 3; 273 return 0; 274} 275 276static int video_get_cur_state(struct thermal_cooling_device *cooling_dev, unsigned 277 long *state) 278{ 279 struct acpi_device *device = cooling_dev->devdata; 280 struct acpi_video_device *video = acpi_driver_data(device); 281 unsigned long long level; 282 int offset; 283 284 if (acpi_video_device_lcd_get_level_current(video, &level, 0)) 285 return -EINVAL; 286 for (offset = 2; offset < video->brightness->count; offset++) 287 if (level == video->brightness->levels[offset]) { 288 *state = video->brightness->count - offset - 1; 289 return 0; 290 } 291 292 return -EINVAL; 293} 294 295static int 296video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long state) 297{ 298 struct acpi_device *device = cooling_dev->devdata; 299 struct acpi_video_device *video = acpi_driver_data(device); 300 int level; 301 302 if ( state >= video->brightness->count - 2) 303 return -EINVAL; 304 305 state = video->brightness->count - state; 306 level = video->brightness->levels[state -1]; 307 return acpi_video_device_lcd_set_level(video, level); 308} 309 310static const struct thermal_cooling_device_ops video_cooling_ops = { 311 .get_max_state = video_get_max_state, 312 .get_cur_state = video_get_cur_state, 313 .set_cur_state = video_set_cur_state, 314}; 315 316/* -------------------------------------------------------------------------- 317 Video Management 318 -------------------------------------------------------------------------- */ 319 320static int 321acpi_video_device_lcd_query_levels(struct acpi_video_device *device, 322 union acpi_object **levels) 323{ 324 int status; 325 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 326 union acpi_object *obj; 327 328 329 *levels = NULL; 330 331 status = acpi_evaluate_object(device->dev->handle, "_BCL", NULL, &buffer); 332 if (!ACPI_SUCCESS(status)) 333 return status; 334 obj = (union acpi_object *)buffer.pointer; 335 if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) { 336 printk(KERN_ERR PREFIX "Invalid _BCL data\n"); 337 status = -EFAULT; 338 goto err; 339 } 340 341 *levels = obj; 342 343 return 0; 344 345 err: 346 kfree(buffer.pointer); 347 348 return status; 349} 350 351static int 352acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level) 353{ 354 int status; 355 union acpi_object arg0 = { ACPI_TYPE_INTEGER }; 356 struct acpi_object_list args = { 1, &arg0 }; 357 int state; 358 359 arg0.integer.value = level; 360 361 status = acpi_evaluate_object(device->dev->handle, "_BCM", 362 &args, NULL); 363 if (ACPI_FAILURE(status)) { 364 ACPI_ERROR((AE_INFO, "Evaluating _BCM failed")); 365 return -EIO; 366 } 367 368 device->brightness->curr = level; 369 for (state = 2; state < device->brightness->count; state++) 370 if (level == device->brightness->levels[state]) { 371 if (device->backlight) 372 device->backlight->props.brightness = state - 2; 373 return 0; 374 } 375 376 ACPI_ERROR((AE_INFO, "Current brightness invalid")); 377 return -EINVAL; 378} 379 380/* 381 * For some buggy _BQC methods, we need to add a constant value to 382 * the _BQC return value to get the actual current brightness level 383 */ 384 385static int bqc_offset_aml_bug_workaround; 386static int __init video_set_bqc_offset(const struct dmi_system_id *d) 387{ 388 bqc_offset_aml_bug_workaround = 9; 389 return 0; 390} 391 392static struct dmi_system_id video_dmi_table[] __initdata = { 393 /* 394 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 395 */ 396 { 397 .callback = video_set_bqc_offset, 398 .ident = "Acer Aspire 5720", 399 .matches = { 400 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 401 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), 402 }, 403 }, 404 { 405 .callback = video_set_bqc_offset, 406 .ident = "Acer Aspire 5710Z", 407 .matches = { 408 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 409 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710Z"), 410 }, 411 }, 412 { 413 .callback = video_set_bqc_offset, 414 .ident = "eMachines E510", 415 .matches = { 416 DMI_MATCH(DMI_BOARD_VENDOR, "EMACHINES"), 417 DMI_MATCH(DMI_PRODUCT_NAME, "eMachines E510"), 418 }, 419 }, 420 { 421 .callback = video_set_bqc_offset, 422 .ident = "Acer Aspire 5315", 423 .matches = { 424 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 425 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"), 426 }, 427 }, 428 { 429 .callback = video_set_bqc_offset, 430 .ident = "Acer Aspire 7720", 431 .matches = { 432 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 433 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), 434 }, 435 }, 436 {} 437}; 438 439static int 440acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, 441 unsigned long long *level, int init) 442{ 443 acpi_status status = AE_OK; 444 int i; 445 446 if (device->cap._BQC || device->cap._BCQ) { 447 char *buf = device->cap._BQC ? "_BQC" : "_BCQ"; 448 449 status = acpi_evaluate_integer(device->dev->handle, buf, 450 NULL, level); 451 if (ACPI_SUCCESS(status)) { 452 if (device->brightness->flags._BQC_use_index) { 453 if (device->brightness->flags._BCL_reversed) 454 *level = device->brightness->count 455 - 3 - (*level); 456 *level = device->brightness->levels[*level + 2]; 457 458 } 459 *level += bqc_offset_aml_bug_workaround; 460 for (i = 2; i < device->brightness->count; i++) 461 if (device->brightness->levels[i] == *level) { 462 device->brightness->curr = *level; 463 return 0; 464 } 465 if (!init) { 466 /* 467 * BQC returned an invalid level. 468 * Stop using it. 469 */ 470 ACPI_WARNING((AE_INFO, 471 "%s returned an invalid level", 472 buf)); 473 device->cap._BQC = device->cap._BCQ = 0; 474 } 475 } else { 476 /* Fixme: 477 * should we return an error or ignore this failure? 478 * dev->brightness->curr is a cached value which stores 479 * the correct current backlight level in most cases. 480 * ACPI video backlight still works w/ buggy _BQC. 481 * http://bugzilla.kernel.org/show_bug.cgi?id=12233 482 */ 483 ACPI_WARNING((AE_INFO, "Evaluating %s failed", buf)); 484 device->cap._BQC = device->cap._BCQ = 0; 485 } 486 } 487 488 *level = device->brightness->curr; 489 return 0; 490} 491 492static int 493acpi_video_device_EDID(struct acpi_video_device *device, 494 union acpi_object **edid, ssize_t length) 495{ 496 int status; 497 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 498 union acpi_object *obj; 499 union acpi_object arg0 = { ACPI_TYPE_INTEGER }; 500 struct acpi_object_list args = { 1, &arg0 }; 501 502 503 *edid = NULL; 504 505 if (!device) 506 return -ENODEV; 507 if (length == 128) 508 arg0.integer.value = 1; 509 else if (length == 256) 510 arg0.integer.value = 2; 511 else 512 return -EINVAL; 513 514 status = acpi_evaluate_object(device->dev->handle, "_DDC", &args, &buffer); 515 if (ACPI_FAILURE(status)) 516 return -ENODEV; 517 518 obj = buffer.pointer; 519 520 if (obj && obj->type == ACPI_TYPE_BUFFER) 521 *edid = obj; 522 else { 523 printk(KERN_ERR PREFIX "Invalid _DDC data\n"); 524 status = -EFAULT; 525 kfree(obj); 526 } 527 528 return status; 529} 530 531/* bus */ 532 533/* 534 * Arg: 535 * video : video bus device pointer 536 * bios_flag : 537 * 0. The system BIOS should NOT automatically switch(toggle) 538 * the active display output. 539 * 1. The system BIOS should automatically switch (toggle) the 540 * active display output. No switch event. 541 * 2. The _DGS value should be locked. 542 * 3. The system BIOS should not automatically switch (toggle) the 543 * active display output, but instead generate the display switch 544 * event notify code. 545 * lcd_flag : 546 * 0. The system BIOS should automatically control the brightness level 547 * of the LCD when the power changes from AC to DC 548 * 1. The system BIOS should NOT automatically control the brightness 549 * level of the LCD when the power changes from AC to DC. 550 * Return Value: 551 * -1 wrong arg. 552 */ 553 554static int 555acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) 556{ 557 u64 status = 0; 558 union acpi_object arg0 = { ACPI_TYPE_INTEGER }; 559 struct acpi_object_list args = { 1, &arg0 }; 560 561 562 if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1) { 563 status = -1; 564 goto Failed; 565 } 566 arg0.integer.value = (lcd_flag << 2) | bios_flag; 567 video->dos_setting = arg0.integer.value; 568 acpi_evaluate_object(video->device->handle, "_DOS", &args, NULL); 569 570 Failed: 571 return status; 572} 573 574/* 575 * Simple comparison function used to sort backlight levels. 576 */ 577 578static int 579acpi_video_cmp_level(const void *a, const void *b) 580{ 581 return *(int *)a - *(int *)b; 582} 583 584/* 585 * Arg: 586 * device : video output device (LCD, CRT, ..) 587 * 588 * Return Value: 589 * Maximum brightness level 590 * 591 * Allocate and initialize device->brightness. 592 */ 593 594static int 595acpi_video_init_brightness(struct acpi_video_device *device) 596{ 597 union acpi_object *obj = NULL; 598 int i, max_level = 0, count = 0, level_ac_battery = 0; 599 unsigned long long level, level_old; 600 union acpi_object *o; 601 struct acpi_video_device_brightness *br = NULL; 602 int result = -EINVAL; 603 604 if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { 605 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " 606 "LCD brightness level\n")); 607 goto out; 608 } 609 610 if (obj->package.count < 2) 611 goto out; 612 613 br = kzalloc(sizeof(*br), GFP_KERNEL); 614 if (!br) { 615 printk(KERN_ERR "can't allocate memory\n"); 616 result = -ENOMEM; 617 goto out; 618 } 619 620 br->levels = kmalloc((obj->package.count + 2) * sizeof *(br->levels), 621 GFP_KERNEL); 622 if (!br->levels) { 623 result = -ENOMEM; 624 goto out_free; 625 } 626 627 for (i = 0; i < obj->package.count; i++) { 628 o = (union acpi_object *)&obj->package.elements[i]; 629 if (o->type != ACPI_TYPE_INTEGER) { 630 printk(KERN_ERR PREFIX "Invalid data\n"); 631 continue; 632 } 633 br->levels[count] = (u32) o->integer.value; 634 635 if (br->levels[count] > max_level) 636 max_level = br->levels[count]; 637 count++; 638 } 639 640 /* 641 * some buggy BIOS don't export the levels 642 * when machine is on AC/Battery in _BCL package. 643 * In this case, the first two elements in _BCL packages 644 * are also supported brightness levels that OS should take care of. 645 */ 646 for (i = 2; i < count; i++) { 647 if (br->levels[i] == br->levels[0]) 648 level_ac_battery++; 649 if (br->levels[i] == br->levels[1]) 650 level_ac_battery++; 651 } 652 653 if (level_ac_battery < 2) { 654 level_ac_battery = 2 - level_ac_battery; 655 br->flags._BCL_no_ac_battery_levels = 1; 656 for (i = (count - 1 + level_ac_battery); i >= 2; i--) 657 br->levels[i] = br->levels[i - level_ac_battery]; 658 count += level_ac_battery; 659 } else if (level_ac_battery > 2) 660 ACPI_ERROR((AE_INFO, "Too many duplicates in _BCL package\n")); 661 662 /* Check if the _BCL package is in a reversed order */ 663 if (max_level == br->levels[2]) { 664 br->flags._BCL_reversed = 1; 665 sort(&br->levels[2], count - 2, sizeof(br->levels[2]), 666 acpi_video_cmp_level, NULL); 667 } else if (max_level != br->levels[count - 1]) 668 ACPI_ERROR((AE_INFO, 669 "Found unordered _BCL package\n")); 670 671 br->count = count; 672 device->brightness = br; 673 674 /* Check the input/output of _BQC/_BCL/_BCM */ 675 if ((max_level < 100) && (max_level <= (count - 2))) 676 br->flags._BCL_use_index = 1; 677 678 /* 679 * _BCM is always consistent with _BCL, 680 * at least for all the laptops we have ever seen. 681 */ 682 br->flags._BCM_use_index = br->flags._BCL_use_index; 683 684 /* _BQC uses INDEX while _BCL uses VALUE in some laptops */ 685 br->curr = level = max_level; 686 687 if (!device->cap._BQC) 688 goto set_level; 689 690 result = acpi_video_device_lcd_get_level_current(device, &level_old, 1); 691 if (result) 692 goto out_free_levels; 693 694 /* 695 * Set the level to maximum and check if _BQC uses indexed value 696 */ 697 result = acpi_video_device_lcd_set_level(device, max_level); 698 if (result) 699 goto out_free_levels; 700 701 result = acpi_video_device_lcd_get_level_current(device, &level, 0); 702 if (result) 703 goto out_free_levels; 704 705 br->flags._BQC_use_index = (level == max_level ? 0 : 1); 706 707 if (!br->flags._BQC_use_index) { 708 /* 709 * Set the backlight to the initial state. 710 * On some buggy laptops, _BQC returns an uninitialized value 711 * when invoked for the first time, i.e. level_old is invalid. 712 * set the backlight to max_level in this case 713 */ 714 if (use_bios_initial_backlight) { 715 for (i = 2; i < br->count; i++) 716 if (level_old == br->levels[i]) 717 level = level_old; 718 } 719 goto set_level; 720 } 721 722 if (br->flags._BCL_reversed) 723 level_old = (br->count - 1) - level_old; 724 level = br->levels[level_old]; 725 726set_level: 727 result = acpi_video_device_lcd_set_level(device, level); 728 if (result) 729 goto out_free_levels; 730 731 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 732 "found %d brightness levels\n", count - 2)); 733 kfree(obj); 734 return result; 735 736out_free_levels: 737 kfree(br->levels); 738out_free: 739 kfree(br); 740out: 741 device->brightness = NULL; 742 kfree(obj); 743 return result; 744} 745 746/* 747 * Arg: 748 * device : video output device (LCD, CRT, ..) 749 * 750 * Return Value: 751 * None 752 * 753 * Find out all required AML methods defined under the output 754 * device. 755 */ 756 757static void acpi_video_device_find_cap(struct acpi_video_device *device) 758{ 759 acpi_handle h_dummy1; 760 761 if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_ADR", &h_dummy1))) { 762 device->cap._ADR = 1; 763 } 764 if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCL", &h_dummy1))) { 765 device->cap._BCL = 1; 766 } 767 if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCM", &h_dummy1))) { 768 device->cap._BCM = 1; 769 } 770 if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle,"_BQC",&h_dummy1))) 771 device->cap._BQC = 1; 772 else if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCQ", 773 &h_dummy1))) { 774 printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n"); 775 device->cap._BCQ = 1; 776 } 777 778 if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_DDC", &h_dummy1))) { 779 device->cap._DDC = 1; 780 } 781 782 if (acpi_video_backlight_support()) { 783 struct backlight_properties props; 784 struct pci_dev *pdev; 785 acpi_handle acpi_parent; 786 struct device *parent = NULL; 787 int result; 788 static int count = 0; 789 char *name; 790 791 result = acpi_video_init_brightness(device); 792 if (result) 793 return; 794 name = kasprintf(GFP_KERNEL, "acpi_video%d", count); 795 if (!name) 796 return; 797 count++; 798 799 acpi_get_parent(device->dev->handle, &acpi_parent); 800 801 pdev = acpi_get_pci_dev(acpi_parent); 802 if (pdev) { 803 parent = &pdev->dev; 804 pci_dev_put(pdev); 805 } 806 807 memset(&props, 0, sizeof(struct backlight_properties)); 808 props.type = BACKLIGHT_FIRMWARE; 809 props.max_brightness = device->brightness->count - 3; 810 device->backlight = backlight_device_register(name, 811 parent, 812 device, 813 &acpi_backlight_ops, 814 &props); 815 kfree(name); 816 if (IS_ERR(device->backlight)) 817 return; 818 819 /* 820 * Save current brightness level in case we have to restore it 821 * before acpi_video_device_lcd_set_level() is called next time. 822 */ 823 device->backlight->props.brightness = 824 acpi_video_get_brightness(device->backlight); 825 826 device->cooling_dev = thermal_cooling_device_register("LCD", 827 device->dev, &video_cooling_ops); 828 if (IS_ERR(device->cooling_dev)) { 829 /* 830 * Set cooling_dev to NULL so we don't crash trying to 831 * free it. 832 * Also, why the hell we are returning early and 833 * not attempt to register video output if cooling 834 * device registration failed? 835 * -- dtor 836 */ 837 device->cooling_dev = NULL; 838 return; 839 } 840 841 dev_info(&device->dev->dev, "registered as cooling_device%d\n", 842 device->cooling_dev->id); 843 result = sysfs_create_link(&device->dev->dev.kobj, 844 &device->cooling_dev->device.kobj, 845 "thermal_cooling"); 846 if (result) 847 printk(KERN_ERR PREFIX "Create sysfs link\n"); 848 result = sysfs_create_link(&device->cooling_dev->device.kobj, 849 &device->dev->dev.kobj, "device"); 850 if (result) 851 printk(KERN_ERR PREFIX "Create sysfs link\n"); 852 853 } 854} 855 856/* 857 * Arg: 858 * device : video output device (VGA) 859 * 860 * Return Value: 861 * None 862 * 863 * Find out all required AML methods defined under the video bus device. 864 */ 865 866static void acpi_video_bus_find_cap(struct acpi_video_bus *video) 867{ 868 acpi_handle h_dummy1; 869 870 if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_DOS", &h_dummy1))) { 871 video->cap._DOS = 1; 872 } 873 if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_DOD", &h_dummy1))) { 874 video->cap._DOD = 1; 875 } 876 if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_ROM", &h_dummy1))) { 877 video->cap._ROM = 1; 878 } 879 if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_GPD", &h_dummy1))) { 880 video->cap._GPD = 1; 881 } 882 if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_SPD", &h_dummy1))) { 883 video->cap._SPD = 1; 884 } 885 if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_VPO", &h_dummy1))) { 886 video->cap._VPO = 1; 887 } 888} 889 890/* 891 * Check whether the video bus device has required AML method to 892 * support the desired features 893 */ 894 895static int acpi_video_bus_check(struct acpi_video_bus *video) 896{ 897 acpi_status status = -ENOENT; 898 struct pci_dev *dev; 899 900 if (!video) 901 return -EINVAL; 902 903 dev = acpi_get_pci_dev(video->device->handle); 904 if (!dev) 905 return -ENODEV; 906 pci_dev_put(dev); 907 908 /* Since there is no HID, CID and so on for VGA driver, we have 909 * to check well known required nodes. 910 */ 911 912 /* Does this device support video switching? */ 913 if (video->cap._DOS || video->cap._DOD) { 914 if (!video->cap._DOS) { 915 printk(KERN_WARNING FW_BUG 916 "ACPI(%s) defines _DOD but not _DOS\n", 917 acpi_device_bid(video->device)); 918 } 919 video->flags.multihead = 1; 920 status = 0; 921 } 922 923 /* Does this device support retrieving a video ROM? */ 924 if (video->cap._ROM) { 925 video->flags.rom = 1; 926 status = 0; 927 } 928 929 /* Does this device support configuring which video device to POST? */ 930 if (video->cap._GPD && video->cap._SPD && video->cap._VPO) { 931 video->flags.post = 1; 932 status = 0; 933 } 934 935 return status; 936} 937 938/* -------------------------------------------------------------------------- 939 Driver Interface 940 -------------------------------------------------------------------------- */ 941 942/* device interface */ 943static struct acpi_video_device_attrib* 944acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id) 945{ 946 struct acpi_video_enumerated_device *ids; 947 int i; 948 949 for (i = 0; i < video->attached_count; i++) { 950 ids = &video->attached_array[i]; 951 if ((ids->value.int_val & 0xffff) == device_id) 952 return &ids->value.attrib; 953 } 954 955 return NULL; 956} 957 958static int 959acpi_video_get_device_type(struct acpi_video_bus *video, 960 unsigned long device_id) 961{ 962 struct acpi_video_enumerated_device *ids; 963 int i; 964 965 for (i = 0; i < video->attached_count; i++) { 966 ids = &video->attached_array[i]; 967 if ((ids->value.int_val & 0xffff) == device_id) 968 return ids->value.int_val; 969 } 970 971 return 0; 972} 973 974static int 975acpi_video_bus_get_one_device(struct acpi_device *device, 976 struct acpi_video_bus *video) 977{ 978 unsigned long long device_id; 979 int status, device_type; 980 struct acpi_video_device *data; 981 struct acpi_video_device_attrib* attribute; 982 983 if (!device || !video) 984 return -EINVAL; 985 986 status = 987 acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); 988 if (ACPI_SUCCESS(status)) { 989 990 data = kzalloc(sizeof(struct acpi_video_device), GFP_KERNEL); 991 if (!data) 992 return -ENOMEM; 993 994 strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME); 995 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS); 996 device->driver_data = data; 997 998 data->device_id = device_id; 999 data->video = video; 1000 data->dev = device; 1001 1002 attribute = acpi_video_get_device_attr(video, device_id); 1003 1004 if((attribute != NULL) && attribute->device_id_scheme) { 1005 switch (attribute->display_type) { 1006 case ACPI_VIDEO_DISPLAY_CRT: 1007 data->flags.crt = 1; 1008 break; 1009 case ACPI_VIDEO_DISPLAY_TV: 1010 data->flags.tvout = 1; 1011 break; 1012 case ACPI_VIDEO_DISPLAY_DVI: 1013 data->flags.dvi = 1; 1014 break; 1015 case ACPI_VIDEO_DISPLAY_LCD: 1016 data->flags.lcd = 1; 1017 break; 1018 default: 1019 data->flags.unknown = 1; 1020 break; 1021 } 1022 if(attribute->bios_can_detect) 1023 data->flags.bios = 1; 1024 } else { 1025 /* Check for legacy IDs */ 1026 device_type = acpi_video_get_device_type(video, 1027 device_id); 1028 /* Ignore bits 16 and 18-20 */ 1029 switch (device_type & 0xffe2ffff) { 1030 case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR: 1031 data->flags.crt = 1; 1032 break; 1033 case ACPI_VIDEO_DISPLAY_LEGACY_PANEL: 1034 data->flags.lcd = 1; 1035 break; 1036 case ACPI_VIDEO_DISPLAY_LEGACY_TV: 1037 data->flags.tvout = 1; 1038 break; 1039 default: 1040 data->flags.unknown = 1; 1041 } 1042 } 1043 1044 acpi_video_device_bind(video, data); 1045 acpi_video_device_find_cap(data); 1046 1047 status = acpi_install_notify_handler(device->handle, 1048 ACPI_DEVICE_NOTIFY, 1049 acpi_video_device_notify, 1050 data); 1051 if (ACPI_FAILURE(status)) { 1052 printk(KERN_ERR PREFIX 1053 "Error installing notify handler\n"); 1054 if(data->brightness) 1055 kfree(data->brightness->levels); 1056 kfree(data->brightness); 1057 kfree(data); 1058 return -ENODEV; 1059 } 1060 1061 mutex_lock(&video->device_list_lock); 1062 list_add_tail(&data->entry, &video->video_device_list); 1063 mutex_unlock(&video->device_list_lock); 1064 1065 return 0; 1066 } 1067 1068 return -ENOENT; 1069} 1070 1071/* 1072 * Arg: 1073 * video : video bus device 1074 * 1075 * Return: 1076 * none 1077 * 1078 * Enumerate the video device list of the video bus, 1079 * bind the ids with the corresponding video devices 1080 * under the video bus. 1081 */ 1082 1083static void acpi_video_device_rebind(struct acpi_video_bus *video) 1084{ 1085 struct acpi_video_device *dev; 1086 1087 mutex_lock(&video->device_list_lock); 1088 1089 list_for_each_entry(dev, &video->video_device_list, entry) 1090 acpi_video_device_bind(video, dev); 1091 1092 mutex_unlock(&video->device_list_lock); 1093} 1094 1095/* 1096 * Arg: 1097 * video : video bus device 1098 * device : video output device under the video 1099 * bus 1100 * 1101 * Return: 1102 * none 1103 * 1104 * Bind the ids with the corresponding video devices 1105 * under the video bus. 1106 */ 1107 1108static void 1109acpi_video_device_bind(struct acpi_video_bus *video, 1110 struct acpi_video_device *device) 1111{ 1112 struct acpi_video_enumerated_device *ids; 1113 int i; 1114 1115 for (i = 0; i < video->attached_count; i++) { 1116 ids = &video->attached_array[i]; 1117 if (device->device_id == (ids->value.int_val & 0xffff)) { 1118 ids->bind_info = device; 1119 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "device_bind %d\n", i)); 1120 } 1121 } 1122} 1123 1124/* 1125 * Arg: 1126 * video : video bus device 1127 * 1128 * Return: 1129 * < 0 : error 1130 * 1131 * Call _DOD to enumerate all devices attached to display adapter 1132 * 1133 */ 1134 1135static int acpi_video_device_enumerate(struct acpi_video_bus *video) 1136{ 1137 int status; 1138 int count; 1139 int i; 1140 struct acpi_video_enumerated_device *active_list; 1141 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 1142 union acpi_object *dod = NULL; 1143 union acpi_object *obj; 1144 1145 status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer); 1146 if (!ACPI_SUCCESS(status)) { 1147 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _DOD")); 1148 return status; 1149 } 1150 1151 dod = buffer.pointer; 1152 if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) { 1153 ACPI_EXCEPTION((AE_INFO, status, "Invalid _DOD data")); 1154 status = -EFAULT; 1155 goto out; 1156 } 1157 1158 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d video heads in _DOD\n", 1159 dod->package.count)); 1160 1161 active_list = kcalloc(1 + dod->package.count, 1162 sizeof(struct acpi_video_enumerated_device), 1163 GFP_KERNEL); 1164 if (!active_list) { 1165 status = -ENOMEM; 1166 goto out; 1167 } 1168 1169 count = 0; 1170 for (i = 0; i < dod->package.count; i++) { 1171 obj = &dod->package.elements[i]; 1172 1173 if (obj->type != ACPI_TYPE_INTEGER) { 1174 printk(KERN_ERR PREFIX 1175 "Invalid _DOD data in element %d\n", i); 1176 continue; 1177 } 1178 1179 active_list[count].value.int_val = obj->integer.value; 1180 active_list[count].bind_info = NULL; 1181 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "dod element[%d] = %d\n", i, 1182 (int)obj->integer.value)); 1183 count++; 1184 } 1185 1186 kfree(video->attached_array); 1187 1188 video->attached_array = active_list; 1189 video->attached_count = count; 1190 1191 out: 1192 kfree(buffer.pointer); 1193 return status; 1194} 1195 1196static int 1197acpi_video_get_next_level(struct acpi_video_device *device, 1198 u32 level_current, u32 event) 1199{ 1200 int min, max, min_above, max_below, i, l, delta = 255; 1201 max = max_below = 0; 1202 min = min_above = 255; 1203 /* Find closest level to level_current */ 1204 for (i = 2; i < device->brightness->count; i++) { 1205 l = device->brightness->levels[i]; 1206 if (abs(l - level_current) < abs(delta)) { 1207 delta = l - level_current; 1208 if (!delta) 1209 break; 1210 } 1211 } 1212 /* Ajust level_current to closest available level */ 1213 level_current += delta; 1214 for (i = 2; i < device->brightness->count; i++) { 1215 l = device->brightness->levels[i]; 1216 if (l < min) 1217 min = l; 1218 if (l > max) 1219 max = l; 1220 if (l < min_above && l > level_current) 1221 min_above = l; 1222 if (l > max_below && l < level_current) 1223 max_below = l; 1224 } 1225 1226 switch (event) { 1227 case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: 1228 return (level_current < max) ? min_above : min; 1229 case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: 1230 return (level_current < max) ? min_above : max; 1231 case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: 1232 return (level_current > min) ? max_below : min; 1233 case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: 1234 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: 1235 return 0; 1236 default: 1237 return level_current; 1238 } 1239} 1240 1241static int 1242acpi_video_switch_brightness(struct acpi_video_device *device, int event) 1243{ 1244 unsigned long long level_current, level_next; 1245 int result = -EINVAL; 1246 1247 /* no warning message if acpi_backlight=vendor is used */ 1248 if (!acpi_video_backlight_support()) 1249 return 0; 1250 1251 if (!device->brightness) 1252 goto out; 1253 1254 result = acpi_video_device_lcd_get_level_current(device, 1255 &level_current, 0); 1256 if (result) 1257 goto out; 1258 1259 level_next = acpi_video_get_next_level(device, level_current, event); 1260 1261 result = acpi_video_device_lcd_set_level(device, level_next); 1262 1263 if (!result) 1264 backlight_force_update(device->backlight, 1265 BACKLIGHT_UPDATE_HOTKEY); 1266 1267out: 1268 if (result) 1269 printk(KERN_ERR PREFIX "Failed to switch the brightness\n"); 1270 1271 return result; 1272} 1273 1274int acpi_video_get_edid(struct acpi_device *device, int type, int device_id, 1275 void **edid) 1276{ 1277 struct acpi_video_bus *video; 1278 struct acpi_video_device *video_device; 1279 union acpi_object *buffer = NULL; 1280 acpi_status status; 1281 int i, length; 1282 1283 if (!device || !acpi_driver_data(device)) 1284 return -EINVAL; 1285 1286 video = acpi_driver_data(device); 1287 1288 for (i = 0; i < video->attached_count; i++) { 1289 video_device = video->attached_array[i].bind_info; 1290 length = 256; 1291 1292 if (!video_device) 1293 continue; 1294 1295 if (!video_device->cap._DDC) 1296 continue; 1297 1298 if (type) { 1299 switch (type) { 1300 case ACPI_VIDEO_DISPLAY_CRT: 1301 if (!video_device->flags.crt) 1302 continue; 1303 break; 1304 case ACPI_VIDEO_DISPLAY_TV: 1305 if (!video_device->flags.tvout) 1306 continue; 1307 break; 1308 case ACPI_VIDEO_DISPLAY_DVI: 1309 if (!video_device->flags.dvi) 1310 continue; 1311 break; 1312 case ACPI_VIDEO_DISPLAY_LCD: 1313 if (!video_device->flags.lcd) 1314 continue; 1315 break; 1316 } 1317 } else if (video_device->device_id != device_id) { 1318 continue; 1319 } 1320 1321 status = acpi_video_device_EDID(video_device, &buffer, length); 1322 1323 if (ACPI_FAILURE(status) || !buffer || 1324 buffer->type != ACPI_TYPE_BUFFER) { 1325 length = 128; 1326 status = acpi_video_device_EDID(video_device, &buffer, 1327 length); 1328 if (ACPI_FAILURE(status) || !buffer || 1329 buffer->type != ACPI_TYPE_BUFFER) { 1330 continue; 1331 } 1332 } 1333 1334 *edid = buffer->buffer.pointer; 1335 return length; 1336 } 1337 1338 return -ENODEV; 1339} 1340EXPORT_SYMBOL(acpi_video_get_edid); 1341 1342static int 1343acpi_video_bus_get_devices(struct acpi_video_bus *video, 1344 struct acpi_device *device) 1345{ 1346 int status = 0; 1347 struct acpi_device *dev; 1348 1349 acpi_video_device_enumerate(video); 1350 1351 list_for_each_entry(dev, &device->children, node) { 1352 1353 status = acpi_video_bus_get_one_device(dev, video); 1354 if (ACPI_FAILURE(status)) { 1355 printk(KERN_WARNING PREFIX 1356 "Can't attach device\n"); 1357 continue; 1358 } 1359 } 1360 return status; 1361} 1362 1363static int acpi_video_bus_put_one_device(struct acpi_video_device *device) 1364{ 1365 acpi_status status; 1366 1367 if (!device || !device->video) 1368 return -ENOENT; 1369 1370 status = acpi_remove_notify_handler(device->dev->handle, 1371 ACPI_DEVICE_NOTIFY, 1372 acpi_video_device_notify); 1373 if (ACPI_FAILURE(status)) { 1374 printk(KERN_WARNING PREFIX 1375 "Can't remove video notify handler\n"); 1376 } 1377 if (device->backlight) { 1378 backlight_device_unregister(device->backlight); 1379 device->backlight = NULL; 1380 } 1381 if (device->cooling_dev) { 1382 sysfs_remove_link(&device->dev->dev.kobj, 1383 "thermal_cooling"); 1384 sysfs_remove_link(&device->cooling_dev->device.kobj, 1385 "device"); 1386 thermal_cooling_device_unregister(device->cooling_dev); 1387 device->cooling_dev = NULL; 1388 } 1389 1390 return 0; 1391} 1392 1393static int acpi_video_bus_put_devices(struct acpi_video_bus *video) 1394{ 1395 int status; 1396 struct acpi_video_device *dev, *next; 1397 1398 mutex_lock(&video->device_list_lock); 1399 1400 list_for_each_entry_safe(dev, next, &video->video_device_list, entry) { 1401 1402 status = acpi_video_bus_put_one_device(dev); 1403 if (ACPI_FAILURE(status)) 1404 printk(KERN_WARNING PREFIX 1405 "hhuuhhuu bug in acpi video driver.\n"); 1406 1407 if (dev->brightness) { 1408 kfree(dev->brightness->levels); 1409 kfree(dev->brightness); 1410 } 1411 list_del(&dev->entry); 1412 kfree(dev); 1413 } 1414 1415 mutex_unlock(&video->device_list_lock); 1416 1417 return 0; 1418} 1419 1420/* acpi_video interface */ 1421 1422static int acpi_video_bus_start_devices(struct acpi_video_bus *video) 1423{ 1424 return acpi_video_bus_DOS(video, 0, 0); 1425} 1426 1427static int acpi_video_bus_stop_devices(struct acpi_video_bus *video) 1428{ 1429 return acpi_video_bus_DOS(video, 0, 1); 1430} 1431 1432static void acpi_video_bus_notify(struct acpi_device *device, u32 event) 1433{ 1434 struct acpi_video_bus *video = acpi_driver_data(device); 1435 struct input_dev *input; 1436 int keycode = 0; 1437 1438 if (!video) 1439 return; 1440 1441 input = video->input; 1442 1443 switch (event) { 1444 case ACPI_VIDEO_NOTIFY_SWITCH: /* User requested a switch, 1445 * most likely via hotkey. */ 1446 acpi_bus_generate_proc_event(device, event, 0); 1447 if (!acpi_notifier_call_chain(device, event, 0)) 1448 keycode = KEY_SWITCHVIDEOMODE; 1449 break; 1450 1451 case ACPI_VIDEO_NOTIFY_PROBE: /* User plugged in or removed a video 1452 * connector. */ 1453 acpi_video_device_enumerate(video); 1454 acpi_video_device_rebind(video); 1455 acpi_bus_generate_proc_event(device, event, 0); 1456 keycode = KEY_SWITCHVIDEOMODE; 1457 break; 1458 1459 case ACPI_VIDEO_NOTIFY_CYCLE: /* Cycle Display output hotkey pressed. */ 1460 acpi_bus_generate_proc_event(device, event, 0); 1461 keycode = KEY_SWITCHVIDEOMODE; 1462 break; 1463 case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: /* Next Display output hotkey pressed. */ 1464 acpi_bus_generate_proc_event(device, event, 0); 1465 keycode = KEY_VIDEO_NEXT; 1466 break; 1467 case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: /* previous Display output hotkey pressed. */ 1468 acpi_bus_generate_proc_event(device, event, 0); 1469 keycode = KEY_VIDEO_PREV; 1470 break; 1471 1472 default: 1473 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 1474 "Unsupported event [0x%x]\n", event)); 1475 break; 1476 } 1477 1478 if (event != ACPI_VIDEO_NOTIFY_SWITCH) 1479 acpi_notifier_call_chain(device, event, 0); 1480 1481 if (keycode) { 1482 input_report_key(input, keycode, 1); 1483 input_sync(input); 1484 input_report_key(input, keycode, 0); 1485 input_sync(input); 1486 } 1487 1488 return; 1489} 1490 1491static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data) 1492{ 1493 struct acpi_video_device *video_device = data; 1494 struct acpi_device *device = NULL; 1495 struct acpi_video_bus *bus; 1496 struct input_dev *input; 1497 int keycode = 0; 1498 1499 if (!video_device) 1500 return; 1501 1502 device = video_device->dev; 1503 bus = video_device->video; 1504 input = bus->input; 1505 1506 switch (event) { 1507 case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */ 1508 if (brightness_switch_enabled) 1509 acpi_video_switch_brightness(video_device, event); 1510 acpi_bus_generate_proc_event(device, event, 0); 1511 keycode = KEY_BRIGHTNESS_CYCLE; 1512 break; 1513 case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: /* Increase brightness */ 1514 if (brightness_switch_enabled) 1515 acpi_video_switch_brightness(video_device, event); 1516 acpi_bus_generate_proc_event(device, event, 0); 1517 keycode = KEY_BRIGHTNESSUP; 1518 break; 1519 case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: /* Decrease brightness */ 1520 if (brightness_switch_enabled) 1521 acpi_video_switch_brightness(video_device, event); 1522 acpi_bus_generate_proc_event(device, event, 0); 1523 keycode = KEY_BRIGHTNESSDOWN; 1524 break; 1525 case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightness */ 1526 if (brightness_switch_enabled) 1527 acpi_video_switch_brightness(video_device, event); 1528 acpi_bus_generate_proc_event(device, event, 0); 1529 keycode = KEY_BRIGHTNESS_ZERO; 1530 break; 1531 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */ 1532 if (brightness_switch_enabled) 1533 acpi_video_switch_brightness(video_device, event); 1534 acpi_bus_generate_proc_event(device, event, 0); 1535 keycode = KEY_DISPLAY_OFF; 1536 break; 1537 default: 1538 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 1539 "Unsupported event [0x%x]\n", event)); 1540 break; 1541 } 1542 1543 acpi_notifier_call_chain(device, event, 0); 1544 1545 if (keycode) { 1546 input_report_key(input, keycode, 1); 1547 input_sync(input); 1548 input_report_key(input, keycode, 0); 1549 input_sync(input); 1550 } 1551 1552 return; 1553} 1554 1555static int acpi_video_resume(struct notifier_block *nb, 1556 unsigned long val, void *ign) 1557{ 1558 struct acpi_video_bus *video; 1559 struct acpi_video_device *video_device; 1560 int i; 1561 1562 switch (val) { 1563 case PM_HIBERNATION_PREPARE: 1564 case PM_SUSPEND_PREPARE: 1565 case PM_RESTORE_PREPARE: 1566 return NOTIFY_DONE; 1567 } 1568 1569 video = container_of(nb, struct acpi_video_bus, pm_nb); 1570 1571 dev_info(&video->device->dev, "Restoring backlight state\n"); 1572 1573 for (i = 0; i < video->attached_count; i++) { 1574 video_device = video->attached_array[i].bind_info; 1575 if (video_device && video_device->backlight) 1576 acpi_video_set_brightness(video_device->backlight); 1577 } 1578 1579 return NOTIFY_OK; 1580} 1581 1582static acpi_status 1583acpi_video_bus_match(acpi_handle handle, u32 level, void *context, 1584 void **return_value) 1585{ 1586 struct acpi_device *device = context; 1587 struct acpi_device *sibling; 1588 int result; 1589 1590 if (handle == device->handle) 1591 return AE_CTRL_TERMINATE; 1592 1593 result = acpi_bus_get_device(handle, &sibling); 1594 if (result) 1595 return AE_OK; 1596 1597 if (!strcmp(acpi_device_name(sibling), ACPI_VIDEO_BUS_NAME)) 1598 return AE_ALREADY_EXISTS; 1599 1600 return AE_OK; 1601} 1602 1603static int instance; 1604 1605static int acpi_video_bus_add(struct acpi_device *device) 1606{ 1607 struct acpi_video_bus *video; 1608 struct input_dev *input; 1609 int error; 1610 acpi_status status; 1611 1612 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, 1613 device->parent->handle, 1, 1614 acpi_video_bus_match, NULL, 1615 device, NULL); 1616 if (status == AE_ALREADY_EXISTS) { 1617 printk(KERN_WARNING FW_BUG 1618 "Duplicate ACPI video bus devices for the" 1619 " same VGA controller, please try module " 1620 "parameter \"video.allow_duplicates=1\"" 1621 "if the current driver doesn't work.\n"); 1622 if (!allow_duplicates) 1623 return -ENODEV; 1624 } 1625 1626 video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL); 1627 if (!video) 1628 return -ENOMEM; 1629 1630 /* a hack to fix the duplicate name "VID" problem on T61 */ 1631 if (!strcmp(device->pnp.bus_id, "VID")) { 1632 if (instance) 1633 device->pnp.bus_id[3] = '0' + instance; 1634 instance ++; 1635 } 1636 /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */ 1637 if (!strcmp(device->pnp.bus_id, "VGA")) { 1638 if (instance) 1639 device->pnp.bus_id[3] = '0' + instance; 1640 instance++; 1641 } 1642 1643 video->device = device; 1644 strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME); 1645 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS); 1646 device->driver_data = video; 1647 1648 acpi_video_bus_find_cap(video); 1649 error = acpi_video_bus_check(video); 1650 if (error) 1651 goto err_free_video; 1652 1653 mutex_init(&video->device_list_lock); 1654 INIT_LIST_HEAD(&video->video_device_list); 1655 1656 acpi_video_bus_get_devices(video, device); 1657 acpi_video_bus_start_devices(video); 1658 1659 video->input = input = input_allocate_device(); 1660 if (!input) { 1661 error = -ENOMEM; 1662 goto err_stop_video; 1663 } 1664 1665 snprintf(video->phys, sizeof(video->phys), 1666 "%s/video/input0", acpi_device_hid(video->device)); 1667 1668 input->name = acpi_device_name(video->device); 1669 input->phys = video->phys; 1670 input->id.bustype = BUS_HOST; 1671 input->id.product = 0x06; 1672 input->dev.parent = &device->dev; 1673 input->evbit[0] = BIT(EV_KEY); 1674 set_bit(KEY_SWITCHVIDEOMODE, input->keybit); 1675 set_bit(KEY_VIDEO_NEXT, input->keybit); 1676 set_bit(KEY_VIDEO_PREV, input->keybit); 1677 set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit); 1678 set_bit(KEY_BRIGHTNESSUP, input->keybit); 1679 set_bit(KEY_BRIGHTNESSDOWN, input->keybit); 1680 set_bit(KEY_BRIGHTNESS_ZERO, input->keybit); 1681 set_bit(KEY_DISPLAY_OFF, input->keybit); 1682 1683 error = input_register_device(input); 1684 if (error) 1685 goto err_free_input_dev; 1686 1687 printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s rom: %s post: %s)\n", 1688 ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device), 1689 video->flags.multihead ? "yes" : "no", 1690 video->flags.rom ? "yes" : "no", 1691 video->flags.post ? "yes" : "no"); 1692 1693 video->pm_nb.notifier_call = acpi_video_resume; 1694 video->pm_nb.priority = 0; 1695 register_pm_notifier(&video->pm_nb); 1696 1697 return 0; 1698 1699 err_free_input_dev: 1700 input_free_device(input); 1701 err_stop_video: 1702 acpi_video_bus_stop_devices(video); 1703 acpi_video_bus_put_devices(video); 1704 kfree(video->attached_array); 1705 err_free_video: 1706 kfree(video); 1707 device->driver_data = NULL; 1708 1709 return error; 1710} 1711 1712static int acpi_video_bus_remove(struct acpi_device *device, int type) 1713{ 1714 struct acpi_video_bus *video = NULL; 1715 1716 1717 if (!device || !acpi_driver_data(device)) 1718 return -EINVAL; 1719 1720 video = acpi_driver_data(device); 1721 1722 unregister_pm_notifier(&video->pm_nb); 1723 1724 acpi_video_bus_stop_devices(video); 1725 acpi_video_bus_put_devices(video); 1726 1727 input_unregister_device(video->input); 1728 kfree(video->attached_array); 1729 kfree(video); 1730 1731 return 0; 1732} 1733 1734static int __init intel_opregion_present(void) 1735{ 1736#if defined(CONFIG_DRM_I915) || defined(CONFIG_DRM_I915_MODULE) 1737 struct pci_dev *dev = NULL; 1738 u32 address; 1739 1740 for_each_pci_dev(dev) { 1741 if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) 1742 continue; 1743 if (dev->vendor != PCI_VENDOR_ID_INTEL) 1744 continue; 1745 pci_read_config_dword(dev, 0xfc, &address); 1746 if (!address) 1747 continue; 1748 return 1; 1749 } 1750#endif 1751 return 0; 1752} 1753 1754int acpi_video_register(void) 1755{ 1756 int result = 0; 1757 if (register_count) { 1758 /* 1759 * if the function of acpi_video_register is already called, 1760 * don't register the acpi_vide_bus again and return no error. 1761 */ 1762 return 0; 1763 } 1764 1765 result = acpi_bus_register_driver(&acpi_video_bus); 1766 if (result < 0) 1767 return -ENODEV; 1768 1769 /* 1770 * When the acpi_video_bus is loaded successfully, increase 1771 * the counter reference. 1772 */ 1773 register_count = 1; 1774 1775 return 0; 1776} 1777EXPORT_SYMBOL(acpi_video_register); 1778 1779void acpi_video_unregister(void) 1780{ 1781 if (!register_count) { 1782 /* 1783 * If the acpi video bus is already unloaded, don't 1784 * unload it again and return directly. 1785 */ 1786 return; 1787 } 1788 acpi_bus_unregister_driver(&acpi_video_bus); 1789 1790 register_count = 0; 1791 1792 return; 1793} 1794EXPORT_SYMBOL(acpi_video_unregister); 1795 1796/* 1797 * This is kind of nasty. Hardware using Intel chipsets may require 1798 * the video opregion code to be run first in order to initialise 1799 * state before any ACPI video calls are made. To handle this we defer 1800 * registration of the video class until the opregion code has run. 1801 */ 1802 1803static int __init acpi_video_init(void) 1804{ 1805 dmi_check_system(video_dmi_table); 1806 1807 if (intel_opregion_present()) 1808 return 0; 1809 1810 return acpi_video_register(); 1811} 1812 1813static void __exit acpi_video_exit(void) 1814{ 1815 acpi_video_unregister(); 1816 1817 return; 1818} 1819 1820module_init(acpi_video_init); 1821module_exit(acpi_video_exit);