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