Lines Matching full:mapping

388 static bool uvc_ctrl_mapping_is_compound(struct uvc_control_mapping *mapping)  in uvc_ctrl_mapping_is_compound()  argument
390 return mapping->v4l2_type >= V4L2_CTRL_COMPOUND_TYPES; in uvc_ctrl_mapping_is_compound()
393 static s32 uvc_mapping_get_s32(struct uvc_control_mapping *mapping, in uvc_mapping_get_s32() argument
398 mapping->get(mapping, query, data_in, sizeof(data_out), &data_out); in uvc_mapping_get_s32()
403 static void uvc_mapping_set_s32(struct uvc_control_mapping *mapping, in uvc_mapping_set_s32() argument
406 mapping->set(mapping, sizeof(data_in), &data_in, data_out); in uvc_mapping_set_s32()
412 * device. The custom menu_mapping in the control @mapping is used when
423 static int uvc_mapping_get_menu_value(const struct uvc_control_mapping *mapping, in uvc_mapping_get_menu_value() argument
426 if (!test_bit(idx, &mapping->menu_mask)) in uvc_mapping_get_menu_value()
429 if (mapping->menu_mapping) in uvc_mapping_get_menu_value()
430 return mapping->menu_mapping[idx]; in uvc_mapping_get_menu_value()
436 uvc_mapping_get_menu_name(const struct uvc_control_mapping *mapping, u32 idx) in uvc_mapping_get_menu_name() argument
438 if (!test_bit(idx, &mapping->menu_mask)) in uvc_mapping_get_menu_name()
441 if (mapping->menu_names) in uvc_mapping_get_menu_name()
442 return mapping->menu_names[idx]; in uvc_mapping_get_menu_name()
444 return v4l2_ctrl_get_menu(mapping->id)[idx]; in uvc_mapping_get_menu_name()
447 static int uvc_ctrl_get_zoom(struct uvc_control_mapping *mapping, u8 query, in uvc_ctrl_get_zoom() argument
473 static int uvc_ctrl_set_zoom(struct uvc_control_mapping *mapping, in uvc_ctrl_set_zoom() argument
490 static int uvc_ctrl_get_rel_speed(struct uvc_control_mapping *mapping, in uvc_ctrl_get_rel_speed() argument
494 unsigned int first = mapping->offset / 8; in uvc_ctrl_get_rel_speed()
518 static int uvc_ctrl_set_rel_speed(struct uvc_control_mapping *mapping, in uvc_ctrl_set_rel_speed() argument
522 unsigned int first = mapping->offset / 8; in uvc_ctrl_set_rel_speed()
615 /* Restore initial value and add mapping. */ in uvc_ctrl_filter_plf_mapping()
624 static int uvc_get_rect(struct uvc_control_mapping *mapping, u8 query, in uvc_get_rect() argument
645 static int uvc_set_rect(struct uvc_control_mapping *mapping, size_t v4l2_size, in uvc_set_rect() argument
999 static s32 uvc_menu_to_v4l2_menu(struct uvc_control_mapping *mapping, s32 val) in uvc_menu_to_v4l2_menu() argument
1003 for (i = 0; BIT(i) <= mapping->menu_mask; ++i) { in uvc_menu_to_v4l2_menu()
1006 if (!test_bit(i, &mapping->menu_mask)) in uvc_menu_to_v4l2_menu()
1009 menu_value = uvc_mapping_get_menu_value(mapping, i); in uvc_menu_to_v4l2_menu()
1019 * Extract the bit string specified by mapping->offset and mapping->size
1021 * a signed 32bit integer. Sign extension will be performed if the mapping
1024 static int uvc_get_le_value(struct uvc_control_mapping *mapping, in uvc_get_le_value() argument
1028 int offset = mapping->offset; in uvc_get_le_value()
1029 int bits = mapping->size; in uvc_get_le_value()
1055 if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED) in uvc_get_le_value()
1056 value |= -(value & (1 << (mapping->size - 1))); in uvc_get_le_value()
1059 if (mapping->v4l2_type != V4L2_CTRL_TYPE_MENU) { in uvc_get_le_value()
1067 *out = uvc_menu_to_v4l2_menu(mapping, value); in uvc_get_le_value()
1076 * Set the bit string specified by mapping->offset and mapping->size
1079 static int uvc_set_le_value(struct uvc_control_mapping *mapping, in uvc_set_le_value() argument
1083 int offset = mapping->offset; in uvc_set_le_value()
1084 int bits = mapping->size; in uvc_set_le_value()
1094 switch (mapping->v4l2_type) { in uvc_set_le_value()
1096 value = uvc_mapping_get_menu_value(mapping, value); in uvc_set_le_value()
1140 struct uvc_control_mapping **mapping, struct uvc_control **control, in __uvc_find_control() argument
1158 *mapping = map; in __uvc_find_control()
1162 if ((*mapping == NULL || (*mapping)->id > map->id) && in __uvc_find_control()
1167 *mapping = map; in __uvc_find_control()
1174 u32 v4l2_id, struct uvc_control_mapping **mapping) in uvc_find_control() argument
1181 *mapping = NULL; in uvc_find_control()
1188 __uvc_find_control(entity, v4l2_id, mapping, &ctrl, next, in uvc_find_control()
1296 struct uvc_control_mapping *mapping, in __uvc_ctrl_get() argument
1308 *value = uvc_mapping_get_s32(mapping, UVC_GET_CUR, in __uvc_ctrl_get()
1360 struct uvc_control_mapping *mapping) in uvc_ctrl_is_readable() argument
1369 switch (mapping->v4l2_type) { in uvc_ctrl_is_readable()
1406 struct uvc_control_mapping *mapping; in uvc_ctrl_is_accessible() local
1415 ctrl = uvc_find_control(chain, v4l2_id, &mapping); in uvc_ctrl_is_accessible()
1420 return uvc_ctrl_is_readable(ctrls->which, ctrl, mapping); in uvc_ctrl_is_accessible()
1425 if (ioctl != VIDIOC_S_EXT_CTRLS || !mapping->master_id) in uvc_ctrl_is_accessible()
1433 if (ctrls->controls[i].id == mapping->master_id) in uvc_ctrl_is_accessible()
1435 mapping->master_manual ? 0 : -EACCES; in uvc_ctrl_is_accessible()
1438 __uvc_find_control(ctrl->entity, mapping->master_id, &master_map, in uvc_ctrl_is_accessible()
1447 if (ret >= 0 && val != mapping->master_manual) in uvc_ctrl_is_accessible()
1468 struct uvc_control_mapping *mapping) in uvc_get_ctrl_bitmap() argument
1476 return uvc_mapping_get_s32(mapping, UVC_GET_RES, in uvc_get_ctrl_bitmap()
1480 return uvc_mapping_get_s32(mapping, UVC_GET_MAX, in uvc_get_ctrl_bitmap()
1488 struct uvc_control_mapping *mapping, in __uvc_queryctrl_boundaries() argument
1498 v4l2_ctrl->default_value = uvc_mapping_get_s32(mapping, in __uvc_queryctrl_boundaries()
1502 switch (mapping->v4l2_type) { in __uvc_queryctrl_boundaries()
1504 v4l2_ctrl->minimum = ffs(mapping->menu_mask) - 1; in __uvc_queryctrl_boundaries()
1505 v4l2_ctrl->maximum = fls(mapping->menu_mask) - 1; in __uvc_queryctrl_boundaries()
1523 v4l2_ctrl->maximum = uvc_get_ctrl_bitmap(ctrl, mapping); in __uvc_queryctrl_boundaries()
1532 v4l2_ctrl->minimum = uvc_mapping_get_s32(mapping, UVC_GET_MIN, in __uvc_queryctrl_boundaries()
1538 v4l2_ctrl->maximum = uvc_mapping_get_s32(mapping, UVC_GET_MAX, in __uvc_queryctrl_boundaries()
1544 v4l2_ctrl->step = uvc_mapping_get_s32(mapping, UVC_GET_RES, in __uvc_queryctrl_boundaries()
1552 static size_t uvc_mapping_v4l2_size(struct uvc_control_mapping *mapping) in uvc_mapping_v4l2_size() argument
1554 if (mapping->v4l2_type == V4L2_CTRL_TYPE_RECT) in uvc_mapping_v4l2_size()
1557 if (uvc_ctrl_mapping_is_compound(mapping)) in uvc_mapping_v4l2_size()
1558 return DIV_ROUND_UP(mapping->size, 8); in uvc_mapping_v4l2_size()
1565 struct uvc_control_mapping *mapping, in __uvc_query_v4l2_ctrl() argument
1572 v4l2_ctrl->id = mapping->id; in __uvc_query_v4l2_ctrl()
1573 v4l2_ctrl->type = mapping->v4l2_type; in __uvc_query_v4l2_ctrl()
1574 strscpy(v4l2_ctrl->name, uvc_map_get_name(mapping), in __uvc_query_v4l2_ctrl()
1586 if (mapping->master_id) in __uvc_query_v4l2_ctrl()
1587 __uvc_find_control(ctrl->entity, mapping->master_id, in __uvc_query_v4l2_ctrl()
1600 if (val != mapping->master_manual) in __uvc_query_v4l2_ctrl()
1604 v4l2_ctrl->elem_size = uvc_mapping_v4l2_size(mapping); in __uvc_query_v4l2_ctrl()
1616 return __uvc_queryctrl_boundaries(chain, ctrl, mapping, v4l2_ctrl); in __uvc_query_v4l2_ctrl()
1623 struct uvc_control_mapping *mapping; in uvc_query_v4l2_ctrl() local
1637 ctrl = uvc_find_control(chain, v4l2_ctrl->id, &mapping); in uvc_query_v4l2_ctrl()
1649 ret = uvc_query_v4l2_class(chain, v4l2_ctrl->id, mapping->id, in uvc_query_v4l2_ctrl()
1655 ret = __uvc_query_v4l2_ctrl(chain, ctrl, mapping, v4l2_ctrl); in uvc_query_v4l2_ctrl()
1662 * Mapping V4L2 controls to UVC controls can be straightforward if done well.
1673 struct uvc_control_mapping *mapping; in uvc_query_v4l2_menu() local
1684 if (index >= BITS_PER_TYPE(mapping->menu_mask)) in uvc_query_v4l2_menu()
1691 ctrl = uvc_find_control(chain, query_menu->id, &mapping); in uvc_query_v4l2_menu()
1692 if (ctrl == NULL || mapping->v4l2_type != V4L2_CTRL_TYPE_MENU) { in uvc_query_v4l2_menu()
1697 if (!test_bit(query_menu->index, &mapping->menu_mask)) { in uvc_query_v4l2_menu()
1702 if (mapping->data_type == UVC_CTRL_DATA_TYPE_BITMASK) { in uvc_query_v4l2_menu()
1711 mask = uvc_mapping_get_menu_value(mapping, query_menu->index); in uvc_query_v4l2_menu()
1717 if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & mask)) { in uvc_query_v4l2_menu()
1723 name = uvc_mapping_get_menu_name(mapping, query_menu->index); in uvc_query_v4l2_menu()
1743 struct uvc_control_mapping *mapping, in uvc_ctrl_fill_event() argument
1748 __uvc_query_v4l2_ctrl(chain, ctrl, mapping, &v4l2_ctrl); in uvc_ctrl_fill_event()
1772 struct uvc_control_mapping *mapping, s32 value, u32 changes) in uvc_ctrl_send_event() argument
1778 if (list_empty(&mapping->ev_subs)) in uvc_ctrl_send_event()
1781 uvc_ctrl_fill_event(chain, &ev, ctrl, mapping, value, changes); in uvc_ctrl_send_event()
1783 list_for_each_entry(sev, &mapping->ev_subs, node) { in uvc_ctrl_send_event()
1799 struct uvc_control_mapping *mapping = NULL; in uvc_ctrl_send_slave_event() local
1804 __uvc_find_control(master->entity, slave_id, &mapping, &ctrl, 0, 0); in uvc_ctrl_send_slave_event()
1808 if (uvc_ctrl_mapping_is_compound(mapping) || in uvc_ctrl_send_slave_event()
1809 __uvc_ctrl_get(chain, ctrl, mapping, &val) == 0) in uvc_ctrl_send_slave_event()
1812 uvc_ctrl_send_event(chain, handle, ctrl, mapping, val, changes); in uvc_ctrl_send_slave_event()
1852 struct uvc_control_mapping *mapping; in uvc_ctrl_status_event() local
1865 list_for_each_entry(mapping, &ctrl->info.mappings, list) { in uvc_ctrl_status_event()
1868 if (uvc_ctrl_mapping_is_compound(mapping)) in uvc_ctrl_status_event()
1871 value = uvc_mapping_get_s32(mapping, UVC_GET_CUR, data); in uvc_ctrl_status_event()
1877 for (i = 0; i < ARRAY_SIZE(mapping->slave_ids); ++i) { in uvc_ctrl_status_event()
1878 if (!mapping->slave_ids[i]) in uvc_ctrl_status_event()
1882 mapping->slave_ids[i]); in uvc_ctrl_status_event()
1885 uvc_ctrl_send_event(chain, handle, ctrl, mapping, value, in uvc_ctrl_status_event()
1948 struct uvc_control_mapping *mapping; in uvc_ctrl_send_events() local
1957 ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping); in uvc_ctrl_send_events()
1962 for (j = 0; j < ARRAY_SIZE(mapping->slave_ids); ++j) { in uvc_ctrl_send_events()
1963 u32 slave_id = mapping->slave_ids[j]; in uvc_ctrl_send_events()
1980 if (uvc_ctrl_mapping_is_compound(mapping)) in uvc_ctrl_send_events()
1988 if (mapping->master_id && in uvc_ctrl_send_events()
1990 mapping->master_id)) in uvc_ctrl_send_events()
1993 uvc_ctrl_send_event(handle->chain, handle, ctrl, mapping, in uvc_ctrl_send_events()
2001 struct uvc_control_mapping *mapping; in uvc_ctrl_add_event() local
2014 ctrl = uvc_find_control(handle->chain, sev->id, &mapping); in uvc_ctrl_add_event()
2020 list_add_tail(&sev->node, &mapping->ev_subs); in uvc_ctrl_add_event()
2026 if (uvc_ctrl_mapping_is_compound(mapping) || in uvc_ctrl_add_event()
2027 __uvc_ctrl_get(handle->chain, ctrl, mapping, &val) == 0) in uvc_ctrl_add_event()
2030 uvc_ctrl_fill_event(handle->chain, &ev, ctrl, mapping, val, in uvc_ctrl_add_event()
2158 struct uvc_control_mapping *mapping = NULL; in uvc_ctrl_find_ctrl_idx() local
2166 __uvc_find_control(entity, ctrls->controls[i].id, &mapping, in uvc_ctrl_find_ctrl_idx()
2205 struct uvc_control_mapping *mapping, in uvc_mapping_get_xctrl_compound() argument
2236 size = uvc_mapping_v4l2_size(mapping); in uvc_mapping_get_xctrl_compound()
2254 ret = mapping->get(mapping, query, uvc_ctrl_data(ctrl, id), size, data); in uvc_mapping_get_xctrl_compound()
2268 struct uvc_control_mapping *mapping, in uvc_mapping_get_xctrl_std() argument
2276 return __uvc_ctrl_get(chain, ctrl, mapping, &xctrl->value); in uvc_mapping_get_xctrl_std()
2285 ret = __uvc_queryctrl_boundaries(chain, ctrl, mapping, &qec); in uvc_mapping_get_xctrl_std()
2306 struct uvc_control_mapping *mapping, in uvc_mapping_get_xctrl() argument
2309 if (uvc_ctrl_mapping_is_compound(mapping)) in uvc_mapping_get_xctrl()
2310 return uvc_mapping_get_xctrl_compound(chain, ctrl, mapping, in uvc_mapping_get_xctrl()
2312 return uvc_mapping_get_xctrl_std(chain, ctrl, mapping, which, xctrl); in uvc_mapping_get_xctrl()
2319 struct uvc_control_mapping *mapping; in uvc_ctrl_get() local
2324 ctrl = uvc_find_control(chain, xctrl->id, &mapping); in uvc_ctrl_get()
2328 return uvc_mapping_get_xctrl(chain, ctrl, mapping, which, xctrl); in uvc_ctrl_get()
2333 struct uvc_control_mapping *mapping, in uvc_ctrl_clamp() argument
2342 switch (mapping->v4l2_type) { in uvc_ctrl_clamp()
2350 min = uvc_mapping_get_s32(mapping, UVC_GET_MIN, in uvc_ctrl_clamp()
2352 max = uvc_mapping_get_s32(mapping, UVC_GET_MAX, in uvc_ctrl_clamp()
2354 step = uvc_mapping_get_s32(mapping, UVC_GET_RES, in uvc_ctrl_clamp()
2360 if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED) in uvc_ctrl_clamp()
2374 value &= uvc_get_ctrl_bitmap(ctrl, mapping); in uvc_ctrl_clamp()
2383 if (value < (ffs(mapping->menu_mask) - 1) || in uvc_ctrl_clamp()
2384 value > (fls(mapping->menu_mask) - 1)) in uvc_ctrl_clamp()
2387 if (!test_bit(value, &mapping->menu_mask)) in uvc_ctrl_clamp()
2394 if (mapping->data_type == UVC_CTRL_DATA_TYPE_BITMASK) { in uvc_ctrl_clamp()
2395 int val = uvc_mapping_get_menu_value(mapping, value); in uvc_ctrl_clamp()
2402 if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & val)) in uvc_ctrl_clamp()
2415 struct uvc_control_mapping *mapping, in uvc_mapping_set_xctrl_compound() argument
2419 size_t size = uvc_mapping_v4l2_size(mapping); in uvc_mapping_set_xctrl_compound()
2433 return mapping->set(mapping, size, data, in uvc_mapping_set_xctrl_compound()
2438 struct uvc_control_mapping *mapping, in uvc_mapping_set_xctrl() argument
2441 if (uvc_ctrl_mapping_is_compound(mapping)) in uvc_mapping_set_xctrl()
2442 return uvc_mapping_set_xctrl_compound(ctrl, mapping, xctrl); in uvc_mapping_set_xctrl()
2444 uvc_mapping_set_s32(mapping, xctrl->value, in uvc_mapping_set_xctrl()
2452 struct uvc_control_mapping *mapping; in uvc_ctrl_set() local
2461 ctrl = uvc_find_control(chain, xctrl->id, &mapping); in uvc_ctrl_set()
2467 ret = uvc_ctrl_clamp(chain, ctrl, mapping, &xctrl->value); in uvc_ctrl_set()
2471 * If the mapping doesn't span the whole UVC control, the current value in uvc_ctrl_set()
2475 if ((ctrl->info.size * 8) != mapping->size) { in uvc_ctrl_set()
2488 ret = uvc_mapping_set_xctrl(ctrl, mapping, xctrl); in uvc_ctrl_set()
2829 * Control and mapping handling
2857 * Add a control mapping to a given control.
2860 struct uvc_control *ctrl, const struct uvc_control_mapping *mapping) in __uvc_ctrl_add_mapping() argument
2872 map = kmemdup(mapping, sizeof(*mapping), GFP_KERNEL); in __uvc_ctrl_add_mapping()
2881 if (mapping->name) { in __uvc_ctrl_add_mapping()
2882 map->name = kstrdup(mapping->name, GFP_KERNEL); in __uvc_ctrl_add_mapping()
2889 if (mapping->menu_mapping && mapping->menu_mask) { in __uvc_ctrl_add_mapping()
2890 size = sizeof(mapping->menu_mapping[0]) in __uvc_ctrl_add_mapping()
2891 * fls(mapping->menu_mask); in __uvc_ctrl_add_mapping()
2892 map->menu_mapping = kmemdup(mapping->menu_mapping, size, in __uvc_ctrl_add_mapping()
2897 if (mapping->menu_names && mapping->menu_mask) { in __uvc_ctrl_add_mapping()
2898 size = sizeof(mapping->menu_names[0]) in __uvc_ctrl_add_mapping()
2899 * fls(mapping->menu_mask); in __uvc_ctrl_add_mapping()
2900 map->menu_names = kmemdup(mapping->menu_names, size, in __uvc_ctrl_add_mapping()
2926 uvc_dbg(chain->dev, CONTROL, "Adding mapping '%s' to control %pUl/%u\n", in __uvc_ctrl_add_mapping()
2943 const struct uvc_control_mapping *mapping) in uvc_ctrl_add_mapping() argument
2952 if (mapping->id & ~V4L2_CTRL_ID_MASK) { in uvc_ctrl_add_mapping()
2954 "Can't add mapping '%s', control id 0x%08x is invalid\n", in uvc_ctrl_add_mapping()
2955 uvc_map_get_name(mapping), mapping->id); in uvc_ctrl_add_mapping()
2964 !uvc_entity_match_guid(entity, mapping->entity)) in uvc_ctrl_add_mapping()
2969 if (ctrl->index == mapping->selector - 1) { in uvc_ctrl_add_mapping()
2992 if (mapping->size > 32 || in uvc_ctrl_add_mapping()
2993 mapping->offset + mapping->size > ctrl->info.size * 8) { in uvc_ctrl_add_mapping()
2999 if (mapping->id == map->id) { in uvc_ctrl_add_mapping()
3001 "Can't add mapping '%s', control id 0x%08x already exists\n", in uvc_ctrl_add_mapping()
3002 uvc_map_get_name(mapping), mapping->id); in uvc_ctrl_add_mapping()
3012 "Can't add mapping '%s', maximum mappings count (%u) exceeded\n", in uvc_ctrl_add_mapping()
3013 uvc_map_get_name(mapping), UVC_MAX_CONTROL_MAPPINGS); in uvc_ctrl_add_mapping()
3018 ret = __uvc_ctrl_add_mapping(chain, ctrl, mapping); in uvc_ctrl_add_mapping()
3130 const struct uvc_control_mapping *mapping = &uvc_ctrl_mappings[i]; in uvc_ctrl_init_ctrl() local
3132 if (!uvc_entity_match_guid(ctrl->entity, mapping->entity) || in uvc_ctrl_init_ctrl()
3133 ctrl->info.selector != mapping->selector) in uvc_ctrl_init_ctrl()
3136 /* Let the device provide a custom mapping. */ in uvc_ctrl_init_ctrl()
3137 if (mapping->filter_mapping) { in uvc_ctrl_init_ctrl()
3138 mapping = mapping->filter_mapping(chain, ctrl); in uvc_ctrl_init_ctrl()
3139 if (!mapping) in uvc_ctrl_init_ctrl()
3143 __uvc_ctrl_add_mapping(chain, ctrl, mapping); in uvc_ctrl_init_ctrl()
3248 struct uvc_control_mapping *mapping, *nm; in uvc_ctrl_cleanup_mappings() local
3250 list_for_each_entry_safe(mapping, nm, &ctrl->info.mappings, list) { in uvc_ctrl_cleanup_mappings()
3251 list_del(&mapping->list); in uvc_ctrl_cleanup_mappings()
3252 kfree(mapping->menu_names); in uvc_ctrl_cleanup_mappings()
3253 kfree(mapping->menu_mapping); in uvc_ctrl_cleanup_mappings()
3254 kfree(mapping->name); in uvc_ctrl_cleanup_mappings()
3255 kfree(mapping); in uvc_ctrl_cleanup_mappings()