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