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