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 the power changes from AC to DC
 703 *              1.      The system BIOS should NOT automatically control the brightness
 704 *                      level of the LCD when the power changes from AC to DC.
 705 *  Return Value:
 706 *              -EINVAL wrong arg.
 707 */
 708
 709static int
 710acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
 711{
 712        acpi_status status;
 713
 714        if (!video->cap._DOS)
 715                return 0;
 716
 717        if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1)
 718                return -EINVAL;
 719        video->dos_setting = (lcd_flag << 2) | bios_flag;
 720        status = acpi_execute_simple_method(video->device->handle, "_DOS",
 721                                            (lcd_flag << 2) | bios_flag);
 722        if (ACPI_FAILURE(status))
 723                return -EIO;
 724
 725        return 0;
 726}
 727
 728/*
 729 * Simple comparison function used to sort backlight levels.
 730 */
 731
 732static int
 733acpi_video_cmp_level(const void *a, const void *b)
 734{
 735        return *(int *)a - *(int *)b;
 736}
 737
 738/*
 739 * Decides if _BQC/_BCQ for this system is usable
 740 *
 741 * We do this by changing the level first and then read out the current
 742 * brightness level, if the value does not match, find out if it is using
 743 * index. If not, clear the _BQC/_BCQ capability.
 744 */
 745static int acpi_video_bqc_quirk(struct acpi_video_device *device,
 746                                int max_level, int current_level)
 747{
 748        struct acpi_video_device_brightness *br = device->brightness;
 749        int result;
 750        unsigned long long level;
 751        int test_level;
 752
 753        /* don't mess with existing known broken systems */
 754        if (bqc_offset_aml_bug_workaround)
 755                return 0;
 756
 757        /*
 758         * Some systems always report current brightness level as maximum
 759         * through _BQC, we need to test another value for them. However,
 760         * there is a subtlety:
 761         *
 762         * If the _BCL package ordering is descending, the first level
 763         * (br->levels[2]) is likely to be 0, and if the number of levels
 764         * matches the number of steps, we might confuse a returned level to
 765         * mean the index.
 766         *
 767         * For example:
 768         *
 769         *     current_level = max_level = 100
 770         *     test_level = 0
 771         *     returned level = 100
 772         *
 773         * In this case 100 means the level, not the index, and _BCM failed.
 774         * Still, if the _BCL package ordering is descending, the index of
 775         * level 0 is also 100, so we assume _BQC is indexed, when it's not.
 776         *
 777         * This causes all _BQC calls to return bogus values causing weird
 778         * behavior from the user's perspective.  For example:
 779         *
 780         * xbacklight -set 10; xbacklight -set 20;
 781         *
 782         * would flash to 90% and then slowly down to the desired level (20).
 783         *
 784         * The solution is simple; test anything other than the first level
 785         * (e.g. 1).
 786         */
 787        test_level = current_level == max_level
 788                ? br->levels[ACPI_VIDEO_FIRST_LEVEL + 1]
 789                : max_level;
 790
 791        result = acpi_video_device_lcd_set_level(device, test_level);
 792        if (result)
 793                return result;
 794
 795        result = acpi_video_device_lcd_get_level_current(device, &level, true);
 796        if (result)
 797                return result;
 798
 799        if (level != test_level) {
 800                /* buggy _BQC found, need to find out if it uses index */
 801                if (level < br->count) {
 802                        if (br->flags._BCL_reversed)
 803                                level = br->count - ACPI_VIDEO_FIRST_LEVEL - 1 - level;
 804                        if (br->levels[level + ACPI_VIDEO_FIRST_LEVEL] == test_level)
 805                                br->flags._BQC_use_index = 1;
 806                }
 807
 808                if (!br->flags._BQC_use_index)
 809                        device->cap._BQC = device->cap._BCQ = 0;
 810        }
 811
 812        return 0;
 813}
 814
 815int acpi_video_get_levels(struct acpi_device *device,
 816                          struct acpi_video_device_brightness **dev_br,
 817                          int *pmax_level)
 818{
 819        union acpi_object *obj = NULL;
 820        int i, max_level = 0, count = 0, level_ac_battery = 0;
 821        union acpi_object *o;
 822        struct acpi_video_device_brightness *br = NULL;
 823        int result = 0;
 824        u32 value;
 825
 826        if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device->handle,
 827                                                                &obj))) {
 828                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available "
 829                                                "LCD brightness level\n"));
 830                result = -ENODEV;
 831                goto out;
 832        }
 833
 834        if (obj->package.count < ACPI_VIDEO_FIRST_LEVEL) {
 835                result = -EINVAL;
 836                goto out;
 837        }
 838
 839        br = kzalloc(sizeof(*br), GFP_KERNEL);
 840        if (!br) {
 841                printk(KERN_ERR "can't allocate memory\n");
 842                result = -ENOMEM;
 843                goto out;
 844        }
 845
 846        /*
 847         * Note that we have to reserve 2 extra items (ACPI_VIDEO_FIRST_LEVEL),
 848         * in order to account for buggy BIOS which don't export the first two
 849         * special levels (see below)
 850         */
 851        br->levels = kmalloc_array(obj->package.count + ACPI_VIDEO_FIRST_LEVEL,
 852                                   sizeof(*br->levels),
 853                                   GFP_KERNEL);
 854        if (!br->levels) {
 855                result = -ENOMEM;
 856                goto out_free;
 857        }
 858
 859        for (i = 0; i < obj->package.count; i++) {
 860                o = (union acpi_object *)&obj->package.elements[i];
 861                if (o->type != ACPI_TYPE_INTEGER) {
 862                        printk(KERN_ERR PREFIX "Invalid data\n");
 863                        continue;
 864                }
 865                value = (u32) o->integer.value;
 866                /* Skip duplicate entries */
 867                if (count > ACPI_VIDEO_FIRST_LEVEL
 868                    && br->levels[count - 1] == value)
 869                        continue;
 870
 871                br->levels[count] = value;
 872
 873                if (br->levels[count] > max_level)
 874                        max_level = br->levels[count];
 875                count++;
 876        }
 877
 878        /*
 879         * some buggy BIOS don't export the levels
 880         * when machine is on AC/Battery in _BCL package.
 881         * In this case, the first two elements in _BCL packages
 882         * are also supported brightness levels that OS should take care of.
 883         */
 884        for (i = ACPI_VIDEO_FIRST_LEVEL; i < count; i++) {
 885                if (br->levels[i] == br->levels[ACPI_VIDEO_AC_LEVEL])
 886                        level_ac_battery++;
 887                if (br->levels[i] == br->levels[ACPI_VIDEO_BATTERY_LEVEL])
 888                        level_ac_battery++;
 889        }
 890
 891        if (level_ac_battery < ACPI_VIDEO_FIRST_LEVEL) {
 892                level_ac_battery = ACPI_VIDEO_FIRST_LEVEL - level_ac_battery;
 893                br->flags._BCL_no_ac_battery_levels = 1;
 894                for (i = (count - 1 + level_ac_battery);
 895                     i >= ACPI_VIDEO_FIRST_LEVEL; i--)
 896                        br->levels[i] = br->levels[i - level_ac_battery];
 897                count += level_ac_battery;
 898        } else if (level_ac_battery > ACPI_VIDEO_FIRST_LEVEL)
 899                ACPI_ERROR((AE_INFO, "Too many duplicates in _BCL package"));
 900
 901        /* Check if the _BCL package is in a reversed order */
 902        if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) {
 903                br->flags._BCL_reversed = 1;
 904                sort(&br->levels[ACPI_VIDEO_FIRST_LEVEL],
 905                     count - ACPI_VIDEO_FIRST_LEVEL,
 906                     sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]),
 907                     acpi_video_cmp_level, NULL);
 908        } else if (max_level != br->levels[count - 1])
 909                ACPI_ERROR((AE_INFO,
 910                            "Found unordered _BCL package"));
 911
 912        br->count = count;
 913        *dev_br = br;
 914        if (pmax_level)
 915                *pmax_level = max_level;
 916
 917out:
 918        kfree(obj);
 919        return result;
 920out_free:
 921        kfree(br);
 922        goto out;
 923}
 924EXPORT_SYMBOL(acpi_video_get_levels);
 925
 926/*
 927 *  Arg:
 928 *      device  : video output device (LCD, CRT, ..)
 929 *
 930 *  Return Value:
 931 *      Maximum brightness level
 932 *
 933 *  Allocate and initialize device->brightness.
 934 */
 935
 936static int
 937acpi_video_init_brightness(struct acpi_video_device *device)
 938{
 939        int i, max_level = 0;
 940        unsigned long long level, level_old;
 941        struct acpi_video_device_brightness *br = NULL;
 942        int result = -EINVAL;
 943
 944        result = acpi_video_get_levels(device->dev, &br, &max_level);
 945        if (result)
 946                return result;
 947        device->brightness = br;
 948
 949        /* _BQC uses INDEX while _BCL uses VALUE in some laptops */
 950        br->curr = level = max_level;
 951
 952        if (!device->cap._BQC)
 953                goto set_level;
 954
 955        result = acpi_video_device_lcd_get_level_current(device,
 956                                                         &level_old, true);
 957        if (result)
 958                goto out_free_levels;
 959
 960        result = acpi_video_bqc_quirk(device, max_level, level_old);
 961        if (result)
 962                goto out_free_levels;
 963        /*
 964         * cap._BQC may get cleared due to _BQC is found to be broken
 965         * in acpi_video_bqc_quirk, so check again here.
 966         */
 967        if (!device->cap._BQC)
 968                goto set_level;
 969
 970        level = acpi_video_bqc_value_to_level(device, level_old);
 971        /*
 972         * On some buggy laptops, _BQC returns an uninitialized
 973         * value when invoked for the first time, i.e.
 974         * level_old is invalid (no matter whether it's a level
 975         * or an index). Set the backlight to max_level in this case.
 976         */
 977        for (i = ACPI_VIDEO_FIRST_LEVEL; i < br->count; i++)
 978                if (level == br->levels[i])
 979                        break;
 980        if (i == br->count || !level)
 981                level = max_level;
 982
 983set_level:
 984        result = acpi_video_device_lcd_set_level(device, level);
 985        if (result)
 986                goto out_free_levels;
 987
 988        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 989                          "found %d brightness levels\n",
 990                          br->count - ACPI_VIDEO_FIRST_LEVEL));
 991        return 0;
 992
 993out_free_levels:
 994        kfree(br->levels);
 995        kfree(br);
 996        device->brightness = NULL;
 997        return result;
 998}
 999
