Lines Matching full:video

3  *  video.c - ACPI Video Driver
10 #define pr_fmt(fmt) "ACPI: video: " fmt
28 #include <acpi/video.h>
31 #define ACPI_VIDEO_BUS_NAME "Video Bus"
32 #define ACPI_VIDEO_DEVICE_NAME "Video Device"
37 MODULE_DESCRIPTION("ACPI Video Driver");
44 * By default, we don't allow duplicate ACPI video bus devices
101 .name = "video",
111 u8 multihead:1; /* can switch video heads */
112 u8 rom:1; /* can retrieve a video rom */
123 u8 _VPO:1; /* Video POST Options */
200 struct acpi_video_bus *video; member
208 static void acpi_video_device_rebind(struct acpi_video_bus *video);
209 static void acpi_video_device_bind(struct acpi_video_bus *video,
211 static int acpi_video_device_enumerate(struct acpi_video_bus *video);
256 struct acpi_video_device *video = cooling_dev->devdata; in video_get_max_state() local
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() local
269 if (acpi_video_device_lcd_get_level_current(video, &level, false)) 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()
284 struct acpi_video_device *video = cooling_dev->devdata; in video_set_cur_state() local
287 if (state >= video->brightness->count - ACPI_VIDEO_FIRST_LEVEL) 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()
292 return acpi_video_device_lcd_set_level(video, level); in video_set_cur_state()
303 * Video Management
463 * Some machines have multiple video output devices, but only the one
465 * register backlight interface for other video output devices.
480 * events, in this case acpi-video is considered the canonical source
600 * ACPI video backlight still works w/ buggy _BQC. in acpi_video_device_lcd_get_level_current()
615 * @device: video output device (LCD, CRT, ..)
675 * video : video bus device pointer
699 acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) in acpi_video_bus_DOS() argument
703 if (!video->cap._DOS) 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()
916 * device : video output device (LCD, CRT, ..)
990 * device : video output device (LCD, CRT, ..)
1021 * device : video output device (VGA)
1026 * Find out all required AML methods defined under the video bus device.
1029 static void acpi_video_bus_find_cap(struct acpi_video_bus *video) in acpi_video_bus_find_cap() argument
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
1050 static int acpi_video_bus_check(struct acpi_video_bus *video) in acpi_video_bus_check() argument
1055 if (!video) in acpi_video_bus_check()
1058 dev = acpi_get_pci_dev(video->device->handle); 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()
1101 acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id) in acpi_video_get_device_attr() argument
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()
1116 acpi_video_get_device_type(struct acpi_video_bus *video, in acpi_video_get_device_type() argument
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()
1133 struct acpi_video_bus *video = arg; in acpi_video_bus_get_one_device() local
1155 data->video = video; in acpi_video_bus_get_one_device()
1160 attribute = acpi_video_get_device_attr(video, device_id); in acpi_video_bus_get_one_device()
1184 device_type = acpi_video_get_device_type(video, device_id); in acpi_video_bus_get_one_device()
1201 acpi_video_device_bind(video, data); 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,
1224 * bind the ids with the corresponding video devices
1225 * under the video bus.
1228 static void acpi_video_device_rebind(struct acpi_video_bus *video) in acpi_video_device_rebind() argument
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()
1235 acpi_video_device_bind(video, dev); 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
1249 * Bind the ids with the corresponding video devices
1250 * under the video bus.
1254 acpi_video_device_bind(struct acpi_video_bus *video, 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()
1264 acpi_handle_debug(video->device->handle, "%s: %d\n", in acpi_video_device_bind()
1272 struct acpi_video_bus *video = device->video; in acpi_video_device_in_dod() local
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()
1294 * video : video bus device
1303 static int acpi_video_device_enumerate(struct acpi_video_bus *video) in acpi_video_device_enumerate() argument
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()
1326 acpi_handle_info(video->device->handle, "Invalid _DOD data\n"); in acpi_video_device_enumerate()
1331 acpi_handle_debug(video->device->handle, "Found %d video heads in _DOD\n", in acpi_video_device_enumerate()
1347 acpi_handle_info(video->device->handle, in acpi_video_device_enumerate()
1355 acpi_handle_debug(video->device->handle, 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()
1456 struct acpi_video_bus *video; in acpi_video_get_edid() local
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()
1509 acpi_video_bus_get_devices(struct acpi_video_bus *video, in acpi_video_bus_get_devices() argument
1513 * There are systems where video module known to work fine regardless in acpi_video_bus_get_devices()
1517 acpi_video_device_enumerate(video); in acpi_video_bus_get_devices()
1519 return acpi_dev_for_each_child(device, acpi_video_bus_get_one_device, video); in acpi_video_bus_get_devices()
1528 static int acpi_video_bus_start_devices(struct acpi_video_bus *video) in acpi_video_bus_start_devices() argument
1530 return acpi_video_bus_DOS(video, 0, in acpi_video_bus_start_devices()
1534 static int acpi_video_bus_stop_devices(struct acpi_video_bus *video) in acpi_video_bus_stop_devices() argument
1536 return acpi_video_bus_DOS(video, 0, in acpi_video_bus_stop_devices()
1543 struct acpi_video_bus *video = acpi_driver_data(device); in acpi_video_bus_notify() local
1547 if (!video || !video->input) in acpi_video_bus_notify()
1550 input = video->input; in acpi_video_bus_notify()
1558 case ACPI_VIDEO_NOTIFY_PROBE: /* User plugged in or removed a video in acpi_video_bus_notify()
1560 acpi_video_device_enumerate(video); in acpi_video_bus_notify()
1561 acpi_video_device_rebind(video); in acpi_video_bus_notify()
1615 bus = video_device->video; in acpi_video_device_notify()
1668 struct acpi_video_bus *video; in acpi_video_resume() local
1676 video = container_of(nb, struct acpi_video_bus, pm_nb); in acpi_video_resume()
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()
1767 * register video output if cooling device registration failed? in acpi_video_dev_register_backlight()
1788 static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video) in acpi_video_run_bcl_for_osi() argument
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()
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()
1817 static int acpi_video_bus_register_backlight(struct acpi_video_bus *video) in acpi_video_bus_register_backlight() argument
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()
1860 static int acpi_video_bus_unregister_backlight(struct acpi_video_bus *video) in acpi_video_bus_unregister_backlight() argument
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()
1893 static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video) in acpi_video_bus_add_notify_handler() argument
1899 video->input = input = input_allocate_device(); in acpi_video_bus_add_notify_handler()
1905 error = acpi_video_bus_start_devices(video); 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()
1916 input->dev.parent = &video->device->dev; 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()
1939 acpi_video_bus_stop_devices(video); in acpi_video_bus_add_notify_handler()
1942 video->input = NULL; in acpi_video_bus_add_notify_handler()
1956 static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video) in acpi_video_bus_remove_notify_handler() argument
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()
1965 acpi_video_bus_stop_devices(video); 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()
1970 static int acpi_video_bus_put_devices(struct acpi_video_bus *video) in acpi_video_bus_put_devices() argument
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()
1979 mutex_unlock(&video->device_list_lock); in acpi_video_bus_put_devices()
1988 struct acpi_video_bus *video; in acpi_video_bus_add() local
1999 "Duplicate ACPI video bus devices for the" in acpi_video_bus_add()
2001 "parameter \"video.allow_duplicates=1\"" in acpi_video_bus_add()
2007 video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL); in acpi_video_bus_add()
2008 if (!video) in acpi_video_bus_add()
2024 video->device = device; in acpi_video_bus_add()
2027 device->driver_data = video; in acpi_video_bus_add()
2029 acpi_video_bus_find_cap(video); in acpi_video_bus_add()
2030 error = acpi_video_bus_check(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()
2042 * HP ZBook Fury 16 G10 requires ACPI video's child devices have _PS0 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()
2058 * show up later and this may change the result from video to native. in acpi_video_bus_add()
2066 acpi_video_run_bcl_for_osi(video); in acpi_video_bus_add()
2069 acpi_video_bus_register_backlight(video); in acpi_video_bus_add()
2071 error = acpi_video_bus_add_notify_handler(video); in acpi_video_bus_add()
2083 acpi_video_bus_remove_notify_handler(video); in acpi_video_bus_add()
2086 list_del(&video->entry); in acpi_video_bus_add()
2088 acpi_video_bus_unregister_backlight(video); in acpi_video_bus_add()
2090 acpi_video_bus_put_devices(video); in acpi_video_bus_add()
2091 kfree(video->attached_array); in acpi_video_bus_add()
2093 kfree(video); in acpi_video_bus_add()
2101 struct acpi_video_bus *video = NULL; in acpi_video_bus_remove() local
2107 video = acpi_driver_data(device); in acpi_video_bus_remove()
2113 list_del(&video->entry); in acpi_video_bus_remove()
2116 acpi_video_bus_remove_notify_handler(video); in acpi_video_bus_remove()
2117 acpi_video_bus_unregister_backlight(video); in acpi_video_bus_remove()
2118 acpi_video_bus_put_devices(video); in acpi_video_bus_remove()
2120 kfree(video->attached_array); in acpi_video_bus_remove()
2121 kfree(video); in acpi_video_bus_remove()
2200 struct acpi_video_bus *video; in acpi_video_register_backlight() local
2203 list_for_each_entry(video, &video_bus_head, entry) in acpi_video_register_backlight()
2204 acpi_video_bus_register_backlight(video); in acpi_video_register_backlight()
2218 * the video opregion code to be run first in order to initialise
2219 * state before any ACPI video calls are made. To handle this we defer
2220 * registration of the video class until the opregion code has run.