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