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