Lines Matching +full:device +full:- +full:handle

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * video.c - ACPI Video Driver
7 * Copyright (C) 2006 Thomas Tuttle <linux-[email protected]>
32 #define ACPI_VIDEO_DEVICE_NAME "Video Device"
52 static int report_key_events = -1;
57 static int hw_changes_brightness = -1;
61 "a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness");
78 static int acpi_video_bus_add(struct acpi_device *device);
79 static void acpi_video_bus_remove(struct acpi_device *device);
80 static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data);
121 u8 _GPD:1; /* Get POST Device */
122 u8 _SPD:1; /* Set POST Device */
128 u32 display_index:4; /* A zero-based instance of the Display */
132 u32 bios_can_detect:1; /* BIOS can detect the device */
133 u32 depend_on_vga:1; /* Non-VGA output device whose power is related to
134 the VGA device. */
135 u32 pipe_id:3; /* For VGA multiple-head devices. */
139 * The device ID might not actually follow the scheme described by this
157 struct acpi_device *device; member
169 char phys[32]; /* for input device */
190 u8 _DDC:1; /* Return the EDID for this device */
207 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data);
210 struct acpi_video_device *device);
212 static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
215 struct acpi_video_device *device,
217 static int acpi_video_get_next_level(struct acpi_video_device *device,
221 /* backlight device sysfs support */
229 return -EINVAL; in acpi_video_get_brightness()
230 for (i = ACPI_VIDEO_FIRST_LEVEL; i < vd->brightness->count; i++) { in acpi_video_get_brightness()
231 if (vd->brightness->levels[i] == cur_level) in acpi_video_get_brightness()
232 return i - ACPI_VIDEO_FIRST_LEVEL; in acpi_video_get_brightness()
239 int request_level = bd->props.brightness + ACPI_VIDEO_FIRST_LEVEL; in acpi_video_set_brightness()
242 cancel_delayed_work(&vd->switch_brightness_work); in acpi_video_set_brightness()
244 vd->brightness->levels[request_level]); in acpi_video_set_brightness()
252 /* thermal cooling device callbacks */
256 struct acpi_video_device *video = cooling_dev->devdata; in video_get_max_state()
258 *state = video->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1; in video_get_max_state()
265 struct acpi_video_device *video = cooling_dev->devdata; in video_get_cur_state()
270 return -EINVAL; in video_get_cur_state()
271 for (offset = ACPI_VIDEO_FIRST_LEVEL; offset < video->brightness->count; in video_get_cur_state()
273 if (level == video->brightness->levels[offset]) { in video_get_cur_state()
274 *state = video->brightness->count - offset - 1; in video_get_cur_state()
278 return -EINVAL; in video_get_cur_state()
284 struct acpi_video_device *video = cooling_dev->devdata; in video_set_cur_state()
287 if (state >= video->brightness->count - ACPI_VIDEO_FIRST_LEVEL) in video_set_cur_state()
288 return -EINVAL; in video_set_cur_state()
290 state = video->brightness->count - state; in video_set_cur_state()
291 level = video->brightness->levels[state - 1]; in video_set_cur_state()
302 * --------------------------------------------------------------------------
304 * --------------------------------------------------------------------------
308 acpi_video_device_lcd_query_levels(acpi_handle handle, in acpi_video_device_lcd_query_levels() argument
318 status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer); in acpi_video_device_lcd_query_levels()
322 if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) { in acpi_video_device_lcd_query_levels()
323 acpi_handle_info(handle, "Invalid _BCL data\n"); in acpi_video_device_lcd_query_levels()
324 status = -EFAULT; in acpi_video_device_lcd_query_levels()
339 acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level) in acpi_video_device_lcd_set_level() argument
344 status = acpi_execute_simple_method(device->dev->handle, in acpi_video_device_lcd_set_level()
347 acpi_handle_info(device->dev->handle, "_BCM evaluation failed\n"); in acpi_video_device_lcd_set_level()
348 return -EIO; in acpi_video_device_lcd_set_level()
351 device->brightness->curr = level; in acpi_video_device_lcd_set_level()
352 for (state = ACPI_VIDEO_FIRST_LEVEL; state < device->brightness->count; in acpi_video_device_lcd_set_level()
354 if (level == device->brightness->levels[state]) { in acpi_video_device_lcd_set_level()
355 if (device->backlight) in acpi_video_device_lcd_set_level()
356 device->backlight->props.brightness = in acpi_video_device_lcd_set_level()
357 state - ACPI_VIDEO_FIRST_LEVEL; in acpi_video_device_lcd_set_level()
361 acpi_handle_info(device->dev->handle, "Current brightness invalid\n"); in acpi_video_device_lcd_set_level()
362 return -EINVAL; in acpi_video_device_lcd_set_level()
391 if (report_key_events == -1) in video_set_report_key_events()
392 report_key_events = (uintptr_t)id->driver_data; in video_set_report_key_events()
399 if (hw_changes_brightness == -1) in video_hw_changes_brightness()
450 * Some machine's _DOD IDs don't have bit 31(Device ID Scheme) set
451 * but the IDs actually follow the Device ID Scheme.
477 * Some machines report wrong key events on the acpi-bus, suppress
480 * events, in this case acpi-video is considered the canonical source
483 * vendor acpi/wmi driver or by using /lib/udev/hwdb.d/60-keyboard.hwdb
531 acpi_video_bqc_value_to_level(struct acpi_video_device *device, in acpi_video_bqc_value_to_level() argument
536 if (device->brightness->flags._BQC_use_index) { in acpi_video_bqc_value_to_level()
542 if (device->brightness->flags._BCL_reversed) in acpi_video_bqc_value_to_level()
543 bqc_value = device->brightness->count - in acpi_video_bqc_value_to_level()
544 ACPI_VIDEO_FIRST_LEVEL - 1 - bqc_value; in acpi_video_bqc_value_to_level()
546 level = device->brightness->levels[bqc_value + in acpi_video_bqc_value_to_level()
558 acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, in acpi_video_device_lcd_get_level_current() argument
564 if (device->cap._BQC || device->cap._BCQ) { in acpi_video_device_lcd_get_level_current()
565 char *buf = device->cap._BQC ? "_BQC" : "_BCQ"; in acpi_video_device_lcd_get_level_current()
567 status = acpi_evaluate_integer(device->dev->handle, buf, in acpi_video_device_lcd_get_level_current()
579 *level = acpi_video_bqc_value_to_level(device, *level); in acpi_video_device_lcd_get_level_current()
582 i < device->brightness->count; i++) in acpi_video_device_lcd_get_level_current()
583 if (device->brightness->levels[i] == *level) { in acpi_video_device_lcd_get_level_current()
584 device->brightness->curr = *level; in acpi_video_device_lcd_get_level_current()
591 acpi_handle_info(device->dev->handle, in acpi_video_device_lcd_get_level_current()
593 device->cap._BQC = device->cap._BCQ = 0; in acpi_video_device_lcd_get_level_current()
598 * dev->brightness->curr is a cached value which stores in acpi_video_device_lcd_get_level_current()
603 acpi_handle_info(device->dev->handle, in acpi_video_device_lcd_get_level_current()
605 device->cap._BQC = device->cap._BCQ = 0; in acpi_video_device_lcd_get_level_current()
609 *level = device->brightness->curr; in acpi_video_device_lcd_get_level_current()
614 * acpi_video_device_EDID() - Get EDID from ACPI _DDC
615 * @device: video output device (LCD, CRT, ..)
627 acpi_video_device_EDID(struct acpi_video_device *device, void **edid, int length) in acpi_video_device_EDID() argument
638 if (!device) in acpi_video_device_EDID()
639 return -ENODEV; in acpi_video_device_EDID()
641 return -EINVAL; in acpi_video_device_EDID()
645 status = acpi_evaluate_object(device->dev->handle, "_DDC", &args, &buffer); in acpi_video_device_EDID()
647 return -ENODEV; in acpi_video_device_EDID()
655 if (obj && obj->type == ACPI_TYPE_PACKAGE && obj->package.count == 1) in acpi_video_device_EDID()
656 obj = &obj->package.elements[0]; in acpi_video_device_EDID()
658 if (obj && obj->type == ACPI_TYPE_BUFFER) { in acpi_video_device_EDID()
659 *edid = kmemdup(obj->buffer.pointer, obj->buffer.length, GFP_KERNEL); in acpi_video_device_EDID()
660 ret = *edid ? obj->buffer.length : -ENOMEM; in acpi_video_device_EDID()
662 acpi_handle_debug(device->dev->handle, in acpi_video_device_EDID()
664 ret = -EFAULT; in acpi_video_device_EDID()
675 * video : video bus device pointer
688 * - the power changes from AC to DC (ACPI appendix B)
689 * - a brightness hotkey gets pressed (implied by Win7/8 backlight docs)
692 * - the power changes from AC to DC (ACPI appendix B)
693 * - a brightness hotkey gets pressed (implied by Win7/8 backlight docs)
695 * -EINVAL wrong arg.
703 if (!video->cap._DOS) in acpi_video_bus_DOS()
707 return -EINVAL; in acpi_video_bus_DOS()
708 video->dos_setting = (lcd_flag << 2) | bios_flag; in acpi_video_bus_DOS()
709 status = acpi_execute_simple_method(video->device->handle, "_DOS", in acpi_video_bus_DOS()
712 return -EIO; in acpi_video_bus_DOS()
724 return *(int *)a - *(int *)b; in acpi_video_cmp_level()
734 static int acpi_video_bqc_quirk(struct acpi_video_device *device, in acpi_video_bqc_quirk() argument
737 struct acpi_video_device_brightness *br = device->brightness; in acpi_video_bqc_quirk()
752 * (br->levels[2]) is likely to be 0, and if the number of levels in acpi_video_bqc_quirk()
769 * xbacklight -set 10; xbacklight -set 20; in acpi_video_bqc_quirk()
777 ? br->levels[ACPI_VIDEO_FIRST_LEVEL + 1] in acpi_video_bqc_quirk()
780 result = acpi_video_device_lcd_set_level(device, test_level); in acpi_video_bqc_quirk()
784 result = acpi_video_device_lcd_get_level_current(device, &level, true); in acpi_video_bqc_quirk()
790 if (level < br->count) { in acpi_video_bqc_quirk()
791 if (br->flags._BCL_reversed) in acpi_video_bqc_quirk()
792 level = br->count - ACPI_VIDEO_FIRST_LEVEL - 1 - level; in acpi_video_bqc_quirk()
793 if (br->levels[level + ACPI_VIDEO_FIRST_LEVEL] == test_level) in acpi_video_bqc_quirk()
794 br->flags._BQC_use_index = 1; in acpi_video_bqc_quirk()
797 if (!br->flags._BQC_use_index) in acpi_video_bqc_quirk()
798 device->cap._BQC = device->cap._BCQ = 0; in acpi_video_bqc_quirk()
804 int acpi_video_get_levels(struct acpi_device *device, in acpi_video_get_levels() argument
815 if (ACPI_FAILURE(acpi_video_device_lcd_query_levels(device->handle, &obj))) { in acpi_video_get_levels()
816 acpi_handle_debug(device->handle, in acpi_video_get_levels()
818 result = -ENODEV; in acpi_video_get_levels()
822 if (obj->package.count < ACPI_VIDEO_FIRST_LEVEL) { in acpi_video_get_levels()
823 result = -EINVAL; in acpi_video_get_levels()
829 result = -ENOMEM; in acpi_video_get_levels()
838 br->levels = kmalloc_array(obj->package.count + ACPI_VIDEO_FIRST_LEVEL, in acpi_video_get_levels()
839 sizeof(*br->levels), in acpi_video_get_levels()
841 if (!br->levels) { in acpi_video_get_levels()
842 result = -ENOMEM; in acpi_video_get_levels()
846 for (i = 0; i < obj->package.count; i++) { in acpi_video_get_levels()
847 o = (union acpi_object *)&obj->package.elements[i]; in acpi_video_get_levels()
848 if (o->type != ACPI_TYPE_INTEGER) { in acpi_video_get_levels()
849 acpi_handle_info(device->handle, "Invalid data\n"); in acpi_video_get_levels()
852 value = (u32) o->integer.value; in acpi_video_get_levels()
855 && br->levels[count - 1] == value) in acpi_video_get_levels()
858 br->levels[count] = value; in acpi_video_get_levels()
860 if (br->levels[count] > max_level) in acpi_video_get_levels()
861 max_level = br->levels[count]; in acpi_video_get_levels()
872 if (br->levels[i] == br->levels[ACPI_VIDEO_AC_LEVEL]) in acpi_video_get_levels()
874 if (br->levels[i] == br->levels[ACPI_VIDEO_BATTERY_LEVEL]) in acpi_video_get_levels()
879 level_ac_battery = ACPI_VIDEO_FIRST_LEVEL - level_ac_battery; in acpi_video_get_levels()
880 br->flags._BCL_no_ac_battery_levels = 1; in acpi_video_get_levels()
881 for (i = (count - 1 + level_ac_battery); in acpi_video_get_levels()
882 i >= ACPI_VIDEO_FIRST_LEVEL; i--) in acpi_video_get_levels()
883 br->levels[i] = br->levels[i - level_ac_battery]; in acpi_video_get_levels()
886 acpi_handle_info(device->handle, in acpi_video_get_levels()
890 if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) { in acpi_video_get_levels()
891 br->flags._BCL_reversed = 1; in acpi_video_get_levels()
892 sort(&br->levels[ACPI_VIDEO_FIRST_LEVEL], in acpi_video_get_levels()
893 count - ACPI_VIDEO_FIRST_LEVEL, in acpi_video_get_levels()
894 sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]), in acpi_video_get_levels()
896 } else if (max_level != br->levels[count - 1]) in acpi_video_get_levels()
897 acpi_handle_info(device->handle, in acpi_video_get_levels()
900 br->count = count; in acpi_video_get_levels()
916 * device : video output device (LCD, CRT, ..)
921 * Allocate and initialize device->brightness.
925 acpi_video_init_brightness(struct acpi_video_device *device) in acpi_video_init_brightness() argument
932 result = acpi_video_get_levels(device->dev, &br, &max_level); in acpi_video_init_brightness()
935 device->brightness = br; in acpi_video_init_brightness()
938 br->curr = level = max_level; in acpi_video_init_brightness()
940 if (!device->cap._BQC) in acpi_video_init_brightness()
943 result = acpi_video_device_lcd_get_level_current(device, in acpi_video_init_brightness()
948 result = acpi_video_bqc_quirk(device, max_level, level_old); in acpi_video_init_brightness()
955 if (!device->cap._BQC) in acpi_video_init_brightness()
958 level = acpi_video_bqc_value_to_level(device, level_old); in acpi_video_init_brightness()
965 for (i = ACPI_VIDEO_FIRST_LEVEL; i < br->count; i++) in acpi_video_init_brightness()
966 if (level == br->levels[i]) in acpi_video_init_brightness()
968 if (i == br->count || !level) in acpi_video_init_brightness()
972 result = acpi_video_device_lcd_set_level(device, level); in acpi_video_init_brightness()
976 acpi_handle_debug(device->dev->handle, "found %d brightness levels\n", in acpi_video_init_brightness()
977 br->count - ACPI_VIDEO_FIRST_LEVEL); in acpi_video_init_brightness()
982 kfree(br->levels); in acpi_video_init_brightness()
984 device->brightness = NULL; in acpi_video_init_brightness()
990 * device : video output device (LCD, CRT, ..)
996 * device.
999 static void acpi_video_device_find_cap(struct acpi_video_device *device) in acpi_video_device_find_cap() argument
1001 if (acpi_has_method(device->dev->handle, "_ADR")) in acpi_video_device_find_cap()
1002 device->cap._ADR = 1; in acpi_video_device_find_cap()
1003 if (acpi_has_method(device->dev->handle, "_BCL")) in acpi_video_device_find_cap()
1004 device->cap._BCL = 1; in acpi_video_device_find_cap()
1005 if (acpi_has_method(device->dev->handle, "_BCM")) in acpi_video_device_find_cap()
1006 device->cap._BCM = 1; in acpi_video_device_find_cap()
1007 if (acpi_has_method(device->dev->handle, "_BQC")) { in acpi_video_device_find_cap()
1008 device->cap._BQC = 1; in acpi_video_device_find_cap()
1009 } else if (acpi_has_method(device->dev->handle, "_BCQ")) { in acpi_video_device_find_cap()
1010 acpi_handle_info(device->dev->handle, in acpi_video_device_find_cap()
1012 device->cap._BCQ = 1; in acpi_video_device_find_cap()
1015 if (acpi_has_method(device->dev->handle, "_DDC")) in acpi_video_device_find_cap()
1016 device->cap._DDC = 1; in acpi_video_device_find_cap()
1021 * device : video output device (VGA)
1026 * Find out all required AML methods defined under the video bus device.
1031 if (acpi_has_method(video->device->handle, "_DOS")) in acpi_video_bus_find_cap()
1032 video->cap._DOS = 1; in acpi_video_bus_find_cap()
1033 if (acpi_has_method(video->device->handle, "_DOD")) in acpi_video_bus_find_cap()
1034 video->cap._DOD = 1; in acpi_video_bus_find_cap()
1035 if (acpi_has_method(video->device->handle, "_ROM")) in acpi_video_bus_find_cap()
1036 video->cap._ROM = 1; in acpi_video_bus_find_cap()
1037 if (acpi_has_method(video->device->handle, "_GPD")) in acpi_video_bus_find_cap()
1038 video->cap._GPD = 1; in acpi_video_bus_find_cap()
1039 if (acpi_has_method(video->device->handle, "_SPD")) in acpi_video_bus_find_cap()
1040 video->cap._SPD = 1; in acpi_video_bus_find_cap()
1041 if (acpi_has_method(video->device->handle, "_VPO")) in acpi_video_bus_find_cap()
1042 video->cap._VPO = 1; in acpi_video_bus_find_cap()
1046 * Check whether the video bus device has required AML method to
1052 acpi_status status = -ENOENT; in acpi_video_bus_check()
1056 return -EINVAL; in acpi_video_bus_check()
1058 dev = acpi_get_pci_dev(video->device->handle); in acpi_video_bus_check()
1060 return -ENODEV; in acpi_video_bus_check()
1068 /* Does this device support video switching? */ in acpi_video_bus_check()
1069 if (video->cap._DOS || video->cap._DOD) { in acpi_video_bus_check()
1070 if (!video->cap._DOS) { in acpi_video_bus_check()
1072 acpi_device_bid(video->device)); in acpi_video_bus_check()
1074 video->flags.multihead = 1; in acpi_video_bus_check()
1078 /* Does this device support retrieving a video ROM? */ in acpi_video_bus_check()
1079 if (video->cap._ROM) { in acpi_video_bus_check()
1080 video->flags.rom = 1; in acpi_video_bus_check()
1084 /* Does this device support configuring which video device to POST? */ in acpi_video_bus_check()
1085 if (video->cap._GPD && video->cap._SPD && video->cap._VPO) { in acpi_video_bus_check()
1086 video->flags.post = 1; in acpi_video_bus_check()
1094 * --------------------------------------------------------------------------
1096 * --------------------------------------------------------------------------
1099 /* device interface */
1106 for (i = 0; i < video->attached_count; i++) { in acpi_video_get_device_attr()
1107 ids = &video->attached_array[i]; in acpi_video_get_device_attr()
1108 if ((ids->value.int_val & 0xffff) == device_id) in acpi_video_get_device_attr()
1109 return &ids->value.attrib; in acpi_video_get_device_attr()
1122 for (i = 0; i < video->attached_count; i++) { in acpi_video_get_device_type()
1123 ids = &video->attached_array[i]; in acpi_video_get_device_type()
1124 if ((ids->value.int_val & 0xffff) == device_id) in acpi_video_get_device_type()
1125 return ids->value.int_val; in acpi_video_get_device_type()
1131 static int acpi_video_bus_get_one_device(struct acpi_device *device, void *arg) in acpi_video_bus_get_one_device() argument
1140 status = acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); in acpi_video_bus_get_one_device()
1147 dev_dbg(&device->dev, "Cannot attach\n"); in acpi_video_bus_get_one_device()
1148 return -ENOMEM; in acpi_video_bus_get_one_device()
1151 strscpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME); in acpi_video_bus_get_one_device()
1152 strscpy(acpi_device_class(device), ACPI_VIDEO_CLASS); in acpi_video_bus_get_one_device()
1154 data->device_id = device_id; in acpi_video_bus_get_one_device()
1155 data->video = video; in acpi_video_bus_get_one_device()
1156 data->dev = device; in acpi_video_bus_get_one_device()
1157 INIT_DELAYED_WORK(&data->switch_brightness_work, in acpi_video_bus_get_one_device()
1162 if (attribute && (attribute->device_id_scheme || device_id_scheme)) { in acpi_video_bus_get_one_device()
1163 switch (attribute->display_type) { in acpi_video_bus_get_one_device()
1165 data->flags.crt = 1; in acpi_video_bus_get_one_device()
1168 data->flags.tvout = 1; in acpi_video_bus_get_one_device()
1171 data->flags.dvi = 1; in acpi_video_bus_get_one_device()
1174 data->flags.lcd = 1; in acpi_video_bus_get_one_device()
1177 data->flags.unknown = 1; in acpi_video_bus_get_one_device()
1180 if (attribute->bios_can_detect) in acpi_video_bus_get_one_device()
1181 data->flags.bios = 1; in acpi_video_bus_get_one_device()
1185 /* Ignore bits 16 and 18-20 */ in acpi_video_bus_get_one_device()
1188 data->flags.crt = 1; in acpi_video_bus_get_one_device()
1191 data->flags.lcd = 1; in acpi_video_bus_get_one_device()
1194 data->flags.tvout = 1; in acpi_video_bus_get_one_device()
1197 data->flags.unknown = 1; in acpi_video_bus_get_one_device()
1204 if (data->cap._BCM && data->cap._BCL) in acpi_video_bus_get_one_device()
1207 mutex_lock(&video->device_list_lock); in acpi_video_bus_get_one_device()
1208 list_add_tail(&data->entry, &video->video_device_list); in acpi_video_bus_get_one_device()
1209 mutex_unlock(&video->device_list_lock); in acpi_video_bus_get_one_device()
1212 video->child_count++; in acpi_video_bus_get_one_device()
1218 * video : video bus device
1223 * Enumerate the video device list of the video bus,
1232 mutex_lock(&video->device_list_lock); in acpi_video_device_rebind()
1234 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_device_rebind()
1237 mutex_unlock(&video->device_list_lock); in acpi_video_device_rebind()
1242 * video : video bus device
1243 * device : video output device under the video
1255 struct acpi_video_device *device) in acpi_video_device_bind() argument
1260 for (i = 0; i < video->attached_count; i++) { in acpi_video_device_bind()
1261 ids = &video->attached_array[i]; in acpi_video_device_bind()
1262 if (device->device_id == (ids->value.int_val & 0xffff)) { in acpi_video_device_bind()
1263 ids->bind_info = device; in acpi_video_device_bind()
1264 acpi_handle_debug(video->device->handle, "%s: %d\n", in acpi_video_device_bind()
1270 static bool acpi_video_device_in_dod(struct acpi_video_device *device) in acpi_video_device_in_dod() argument
1272 struct acpi_video_bus *video = device->video; in acpi_video_device_in_dod()
1280 if (!video->attached_count || video->child_count > 8) in acpi_video_device_in_dod()
1283 for (i = 0; i < video->attached_count; i++) { in acpi_video_device_in_dod()
1284 if ((video->attached_array[i].value.int_val & 0xfff) == in acpi_video_device_in_dod()
1285 (device->device_id & 0xfff)) in acpi_video_device_in_dod()
1294 * video : video bus device
1313 if (!video->cap._DOD) in acpi_video_device_enumerate()
1316 status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer); in acpi_video_device_enumerate()
1318 acpi_handle_info(video->device->handle, in acpi_video_device_enumerate()
1325 if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) { in acpi_video_device_enumerate()
1326 acpi_handle_info(video->device->handle, "Invalid _DOD data\n"); in acpi_video_device_enumerate()
1327 status = -EFAULT; in acpi_video_device_enumerate()
1331 acpi_handle_debug(video->device->handle, "Found %d video heads in _DOD\n", in acpi_video_device_enumerate()
1332 dod->package.count); in acpi_video_device_enumerate()
1334 active_list = kcalloc(1 + dod->package.count, in acpi_video_device_enumerate()
1338 status = -ENOMEM; in acpi_video_device_enumerate()
1343 for (i = 0; i < dod->package.count; i++) { in acpi_video_device_enumerate()
1344 obj = &dod->package.elements[i]; in acpi_video_device_enumerate()
1346 if (obj->type != ACPI_TYPE_INTEGER) { in acpi_video_device_enumerate()
1347 acpi_handle_info(video->device->handle, in acpi_video_device_enumerate()
1352 active_list[count].value.int_val = obj->integer.value; in acpi_video_device_enumerate()
1355 acpi_handle_debug(video->device->handle, in acpi_video_device_enumerate()
1357 (int)obj->integer.value); in acpi_video_device_enumerate()
1362 kfree(video->attached_array); in acpi_video_device_enumerate()
1364 video->attached_array = active_list; in acpi_video_device_enumerate()
1365 video->attached_count = count; in acpi_video_device_enumerate()
1373 acpi_video_get_next_level(struct acpi_video_device *device, in acpi_video_get_next_level() argument
1380 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) { in acpi_video_get_next_level()
1381 l = device->brightness->levels[i]; in acpi_video_get_next_level()
1382 if (abs(l - level_current) < abs(delta)) { in acpi_video_get_next_level()
1383 delta = l - level_current; in acpi_video_get_next_level()
1390 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) { in acpi_video_get_next_level()
1391 l = device->brightness->levels[i]; in acpi_video_get_next_level()
1420 struct acpi_video_device *device = container_of(to_delayed_work(work), in acpi_video_switch_brightness() local
1423 int event = device->switch_brightness_event; in acpi_video_switch_brightness()
1424 int result = -EINVAL; in acpi_video_switch_brightness()
1427 if (!device->backlight) in acpi_video_switch_brightness()
1430 if (!device->brightness) in acpi_video_switch_brightness()
1433 result = acpi_video_device_lcd_get_level_current(device, in acpi_video_switch_brightness()
1439 level_next = acpi_video_get_next_level(device, level_current, event); in acpi_video_switch_brightness()
1441 result = acpi_video_device_lcd_set_level(device, level_next); in acpi_video_switch_brightness()
1444 backlight_force_update(device->backlight, in acpi_video_switch_brightness()
1449 acpi_handle_info(device->dev->handle, in acpi_video_switch_brightness()
1453 int acpi_video_get_edid(struct acpi_device *device, int type, int device_id, in acpi_video_get_edid() argument
1460 if (!device || !acpi_driver_data(device)) in acpi_video_get_edid()
1461 return -EINVAL; in acpi_video_get_edid()
1463 video = acpi_driver_data(device); in acpi_video_get_edid()
1465 for (i = 0; i < video->attached_count; i++) { in acpi_video_get_edid()
1466 video_device = video->attached_array[i].bind_info; in acpi_video_get_edid()
1471 if (!video_device->cap._DDC) in acpi_video_get_edid()
1477 if (!video_device->flags.crt) in acpi_video_get_edid()
1481 if (!video_device->flags.tvout) in acpi_video_get_edid()
1485 if (!video_device->flags.dvi) in acpi_video_get_edid()
1489 if (!video_device->flags.lcd) in acpi_video_get_edid()
1493 } else if (video_device->device_id != device_id) { in acpi_video_get_edid()
1497 for (length = 512; length > 0; length -= 128) { in acpi_video_get_edid()
1504 return -ENODEV; in acpi_video_get_edid()
1510 struct acpi_device *device) in acpi_video_bus_get_devices() argument
1519 return acpi_dev_for_each_child(device, acpi_video_bus_get_one_device, video); in acpi_video_bus_get_devices()
1540 static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data) in acpi_video_bus_notify() argument
1542 struct acpi_device *device = data; in acpi_video_bus_notify() local
1543 struct acpi_video_bus *video = acpi_driver_data(device); in acpi_video_bus_notify()
1547 if (!video || !video->input) in acpi_video_bus_notify()
1550 input = video->input; in acpi_video_bus_notify()
1576 acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n", in acpi_video_bus_notify()
1581 if (acpi_notifier_call_chain(device, event, 0)) in acpi_video_bus_notify()
1599 video_device->switch_brightness_event = event; in brightness_switch_event()
1600 schedule_delayed_work(&video_device->switch_brightness_work, HZ / 10); in brightness_switch_event()
1603 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data) in acpi_video_device_notify() argument
1606 struct acpi_device *device = NULL; in acpi_video_device_notify() local
1614 device = video_device->dev; in acpi_video_device_notify()
1615 bus = video_device->video; in acpi_video_device_notify()
1616 input = bus->input; in acpi_video_device_notify()
1619 if (video_device->backlight) in acpi_video_device_notify()
1620 backlight_force_update(video_device->backlight, in acpi_video_device_notify()
1622 acpi_notifier_call_chain(device, event, 0); in acpi_video_device_notify()
1643 case ACPI_VIDEO_NOTIFY_DISPLAY_OFF: /* display device off */ in acpi_video_device_notify()
1648 acpi_handle_debug(handle, "Unsupported event [0x%x]\n", event); in acpi_video_device_notify()
1655 acpi_notifier_call_chain(device, event, 0); in acpi_video_device_notify()
1678 dev_info(&video->device->dev, "Restoring backlight state\n"); in acpi_video_resume()
1680 for (i = 0; i < video->attached_count; i++) { in acpi_video_resume()
1681 video_device = video->attached_array[i].bind_info; in acpi_video_resume()
1682 if (video_device && video_device->brightness) in acpi_video_resume()
1684 video_device->brightness->curr); in acpi_video_resume()
1693 acpi_video_bus_match(acpi_handle handle, u32 level, void *context, in acpi_video_bus_match() argument
1696 struct acpi_device *device = context; in acpi_video_bus_match() local
1699 if (handle == device->handle) in acpi_video_bus_match()
1702 sibling = acpi_fetch_acpi_dev(handle); in acpi_video_bus_match()
1712 static void acpi_video_dev_register_backlight(struct acpi_video_device *device) in acpi_video_dev_register_backlight() argument
1717 struct device *parent = NULL; in acpi_video_dev_register_backlight()
1722 result = acpi_video_init_brightness(device); in acpi_video_dev_register_backlight()
1731 if (ACPI_SUCCESS(acpi_get_parent(device->dev->handle, &acpi_parent))) { in acpi_video_dev_register_backlight()
1734 parent = &pdev->dev; in acpi_video_dev_register_backlight()
1742 device->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1; in acpi_video_dev_register_backlight()
1743 device->backlight = backlight_device_register(name, in acpi_video_dev_register_backlight()
1745 device, in acpi_video_dev_register_backlight()
1749 if (IS_ERR(device->backlight)) { in acpi_video_dev_register_backlight()
1750 device->backlight = NULL; in acpi_video_dev_register_backlight()
1758 device->backlight->props.brightness = in acpi_video_dev_register_backlight()
1759 acpi_video_get_brightness(device->backlight); in acpi_video_dev_register_backlight()
1761 device->cooling_dev = thermal_cooling_device_register("LCD", device, in acpi_video_dev_register_backlight()
1763 if (IS_ERR(device->cooling_dev)) { in acpi_video_dev_register_backlight()
1767 * register video output if cooling device registration failed? in acpi_video_dev_register_backlight()
1768 * -- dtor in acpi_video_dev_register_backlight()
1770 device->cooling_dev = NULL; in acpi_video_dev_register_backlight()
1774 dev_info(&device->dev->dev, "registered as cooling_device%d\n", in acpi_video_dev_register_backlight()
1775 device->cooling_dev->id); in acpi_video_dev_register_backlight()
1776 result = sysfs_create_link(&device->dev->dev.kobj, in acpi_video_dev_register_backlight()
1777 &device->cooling_dev->device.kobj, in acpi_video_dev_register_backlight()
1782 result = sysfs_create_link(&device->cooling_dev->device.kobj, in acpi_video_dev_register_backlight()
1783 &device->dev->dev.kobj, "device"); in acpi_video_dev_register_backlight()
1793 mutex_lock(&video->device_list_lock); in acpi_video_run_bcl_for_osi()
1794 list_for_each_entry(dev, &video->video_device_list, entry) { in acpi_video_run_bcl_for_osi()
1795 if (!acpi_video_device_lcd_query_levels(dev->dev->handle, &levels)) in acpi_video_run_bcl_for_osi()
1798 mutex_unlock(&video->device_list_lock); in acpi_video_run_bcl_for_osi()
1804 * Do not create backlight device for video output in acpi_video_should_register_backlight()
1805 * device that is not in the enumerated list. in acpi_video_should_register_backlight()
1808 dev_dbg(&dev->dev->dev, "not in _DOD list, ignore\n"); in acpi_video_should_register_backlight()
1813 return dev->flags.lcd; in acpi_video_should_register_backlight()
1821 if (video->backlight_registered) in acpi_video_bus_register_backlight()
1827 mutex_lock(&video->device_list_lock); in acpi_video_bus_register_backlight()
1828 list_for_each_entry(dev, &video->video_device_list, entry) { in acpi_video_bus_register_backlight()
1832 mutex_unlock(&video->device_list_lock); in acpi_video_bus_register_backlight()
1834 video->backlight_registered = true; in acpi_video_bus_register_backlight()
1836 video->pm_nb.notifier_call = acpi_video_resume; in acpi_video_bus_register_backlight()
1837 video->pm_nb.priority = 0; in acpi_video_bus_register_backlight()
1838 return register_pm_notifier(&video->pm_nb); in acpi_video_bus_register_backlight()
1841 static void acpi_video_dev_unregister_backlight(struct acpi_video_device *device) in acpi_video_dev_unregister_backlight() argument
1843 if (device->backlight) { in acpi_video_dev_unregister_backlight()
1844 backlight_device_unregister(device->backlight); in acpi_video_dev_unregister_backlight()
1845 device->backlight = NULL; in acpi_video_dev_unregister_backlight()
1847 if (device->brightness) { in acpi_video_dev_unregister_backlight()
1848 kfree(device->brightness->levels); in acpi_video_dev_unregister_backlight()
1849 kfree(device->brightness); in acpi_video_dev_unregister_backlight()
1850 device->brightness = NULL; in acpi_video_dev_unregister_backlight()
1852 if (device->cooling_dev) { in acpi_video_dev_unregister_backlight()
1853 sysfs_remove_link(&device->dev->dev.kobj, "thermal_cooling"); in acpi_video_dev_unregister_backlight()
1854 sysfs_remove_link(&device->cooling_dev->device.kobj, "device"); in acpi_video_dev_unregister_backlight()
1855 thermal_cooling_device_unregister(device->cooling_dev); in acpi_video_dev_unregister_backlight()
1856 device->cooling_dev = NULL; in acpi_video_dev_unregister_backlight()
1865 if (!video->backlight_registered) in acpi_video_bus_unregister_backlight()
1868 error = unregister_pm_notifier(&video->pm_nb); in acpi_video_bus_unregister_backlight()
1870 mutex_lock(&video->device_list_lock); in acpi_video_bus_unregister_backlight()
1871 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_bus_unregister_backlight()
1873 mutex_unlock(&video->device_list_lock); in acpi_video_bus_unregister_backlight()
1875 video->backlight_registered = false; in acpi_video_bus_unregister_backlight()
1880 static void acpi_video_dev_add_notify_handler(struct acpi_video_device *device) in acpi_video_dev_add_notify_handler() argument
1883 struct acpi_device *adev = device->dev; in acpi_video_dev_add_notify_handler()
1885 status = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY, in acpi_video_dev_add_notify_handler()
1886 acpi_video_device_notify, device); in acpi_video_dev_add_notify_handler()
1888 dev_err(&adev->dev, "Error installing notify handler\n"); in acpi_video_dev_add_notify_handler()
1890 device->flags.notify = 1; in acpi_video_dev_add_notify_handler()
1899 video->input = input = input_allocate_device(); in acpi_video_bus_add_notify_handler()
1901 error = -ENOMEM; in acpi_video_bus_add_notify_handler()
1909 snprintf(video->phys, sizeof(video->phys), in acpi_video_bus_add_notify_handler()
1910 "%s/video/input0", acpi_device_hid(video->device)); in acpi_video_bus_add_notify_handler()
1912 input->name = acpi_device_name(video->device); in acpi_video_bus_add_notify_handler()
1913 input->phys = video->phys; in acpi_video_bus_add_notify_handler()
1914 input->id.bustype = BUS_HOST; in acpi_video_bus_add_notify_handler()
1915 input->id.product = 0x06; in acpi_video_bus_add_notify_handler()
1916 input->dev.parent = &video->device->dev; in acpi_video_bus_add_notify_handler()
1917 input->evbit[0] = BIT(EV_KEY); in acpi_video_bus_add_notify_handler()
1918 set_bit(KEY_SWITCHVIDEOMODE, input->keybit); in acpi_video_bus_add_notify_handler()
1919 set_bit(KEY_VIDEO_NEXT, input->keybit); in acpi_video_bus_add_notify_handler()
1920 set_bit(KEY_VIDEO_PREV, input->keybit); in acpi_video_bus_add_notify_handler()
1921 set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit); in acpi_video_bus_add_notify_handler()
1922 set_bit(KEY_BRIGHTNESSUP, input->keybit); in acpi_video_bus_add_notify_handler()
1923 set_bit(KEY_BRIGHTNESSDOWN, input->keybit); in acpi_video_bus_add_notify_handler()
1924 set_bit(KEY_BRIGHTNESS_ZERO, input->keybit); in acpi_video_bus_add_notify_handler()
1925 set_bit(KEY_DISPLAY_OFF, input->keybit); in acpi_video_bus_add_notify_handler()
1931 mutex_lock(&video->device_list_lock); in acpi_video_bus_add_notify_handler()
1932 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_bus_add_notify_handler()
1934 mutex_unlock(&video->device_list_lock); in acpi_video_bus_add_notify_handler()
1942 video->input = NULL; in acpi_video_bus_add_notify_handler()
1949 if (dev->flags.notify) { in acpi_video_dev_remove_notify_handler()
1950 acpi_remove_notify_handler(dev->dev->handle, ACPI_DEVICE_NOTIFY, in acpi_video_dev_remove_notify_handler()
1952 dev->flags.notify = 0; in acpi_video_dev_remove_notify_handler()
1960 mutex_lock(&video->device_list_lock); in acpi_video_bus_remove_notify_handler()
1961 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_bus_remove_notify_handler()
1963 mutex_unlock(&video->device_list_lock); in acpi_video_bus_remove_notify_handler()
1966 input_unregister_device(video->input); in acpi_video_bus_remove_notify_handler()
1967 video->input = NULL; in acpi_video_bus_remove_notify_handler()
1974 mutex_lock(&video->device_list_lock); in acpi_video_bus_put_devices()
1975 list_for_each_entry_safe(dev, next, &video->video_device_list, entry) { in acpi_video_bus_put_devices()
1976 list_del(&dev->entry); in acpi_video_bus_put_devices()
1979 mutex_unlock(&video->device_list_lock); in acpi_video_bus_put_devices()
1986 static int acpi_video_bus_add(struct acpi_device *device) in acpi_video_bus_add() argument
1994 acpi_dev_parent(device)->handle, 1, in acpi_video_bus_add()
1996 device, NULL); in acpi_video_bus_add()
2004 return -ENODEV; in acpi_video_bus_add()
2009 return -ENOMEM; in acpi_video_bus_add()
2012 if (!strcmp(device->pnp.bus_id, "VID")) { in acpi_video_bus_add()
2014 device->pnp.bus_id[3] = '0' + instance; in acpi_video_bus_add()
2018 if (!strcmp(device->pnp.bus_id, "VGA")) { in acpi_video_bus_add()
2020 device->pnp.bus_id[3] = '0' + instance; in acpi_video_bus_add()
2024 video->device = device; in acpi_video_bus_add()
2025 strscpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME); in acpi_video_bus_add()
2026 strscpy(acpi_device_class(device), ACPI_VIDEO_CLASS); in acpi_video_bus_add()
2027 device->driver_data = video; in acpi_video_bus_add()
2034 mutex_init(&video->device_list_lock); in acpi_video_bus_add()
2035 INIT_LIST_HEAD(&video->video_device_list); in acpi_video_bus_add()
2037 error = acpi_video_bus_get_devices(video, device); in acpi_video_bus_add()
2045 acpi_device_fix_up_power_children(device); in acpi_video_bus_add()
2047 pr_info("%s [%s] (multi-head: %s rom: %s post: %s)\n", in acpi_video_bus_add()
2048 ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device), in acpi_video_bus_add()
2049 video->flags.multihead ? "yes" : "no", in acpi_video_bus_add()
2050 video->flags.rom ? "yes" : "no", in acpi_video_bus_add()
2051 video->flags.post ? "yes" : "no"); in acpi_video_bus_add()
2053 list_add_tail(&video->entry, &video_bus_head); in acpi_video_bus_add()
2057 * If backlight-type auto-detection is used then a native backlight may in acpi_video_bus_add()
2059 * Therefor normally the userspace visible /sys/class/backlight device in acpi_video_bus_add()
2062 * Register the backlight now when not using auto-detection, so that in acpi_video_bus_add()
2063 * when the kernel cmdline or DMI-quirks are used the backlight will in acpi_video_bus_add()
2075 error = acpi_dev_install_notify_handler(device, ACPI_DEVICE_NOTIFY, in acpi_video_bus_add()
2076 acpi_video_bus_notify, device); in acpi_video_bus_add()
2086 list_del(&video->entry); in acpi_video_bus_add()
2091 kfree(video->attached_array); in acpi_video_bus_add()
2094 device->driver_data = NULL; in acpi_video_bus_add()
2099 static void acpi_video_bus_remove(struct acpi_device *device) in acpi_video_bus_remove() argument
2104 if (!device || !acpi_driver_data(device)) in acpi_video_bus_remove()
2107 video = acpi_driver_data(device); in acpi_video_bus_remove()
2109 acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY, in acpi_video_bus_remove()
2113 list_del(&video->entry); in acpi_video_bus_remove()
2120 kfree(video->attached_array); in acpi_video_bus_remove()
2126 if (dev->device == 0x00D1) in is_i740()
2128 if (dev->device == 0x7000) in is_i740()
2140 if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) in intel_opregion_present()
2142 if (dev->vendor != PCI_VENDOR_ID_INTEL) in intel_opregion_present()
2219 * state before any ACPI video calls are made. To handle this we defer
2230 * acpi_video_register() will report -ENODEV later as well due in acpi_video_init()