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