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