1000/*
1001 *  Arg:
1002 *      device  : video output device (LCD, CRT, ..)
1003 *
1004 *  Return Value:
1005 *      None
1006 *
1007 *  Find out all required AML methods defined under the output
1008 *  device.
1009 */
1010
1011static void acpi_video_device_find_cap(struct acpi_video_device *device)
1012{
1013        if (acpi_has_method(device->dev->handle, "_ADR"))
1014                device->cap._ADR = 1;
1015        if (acpi_has_method(device->dev->handle, "_BCL"))
1016                device->cap._BCL = 1;
1017        if (acpi_has_method(device->dev->handle, "_BCM"))
1018                device->cap._BCM = 1;
1019        if (acpi_has_method(device->dev->handle, "_BQC")) {
1020                device->cap._BQC = 1;
1021        } else if (acpi_has_method(device->dev->handle, "_BCQ")) {
1022                printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n");
1023                device->cap._BCQ = 1;
1024        }
1025
1026        if (acpi_has_method(device->dev->handle, "_DDC"))
1027                device->cap._DDC = 1;
1028}
1029
1030/*
1031 *  Arg:
1032 *      device  : video output device (VGA)
1033 *
1034 *  Return Value:
1035 *      None
1036 *
1037 *  Find out all required AML methods defined under the video bus device.
1038 */
1039
1040static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
1041{
1042        if (acpi_has_method(video->device->handle, "_DOS"))
1043                video->cap._DOS = 1;
1044        if (acpi_has_method(video->device->handle, "_DOD"))
1045                video->cap._DOD = 1;
1046        if (acpi_has_method(video->device->handle, "_ROM"))
1047                video->cap._ROM = 1;
1048        if (acpi_has_method(video->device->handle, "_GPD"))
1049                video->cap._GPD = 1;
1050        if (acpi_has_method(video->device->handle, "_SPD"))
1051                video->cap._SPD = 1;
1052        if (acpi_has_method(video->device->handle, "_VPO"))
1053                video->cap._VPO = 1;
1054}
1055
1056/*
1057 * Check whether the video bus device has required AML method to
1058 * support the desired features
1059 */
1060
1061static int acpi_video_bus_check(struct acpi_video_bus *video)
1062{
1063        acpi_status status = -ENOENT;
1064        struct pci_dev *dev;
1065
1066        if (!video)
1067                return -EINVAL;
1068
1069        dev = acpi_get_pci_dev(video->device->handle);
1070        if (!dev)
1071                return -ENODEV;
1072        pci_dev_put(dev);
1073
1074        /*
1075         * Since there is no HID, CID and so on for VGA driver, we have
1076         * to check well known required nodes.
1077         */
1078
1079        /* Does this device support video switching? */
1080        if (video->cap._DOS || video->cap._DOD) {
1081                if (!video->cap._DOS) {
1082                        printk(KERN_WARNING FW_BUG
1083                                "ACPI(%s) defines _DOD but not _DOS\n",
1084                                acpi_device_bid(video->device));
1085                }
1086                video->flags.multihead = 1;
1087                status = 0;
1088        }
1089
1090        /* Does this device support retrieving a video ROM? */
1091        if (video->cap._ROM) {
1092                video->flags.rom = 1;
1093                status = 0;
1094        }
1095
1096        /* Does this device support configuring which video device to POST? */
1097        if (video->cap._GPD && video->cap._SPD && video->cap._VPO) {
1098                video->flags.post = 1;
1099                status = 0;
1100        }
1101
1102        return status;
1103}
1104
1105/*
1106 * --------------------------------------------------------------------------
1107 *                               Driver Interface
1108 * --------------------------------------------------------------------------
1109 */
1110
1111/* device interface */
1112static struct acpi_video_device_attrib *
1113acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id)
1114{
1115        struct acpi_video_enumerated_device *ids;
1116        int i;
1117
1118        for (i = 0; i < video->attached_count; i++) {
1119                ids = &video->attached_array[i];
1120                if ((ids->value.int_val & 0xffff) == device_id)
1121                        return &ids->value.attrib;
1122        }
1123
1124        return NULL;
1125}
1126
1127static int
1128acpi_video_get_device_type(struct acpi_video_bus *video,
1129                           unsigned long device_id)
1130{
1131        struct acpi_video_enumerated_device *ids;
1132        int i;
1133
1134        for (i = 0; i < video->attached_count; i++) {
1135                ids = &video->attached_array[i];
1136                if ((ids->value.int_val & 0xffff) == device_id)
1137                        return ids->value.int_val;
1138        }
1139
1140        return 0;
1141}
1142
1143static int
1144acpi_video_bus_get_one_device(struct acpi_device *device,
1145                              struct acpi_video_bus *video)
1146{
1147        unsigned long long device_id;
1148        int status, device_type;
1149        struct acpi_video_device *data;
1150        struct acpi_video_device_attrib *attribute;
1151
1152        status =
1153            acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
1154        /* Some device omits _ADR, we skip them instead of fail */
1155        if (ACPI_FAILURE(status))
1156                return 0;
1157
1158        data = kzalloc(sizeof(struct acpi_video_device), GFP_KERNEL);
1159        if (!data)
1160                return -ENOMEM;
1161
1162        strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME);
1163        strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
1164        device->driver_data = data;
1165
1166        data->device_id = device_id;
1167        data->video = video;
1168        data->dev = device;
1169        INIT_DELAYED_WORK(&data->switch_brightness_work,
1170                          acpi_video_switch_brightness);
1171
1172        attribute = acpi_video_get_device_attr(video, device_id);
1173
1174        if (attribute && (attribute->device_id_scheme || device_id_scheme)) {
1175                switch (attribute->display_type) {
1176                case ACPI_VIDEO_DISPLAY_CRT:
1177                        data->flags.crt = 1;
1178                        break;
1179                case ACPI_VIDEO_DISPLAY_TV:
1180                        data->flags.tvout = 1;
1181                        break;
1182                case ACPI_VIDEO_DISPLAY_DVI:
1183                        data->flags.dvi = 1;
1184                        break;
1185                case ACPI_VIDEO_DISPLAY_LCD:
1186                        data->flags.lcd = 1;
1187                        break;
1188                default:
1189                        data->flags.unknown = 1;
1190                        break;
1191                }
1192                if (attribute->bios_can_detect)
1193                        data->flags.bios = 1;
1194        } else {
1195                /* Check for legacy IDs */
1196                device_type = acpi_video_get_device_type(video, device_id);
1197                /* Ignore bits 16 and 18-20 */
1198                switch (device_type & 0xffe2ffff) {
1199                case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
1200                        data->flags.crt = 1;
1201                        break;
1202                case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
1203                        data->flags.lcd = 1;
1204                        break;
1205                case ACPI_VIDEO_DISPLAY_LEGACY_TV:
1206                        data->flags.tvout = 1;
1207                        break;
1208                default:
1209                        data->flags.unknown = 1;
1210                }
1211        }
1212
1213        acpi_video_device_bind(video, data);
1214        acpi_video_device_find_cap(data);
1215
1216        mutex_lock(&video->device_list_lock);
1217        list_add_tail(&data->entry, &video->video_device_list);
1218        mutex_unlock(&video->device_list_lock);
1219
1220        return status;
1221}
1222
1223/*
1224 *  Arg:
1225 *      video   : video bus device
1226 *
1227 *  Return:
1228 *      none
1229 *
1230 *  Enumerate the video device list of the video bus,
1231 *  bind the ids with the corresponding video devices
1232 *  under the video bus.
1233 */
1234
1235static void acpi_video_device_rebind(struct acpi_video_bus *video)
1236{
1237        struct acpi_video_device *dev;
1238
1239        mutex_lock(&video->device_list_lock);
1240
1241        list_for_each_entry(dev, &video->video_device_list, entry)
1242                acpi_video_device_bind(video, dev);
1243
1244        mutex_unlock(&video->device_list_lock);
1245}
1246
1247/*
1248 *  Arg:
1249 *      video   : video bus device
1250 *      device  : video output device under the video
1251 *              bus
1252 *
1253 *  Return:
1254 *      none
1255 *
1256 *  Bind the ids with the corresponding video devices
1257 *  under the video bus.
1258 */
1259
1260static void
1261acpi_video_device_bind(struct acpi_video_bus *video,
1262                       struct acpi_video_device *device)
1263{
1264        struct acpi_video_enumerated_device *ids;
1265        int i;
1266
1267        for (i = 0; i < video->attached_count; i++) {
1268                ids = &video->attached_array[i];
1269                if (device->device_id == (ids->value.int_val & 0xffff)) {
1270                        ids->bind_info = device;
1271                        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "device_bind %d\n", i));
1272                }
1273        }
1274}
1275
1276static bool acpi_video_device_in_dod(struct acpi_video_device *device)
1277{
1278        struct acpi_video_bus *video = device->video;
1279        int i;
1280
1281        /*
1282         * If we have a broken _DOD or we have more than 8 output devices
1283         * under the graphics controller node that we can't proper deal with
1284         * in the operation region code currently, no need to test.
1285         */
1286        if (!video->attached_count || video->child_count > 8)
1287                return true;
1288
1289        for (i = 0; i < video->attached_count; i++) {
1290                if ((video->attached_array[i].value.int_val & 0xfff) ==
1291                    (device->device_id & 0xfff))
1292                        return true;
1293        }
1294
1295        return false;
1296}
1297
1298/*
1299 *  Arg:
1300 *      video   : video bus device
1301 *
1302 *  Return:
1303 *      < 0     : error
1304 *
1305 *  Call _DOD to enumerate all devices attached to display adapter
1306 *
1307 */
1308
1309static int acpi_video_device_enumerate(struct acpi_video_bus *video)
1310{
1311        int status;
1312        int count;
1313        int i;
1314        struct acpi_video_enumerated_device *active_list;
1315        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
1316        union acpi_object *dod = NULL;
1317        union acpi_object *obj;
1318
1319        if (!video->cap._DOD)
1320                return AE_NOT_EXIST;
1321
1322        status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer);
1323        if (!ACPI_SUCCESS(status)) {
1324                ACPI_EXCEPTION((AE_INFO, status, "Evaluating _DOD"));
1325                return status;
1326        }
1327
1328        dod = buffer.pointer;
1329        if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) {
1330                ACPI_EXCEPTION((AE_INFO, status, "Invalid _DOD data"));
1331                status = -EFAULT;
1332                goto out;
1333        }
1334
1335        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d video heads in _DOD\n",
1336                          dod->package.count));
1337
1338        active_list = kcalloc(1 + dod->package.count,
1339                              sizeof(struct acpi_video_enumerated_device),
1340                              GFP_KERNEL);
1341        if (!active_list) {
1342                status = -ENOMEM;
1343                goto out;
1344        }
1345
1346        count = 0;
1347        for (i = 0; i < dod->package.count; i++) {
1348                obj = &dod->package.elements[i];
1349
1350                if (obj->type != ACPI_TYPE_INTEGER) {
1351                        printk(KERN_ERR PREFIX
1352                                "Invalid _DOD data in element %d\n", i);
1353                        continue;
1354                }
1355
1356                active_list[count].value.int_val = obj->integer.value;
1357                active_list[count].bind_info = NULL;
1358                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "dod element[%d] = %d\n", i,
1359                                  (int)obj->integer.value));
1360                count++;
1361        }
1362
1363        kfree(video->attached_array);
1364
1365        video->attached_array = active_list;
1366        video->attached_count = count;
1367
1368out:
1369        kfree(buffer.pointer);
1370        return status;
1371}
1372
1373static int
1374acpi_video_get_next_level(struct acpi_video_device *device,
1375                          u32 level_current, u32 event)
1376{
1377        int min, max, min_above, max_below, i, l, delta = 255;
1378        max = max_below = 0;
1379        min = min_above = 255;
1380        /* Find closest level to level_current */
1381        for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) {
1382                l = device->brightness->levels[i];
1383                if (abs(l - level_current) < abs(delta)) {
1384                        delta = l - level_current;
1385                        if (!delta)
1386                                break;
1387                }
1388        }
1389        /* Ajust level_current to closest available level */
1390        level_current += delta;
1391        for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) {
1392                l = device->brightness->levels[i];
1393                if (l < min)
1394                        min = l;
1395                if (l > max)
1396                        max = l;
1397                if (l < min_above && l > level_current)
1398                        min_above = l;
1399                if (l > max_below && l < level_current)
1400                        max_below = l;
1401        }
1402
1403        switch (event) {
1404        case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS:
1405                return (level_current < max) ? min_above : min;
1406        case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS:
1407                return (level_current < max) ? min_above : max;
1408        case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS:
1409                return (level_current > min) ? max_below : min;
1410        case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS:
1411        case ACPI_VIDEO_NOTIFY_DISPLAY_OFF:
1412                return 0;
1413        default:
1414                return level_current;
1415        }
1416}
1417
1418static void
1419acpi_video_switch_brightness(struct work_struct *work)
1420{
1421        struct acpi_video_device *device = container_of(to_delayed_work(work),
1422                             struct acpi_video_device, switch_brightness_work);
1423        unsigned long long level_current, level_next;
1424        int event = device->switch_brightness_event;
1425        int result = -EINVAL;
1426
1427        /* no warning message if acpi_backlight=vendor or a quirk is used */
1428        if (!device->backlight)
1429                return;
1430
1431        if (!device->brightness)
1432                goto out;
1433
1434        result = acpi_video_device_lcd_get_level_current(device,
1435                                                         &level_current,
1436                                                         false);
1437        if (result)
1438                goto out;
1439
1440        level_next = acpi_video_get_next_level(device, level_current, event);
1441
1442        result = acpi_video_device_lcd_set_level(device, level_next);
1443
1444        if (!result)
1445                backlight_force_update(device->backlight,
1446                                       BACKLIGHT_UPDATE_HOTKEY);
1447
1448out:
1449        if (result)
1450                printk(KERN_ERR PREFIX "Failed to switch the brightness\n");
1451}
1452
1453int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
1454                        void **edid)
1455{
1456        struct acpi_video_bus *video;
1457        struct acpi_video_device *video_device;
1458        union acpi_object *buffer = NULL;
1459        acpi_status status;
1460        int i, length;
1461
1462        if (!device || !acpi_driver_data(device))
1463                return -EINVAL;
1464
1465        video = acpi_driver_data(device);
1466
1467        for (i = 0; i < video->attached_count; i++) {
1468                video_device = video->attached_array[i].bind_info;
1469                length = 256;
1470
1471                if (!video_device)
1472                        continue;
1473
1474                if (!video_device->cap._DDC)
1475                        continue;
1476
1477                if (type) {
1478                        switch (type) {
1479                        case ACPI_VIDEO_DISPLAY_CRT:
1480                                if (!video_device->flags.crt)
1481                                        continue;
1482                                break;
1483                        case ACPI_VIDEO_DISPLAY_TV:
1484                                if (!video_device->flags.tvout)
1485                                        continue;
1486                                break;
1487                        case ACPI_VIDEO_DISPLAY_DVI:
1488                                if (!video_device->flags.dvi)
1489                                        continue;
1490                                break;
1491                        case ACPI_VIDEO_DISPLAY_LCD:
1492                                if (!video_device->flags.lcd)
1493                                        continue;
1494                                break;
1495                        }
1496                } else if (video_device->device_id != device_id) {
1497                        continue;
1498                }
1499
1500                status = acpi_video_device_EDID(video_device, &buffer, length);
1501
1502                if (ACPI_FAILURE(status) || !buffer ||
1503                    buffer->type != ACPI_TYPE_BUFFER) {
1504                        length = 128;
1505                        status = acpi_video_device_EDID(video_device, &buffer,
1506                                                        length);
1507                        if (ACPI_FAILURE(status) || !buffer ||
1508                            buffer->type != ACPI_TYPE_BUFFER) {
1509                                continue;
1510                        }
1511                }
1512
1513                *edid = buffer->buffer.pointer;
1514                return length;
1515        }
1516
1517        return -ENODEV;
1518}
1519EXPORT_SYMBOL(acpi_video_get_edid);
1520
1521static int
1522acpi_video_bus_get_devices(struct acpi_video_bus *video,
1523                           struct acpi_device *device)
1524{
1525        int status = 0;
1526        struct acpi_device *dev;
1527
1528        /*
1529         * There are systems where video module known to work fine regardless
1530         * of broken _DOD and ignoring returned value here doesn't cause
1531         * any issues later.
1532         */
1533        acpi_video_device_enumerate(video);
1534
1535        list_for_each_entry(dev, &device->children, node) {
1536
1537                status = acpi_video_bus_get_one_device(dev, video);
1538                if (status) {
1539                        dev_err(&dev->dev, "Can't attach device\n");
1540                        break;
1541                }
1542                video->child_count++;
1543        }
1544        return status;
1545}
1546
1547/* acpi_video interface */
1548
1549/*
1550 * Win8 requires setting bit2 of _DOS to let firmware know it shouldn't
1551 * preform any automatic brightness change on receiving a notification.
1552 */
1553static int acpi_video_bus_start_devices(struct acpi_video_bus *video)
1554{
1555        return acpi_video_bus_DOS(video, 0,
1556                                  acpi_osi_is_win8() ? 1 : 0);
1557}
1558
1559static int acpi_video_bus_stop_devices(struct acpi_video_bus *video)
1560{
1561        return acpi_video_bus_DOS(video, 0,
1562                                  acpi_osi_is_win8() ? 0 : 1);
1563}
1564
1565static void acpi_video_bus_notify(struct acpi_device *device, u32 event)
1566{
1567        struct acpi_video_bus *video = acpi_driver_data(device);
1568        struct input_dev *input;
1569        int keycode = 0;
1570
1571        if (!video || !video->input)
1572                return;
1573
1574        input = video->input;
1575
1576        switch (event) {
1577        case ACPI_VIDEO_NOTIFY_SWITCH:  /* User requested a switch,
1578                                         * most likely via hotkey. */
1579                keycode = KEY_SWITCHVIDEOMODE;
1580                break;
1581
1582        case ACPI_VIDEO_NOTIFY_PROBE:   /* User plugged in or removed a video
1583                                         * connector. */
1584                acpi_video_device_enumerate(video);
1585                acpi_video_device_rebind(video);
1586                keycode = KEY_SWITCHVIDEOMODE;
1587                break;
1588
1589        case ACPI_VIDEO_NOTIFY_CYCLE:   /* Cycle Display output hotkey pressed. */
1590                keycode = KEY_SWITCHVIDEOMODE;
1591                break;
1592        case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT:     /* Next Display output hotkey pressed. */
1593                keycode = KEY_VIDEO_NEXT;
1594                break;
1595        case ACPI_VIDEO_NOTIFY_PREV_OUTPUT:     /* previous Display output hotkey pressed. */
1596                keycode = KEY_VIDEO_PREV;
1597                break;
1598
1599        default:
1600                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1601                                  "Unsupported event [0x%x]\n", event));
1602                break;
1603        }
1604
1605        if (acpi_notifier_call_chain(device, event, 0))
1606                /* Something vetoed the keypress. */
1607                keycode = 0;
1608
1609        if (keycode && (report_key_events & REPORT_OUTPUT_KEY_EVENTS)) {
1610                input_report_key(input, keycode, 1);
1611                input_sync(input);
1612                input_report_key(input, keycode, 0);
1613                input_sync(input);
1614        }
1615
1616        return;
1617}
1618
1619static void brightness_switch_event(struct acpi_video_device *video_device,
1620                                    u32 event)
1621{
1622        if (!brightness_switch_enabled)
1623                return;
1624
1625        video_device->switch_brightness_event = event;
1626        schedule_delayed_work(&video_device->switch_brightness_work, HZ / 10);
1627}
1628
1629static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
1630{
1631        struct acpi_video_device *video_device = data;
1632        struct acpi_device *device = NULL;
1633        struct acpi_video_bus *bus;
1634        struct input_dev *input;
1635        int keycode = 0;
1636
1637        if (!video_device)
1638                return;
1639
1640        device = video_device->dev;
1641        bus = video_device->video;
1642        input = bus->input;
1643
1644        if (hw_changes_brightness > 0) {
1645                if (video_device->backlight)
1646                        backlight_force_update(video_device->backlight,
1647                                               BACKLIGHT_UPDATE_HOTKEY);
1648                acpi_notifier_call_chain(device, event, 0);
1649                return;
1650        }
1651
1652        switch (event) {
1653        case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS:        /* Cycle brightness */
1654                brightness_switch_event(video_device, event);
1655                keycode = KEY_BRIGHTNESS_CYCLE;
1656                break;
1657        case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS:  /* Increase brightness */
1658                brightness_switch_event(video_device, event);
1659                keycode = KEY_BRIGHTNESSUP;
1660                break;
1661        case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS:  /* Decrease brightness */
1662                brightness_switch_event(video_device, event);
1663                keycode = KEY_BRIGHTNESSDOWN;
1664                break;
1665        case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS: /* zero brightness */
1666                brightness_switch_event(video_device, event);
1667                keycode = KEY_BRIGHTNESS_ZERO;
1668                break;
1669        case ACPI_VIDEO_NOTIFY_DISPLAY_OFF:     /* display device off */
1670                brightness_switch_event(video_device, event);
1671                keycode = KEY_DISPLAY_OFF;
1672                break;
1673        default:
1674                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1675                                  "Unsupported event [0x%x]\n", event));
1676                break;
1677        }
1678
1679        acpi_notifier_call_chain(device, event, 0);
1680
1681        if (keycode && (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS)) {
1682                input_report_key(input, keycode, 1);
1683                input_sync(input);
1684                input_report_key(input, keycode, 0);
1685                input_sync(input);
1686        }
1687
1688        return;
1689}
1690
1691static int acpi_video_resume(struct notifier_block *nb,
1692                                unsigned long val, void *ign)
1693{
1694        struct acpi_video_bus *video;
1695        struct acpi_video_device *video_device;
1696        int i;
1697
1698        switch (val) {
1699        case PM_HIBERNATION_PREPARE:
1700        case PM_SUSPEND_PREPARE:
1701        case PM_RESTORE_PREPARE:
1702                return NOTIFY_DONE;
1703        }
1704
1705        video = container_of(nb, struct acpi_video_bus, pm_nb);
1706
1707        dev_info(&video->device->dev, "Restoring backlight state\n");
1708
1709        for (i = 0; i < video->attached_count; i++) {
1710                video_device = video->attached_array[i].bind_info;
1711                if (video_device && video_device->brightness)
1712                        acpi_video_device_lcd_set_level(video_device,
1713                                        video_device->brightness->curr);
1714        }
1715
1716        return NOTIFY_OK;
1717}
1718
1719static acpi_status
1720acpi_video_bus_match(acpi_handle handle, u32 level, void *context,
1721                        void **return_value)
1722{
1723        struct acpi_device *device = context;
1724        struct acpi_device *sibling;
1725        int result;
1726
1727        if (handle == device->handle)
1728                return AE_CTRL_TERMINATE;
1729
1730        result = acpi_bus_get_device(handle, &sibling);
1731        if (result)
1732                return AE_OK;
1733
1734        if (!strcmp(acpi_device_name(sibling), ACPI_VIDEO_BUS_NAME))
1735                        return AE_ALREADY_EXISTS;
1736
1737        return AE_OK;
1738}
1739
1740static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
1741{
1742        struct backlight_properties props;
1743        struct pci_dev *pdev;
1744        acpi_handle acpi_parent;
1745        struct device *parent = NULL;
1746        int result;
1747        static int count;
1748        char *name;
1749
1750        result = acpi_video_init_brightness(device);
1751        if (result)
1752                return;
1753
1754        if (disable_backlight_sysfs_if > 0)
1755                return;
1756
1757        name = kasprintf(GFP_KERNEL, "acpi_video%d", count);
1758        if (!name)
1759                return;
1760        count++;
1761
1762        acpi_get_parent(device->dev->handle, &acpi_parent);
1763
1764        pdev = acpi_get_pci_dev(acpi_parent);
1765        if (pdev) {
1766                parent = &pdev->dev;
1767                pci_dev_put(pdev);
1768        }
1769
1770        memset(&props, 0, sizeof(struct backlight_properties));
1771        props.type = BACKLIGHT_FIRMWARE;
1772        props.max_brightness =
1773                device->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1;
1774        device->backlight = backlight_device_register(name,
1775                                                      parent,
1776                                                      device,
1777                                                      &acpi_backlight_ops,
1778                                                      &props);
1779        kfree(name);
1780        if (IS_ERR(device->backlight)) {
1781                device->backlight = NULL;
1782                return;
1783        }
1784
1785        /*
1786         * Save current brightness level in case we have to restore it
1787         * before acpi_video_device_lcd_set_level() is called next time.
1788         */
1789        device->backlight->props.brightness =
1790                        acpi_video_get_brightness(device->backlight);
1791
1792        device->cooling_dev = thermal_cooling_device_register("LCD",
1793                                device->dev, &video_cooling_ops);
1794        if (IS_ERR(device->cooling_dev)) {
1795                /*
1796                 * Set cooling_dev to NULL so we don't crash trying to free it.
1797                 * Also, why the hell we are returning early and not attempt to
1798                 * register video output if cooling device registration failed?
1799                 * -- dtor
1800                 */
1801                device->cooling_dev = NULL;
1802                return;
1803        }
1804
1805        dev_info(&device->dev->dev, "registered as cooling_device%d\n",
1806                 device->cooling_dev->id);
1807        result = sysfs_create_link(&device->dev->dev.kobj,
1808                        &device->cooling_dev->device.kobj,
1809                        "thermal_cooling");
1810        if (result)
1811                printk(KERN_ERR PREFIX "Create sysfs link\n");
1812        result = sysfs_create_link(&device->cooling_dev->device.kobj,
1813                        &device->dev->dev.kobj, "device");
1814        if (result)
1815                printk(KERN_ERR PREFIX "Create sysfs link\n");
1816}
1817
1818static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video)
1819{
1820        struct acpi_video_device *dev;
1821        union acpi_object *levels;
1822
1823        mutex_lock(&video->device_list_lock);
1824        list_for_each_entry(dev, &video->video_device_list, entry) {
1825                if (!acpi_video_device_lcd_query_levels(dev->dev->handle, &levels))
1826                        kfree(levels);
1827        }
1828        mutex_unlock(&video->device_list_lock);
1829}
1830
1831static bool acpi_video_should_register_backlight(struct acpi_video_device *dev)
1832{
1833        /*
1834         * Do not create backlight device for video output
1835         * device that is not in the enumerated list.
1836         */
1837        if (!acpi_video_device_in_dod(dev)) {
1838                dev_dbg(&dev->dev->dev, "not in _DOD list, ignore\n");
1839                return false;
1840        }
1841
1842        if (only_lcd)
1843                return dev->flags.lcd;
1844        return true;
1845}
1846
1847static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
1848{
1849        struct acpi_video_device *dev;
1850
1851        if (video->backlight_registered)
1852                return 0;
1853
1854        acpi_video_run_bcl_for_osi(video);
1855
1856        if (acpi_video_get_backlight_type() != acpi_backlight_video)
1857                return 0;
1858
1859        mutex_lock(&video->device_list_lock);
1860        list_for_each_entry(dev, &video->video_device_list, entry) {
1861                if (acpi_video_should_register_backlight(dev))
1862                        acpi_video_dev_register_backlight(dev);
1863        }
1864        mutex_unlock(&video->device_list_lock);
1865
1866        video->backlight_registered = true;
1867
1868        video->pm_nb.notifier_call = acpi_video_resume;
1869        video->pm_nb.priority = 0;
1870        return register_pm_notifier(&video->pm_nb);
1871}
1872
1873static void acpi_video_dev_unregister_backlight(struct acpi_video_device *device)
1874{
1875        if (device->backlight) {
1876                backlight_device_unregister(device->backlight);
1877                device->backlight = NULL;
1878        }
1879        if (device->brightness) {
1880                kfree(device->brightness->levels);
1881                kfree(device->brightness);
1882                device->brightness = NULL;
1883        }
1884        if (device->cooling_dev) {
1885                sysfs_remove_link(&device->dev->dev.kobj, "thermal_cooling");
1886                sysfs_remove_link(&device->cooling_dev->device.kobj, "device");
1887                thermal_cooling_device_unregister(device->cooling_dev);
1888                device->cooling_dev = NULL;
1889        }
1890}
1891
1892static int acpi_video_bus_unregister_backlight(struct acpi_video_bus *video)
1893{
1894        struct acpi_video_device *dev;
1895        int error;
1896
1897        if (!video->backlight_registered)
1898                return 0;
1899
1900        error = unregister_pm_notifier(&video->pm_nb);
1901
1902        mutex_lock(&video->device_list_lock);
1903        list_for_each_entry(dev, &video->video_device_list, entry)
1904                acpi_video_dev_unregister_backlight(dev);
1905        mutex_unlock(&video->device_list_lock);
1906
1907        video->backlight_registered = false;
1908
1909        return error;
1910}
1911
1912static void acpi_video_dev_add_notify_handler(struct acpi_video_device *device)
1913{
1914        acpi_status status;
1915        struct acpi_device *adev = device->dev;
1916
1917        status = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY,
1918                                             acpi_video_device_notify, device);
1919        if (ACPI_FAILURE(status))
1920                dev_err(&adev->dev, "Error installing notify handler\n");
1921        else
1922                device->flags.notify = 1;
1923}
1924
1925static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video)
1926{
1927        struct input_dev *input;
1928        struct acpi_video_device *dev;
1929        int error;
1930
1931        video->input = input = input_allocate_device();
1932        if (!input) {
1933                error = -ENOMEM;
1934                goto out;
1935        }
1936
1937        error = acpi_video_bus_start_devices(video);
1938        if (error)
1939                goto err_free_input;
1940
1941        snprintf(video->phys, sizeof(video->phys),
1942                        "%s/video/input0", acpi_device_hid(video->device));
1943
1944        input->name = acpi_device_name(video->device);
1945        input->phys = video->phys;
1946        input->id.bustype = BUS_HOST;
1947        input->id.product = 0x06;
1948        input->dev.parent = &video->device->dev;
1949        input->evbit[0] = BIT(EV_KEY);
1950        set_bit(KEY_SWITCHVIDEOMODE, input->keybit);
1951        set_bit(KEY_VIDEO_NEXT, input->keybit);
1952        set_bit(KEY_VIDEO_PREV, input->keybit);
1953        set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit);
1954        set_bit(KEY_BRIGHTNESSUP, input->keybit);
1955        set_bit(KEY_BRIGHTNESSDOWN, input->keybit);
1956        set_bit(KEY_BRIGHTNESS_ZERO, input->keybit);
1957        set_bit(KEY_DISPLAY_OFF, input->keybit);
1958
1959        error = input_register_device(input);
1960        if (error)
1961                goto err_stop_dev;
1962
1963        mutex_lock(&video->device_list_lock);
1964        list_for_each_entry(dev, &video->video_device_list, entry)
1965                acpi_video_dev_add_notify_handler(dev);
1966        mutex_unlock(&video->device_list_lock);
1967
1968        return 0;
1969
1970err_stop_dev:
1971        acpi_video_bus_stop_devices(video);
1972err_free_input:
1973        input_free_device(input);
1974        video->input = NULL;
1975out:
1976        return error;
1977}
1978
1979static void acpi_video_dev_remove_notify_handler(struct acpi_video_device *dev)
1980{
1981        if (dev->flags.notify) {
1982                acpi_remove_notify_handler(dev->dev->handle, ACPI_DEVICE_NOTIFY,
1983                                           acpi_video_device_notify);
1984                dev->flags.notify = 0;
1985        }
1986}
1987
1988static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
1989{
1990        struct acpi_video_device *dev;
1991
1992        mutex_lock(&video->device_list_lock);
1993        list_for_each_entry(dev, &video->video_device_list, entry)
1994                acpi_video_dev_remove_notify_handler(dev);
1995        mutex_unlock(&video->device_list_lock);
1996
1997        acpi_video_bus_stop_devices(video);
1998        input_unregister_device(video->input);
1999        video->input = NULL;
2000}
2001
2002static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
2003{
2004        struct acpi_video_device *dev, *next;
2005
2006        mutex_lock(&video->device_list_lock);
2007        list_for_each_entry_safe(dev, next, &video->video_device_list, entry) {
2008                list_del(&dev->entry);
2009                kfree(dev);
2010        }
2011        mutex_unlock(&video->device_list_lock);
2012
2013        return 0;
2014}
2015
2016static int instance;
2017
2018static int acpi_video_bus_add(struct acpi_device *device)
2019{
2020        struct acpi_video_bus *video;
2021        int error;
2022        acpi_status status;
2023
2024        status = acpi_walk_namespace(ACPI_TYPE_DEVICE,
2025                                device->parent->handle, 1,
2026                                acpi_video_bus_match, NULL,
2027                                device, NULL);
2028        if (status == AE_ALREADY_EXISTS) {
2029                printk(KERN_WARNING FW_BUG
2030                        "Duplicate ACPI video bus devices for the"
2031                        " same VGA controller, please try module "
2032                        "parameter \"video.allow_duplicates=1\""
2033                        "if the current driver doesn't work.\n");
2034                if (!allow_duplicates)
2035                        return -ENODEV;
2036        }
2037
2038        video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL);
2039        if (!video)
2040                return -ENOMEM;
2041
2042        /* a hack to fix the duplicate name "VID" problem on T61 */
2043        if (!strcmp(device->pnp.bus_id, "VID")) {
2044                if (instance)
2045                        device->pnp.bus_id[3] = '0' + instance;
2046                instance++;
2047        }
2048        /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
2049        if (!strcmp(device->pnp.bus_id, "VGA")) {
2050                if (instance)
2051                        device->pnp.bus_id[3] = '0' + instance;
2052                instance++;
2053        }
2054
2055        video->device = device;
2056        strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
2057        strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
2058        device->driver_data = video;
2059
2060        acpi_video_bus_find_cap(video);
2061        error = acpi_video_bus_check(video);
2062        if (error)
2063                goto err_free_video;
2064
2065        mutex_init(&video->device_list_lock);
2066        INIT_LIST_HEAD(&video->video_device_list);
2067
2068        error = acpi_video_bus_get_devices(video, device);
2069        if (error)
2070                goto err_put_video;
2071
2072        printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s  rom: %s  post: %s)\n",
2073               ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
2074               video->flags.multihead ? "yes" : "no",
2075               video->flags.rom ? "yes" : "no",
2076               video->flags.post ? "yes" : "no");
2077        mutex_lock(&video_list_lock);
2078        list_add_tail(&video->entry, &video_bus_head);
2079        mutex_unlock(&video_list_lock);
2080
2081        acpi_video_bus_register_backlight(video);
2082        acpi_video_bus_add_notify_handler(video);
2083
2084        return 0;
2085
2086err_put_video:
2087        acpi_video_bus_put_devices(video);
2088        kfree(video->attached_array);
2089err_free_video:
2090        kfree(video);
2091        device->driver_data = NULL;
2092
2093        return error;
2094}
2095
2096static int acpi_video_bus_remove(struct acpi_device *device)
2097{
2098        struct acpi_video_bus *video = NULL;
2099
2100
2101        if (!device || !acpi_driver_data(device))
2102                return -EINVAL;
2103
2104        video = acpi_driver_data(device);
2105
2106        acpi_video_bus_remove_notify_handler(video);
2107        acpi_video_bus_unregister_backlight(video);
2108        acpi_video_bus_put_devices(video);
2109
2110        mutex_lock(&video_list_lock);
2111        list_del(&video->entry);
2112        mutex_unlock(&video_list_lock);
2113
2114        kfree(video->attached_array);
2115        kfree(video);
2116
2117        return 0;
2118}
2119
2120static int __init is_i740(struct pci_dev *dev)
2121{
2122        if (dev->device == 0x00D1)
2123                return 1;
2124        if (dev->device == 0x7000)
2125                return 1;
2126        return 0;
2127}
2128
2129static int __init intel_opregion_present(void)
2130{
2131        int opregion = 0;
2132        struct pci_dev *dev = NULL;
2133        u32 address;
2134
2135        for_each_pci_dev(dev) {
2136                if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
2137                        continue;
2138                if (dev->vendor != PCI_VENDOR_ID_INTEL)
2139                        continue;
2140                /* We don't want to poke around undefined i740 registers */
2141                if (is_i740(dev))
2142                        continue;
2143                pci_read_config_dword(dev, 0xfc, &address);
2144                if (!address)
2145                        continue;
2146                opregion = 1;
2147        }
2148        return opregion;
2149}
2150
2151/* Check if the chassis-type indicates there is no builtin LCD panel */
2152static bool dmi_is_desktop(void)
2153{
2154        const char *chassis_type;
2155        unsigned long type;
2156
2157        chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE);
2158        if (!chassis_type)
2159                return false;
2160
2161        if (kstrtoul(chassis_type, 10, &type) != 0)
2162                return false;
2163
2164        switch (type) {
2165        case 0x03: /* Desktop */
2166        case 0x04: /* Low Profile Desktop */
2167        case 0x05: /* Pizza Box */
2168        case 0x06: /* Mini Tower */
2169        case 0x07: /* Tower */
2170        case 0x10: /* Lunch Box */
2171        case 0x11: /* Main Server Chassis */
2172                return true;
2173        }
2174
2175        return false;
2176}
2177
2178int acpi_video_register(void)
2179{
2180        int ret = 0;
2181
2182        mutex_lock(&register_count_mutex);
2183        if (register_count) {
2184                /*
2185                 * if the function of acpi_video_register is already called,
2186                 * don't register the acpi_vide_bus again and return no error.
2187                 */
2188                goto leave;
2189        }
2190
2191        /*
2192         * We're seeing a lot of bogus backlight interfaces on newer machines
2193         * without a LCD such as desktops, servers and HDMI sticks. Checking
2194         * the lcd flag fixes this, so enable this on any machines which are
2195         * win8 ready (where we also prefer the native backlight driver, so
2196         * normally the acpi_video code should not register there anyways).
2197         */
2198        if (only_lcd == -1) {
2199                if (dmi_is_desktop() && acpi_osi_is_win8())
2200                        only_lcd = true;
2201                else
2202                        only_lcd = false;
2203        }
2204
2205        dmi_check_system(video_dmi_table);
2206
2207        ret = acpi_bus_register_driver(&acpi_video_bus);
2208        if (ret)
2209                goto leave;
2210
2211        /*
2212         * When the acpi_video_bus is loaded successfully, increase
2213         * the counter reference.
2214         */
2215        register_count = 1;
2216
2217leave:
2218        mutex_unlock(&register_count_mutex);
2219        return ret;
2220}
2221EXPORT_SYMBOL(acpi_video_register);
2222
2223void acpi_video_unregister(void)
2224{
2225        mutex_lock(&register_count_mutex);
2226        if (register_count) {
2227                acpi_bus_unregister_driver(&acpi_video_bus);
2228                register_count = 0;
2229        }
2230        mutex_unlock(&register_count_mutex);
2231}
2232EXPORT_SYMBOL(acpi_video_unregister);
2233
2234void acpi_video_unregister_backlight(void)
2235{
2236        struct acpi_video_bus *video;
2237
2238        mutex_lock(&register_count_mutex);
2239        if (register_count) {
2240                mutex_lock(&video_list_lock);
2241                list_for_each_entry(video, &video_bus_head, entry)
2242                        acpi_video_bus_unregister_backlight(video);
2243                mutex_unlock(&video_list_lock);
2244        }
2245        mutex_unlock(&register_count_mutex);
2246}
2247
2248bool acpi_video_handles_brightness_key_presses(void)
2249{
2250        bool have_video_busses;
2251
2252        mutex_lock(&video_list_lock);
2253        have_video_busses = !list_empty(&video_bus_head);
2254        mutex_unlock(&video_list_lock);
2255
2256        return have_video_busses &&
2257               (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS);
2258}
2259EXPORT_SYMBOL(acpi_video_handles_brightness_key_presses);
2260
2261/*
2262 * This is kind of nasty. Hardware using Intel chipsets may require
2263 * the video opregion code to be run first in order to initialise
2264 * state before any ACPI video calls are made. To handle this we defer
2265 * registration of the video class until the opregion code has run.
2266 */
2267
2268static int __init acpi_video_init(void)
2269{
2270        /*
2271         * Let the module load even if ACPI is disabled (e.g. due to
2272         * a broken BIOS) so that i915.ko can still be loaded on such
2273         * old systems without an AcpiOpRegion.
2274         *
2275         * acpi_video_register() will report -ENODEV later as well due
2276         * to acpi_disabled when i915.ko tries to register itself afterwards.
2277         */
2278        if (acpi_disabled)
2279                return 0;
2280
2281        if (intel_opregion_present())
2282                return 0;
2283
2284        return acpi_video_register();
2285}
2286
2287static void __exit acpi_video_exit(void)
2288{
2289        acpi_video_detect_exit();
2290        acpi_video_unregister();
2291
2292        return;
2293}
2294
2295module_init(acpi_video_init);
2296module_exit(acpi_video_exit);
2297