Lines Matching refs:ctrl
747 static inline __u8 *uvc_ctrl_data(struct uvc_control *ctrl, int id) in uvc_ctrl_data() argument
749 return ctrl->uvc_data + id * ctrl->info.size; in uvc_ctrl_data()
863 struct uvc_control *ctrl; in __uvc_find_control() local
871 ctrl = &entity->controls[i]; in __uvc_find_control()
872 if (!ctrl->initialized) in __uvc_find_control()
875 list_for_each_entry(map, &ctrl->info.mappings, list) { in __uvc_find_control()
877 *control = ctrl; in __uvc_find_control()
884 *control = ctrl; in __uvc_find_control()
894 struct uvc_control *ctrl = NULL; in uvc_find_control() local
905 __uvc_find_control(entity, v4l2_id, mapping, &ctrl, next); in uvc_find_control()
906 if (ctrl && !next) in uvc_find_control()
907 return ctrl; in uvc_find_control()
910 if (ctrl == NULL && !next) in uvc_find_control()
914 return ctrl; in uvc_find_control()
918 struct uvc_control *ctrl) in uvc_ctrl_populate_cache() argument
922 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF) { in uvc_ctrl_populate_cache()
923 ret = uvc_query_ctrl(chain->dev, UVC_GET_DEF, ctrl->entity->id, in uvc_ctrl_populate_cache()
924 chain->dev->intfnum, ctrl->info.selector, in uvc_ctrl_populate_cache()
925 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF), in uvc_ctrl_populate_cache()
926 ctrl->info.size); in uvc_ctrl_populate_cache()
931 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) { in uvc_ctrl_populate_cache()
932 ret = uvc_query_ctrl(chain->dev, UVC_GET_MIN, ctrl->entity->id, in uvc_ctrl_populate_cache()
933 chain->dev->intfnum, ctrl->info.selector, in uvc_ctrl_populate_cache()
934 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN), in uvc_ctrl_populate_cache()
935 ctrl->info.size); in uvc_ctrl_populate_cache()
939 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) { in uvc_ctrl_populate_cache()
940 ret = uvc_query_ctrl(chain->dev, UVC_GET_MAX, ctrl->entity->id, in uvc_ctrl_populate_cache()
941 chain->dev->intfnum, ctrl->info.selector, in uvc_ctrl_populate_cache()
942 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX), in uvc_ctrl_populate_cache()
943 ctrl->info.size); in uvc_ctrl_populate_cache()
947 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) { in uvc_ctrl_populate_cache()
948 ret = uvc_query_ctrl(chain->dev, UVC_GET_RES, ctrl->entity->id, in uvc_ctrl_populate_cache()
949 chain->dev->intfnum, ctrl->info.selector, in uvc_ctrl_populate_cache()
950 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES), in uvc_ctrl_populate_cache()
951 ctrl->info.size); in uvc_ctrl_populate_cache()
953 if (UVC_ENTITY_TYPE(ctrl->entity) != in uvc_ctrl_populate_cache()
964 memset(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES), 0, in uvc_ctrl_populate_cache()
965 ctrl->info.size); in uvc_ctrl_populate_cache()
969 ctrl->cached = 1; in uvc_ctrl_populate_cache()
974 struct uvc_control *ctrl, struct uvc_control_mapping *mapping, in __uvc_ctrl_get() argument
981 if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0) in __uvc_ctrl_get()
984 if (!ctrl->loaded) { in __uvc_ctrl_get()
985 ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, ctrl->entity->id, in __uvc_ctrl_get()
986 chain->dev->intfnum, ctrl->info.selector, in __uvc_ctrl_get()
987 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), in __uvc_ctrl_get()
988 ctrl->info.size); in __uvc_ctrl_get()
992 ctrl->loaded = 1; in __uvc_ctrl_get()
996 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); in __uvc_ctrl_get()
1012 struct uvc_control *ctrl, in __uvc_query_v4l2_ctrl() argument
1027 if (!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) in __uvc_query_v4l2_ctrl()
1029 if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) in __uvc_query_v4l2_ctrl()
1033 __uvc_find_control(ctrl->entity, mapping->master_id, in __uvc_query_v4l2_ctrl()
1045 if (!ctrl->cached) { in __uvc_query_v4l2_ctrl()
1046 int ret = uvc_ctrl_populate_cache(chain, ctrl); in __uvc_query_v4l2_ctrl()
1051 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF) { in __uvc_query_v4l2_ctrl()
1053 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF)); in __uvc_query_v4l2_ctrl()
1088 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) in __uvc_query_v4l2_ctrl()
1090 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); in __uvc_query_v4l2_ctrl()
1092 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) in __uvc_query_v4l2_ctrl()
1094 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); in __uvc_query_v4l2_ctrl()
1096 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) in __uvc_query_v4l2_ctrl()
1098 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); in __uvc_query_v4l2_ctrl()
1106 struct uvc_control *ctrl; in uvc_query_v4l2_ctrl() local
1114 ctrl = uvc_find_control(chain, v4l2_ctrl->id, &mapping); in uvc_query_v4l2_ctrl()
1115 if (ctrl == NULL) { in uvc_query_v4l2_ctrl()
1120 ret = __uvc_query_v4l2_ctrl(chain, ctrl, mapping, v4l2_ctrl); in uvc_query_v4l2_ctrl()
1140 struct uvc_control *ctrl; in uvc_query_v4l2_menu() local
1153 ctrl = uvc_find_control(chain, query_menu->id, &mapping); in uvc_query_v4l2_menu()
1154 if (ctrl == NULL || mapping->v4l2_type != V4L2_CTRL_TYPE_MENU) { in uvc_query_v4l2_menu()
1167 (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) { in uvc_query_v4l2_menu()
1170 if (!ctrl->cached) { in uvc_query_v4l2_menu()
1171 ret = uvc_ctrl_populate_cache(chain, ctrl); in uvc_query_v4l2_menu()
1177 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); in uvc_query_v4l2_menu()
1197 struct uvc_control *ctrl, in uvc_ctrl_fill_event() argument
1203 __uvc_query_v4l2_ctrl(chain, ctrl, mapping, &v4l2_ctrl); in uvc_ctrl_fill_event()
1208 ev->u.ctrl.value = value; in uvc_ctrl_fill_event()
1209 ev->u.ctrl.changes = changes; in uvc_ctrl_fill_event()
1210 ev->u.ctrl.type = v4l2_ctrl.type; in uvc_ctrl_fill_event()
1211 ev->u.ctrl.flags = v4l2_ctrl.flags; in uvc_ctrl_fill_event()
1212 ev->u.ctrl.minimum = v4l2_ctrl.minimum; in uvc_ctrl_fill_event()
1213 ev->u.ctrl.maximum = v4l2_ctrl.maximum; in uvc_ctrl_fill_event()
1214 ev->u.ctrl.step = v4l2_ctrl.step; in uvc_ctrl_fill_event()
1215 ev->u.ctrl.default_value = v4l2_ctrl.default_value; in uvc_ctrl_fill_event()
1219 struct uvc_control *ctrl, struct uvc_control_mapping *mapping, in uvc_ctrl_send_event() argument
1228 uvc_ctrl_fill_event(handle->chain, &ev, ctrl, mapping, value, changes); in uvc_ctrl_send_event()
1243 struct uvc_control *ctrl = NULL; in uvc_ctrl_send_slave_event() local
1257 __uvc_find_control(master->entity, slave_id, &mapping, &ctrl, 0); in uvc_ctrl_send_slave_event()
1258 if (ctrl == NULL) in uvc_ctrl_send_slave_event()
1261 if (__uvc_ctrl_get(handle->chain, ctrl, mapping, &val) == 0) in uvc_ctrl_send_slave_event()
1264 uvc_ctrl_send_event(handle, ctrl, mapping, val, changes); in uvc_ctrl_send_slave_event()
1271 struct uvc_control *ctrl; in uvc_ctrl_send_events() local
1277 ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping); in uvc_ctrl_send_events()
1282 uvc_ctrl_send_slave_event(handle, ctrl, in uvc_ctrl_send_events()
1300 uvc_ctrl_send_event(handle, ctrl, mapping, xctrls[i].value, in uvc_ctrl_send_events()
1309 struct uvc_control *ctrl; in uvc_ctrl_add_event() local
1316 ctrl = uvc_find_control(handle->chain, sev->id, &mapping); in uvc_ctrl_add_event()
1317 if (ctrl == NULL) { in uvc_ctrl_add_event()
1328 if (__uvc_ctrl_get(handle->chain, ctrl, mapping, &val) == 0) in uvc_ctrl_add_event()
1331 uvc_ctrl_fill_event(handle->chain, &ev, ctrl, mapping, val, in uvc_ctrl_add_event()
1392 struct uvc_control *ctrl; in uvc_ctrl_commit_entity() local
1400 ctrl = &entity->controls[i]; in uvc_ctrl_commit_entity()
1401 if (!ctrl->initialized) in uvc_ctrl_commit_entity()
1410 if (ctrl->info.flags & UVC_CTRL_FLAG_AUTO_UPDATE || in uvc_ctrl_commit_entity()
1411 !(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) in uvc_ctrl_commit_entity()
1412 ctrl->loaded = 0; in uvc_ctrl_commit_entity()
1414 if (!ctrl->dirty) in uvc_ctrl_commit_entity()
1418 ret = uvc_query_ctrl(dev, UVC_SET_CUR, ctrl->entity->id, in uvc_ctrl_commit_entity()
1419 dev->intfnum, ctrl->info.selector, in uvc_ctrl_commit_entity()
1420 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), in uvc_ctrl_commit_entity()
1421 ctrl->info.size); in uvc_ctrl_commit_entity()
1426 memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), in uvc_ctrl_commit_entity()
1427 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP), in uvc_ctrl_commit_entity()
1428 ctrl->info.size); in uvc_ctrl_commit_entity()
1430 ctrl->dirty = 0; in uvc_ctrl_commit_entity()
1464 struct uvc_control *ctrl; in uvc_ctrl_get() local
1467 ctrl = uvc_find_control(chain, xctrl->id, &mapping); in uvc_ctrl_get()
1468 if (ctrl == NULL) in uvc_ctrl_get()
1471 return __uvc_ctrl_get(chain, ctrl, mapping, &xctrl->value); in uvc_ctrl_get()
1477 struct uvc_control *ctrl; in uvc_ctrl_set() local
1485 ctrl = uvc_find_control(chain, xctrl->id, &mapping); in uvc_ctrl_set()
1486 if (ctrl == NULL) in uvc_ctrl_set()
1488 if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR)) in uvc_ctrl_set()
1494 if (!ctrl->cached) { in uvc_ctrl_set()
1495 ret = uvc_ctrl_populate_cache(chain, ctrl); in uvc_ctrl_set()
1501 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); in uvc_ctrl_set()
1503 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); in uvc_ctrl_set()
1505 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); in uvc_ctrl_set()
1532 (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) { in uvc_ctrl_set()
1533 if (!ctrl->cached) { in uvc_ctrl_set()
1534 ret = uvc_ctrl_populate_cache(chain, ctrl); in uvc_ctrl_set()
1540 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); in uvc_ctrl_set()
1556 if (!ctrl->loaded && (ctrl->info.size * 8) != mapping->size) { in uvc_ctrl_set()
1557 if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0) { in uvc_ctrl_set()
1558 memset(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), in uvc_ctrl_set()
1559 0, ctrl->info.size); in uvc_ctrl_set()
1562 ctrl->entity->id, chain->dev->intfnum, in uvc_ctrl_set()
1563 ctrl->info.selector, in uvc_ctrl_set()
1564 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), in uvc_ctrl_set()
1565 ctrl->info.size); in uvc_ctrl_set()
1570 ctrl->loaded = 1; in uvc_ctrl_set()
1574 if (!ctrl->dirty) { in uvc_ctrl_set()
1575 memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP), in uvc_ctrl_set()
1576 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), in uvc_ctrl_set()
1577 ctrl->info.size); in uvc_ctrl_set()
1581 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); in uvc_ctrl_set()
1583 ctrl->dirty = 1; in uvc_ctrl_set()
1584 ctrl->modified = 1; in uvc_ctrl_set()
1593 const struct uvc_control *ctrl, struct uvc_control_info *info) in uvc_ctrl_fixup_xu_info() argument
1623 if (fixups[i].entity == ctrl->entity->id && in uvc_ctrl_fixup_xu_info()
1635 const struct uvc_control *ctrl, struct uvc_control_info *info) in uvc_ctrl_fill_xu_info() argument
1644 memcpy(info->entity, ctrl->entity->extension.guidExtensionCode, in uvc_ctrl_fill_xu_info()
1646 info->index = ctrl->index; in uvc_ctrl_fill_xu_info()
1647 info->selector = ctrl->index + 1; in uvc_ctrl_fill_xu_info()
1650 ret = uvc_query_ctrl(dev, UVC_GET_LEN, ctrl->entity->id, dev->intfnum, in uvc_ctrl_fill_xu_info()
1662 ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum, in uvc_ctrl_fill_xu_info()
1680 uvc_ctrl_fixup_xu_info(dev, ctrl, info); in uvc_ctrl_fill_xu_info()
1694 static int uvc_ctrl_add_info(struct uvc_device *dev, struct uvc_control *ctrl,
1698 struct uvc_control *ctrl) in uvc_ctrl_init_xu_ctrl() argument
1703 if (ctrl->initialized) in uvc_ctrl_init_xu_ctrl()
1706 ret = uvc_ctrl_fill_xu_info(dev, ctrl, &info); in uvc_ctrl_init_xu_ctrl()
1710 ret = uvc_ctrl_add_info(dev, ctrl, &info); in uvc_ctrl_init_xu_ctrl()
1714 info.selector, dev->udev->devpath, ctrl->entity->id); in uvc_ctrl_init_xu_ctrl()
1723 struct uvc_control *ctrl; in uvc_xu_ctrl_query() local
1745 ctrl = &entity->controls[i]; in uvc_xu_ctrl_query()
1746 if (ctrl->index == xqry->selector - 1) { in uvc_xu_ctrl_query()
1761 ret = uvc_ctrl_init_xu_ctrl(chain->dev, ctrl); in uvc_xu_ctrl_query()
1769 size = ctrl->info.size; in uvc_xu_ctrl_query()
1806 if (reqflags && !(ctrl->info.flags & reqflags)) { in uvc_xu_ctrl_query()
1852 struct uvc_control *ctrl; in uvc_ctrl_restore_values() local
1861 ctrl = &entity->controls[i]; in uvc_ctrl_restore_values()
1863 if (!ctrl->initialized || !ctrl->modified || in uvc_ctrl_restore_values()
1864 (ctrl->info.flags & UVC_CTRL_FLAG_RESTORE) == 0) in uvc_ctrl_restore_values()
1868 ctrl->info.entity, ctrl->info.index, in uvc_ctrl_restore_values()
1869 ctrl->info.selector); in uvc_ctrl_restore_values()
1870 ctrl->dirty = 1; in uvc_ctrl_restore_values()
1888 static int uvc_ctrl_add_info(struct uvc_device *dev, struct uvc_control *ctrl, in uvc_ctrl_add_info() argument
1893 ctrl->info = *info; in uvc_ctrl_add_info()
1894 INIT_LIST_HEAD(&ctrl->info.mappings); in uvc_ctrl_add_info()
1897 ctrl->uvc_data = kzalloc(ctrl->info.size * UVC_CTRL_DATA_LAST + 1, in uvc_ctrl_add_info()
1899 if (ctrl->uvc_data == NULL) { in uvc_ctrl_add_info()
1904 ctrl->initialized = 1; in uvc_ctrl_add_info()
1907 "entity %u\n", ctrl->info.entity, ctrl->info.selector, in uvc_ctrl_add_info()
1908 dev->udev->devpath, ctrl->entity->id); in uvc_ctrl_add_info()
1912 kfree(ctrl->uvc_data); in uvc_ctrl_add_info()
1920 struct uvc_control *ctrl, const struct uvc_control_mapping *mapping) in __uvc_ctrl_add_mapping() argument
1947 list_add_tail(&map->list, &ctrl->info.mappings); in __uvc_ctrl_add_mapping()
1950 map->name, ctrl->info.entity, ctrl->info.selector); in __uvc_ctrl_add_mapping()
1961 struct uvc_control *ctrl; in uvc_ctrl_add_mapping() local
1981 ctrl = &entity->controls[i]; in uvc_ctrl_add_mapping()
1982 if (ctrl->index == mapping->selector - 1) { in uvc_ctrl_add_mapping()
1998 ret = uvc_ctrl_init_xu_ctrl(dev, ctrl); in uvc_ctrl_add_mapping()
2004 list_for_each_entry(map, &ctrl->info.mappings, list) { in uvc_ctrl_add_mapping()
2024 ret = __uvc_ctrl_add_mapping(dev, ctrl, mapping); in uvc_ctrl_add_mapping()
2099 static void uvc_ctrl_init_ctrl(struct uvc_device *dev, struct uvc_control *ctrl) in uvc_ctrl_init_ctrl() argument
2112 if (UVC_ENTITY_TYPE(ctrl->entity) == UVC_VC_EXTENSION_UNIT) in uvc_ctrl_init_ctrl()
2116 if (uvc_entity_match_guid(ctrl->entity, info->entity) && in uvc_ctrl_init_ctrl()
2117 ctrl->index == info->index) { in uvc_ctrl_init_ctrl()
2118 uvc_ctrl_add_info(dev, ctrl, info); in uvc_ctrl_init_ctrl()
2123 if (!ctrl->initialized) in uvc_ctrl_init_ctrl()
2127 if (uvc_entity_match_guid(ctrl->entity, mapping->entity) && in uvc_ctrl_init_ctrl()
2128 ctrl->info.selector == mapping->selector) in uvc_ctrl_init_ctrl()
2129 __uvc_ctrl_add_mapping(dev, ctrl, mapping); in uvc_ctrl_init_ctrl()
2143 struct uvc_control *ctrl; in uvc_ctrl_init_device() local
2166 entity->controls = kcalloc(ncontrols, sizeof(*ctrl), in uvc_ctrl_init_device()
2173 ctrl = entity->controls; in uvc_ctrl_init_device()
2178 ctrl->entity = entity; in uvc_ctrl_init_device()
2179 ctrl->index = i; in uvc_ctrl_init_device()
2181 uvc_ctrl_init_ctrl(dev, ctrl); in uvc_ctrl_init_device()
2182 ctrl++; in uvc_ctrl_init_device()
2193 struct uvc_control *ctrl) in uvc_ctrl_cleanup_mappings() argument
2197 list_for_each_entry_safe(mapping, nm, &ctrl->info.mappings, list) { in uvc_ctrl_cleanup_mappings()
2212 struct uvc_control *ctrl = &entity->controls[i]; in uvc_ctrl_cleanup_device() local
2214 if (!ctrl->initialized) in uvc_ctrl_cleanup_device()
2217 uvc_ctrl_cleanup_mappings(dev, ctrl); in uvc_ctrl_cleanup_device()
2218 kfree(ctrl->uvc_data); in uvc_ctrl_cleanup_device()