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