Lines Matching +full:broken +full:- +full:turn +full:- +full:around
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * video.c - ACPI Video Driver
7 * Copyright (C) 2006 Thomas Tuttle <linux-kernel@ttuttle.net>
50 static int disable_backlight_sysfs_if = -1;
55 static int report_key_events = -1;
60 static int hw_changes_brightness = -1;
64 "a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness");
73 static int only_lcd = -1;
132 u32 display_index:4; /* A zero-based instance of the Display */
137 u32 depend_on_vga:1; /* Non-VGA output device whose power is related to
139 u32 pipe_id:3; /* For VGA multiple-head devices. */
233 return -EINVAL; in acpi_video_get_brightness()
234 for (i = ACPI_VIDEO_FIRST_LEVEL; i < vd->brightness->count; i++) { in acpi_video_get_brightness()
235 if (vd->brightness->levels[i] == cur_level) in acpi_video_get_brightness()
236 return i - ACPI_VIDEO_FIRST_LEVEL; in acpi_video_get_brightness()
243 int request_level = bd->props.brightness + ACPI_VIDEO_FIRST_LEVEL; in acpi_video_set_brightness()
246 cancel_delayed_work(&vd->switch_brightness_work); in acpi_video_set_brightness()
248 vd->brightness->levels[request_level]); in acpi_video_set_brightness()
260 struct acpi_device *device = cooling_dev->devdata; in video_get_max_state()
263 *state = video->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1; in video_get_max_state()
270 struct acpi_device *device = cooling_dev->devdata; in video_get_cur_state()
276 return -EINVAL; in video_get_cur_state()
277 for (offset = ACPI_VIDEO_FIRST_LEVEL; offset < video->brightness->count; in video_get_cur_state()
279 if (level == video->brightness->levels[offset]) { in video_get_cur_state()
280 *state = video->brightness->count - offset - 1; in video_get_cur_state()
284 return -EINVAL; in video_get_cur_state()
290 struct acpi_device *device = cooling_dev->devdata; in video_set_cur_state()
294 if (state >= video->brightness->count - ACPI_VIDEO_FIRST_LEVEL) in video_set_cur_state()
295 return -EINVAL; in video_set_cur_state()
297 state = video->brightness->count - state; in video_set_cur_state()
298 level = video->brightness->levels[state - 1]; in video_set_cur_state()
309 * --------------------------------------------------------------------------
311 * --------------------------------------------------------------------------
329 if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) { in acpi_video_device_lcd_query_levels()
331 status = -EFAULT; in acpi_video_device_lcd_query_levels()
351 status = acpi_execute_simple_method(device->dev->handle, in acpi_video_device_lcd_set_level()
354 acpi_handle_info(device->dev->handle, "_BCM evaluation failed\n"); in acpi_video_device_lcd_set_level()
355 return -EIO; in acpi_video_device_lcd_set_level()
358 device->brightness->curr = level; in acpi_video_device_lcd_set_level()
359 for (state = ACPI_VIDEO_FIRST_LEVEL; state < device->brightness->count; in acpi_video_device_lcd_set_level()
361 if (level == device->brightness->levels[state]) { in acpi_video_device_lcd_set_level()
362 if (device->backlight) in acpi_video_device_lcd_set_level()
363 device->backlight->props.brightness = in acpi_video_device_lcd_set_level()
364 state - ACPI_VIDEO_FIRST_LEVEL; in acpi_video_device_lcd_set_level()
368 acpi_handle_info(device->dev->handle, "Current brightness invalid\n"); in acpi_video_device_lcd_set_level()
369 return -EINVAL; in acpi_video_device_lcd_set_level()
387 if (disable_backlight_sysfs_if == -1) in video_disable_backlight_sysfs_if()
406 if (report_key_events == -1) in video_set_report_key_events()
407 report_key_events = (uintptr_t)id->driver_data; in video_set_report_key_events()
414 if (hw_changes_brightness == -1) in video_hw_changes_brightness()
421 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
465 * Some machines have a broken acpi-video interface for brightness
467 * on resume to turn the backlight power on. We Enable backlight
526 * Some machines report wrong key events on the acpi-bus, suppress
528 * around events which are plain wrong. In some cases we get double
529 * events, in this case acpi-video is considered the canonical source
532 * vendor acpi/wmi driver or by using /lib/udev/hwdb.d/60-keyboard.hwdb
576 if (device->brightness->flags._BQC_use_index) { in acpi_video_bqc_value_to_level()
582 if (device->brightness->flags._BCL_reversed) in acpi_video_bqc_value_to_level()
583 bqc_value = device->brightness->count - in acpi_video_bqc_value_to_level()
584 ACPI_VIDEO_FIRST_LEVEL - 1 - bqc_value; in acpi_video_bqc_value_to_level()
586 level = device->brightness->levels[bqc_value + in acpi_video_bqc_value_to_level()
604 if (device->cap._BQC || device->cap._BCQ) { in acpi_video_device_lcd_get_level_current()
605 char *buf = device->cap._BQC ? "_BQC" : "_BCQ"; in acpi_video_device_lcd_get_level_current()
607 status = acpi_evaluate_integer(device->dev->handle, buf, in acpi_video_device_lcd_get_level_current()
622 i < device->brightness->count; i++) in acpi_video_device_lcd_get_level_current()
623 if (device->brightness->levels[i] == *level) { in acpi_video_device_lcd_get_level_current()
624 device->brightness->curr = *level; in acpi_video_device_lcd_get_level_current()
631 acpi_handle_info(device->dev->handle, in acpi_video_device_lcd_get_level_current()
633 device->cap._BQC = device->cap._BCQ = 0; in acpi_video_device_lcd_get_level_current()
638 * dev->brightness->curr is a cached value which stores in acpi_video_device_lcd_get_level_current()
643 acpi_handle_info(device->dev->handle, in acpi_video_device_lcd_get_level_current()
645 device->cap._BQC = device->cap._BCQ = 0; in acpi_video_device_lcd_get_level_current()
649 *level = device->brightness->curr; in acpi_video_device_lcd_get_level_current()
667 return -ENODEV; in acpi_video_device_EDID()
673 return -EINVAL; in acpi_video_device_EDID()
675 status = acpi_evaluate_object(device->dev->handle, "_DDC", &args, &buffer); in acpi_video_device_EDID()
677 return -ENODEV; in acpi_video_device_EDID()
681 if (obj && obj->type == ACPI_TYPE_BUFFER) in acpi_video_device_EDID()
684 acpi_handle_info(device->dev->handle, "Invalid _DDC data\n"); in acpi_video_device_EDID()
685 status = -EFAULT; in acpi_video_device_EDID()
709 * - the power changes from AC to DC (ACPI appendix B)
710 * - a brightness hotkey gets pressed (implied by Win7/8 backlight docs)
713 * - the power changes from AC to DC (ACPI appendix B)
714 * - a brightness hotkey gets pressed (implied by Win7/8 backlight docs)
716 * -EINVAL wrong arg.
724 if (!video->cap._DOS) in acpi_video_bus_DOS()
728 return -EINVAL; in acpi_video_bus_DOS()
729 video->dos_setting = (lcd_flag << 2) | bios_flag; in acpi_video_bus_DOS()
730 status = acpi_execute_simple_method(video->device->handle, "_DOS", in acpi_video_bus_DOS()
733 return -EIO; in acpi_video_bus_DOS()
745 return *(int *)a - *(int *)b; in acpi_video_cmp_level()
758 struct acpi_video_device_brightness *br = device->brightness; in acpi_video_bqc_quirk()
763 /* don't mess with existing known broken systems */ in acpi_video_bqc_quirk()
773 * (br->levels[2]) is likely to be 0, and if the number of levels in acpi_video_bqc_quirk()
790 * xbacklight -set 10; xbacklight -set 20; in acpi_video_bqc_quirk()
798 ? br->levels[ACPI_VIDEO_FIRST_LEVEL + 1] in acpi_video_bqc_quirk()
811 if (level < br->count) { in acpi_video_bqc_quirk()
812 if (br->flags._BCL_reversed) in acpi_video_bqc_quirk()
813 level = br->count - ACPI_VIDEO_FIRST_LEVEL - 1 - level; in acpi_video_bqc_quirk()
814 if (br->levels[level + ACPI_VIDEO_FIRST_LEVEL] == test_level) in acpi_video_bqc_quirk()
815 br->flags._BQC_use_index = 1; in acpi_video_bqc_quirk()
818 if (!br->flags._BQC_use_index) in acpi_video_bqc_quirk()
819 device->cap._BQC = device->cap._BCQ = 0; in acpi_video_bqc_quirk()
836 if (ACPI_FAILURE(acpi_video_device_lcd_query_levels(device->handle, &obj))) { in acpi_video_get_levels()
837 acpi_handle_debug(device->handle, in acpi_video_get_levels()
839 result = -ENODEV; in acpi_video_get_levels()
843 if (obj->package.count < ACPI_VIDEO_FIRST_LEVEL) { in acpi_video_get_levels()
844 result = -EINVAL; in acpi_video_get_levels()
850 result = -ENOMEM; in acpi_video_get_levels()
859 br->levels = kmalloc_array(obj->package.count + ACPI_VIDEO_FIRST_LEVEL, in acpi_video_get_levels()
860 sizeof(*br->levels), in acpi_video_get_levels()
862 if (!br->levels) { in acpi_video_get_levels()
863 result = -ENOMEM; in acpi_video_get_levels()
867 for (i = 0; i < obj->package.count; i++) { in acpi_video_get_levels()
868 o = (union acpi_object *)&obj->package.elements[i]; in acpi_video_get_levels()
869 if (o->type != ACPI_TYPE_INTEGER) { in acpi_video_get_levels()
870 acpi_handle_info(device->handle, "Invalid data\n"); in acpi_video_get_levels()
873 value = (u32) o->integer.value; in acpi_video_get_levels()
876 && br->levels[count - 1] == value) in acpi_video_get_levels()
879 br->levels[count] = value; in acpi_video_get_levels()
881 if (br->levels[count] > max_level) in acpi_video_get_levels()
882 max_level = br->levels[count]; in acpi_video_get_levels()
893 if (br->levels[i] == br->levels[ACPI_VIDEO_AC_LEVEL]) in acpi_video_get_levels()
895 if (br->levels[i] == br->levels[ACPI_VIDEO_BATTERY_LEVEL]) in acpi_video_get_levels()
900 level_ac_battery = ACPI_VIDEO_FIRST_LEVEL - level_ac_battery; in acpi_video_get_levels()
901 br->flags._BCL_no_ac_battery_levels = 1; in acpi_video_get_levels()
902 for (i = (count - 1 + level_ac_battery); in acpi_video_get_levels()
903 i >= ACPI_VIDEO_FIRST_LEVEL; i--) in acpi_video_get_levels()
904 br->levels[i] = br->levels[i - level_ac_battery]; in acpi_video_get_levels()
907 acpi_handle_info(device->handle, in acpi_video_get_levels()
911 if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) { in acpi_video_get_levels()
912 br->flags._BCL_reversed = 1; in acpi_video_get_levels()
913 sort(&br->levels[ACPI_VIDEO_FIRST_LEVEL], in acpi_video_get_levels()
914 count - ACPI_VIDEO_FIRST_LEVEL, in acpi_video_get_levels()
915 sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]), in acpi_video_get_levels()
917 } else if (max_level != br->levels[count - 1]) in acpi_video_get_levels()
918 acpi_handle_info(device->handle, in acpi_video_get_levels()
921 br->count = count; in acpi_video_get_levels()
942 * Allocate and initialize device->brightness.
953 result = acpi_video_get_levels(device->dev, &br, &max_level); in acpi_video_init_brightness()
956 device->brightness = br; in acpi_video_init_brightness()
959 br->curr = level = max_level; in acpi_video_init_brightness()
961 if (!device->cap._BQC) in acpi_video_init_brightness()
973 * cap._BQC may get cleared due to _BQC is found to be broken in acpi_video_init_brightness()
976 if (!device->cap._BQC) in acpi_video_init_brightness()
986 for (i = ACPI_VIDEO_FIRST_LEVEL; i < br->count; i++) in acpi_video_init_brightness()
987 if (level == br->levels[i]) in acpi_video_init_brightness()
989 if (i == br->count || !level) in acpi_video_init_brightness()
997 acpi_handle_debug(device->dev->handle, "found %d brightness levels\n", in acpi_video_init_brightness()
998 br->count - ACPI_VIDEO_FIRST_LEVEL); in acpi_video_init_brightness()
1003 kfree(br->levels); in acpi_video_init_brightness()
1005 device->brightness = NULL; in acpi_video_init_brightness()
1022 if (acpi_has_method(device->dev->handle, "_ADR")) in acpi_video_device_find_cap()
1023 device->cap._ADR = 1; in acpi_video_device_find_cap()
1024 if (acpi_has_method(device->dev->handle, "_BCL")) in acpi_video_device_find_cap()
1025 device->cap._BCL = 1; in acpi_video_device_find_cap()
1026 if (acpi_has_method(device->dev->handle, "_BCM")) in acpi_video_device_find_cap()
1027 device->cap._BCM = 1; in acpi_video_device_find_cap()
1028 if (acpi_has_method(device->dev->handle, "_BQC")) { in acpi_video_device_find_cap()
1029 device->cap._BQC = 1; in acpi_video_device_find_cap()
1030 } else if (acpi_has_method(device->dev->handle, "_BCQ")) { in acpi_video_device_find_cap()
1031 acpi_handle_info(device->dev->handle, in acpi_video_device_find_cap()
1033 device->cap._BCQ = 1; in acpi_video_device_find_cap()
1036 if (acpi_has_method(device->dev->handle, "_DDC")) in acpi_video_device_find_cap()
1037 device->cap._DDC = 1; in acpi_video_device_find_cap()
1052 if (acpi_has_method(video->device->handle, "_DOS")) in acpi_video_bus_find_cap()
1053 video->cap._DOS = 1; in acpi_video_bus_find_cap()
1054 if (acpi_has_method(video->device->handle, "_DOD")) in acpi_video_bus_find_cap()
1055 video->cap._DOD = 1; in acpi_video_bus_find_cap()
1056 if (acpi_has_method(video->device->handle, "_ROM")) in acpi_video_bus_find_cap()
1057 video->cap._ROM = 1; in acpi_video_bus_find_cap()
1058 if (acpi_has_method(video->device->handle, "_GPD")) in acpi_video_bus_find_cap()
1059 video->cap._GPD = 1; in acpi_video_bus_find_cap()
1060 if (acpi_has_method(video->device->handle, "_SPD")) in acpi_video_bus_find_cap()
1061 video->cap._SPD = 1; in acpi_video_bus_find_cap()
1062 if (acpi_has_method(video->device->handle, "_VPO")) in acpi_video_bus_find_cap()
1063 video->cap._VPO = 1; in acpi_video_bus_find_cap()
1073 acpi_status status = -ENOENT; in acpi_video_bus_check()
1077 return -EINVAL; in acpi_video_bus_check()
1079 dev = acpi_get_pci_dev(video->device->handle); in acpi_video_bus_check()
1081 return -ENODEV; in acpi_video_bus_check()
1090 if (video->cap._DOS || video->cap._DOD) { in acpi_video_bus_check()
1091 if (!video->cap._DOS) { in acpi_video_bus_check()
1093 acpi_device_bid(video->device)); in acpi_video_bus_check()
1095 video->flags.multihead = 1; in acpi_video_bus_check()
1100 if (video->cap._ROM) { in acpi_video_bus_check()
1101 video->flags.rom = 1; in acpi_video_bus_check()
1106 if (video->cap._GPD && video->cap._SPD && video->cap._VPO) { in acpi_video_bus_check()
1107 video->flags.post = 1; in acpi_video_bus_check()
1115 * --------------------------------------------------------------------------
1117 * --------------------------------------------------------------------------
1127 for (i = 0; i < video->attached_count; i++) { in acpi_video_get_device_attr()
1128 ids = &video->attached_array[i]; in acpi_video_get_device_attr()
1129 if ((ids->value.int_val & 0xffff) == device_id) in acpi_video_get_device_attr()
1130 return &ids->value.attrib; in acpi_video_get_device_attr()
1143 for (i = 0; i < video->attached_count; i++) { in acpi_video_get_device_type()
1144 ids = &video->attached_array[i]; in acpi_video_get_device_type()
1145 if ((ids->value.int_val & 0xffff) == device_id) in acpi_video_get_device_type()
1146 return ids->value.int_val; in acpi_video_get_device_type()
1162 acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); in acpi_video_bus_get_one_device()
1169 return -ENOMEM; in acpi_video_bus_get_one_device()
1173 device->driver_data = data; in acpi_video_bus_get_one_device()
1175 data->device_id = device_id; in acpi_video_bus_get_one_device()
1176 data->video = video; in acpi_video_bus_get_one_device()
1177 data->dev = device; in acpi_video_bus_get_one_device()
1178 INIT_DELAYED_WORK(&data->switch_brightness_work, in acpi_video_bus_get_one_device()
1183 if (attribute && (attribute->device_id_scheme || device_id_scheme)) { in acpi_video_bus_get_one_device()
1184 switch (attribute->display_type) { in acpi_video_bus_get_one_device()
1186 data->flags.crt = 1; in acpi_video_bus_get_one_device()
1189 data->flags.tvout = 1; in acpi_video_bus_get_one_device()
1192 data->flags.dvi = 1; in acpi_video_bus_get_one_device()
1195 data->flags.lcd = 1; in acpi_video_bus_get_one_device()
1198 data->flags.unknown = 1; in acpi_video_bus_get_one_device()
1201 if (attribute->bios_can_detect) in acpi_video_bus_get_one_device()
1202 data->flags.bios = 1; in acpi_video_bus_get_one_device()
1206 /* Ignore bits 16 and 18-20 */ in acpi_video_bus_get_one_device()
1209 data->flags.crt = 1; in acpi_video_bus_get_one_device()
1212 data->flags.lcd = 1; in acpi_video_bus_get_one_device()
1215 data->flags.tvout = 1; in acpi_video_bus_get_one_device()
1218 data->flags.unknown = 1; in acpi_video_bus_get_one_device()
1225 mutex_lock(&video->device_list_lock); in acpi_video_bus_get_one_device()
1226 list_add_tail(&data->entry, &video->video_device_list); in acpi_video_bus_get_one_device()
1227 mutex_unlock(&video->device_list_lock); in acpi_video_bus_get_one_device()
1248 mutex_lock(&video->device_list_lock); in acpi_video_device_rebind()
1250 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_device_rebind()
1253 mutex_unlock(&video->device_list_lock); in acpi_video_device_rebind()
1276 for (i = 0; i < video->attached_count; i++) { in acpi_video_device_bind()
1277 ids = &video->attached_array[i]; in acpi_video_device_bind()
1278 if (device->device_id == (ids->value.int_val & 0xffff)) { in acpi_video_device_bind()
1279 ids->bind_info = device; in acpi_video_device_bind()
1280 acpi_handle_debug(video->device->handle, "%s: %d\n", in acpi_video_device_bind()
1288 struct acpi_video_bus *video = device->video; in acpi_video_device_in_dod()
1292 * If we have a broken _DOD or we have more than 8 output devices in acpi_video_device_in_dod()
1296 if (!video->attached_count || video->child_count > 8) in acpi_video_device_in_dod()
1299 for (i = 0; i < video->attached_count; i++) { in acpi_video_device_in_dod()
1300 if ((video->attached_array[i].value.int_val & 0xfff) == in acpi_video_device_in_dod()
1301 (device->device_id & 0xfff)) in acpi_video_device_in_dod()
1329 if (!video->cap._DOD) in acpi_video_device_enumerate()
1332 status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer); in acpi_video_device_enumerate()
1334 acpi_handle_info(video->device->handle, in acpi_video_device_enumerate()
1341 if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) { in acpi_video_device_enumerate()
1342 acpi_handle_info(video->device->handle, "Invalid _DOD data\n"); in acpi_video_device_enumerate()
1343 status = -EFAULT; in acpi_video_device_enumerate()
1347 acpi_handle_debug(video->device->handle, "Found %d video heads in _DOD\n", in acpi_video_device_enumerate()
1348 dod->package.count); in acpi_video_device_enumerate()
1350 active_list = kcalloc(1 + dod->package.count, in acpi_video_device_enumerate()
1354 status = -ENOMEM; in acpi_video_device_enumerate()
1359 for (i = 0; i < dod->package.count; i++) { in acpi_video_device_enumerate()
1360 obj = &dod->package.elements[i]; in acpi_video_device_enumerate()
1362 if (obj->type != ACPI_TYPE_INTEGER) { in acpi_video_device_enumerate()
1363 acpi_handle_info(video->device->handle, in acpi_video_device_enumerate()
1368 active_list[count].value.int_val = obj->integer.value; in acpi_video_device_enumerate()
1371 acpi_handle_debug(video->device->handle, in acpi_video_device_enumerate()
1373 (int)obj->integer.value); in acpi_video_device_enumerate()
1378 kfree(video->attached_array); in acpi_video_device_enumerate()
1380 video->attached_array = active_list; in acpi_video_device_enumerate()
1381 video->attached_count = count; in acpi_video_device_enumerate()
1396 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) { in acpi_video_get_next_level()
1397 l = device->brightness->levels[i]; in acpi_video_get_next_level()
1398 if (abs(l - level_current) < abs(delta)) { in acpi_video_get_next_level()
1399 delta = l - level_current; in acpi_video_get_next_level()
1406 for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) { in acpi_video_get_next_level()
1407 l = device->brightness->levels[i]; in acpi_video_get_next_level()
1439 int event = device->switch_brightness_event; in acpi_video_switch_brightness()
1440 int result = -EINVAL; in acpi_video_switch_brightness()
1443 if (!device->backlight) in acpi_video_switch_brightness()
1446 if (!device->brightness) in acpi_video_switch_brightness()
1460 backlight_force_update(device->backlight, in acpi_video_switch_brightness()
1465 acpi_handle_info(device->dev->handle, in acpi_video_switch_brightness()
1479 return -EINVAL; in acpi_video_get_edid()
1483 for (i = 0; i < video->attached_count; i++) { in acpi_video_get_edid()
1484 video_device = video->attached_array[i].bind_info; in acpi_video_get_edid()
1490 if (!video_device->cap._DDC) in acpi_video_get_edid()
1496 if (!video_device->flags.crt) in acpi_video_get_edid()
1500 if (!video_device->flags.tvout) in acpi_video_get_edid()
1504 if (!video_device->flags.dvi) in acpi_video_get_edid()
1508 if (!video_device->flags.lcd) in acpi_video_get_edid()
1512 } else if (video_device->device_id != device_id) { in acpi_video_get_edid()
1519 buffer->type != ACPI_TYPE_BUFFER) { in acpi_video_get_edid()
1524 buffer->type != ACPI_TYPE_BUFFER) { in acpi_video_get_edid()
1529 *edid = buffer->buffer.pointer; in acpi_video_get_edid()
1533 return -ENODEV; in acpi_video_get_edid()
1546 * of broken _DOD and ignoring returned value here doesn't cause in acpi_video_bus_get_devices()
1551 list_for_each_entry(dev, &device->children, node) { in acpi_video_bus_get_devices()
1555 dev_err(&dev->dev, "Can't attach device\n"); in acpi_video_bus_get_devices()
1558 video->child_count++; in acpi_video_bus_get_devices()
1587 if (!video || !video->input) in acpi_video_bus_notify()
1590 input = video->input; in acpi_video_bus_notify()
1616 acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n", in acpi_video_bus_notify()
1639 video_device->switch_brightness_event = event; in brightness_switch_event()
1640 schedule_delayed_work(&video_device->switch_brightness_work, HZ / 10); in brightness_switch_event()
1654 device = video_device->dev; in acpi_video_device_notify()
1655 bus = video_device->video; in acpi_video_device_notify()
1656 input = bus->input; in acpi_video_device_notify()
1659 if (video_device->backlight) in acpi_video_device_notify()
1660 backlight_force_update(video_device->backlight, in acpi_video_device_notify()
1718 dev_info(&video->device->dev, "Restoring backlight state\n"); in acpi_video_resume()
1720 for (i = 0; i < video->attached_count; i++) { in acpi_video_resume()
1721 video_device = video->attached_array[i].bind_info; in acpi_video_resume()
1722 if (video_device && video_device->brightness) in acpi_video_resume()
1724 video_device->brightness->curr); in acpi_video_resume()
1738 if (handle == device->handle) in acpi_video_bus_match()
1773 acpi_get_parent(device->dev->handle, &acpi_parent); in acpi_video_dev_register_backlight()
1777 parent = &pdev->dev; in acpi_video_dev_register_backlight()
1784 device->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1; in acpi_video_dev_register_backlight()
1785 device->backlight = backlight_device_register(name, in acpi_video_dev_register_backlight()
1791 if (IS_ERR(device->backlight)) { in acpi_video_dev_register_backlight()
1792 device->backlight = NULL; in acpi_video_dev_register_backlight()
1800 device->backlight->props.brightness = in acpi_video_dev_register_backlight()
1801 acpi_video_get_brightness(device->backlight); in acpi_video_dev_register_backlight()
1803 device->cooling_dev = thermal_cooling_device_register("LCD", in acpi_video_dev_register_backlight()
1804 device->dev, &video_cooling_ops); in acpi_video_dev_register_backlight()
1805 if (IS_ERR(device->cooling_dev)) { in acpi_video_dev_register_backlight()
1810 * -- dtor in acpi_video_dev_register_backlight()
1812 device->cooling_dev = NULL; in acpi_video_dev_register_backlight()
1816 dev_info(&device->dev->dev, "registered as cooling_device%d\n", in acpi_video_dev_register_backlight()
1817 device->cooling_dev->id); in acpi_video_dev_register_backlight()
1818 result = sysfs_create_link(&device->dev->dev.kobj, in acpi_video_dev_register_backlight()
1819 &device->cooling_dev->device.kobj, in acpi_video_dev_register_backlight()
1824 result = sysfs_create_link(&device->cooling_dev->device.kobj, in acpi_video_dev_register_backlight()
1825 &device->dev->dev.kobj, "device"); in acpi_video_dev_register_backlight()
1835 mutex_lock(&video->device_list_lock); in acpi_video_run_bcl_for_osi()
1836 list_for_each_entry(dev, &video->video_device_list, entry) { in acpi_video_run_bcl_for_osi()
1837 if (!acpi_video_device_lcd_query_levels(dev->dev->handle, &levels)) in acpi_video_run_bcl_for_osi()
1840 mutex_unlock(&video->device_list_lock); in acpi_video_run_bcl_for_osi()
1850 dev_dbg(&dev->dev->dev, "not in _DOD list, ignore\n"); in acpi_video_should_register_backlight()
1855 return dev->flags.lcd; in acpi_video_should_register_backlight()
1863 if (video->backlight_registered) in acpi_video_bus_register_backlight()
1871 mutex_lock(&video->device_list_lock); in acpi_video_bus_register_backlight()
1872 list_for_each_entry(dev, &video->video_device_list, entry) { in acpi_video_bus_register_backlight()
1876 mutex_unlock(&video->device_list_lock); in acpi_video_bus_register_backlight()
1878 video->backlight_registered = true; in acpi_video_bus_register_backlight()
1880 video->pm_nb.notifier_call = acpi_video_resume; in acpi_video_bus_register_backlight()
1881 video->pm_nb.priority = 0; in acpi_video_bus_register_backlight()
1882 return register_pm_notifier(&video->pm_nb); in acpi_video_bus_register_backlight()
1887 if (device->backlight) { in acpi_video_dev_unregister_backlight()
1888 backlight_device_unregister(device->backlight); in acpi_video_dev_unregister_backlight()
1889 device->backlight = NULL; in acpi_video_dev_unregister_backlight()
1891 if (device->brightness) { in acpi_video_dev_unregister_backlight()
1892 kfree(device->brightness->levels); in acpi_video_dev_unregister_backlight()
1893 kfree(device->brightness); in acpi_video_dev_unregister_backlight()
1894 device->brightness = NULL; in acpi_video_dev_unregister_backlight()
1896 if (device->cooling_dev) { in acpi_video_dev_unregister_backlight()
1897 sysfs_remove_link(&device->dev->dev.kobj, "thermal_cooling"); in acpi_video_dev_unregister_backlight()
1898 sysfs_remove_link(&device->cooling_dev->device.kobj, "device"); in acpi_video_dev_unregister_backlight()
1899 thermal_cooling_device_unregister(device->cooling_dev); in acpi_video_dev_unregister_backlight()
1900 device->cooling_dev = NULL; in acpi_video_dev_unregister_backlight()
1909 if (!video->backlight_registered) in acpi_video_bus_unregister_backlight()
1912 error = unregister_pm_notifier(&video->pm_nb); in acpi_video_bus_unregister_backlight()
1914 mutex_lock(&video->device_list_lock); in acpi_video_bus_unregister_backlight()
1915 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_bus_unregister_backlight()
1917 mutex_unlock(&video->device_list_lock); in acpi_video_bus_unregister_backlight()
1919 video->backlight_registered = false; in acpi_video_bus_unregister_backlight()
1927 struct acpi_device *adev = device->dev; in acpi_video_dev_add_notify_handler()
1929 status = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY, in acpi_video_dev_add_notify_handler()
1932 dev_err(&adev->dev, "Error installing notify handler\n"); in acpi_video_dev_add_notify_handler()
1934 device->flags.notify = 1; in acpi_video_dev_add_notify_handler()
1943 video->input = input = input_allocate_device(); in acpi_video_bus_add_notify_handler()
1945 error = -ENOMEM; in acpi_video_bus_add_notify_handler()
1953 snprintf(video->phys, sizeof(video->phys), in acpi_video_bus_add_notify_handler()
1954 "%s/video/input0", acpi_device_hid(video->device)); in acpi_video_bus_add_notify_handler()
1956 input->name = acpi_device_name(video->device); in acpi_video_bus_add_notify_handler()
1957 input->phys = video->phys; in acpi_video_bus_add_notify_handler()
1958 input->id.bustype = BUS_HOST; in acpi_video_bus_add_notify_handler()
1959 input->id.product = 0x06; in acpi_video_bus_add_notify_handler()
1960 input->dev.parent = &video->device->dev; in acpi_video_bus_add_notify_handler()
1961 input->evbit[0] = BIT(EV_KEY); in acpi_video_bus_add_notify_handler()
1962 set_bit(KEY_SWITCHVIDEOMODE, input->keybit); in acpi_video_bus_add_notify_handler()
1963 set_bit(KEY_VIDEO_NEXT, input->keybit); in acpi_video_bus_add_notify_handler()
1964 set_bit(KEY_VIDEO_PREV, input->keybit); in acpi_video_bus_add_notify_handler()
1965 set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit); in acpi_video_bus_add_notify_handler()
1966 set_bit(KEY_BRIGHTNESSUP, input->keybit); in acpi_video_bus_add_notify_handler()
1967 set_bit(KEY_BRIGHTNESSDOWN, input->keybit); in acpi_video_bus_add_notify_handler()
1968 set_bit(KEY_BRIGHTNESS_ZERO, input->keybit); in acpi_video_bus_add_notify_handler()
1969 set_bit(KEY_DISPLAY_OFF, input->keybit); in acpi_video_bus_add_notify_handler()
1975 mutex_lock(&video->device_list_lock); in acpi_video_bus_add_notify_handler()
1976 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_bus_add_notify_handler()
1978 mutex_unlock(&video->device_list_lock); in acpi_video_bus_add_notify_handler()
1986 video->input = NULL; in acpi_video_bus_add_notify_handler()
1993 if (dev->flags.notify) { in acpi_video_dev_remove_notify_handler()
1994 acpi_remove_notify_handler(dev->dev->handle, ACPI_DEVICE_NOTIFY, in acpi_video_dev_remove_notify_handler()
1996 dev->flags.notify = 0; in acpi_video_dev_remove_notify_handler()
2004 mutex_lock(&video->device_list_lock); in acpi_video_bus_remove_notify_handler()
2005 list_for_each_entry(dev, &video->video_device_list, entry) in acpi_video_bus_remove_notify_handler()
2007 mutex_unlock(&video->device_list_lock); in acpi_video_bus_remove_notify_handler()
2010 input_unregister_device(video->input); in acpi_video_bus_remove_notify_handler()
2011 video->input = NULL; in acpi_video_bus_remove_notify_handler()
2018 mutex_lock(&video->device_list_lock); in acpi_video_bus_put_devices()
2019 list_for_each_entry_safe(dev, next, &video->video_device_list, entry) { in acpi_video_bus_put_devices()
2020 list_del(&dev->entry); in acpi_video_bus_put_devices()
2023 mutex_unlock(&video->device_list_lock); in acpi_video_bus_put_devices()
2037 device->parent->handle, 1, in acpi_video_bus_add()
2047 return -ENODEV; in acpi_video_bus_add()
2052 return -ENOMEM; in acpi_video_bus_add()
2055 if (!strcmp(device->pnp.bus_id, "VID")) { in acpi_video_bus_add()
2057 device->pnp.bus_id[3] = '0' + instance; in acpi_video_bus_add()
2061 if (!strcmp(device->pnp.bus_id, "VGA")) { in acpi_video_bus_add()
2063 device->pnp.bus_id[3] = '0' + instance; in acpi_video_bus_add()
2067 video->device = device; in acpi_video_bus_add()
2070 device->driver_data = video; in acpi_video_bus_add()
2077 mutex_init(&video->device_list_lock); in acpi_video_bus_add()
2078 INIT_LIST_HEAD(&video->video_device_list); in acpi_video_bus_add()
2084 pr_info("%s [%s] (multi-head: %s rom: %s post: %s)\n", in acpi_video_bus_add()
2086 video->flags.multihead ? "yes" : "no", in acpi_video_bus_add()
2087 video->flags.rom ? "yes" : "no", in acpi_video_bus_add()
2088 video->flags.post ? "yes" : "no"); in acpi_video_bus_add()
2090 list_add_tail(&video->entry, &video_bus_head); in acpi_video_bus_add()
2100 kfree(video->attached_array); in acpi_video_bus_add()
2103 device->driver_data = NULL; in acpi_video_bus_add()
2114 return -EINVAL; in acpi_video_bus_remove()
2123 list_del(&video->entry); in acpi_video_bus_remove()
2126 kfree(video->attached_array); in acpi_video_bus_remove()
2134 if (dev->device == 0x00D1) in is_i740()
2136 if (dev->device == 0x7000) in is_i740()
2148 if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) in intel_opregion_present()
2150 if (dev->vendor != PCI_VENDOR_ID_INTEL) in intel_opregion_present()
2152 /* We don't want to poke around undefined i740 registers */ in intel_opregion_present()
2163 /* Check if the chassis-type indicates there is no builtin LCD panel */
2196 * 2.1 Report a desktop/server DMI chassis-type, or
2197 * 2.2 Are an ACPI-reduced-hardware platform (and thus won't use the EC for
2227 if (only_lcd == -1) in acpi_video_register()
2297 * a broken BIOS) so that i915.ko can still be loaded on such in acpi_video_init()
2300 * acpi_video_register() will report -ENODEV later as well due in acpi_video_init()