Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.4-rc2 1833 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 * -EINVAL wrong arg. 552 */ 553 554static int 555acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) 556{ 557 acpi_status status; 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 return -EINVAL; 564 arg0.integer.value = (lcd_flag << 2) | bios_flag; 565 video->dos_setting = arg0.integer.value; 566 status = acpi_evaluate_object(video->device->handle, "_DOS", 567 &args, NULL); 568 if (ACPI_FAILURE(status)) 569 return -EIO; 570 571 return 0; 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; 1347 struct acpi_device *dev; 1348 1349 status = acpi_video_device_enumerate(video); 1350 if (status) 1351 return status; 1352 1353 list_for_each_entry(dev, &device->children, node) { 1354 1355 status = acpi_video_bus_get_one_device(dev, video); 1356 if (status) { 1357 printk(KERN_WARNING PREFIX 1358 "Can't attach device\n"); 1359 continue; 1360 } 1361 } 1362 return status; 1363} 1364 1365static int acpi_video_bus_put_one_device(struct acpi_video_device *device) 1366{ 1367 acpi_status status; 1368 1369 if (!device || !device->video) 1370 return -ENOENT; 1371 1372 status = acpi_remove_notify_handler(device->dev->handle, 1373 ACPI_DEVICE_NOTIFY, 1374 acpi_video_device_notify); 1375 if (ACPI_FAILURE(status)) { 1376 printk(KERN_WARNING PREFIX 1377 "Can't remove video notify handler\n"); 1378 } 1379 if (device->backlight) { 1380 backlight_device_unregister(device->backlight); 1381 device->backlight = NULL; 1382 } 1383 if (device->cooling_dev) { 1384 sysfs_remove_link(&device->dev->dev.kobj, 1385 "thermal_cooling"); 1386 sysfs_remove_link(&device->cooling_dev->device.kobj, 1387 "device"); 1388 thermal_cooling_device_unregister(device->cooling_dev); 1389 device->cooling_dev = NULL; 1390 } 1391 1392 return 0; 1393} 1394 1395static int acpi_video_bus_put_devices(struct acpi_video_bus *video) 1396{ 1397 int status; 1398 struct acpi_video_device *dev, *next; 1399 1400 mutex_lock(&video->device_list_lock); 1401 1402 list_for_each_entry_safe(dev, next, &video->video_device_list, entry) { 1403 1404 status = acpi_video_bus_put_one_device(dev); 1405 if (ACPI_FAILURE(status)) 1406 printk(KERN_WARNING PREFIX 1407 "hhuuhhuu bug in acpi video driver.\n"); 1408 1409 if (dev->brightness) { 1410 kfree(dev->brightness->levels); 1411 kfree(dev->brightness); 1412 } 1413 list_del(&dev->entry); 1414 kfree(dev); 1415 } 1416 1417 mutex_unlock(&video->device_list_lock); 1418 1419 return 0; 1420} 1421 1422/* acpi_video interface */ 1423 1424static int acpi_video_bus_start_devices(struct acpi_video_bus *video) 1425{ 1426 return acpi_video_bus_DOS(video, 0, 0); 1427} 1428 1429static int acpi_video_bus_stop_devices(struct acpi_video_bus *video) 1430{ 1431 return acpi_video_bus_DOS(video, 0, 1); 1432} 1433 1434static void acpi_video_bus_notify(struct acpi_device *device, u32 event) 1435{ 1436 struct acpi_video_bus *video = acpi_driver_data(device); 1437 struct input_dev *input; 1438 int keycode = 0; 1439 1440 if (!video) 1441 return; 1442 1443 input = video->input; 1444 1445 switch (event) { 1446 case ACPI_VIDEO_NOTIFY_SWITCH: /* User requested a switch, 1447 * most likely via hotkey. */ 1448 acpi_bus_generate_proc_event(device, event, 0); 1449 if (!acpi_notifier_call_chain(device, event, 0)) 1450 keycode = KEY_SWITCHVIDEOMODE; 1451 break; 1452 1453 case ACPI_VIDEO_NOTIFY_PROBE: /* User plugged in or removed a video 1454 * connector. */ 1455 acpi_video_device_enumerate(video); 1456 acpi_video_device_rebind(video); 1457 acpi_bus_generate_proc_event(device, event, 0); 1458 keycode = KEY_SWITCHVIDEOMODE; 1459 break; 1460 1461 case ACPI_VIDEO_NOTIFY_CYCLE: /* Cycle Display output hotkey pressed. */ 1462 acpi_bus_generate_proc_event(device, event, 0); 1463 keycode = KEY_SWITCHVIDEOMODE; 1464 break; 1465 case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: /* Next Display output hotkey pressed. */ 1466 acpi_bus_generate_proc_event(device, event, 0); 1467 keycode = KEY_VIDEO_NEXT; 1468 break; 1469 case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: /* previous Display output hotkey pressed. */ 1470 acpi_bus_generate_proc_event(device, event, 0); 1471 keycode = KEY_VIDEO_PREV; 1472 break; 1473 1474 default: 1475 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 1476 "Unsupported event [0x%x]\n", event)); 1477 break; 1478 } 1479 1480 if (event != ACPI_VIDEO_NOTIFY_SWITCH) 1481 acpi_notifier_call_chain(device, event, 0); 1482 1483 if (keycode) { 1484 input_report_key(input, keycode, 1); 1485 input_sync(input); 1486 input_report_key(input, keycode, 0); 1487 input_sync(input); 1488 } 1489 1490 return; 1491} 1492 1493static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data) 1494{ 1495 struct acpi_video_device *video_device = data; 1496 struct acpi_device *device = NULL; 1497 struct acpi_video_bus *bus; 1498 struct input_dev *input; 1499 int keycode = 0; 1500 1501 if (!video_device) 1502 return; 1503 1504 device = video_device->dev; 1505 bus = video_device->video; 1506 input = bus->input; 1507 1508 switch (event) { 1509 case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */ 1510 if (brightness_switch_enabled) 1511 acpi_video_switch_brightness(video_device, event); 1512 acpi_bus_generate_proc_event(device, event, 0); 1513 keycode = KEY_BRIGHTNESS_CYCLE; 1514 break; 1515 case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS: /* Increase brightness */ 1516 if (brightness_switch_enabled) 1517 acpi_video_switch_brightness(video_device, event); 1518 acpi_bus_generate_proc_event(device, event, 0); 1519 keycode = KEY_BRIGHTNESSUP; 1520 break; 1521 case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS: /* Decrease brightness */ 1522 if (brightness_switch_enabled) 1523 acpi_video_switch_brightness(video_device, event); 1524 acpi_bus_generate_proc_event(device, event, 0); 1525 keycode = KEY_BRIGHTNESSDOWN; 1526 break; 1527 case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightness */ 1528 if (brightness_switch_enabled) 1529 acpi_video_switch_brightness(video_device, event); 1530 acpi_bus_generate_proc_event(device, event, 0); 1531 keycode = KEY_BRIGHTNESS_ZERO; 1532 break; 1533 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */ 1534 if (brightness_switch_enabled) 1535 acpi_video_switch_brightness(video_device, event); 1536 acpi_bus_generate_proc_event(device, event, 0); 1537 keycode = KEY_DISPLAY_OFF; 1538 break; 1539 default: 1540 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 1541 "Unsupported event [0x%x]\n", event)); 1542 break; 1543 } 1544 1545 acpi_notifier_call_chain(device, event, 0); 1546 1547 if (keycode) { 1548 input_report_key(input, keycode, 1); 1549 input_sync(input); 1550 input_report_key(input, keycode, 0); 1551 input_sync(input); 1552 } 1553 1554 return; 1555} 1556 1557static int acpi_video_resume(struct notifier_block *nb, 1558 unsigned long val, void *ign) 1559{ 1560 struct acpi_video_bus *video; 1561 struct acpi_video_device *video_device; 1562 int i; 1563 1564 switch (val) { 1565 case PM_HIBERNATION_PREPARE: 1566 case PM_SUSPEND_PREPARE: 1567 case PM_RESTORE_PREPARE: 1568 return NOTIFY_DONE; 1569 } 1570 1571 video = container_of(nb, struct acpi_video_bus, pm_nb); 1572 1573 dev_info(&video->device->dev, "Restoring backlight state\n"); 1574 1575 for (i = 0; i < video->attached_count; i++) { 1576 video_device = video->attached_array[i].bind_info; 1577 if (video_device && video_device->backlight) 1578 acpi_video_set_brightness(video_device->backlight); 1579 } 1580 1581 return NOTIFY_OK; 1582} 1583 1584static acpi_status 1585acpi_video_bus_match(acpi_handle handle, u32 level, void *context, 1586 void **return_value) 1587{ 1588 struct acpi_device *device = context; 1589 struct acpi_device *sibling; 1590 int result; 1591 1592 if (handle == device->handle) 1593 return AE_CTRL_TERMINATE; 1594 1595 result = acpi_bus_get_device(handle, &sibling); 1596 if (result) 1597 return AE_OK; 1598 1599 if (!strcmp(acpi_device_name(sibling), ACPI_VIDEO_BUS_NAME)) 1600 return AE_ALREADY_EXISTS; 1601 1602 return AE_OK; 1603} 1604 1605static int instance; 1606 1607static int acpi_video_bus_add(struct acpi_device *device) 1608{ 1609 struct acpi_video_bus *video; 1610 struct input_dev *input; 1611 int error; 1612 acpi_status status; 1613 1614 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, 1615 device->parent->handle, 1, 1616 acpi_video_bus_match, NULL, 1617 device, NULL); 1618 if (status == AE_ALREADY_EXISTS) { 1619 printk(KERN_WARNING FW_BUG 1620 "Duplicate ACPI video bus devices for the" 1621 " same VGA controller, please try module " 1622 "parameter \"video.allow_duplicates=1\"" 1623 "if the current driver doesn't work.\n"); 1624 if (!allow_duplicates) 1625 return -ENODEV; 1626 } 1627 1628 video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL); 1629 if (!video) 1630 return -ENOMEM; 1631 1632 /* a hack to fix the duplicate name "VID" problem on T61 */ 1633 if (!strcmp(device->pnp.bus_id, "VID")) { 1634 if (instance) 1635 device->pnp.bus_id[3] = '0' + instance; 1636 instance ++; 1637 } 1638 /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */ 1639 if (!strcmp(device->pnp.bus_id, "VGA")) { 1640 if (instance) 1641 device->pnp.bus_id[3] = '0' + instance; 1642 instance++; 1643 } 1644 1645 video->device = device; 1646 strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME); 1647 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS); 1648 device->driver_data = video; 1649 1650 acpi_video_bus_find_cap(video); 1651 error = acpi_video_bus_check(video); 1652 if (error) 1653 goto err_free_video; 1654 1655 mutex_init(&video->device_list_lock); 1656 INIT_LIST_HEAD(&video->video_device_list); 1657 1658 error = acpi_video_bus_get_devices(video, device); 1659 if (error) 1660 goto err_free_video; 1661 1662 video->input = input = input_allocate_device(); 1663 if (!input) { 1664 error = -ENOMEM; 1665 goto err_put_video; 1666 } 1667 1668 error = acpi_video_bus_start_devices(video); 1669 if (error) 1670 goto err_free_input_dev; 1671 1672 snprintf(video->phys, sizeof(video->phys), 1673 "%s/video/input0", acpi_device_hid(video->device)); 1674 1675 input->name = acpi_device_name(video->device); 1676 input->phys = video->phys; 1677 input->id.bustype = BUS_HOST; 1678 input->id.product = 0x06; 1679 input->dev.parent = &device->dev; 1680 input->evbit[0] = BIT(EV_KEY); 1681 set_bit(KEY_SWITCHVIDEOMODE, input->keybit); 1682 set_bit(KEY_VIDEO_NEXT, input->keybit); 1683 set_bit(KEY_VIDEO_PREV, input->keybit); 1684 set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit); 1685 set_bit(KEY_BRIGHTNESSUP, input->keybit); 1686 set_bit(KEY_BRIGHTNESSDOWN, input->keybit); 1687 set_bit(KEY_BRIGHTNESS_ZERO, input->keybit); 1688 set_bit(KEY_DISPLAY_OFF, input->keybit); 1689 1690 error = input_register_device(input); 1691 if (error) 1692 goto err_stop_video; 1693 1694 printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s rom: %s post: %s)\n", 1695 ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device), 1696 video->flags.multihead ? "yes" : "no", 1697 video->flags.rom ? "yes" : "no", 1698 video->flags.post ? "yes" : "no"); 1699 1700 video->pm_nb.notifier_call = acpi_video_resume; 1701 video->pm_nb.priority = 0; 1702 error = register_pm_notifier(&video->pm_nb); 1703 if (error) 1704 goto err_unregister_input_dev; 1705 1706 return 0; 1707 1708 err_unregister_input_dev: 1709 input_unregister_device(input); 1710 err_stop_video: 1711 acpi_video_bus_stop_devices(video); 1712 err_free_input_dev: 1713 input_free_device(input); 1714 err_put_video: 1715 acpi_video_bus_put_devices(video); 1716 kfree(video->attached_array); 1717 err_free_video: 1718 kfree(video); 1719 device->driver_data = NULL; 1720 1721 return error; 1722} 1723 1724static int acpi_video_bus_remove(struct acpi_device *device, int type) 1725{ 1726 struct acpi_video_bus *video = NULL; 1727 1728 1729 if (!device || !acpi_driver_data(device)) 1730 return -EINVAL; 1731 1732 video = acpi_driver_data(device); 1733 1734 unregister_pm_notifier(&video->pm_nb); 1735 1736 acpi_video_bus_stop_devices(video); 1737 acpi_video_bus_put_devices(video); 1738 1739 input_unregister_device(video->input); 1740 kfree(video->attached_array); 1741 kfree(video); 1742 1743 return 0; 1744} 1745 1746static int __init intel_opregion_present(void) 1747{ 1748#if defined(CONFIG_DRM_I915) || defined(CONFIG_DRM_I915_MODULE) 1749 struct pci_dev *dev = NULL; 1750 u32 address; 1751 1752 for_each_pci_dev(dev) { 1753 if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) 1754 continue; 1755 if (dev->vendor != PCI_VENDOR_ID_INTEL) 1756 continue; 1757 pci_read_config_dword(dev, 0xfc, &address); 1758 if (!address) 1759 continue; 1760 return 1; 1761 } 1762#endif 1763 return 0; 1764} 1765 1766int acpi_video_register(void) 1767{ 1768 int result = 0; 1769 if (register_count) { 1770 /* 1771 * if the function of acpi_video_register is already called, 1772 * don't register the acpi_vide_bus again and return no error. 1773 */ 1774 return 0; 1775 } 1776 1777 result = acpi_bus_register_driver(&acpi_video_bus); 1778 if (result < 0) 1779 return -ENODEV; 1780 1781 /* 1782 * When the acpi_video_bus is loaded successfully, increase 1783 * the counter reference. 1784 */ 1785 register_count = 1; 1786 1787 return 0; 1788} 1789EXPORT_SYMBOL(acpi_video_register); 1790 1791void acpi_video_unregister(void) 1792{ 1793 if (!register_count) { 1794 /* 1795 * If the acpi video bus is already unloaded, don't 1796 * unload it again and return directly. 1797 */ 1798 return; 1799 } 1800 acpi_bus_unregister_driver(&acpi_video_bus); 1801 1802 register_count = 0; 1803 1804 return; 1805} 1806EXPORT_SYMBOL(acpi_video_unregister); 1807 1808/* 1809 * This is kind of nasty. Hardware using Intel chipsets may require 1810 * the video opregion code to be run first in order to initialise 1811 * state before any ACPI video calls are made. To handle this we defer 1812 * registration of the video class until the opregion code has run. 1813 */ 1814 1815static int __init acpi_video_init(void) 1816{ 1817 dmi_check_system(video_dmi_table); 1818 1819 if (intel_opregion_present()) 1820 return 0; 1821 1822 return acpi_video_register(); 1823} 1824 1825static void __exit acpi_video_exit(void) 1826{ 1827 acpi_video_unregister(); 1828 1829 return; 1830} 1831 1832module_init(acpi_video_init); 1833module_exit(acpi_video_exit);