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