Lines Matching full:ctrl
41 struct v4l2_ctrl *ctrl, in ptr_to_user() argument
46 if (ctrl->is_ptr && !ctrl->is_string) in ptr_to_user()
50 switch (ctrl->type) { in ptr_to_user()
54 c->size = ctrl->elem_size; in ptr_to_user()
70 static int cur_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) in cur_to_user() argument
72 return ptr_to_user(c, ctrl, ctrl->p_cur); in cur_to_user()
77 struct v4l2_ctrl *ctrl) in new_to_user() argument
79 return ptr_to_user(c, ctrl, ctrl->p_new); in new_to_user()
86 return ptr_to_user(c, ref->ctrl, ref->p_req); in req_to_user()
90 static int def_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) in def_to_user() argument
92 ctrl->type_ops->init(ctrl, 0, ctrl->p_new); in def_to_user()
94 return ptr_to_user(c, ctrl, ctrl->p_new); in def_to_user()
98 static int min_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) in min_to_user() argument
100 ctrl->type_ops->minimum(ctrl, 0, ctrl->p_new); in min_to_user()
102 return ptr_to_user(c, ctrl, ctrl->p_new); in min_to_user()
106 static int max_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) in max_to_user() argument
108 ctrl->type_ops->maximum(ctrl, 0, ctrl->p_new); in max_to_user()
110 return ptr_to_user(c, ctrl, ctrl->p_new); in max_to_user()
114 static int user_to_new(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl) in user_to_new() argument
119 ctrl->is_new = 0; in user_to_new()
120 if (ctrl->is_dyn_array && in user_to_new()
121 c->size > ctrl->p_array_alloc_elems * ctrl->elem_size) { in user_to_new()
122 void *old = ctrl->p_array; in user_to_new()
127 memcpy(tmp, ctrl->p_new.p, ctrl->elems * ctrl->elem_size); in user_to_new()
128 memcpy(tmp + c->size, ctrl->p_cur.p, ctrl->elems * ctrl->elem_size); in user_to_new()
129 ctrl->p_new.p = tmp; in user_to_new()
130 ctrl->p_cur.p = tmp + c->size; in user_to_new()
131 ctrl->p_array = tmp; in user_to_new()
132 ctrl->p_array_alloc_elems = c->size / ctrl->elem_size; in user_to_new()
136 if (ctrl->is_ptr && !ctrl->is_string) { in user_to_new()
137 unsigned int elems = c->size / ctrl->elem_size; in user_to_new()
139 if (copy_from_user(ctrl->p_new.p, c->ptr, c->size)) in user_to_new()
141 ctrl->is_new = 1; in user_to_new()
142 if (ctrl->is_dyn_array) in user_to_new()
143 ctrl->new_elems = elems; in user_to_new()
144 else if (ctrl->is_array) in user_to_new()
145 ctrl->type_ops->init(ctrl, elems, ctrl->p_new); in user_to_new()
149 switch (ctrl->type) { in user_to_new()
151 *ctrl->p_new.p_s64 = c->value64; in user_to_new()
157 if (size > ctrl->maximum + 1) in user_to_new()
158 size = ctrl->maximum + 1; in user_to_new()
159 ret = copy_from_user(ctrl->p_new.p_char, c->string, size) ? -EFAULT : 0; in user_to_new()
161 char last = ctrl->p_new.p_char[size - 1]; in user_to_new()
163 ctrl->p_new.p_char[size - 1] = 0; in user_to_new()
165 * If the string was longer than ctrl->maximum, in user_to_new()
168 if (strlen(ctrl->p_new.p_char) == ctrl->maximum && last) in user_to_new()
170 ctrl->is_new = 1; in user_to_new()
174 *ctrl->p_new.p_s32 = c->value; in user_to_new()
177 ctrl->is_new = 1; in user_to_new()
242 struct v4l2_ctrl *ctrl; in prepare_ext_ctrls() local
272 ctrl = ref->ctrl; in prepare_ext_ctrls()
273 if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED) { in prepare_ext_ctrls()
278 if (!(ctrl->flags & V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX) && in prepare_ext_ctrls()
287 if (ctrl->cluster[0]->ncontrols > 1) in prepare_ext_ctrls()
289 if (ctrl->cluster[0] != ctrl) in prepare_ext_ctrls()
290 ref = find_ref_lock(hdl, ctrl->cluster[0]->id); in prepare_ext_ctrls()
291 if (ctrl->is_dyn_array) { in prepare_ext_ctrls()
292 unsigned int max_size = ctrl->dims[0] * ctrl->elem_size; in prepare_ext_ctrls()
293 unsigned int tot_size = ctrl->elem_size; in prepare_ext_ctrls()
298 tot_size *= ctrl->elems; in prepare_ext_ctrls()
300 c->size = ctrl->elem_size * (c->size / ctrl->elem_size); in prepare_ext_ctrls()
315 } else if (ctrl->is_ptr && !ctrl->is_string) { in prepare_ext_ctrls()
316 unsigned int tot_size = ctrl->elems * ctrl->elem_size; in prepare_ext_ctrls()
444 if (helpers[i].ref->ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY) in v4l2_g_ext_ctrls_common()
455 master = helpers[i].mref->ctrl; in v4l2_g_ext_ctrls_common()
493 ret = def_to_user(cs->controls + idx, ref->ctrl); in v4l2_g_ext_ctrls_common()
499 ret = min_to_user(cs->controls + idx, ref->ctrl); in v4l2_g_ext_ctrls_common()
501 ret = max_to_user(cs->controls + idx, ref->ctrl); in v4l2_g_ext_ctrls_common()
503 ret = new_to_user(cs->controls + idx, ref->ctrl); in v4l2_g_ext_ctrls_common()
505 ret = cur_to_user(cs->controls + idx, ref->ctrl); in v4l2_g_ext_ctrls_common()
528 static int validate_new(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr p_new) in validate_new() argument
530 return ctrl->type_ops->validate(ctrl, p_new); in validate_new()
544 struct v4l2_ctrl *ctrl = helpers[i].ref->ctrl; in validate_ctrls() local
549 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) { in validate_ctrls()
552 ctrl->id); in validate_ctrls()
563 if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)) { in validate_ctrls()
566 ctrl->id); in validate_ctrls()
573 if (ctrl->is_ptr) in validate_ctrls()
575 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64) in validate_ctrls()
579 ret = validate_new(ctrl, p_new); in validate_ctrls()
638 master = helpers[i].mref->ctrl; in try_set_ext_ctrls_common()
665 if (helpers[tmp_idx].ref->ctrl == master) in try_set_ext_ctrls_common()
682 struct v4l2_ctrl *ctrl = helpers[idx].ref->ctrl; in try_set_ext_ctrls_common() local
684 ret = user_to_new(cs->controls + idx, ctrl); in try_set_ext_ctrls_common()
685 if (!ret && ctrl->is_ptr) { in try_set_ext_ctrls_common()
686 ret = validate_new(ctrl, ctrl->p_new); in try_set_ext_ctrls_common()
690 v4l2_ctrl_get_name(ctrl->id), ret); in try_set_ext_ctrls_common()
712 helpers[idx].ref->ctrl); in try_set_ext_ctrls_common()
768 static int get_ctrl(struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c) in get_ctrl() argument
770 struct v4l2_ctrl *master = ctrl->cluster[0]; in get_ctrl()
778 if (!ctrl->is_int && ctrl->type != V4L2_CTRL_TYPE_INTEGER64) in get_ctrl()
781 if (ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY) in get_ctrl()
786 if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) { in get_ctrl()
791 ret = new_to_user(c, ctrl); in get_ctrl()
793 ret = cur_to_user(c, ctrl); in get_ctrl()
801 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id); in v4l2_g_ctrl() local
805 if (!ctrl || !ctrl->is_int) in v4l2_g_ctrl()
807 ret = get_ctrl(ctrl, &c); in v4l2_g_ctrl()
817 static int set_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags) in set_ctrl() argument
819 struct v4l2_ctrl *master = ctrl->cluster[0]; in set_ctrl()
828 ret = validate_new(ctrl, ctrl->p_new); in set_ctrl()
837 if (master->is_auto && master->has_volatiles && ctrl == master && in set_ctrl()
838 !is_cur_manual(master) && ctrl->val == master->manual_mode_value) in set_ctrl()
841 ctrl->is_new = 1; in set_ctrl()
846 static int set_ctrl_lock(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, in set_ctrl_lock() argument
851 v4l2_ctrl_lock(ctrl); in set_ctrl_lock()
852 ret = user_to_new(c, ctrl); in set_ctrl_lock()
854 ret = set_ctrl(fh, ctrl, 0); in set_ctrl_lock()
856 ret = cur_to_user(c, ctrl); in set_ctrl_lock()
857 v4l2_ctrl_unlock(ctrl); in set_ctrl_lock()
864 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id); in v4l2_s_ctrl() local
868 if (!ctrl || !ctrl->is_int) in v4l2_s_ctrl()
871 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) in v4l2_s_ctrl()
875 ret = set_ctrl_lock(fh, ctrl, &c); in v4l2_s_ctrl()
885 s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl) in v4l2_ctrl_g_ctrl() argument
890 if (WARN_ON(!ctrl->is_int)) in v4l2_ctrl_g_ctrl()
893 get_ctrl(ctrl, &c); in v4l2_ctrl_g_ctrl()
898 s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl) in v4l2_ctrl_g_ctrl_int64() argument
903 if (WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64)) in v4l2_ctrl_g_ctrl_int64()
906 get_ctrl(ctrl, &c); in v4l2_ctrl_g_ctrl_int64()
911 int __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val) in __v4l2_ctrl_s_ctrl() argument
913 lockdep_assert_held(ctrl->handler->lock); in __v4l2_ctrl_s_ctrl()
916 if (WARN_ON(!ctrl->is_int)) in __v4l2_ctrl_s_ctrl()
918 ctrl->val = val; in __v4l2_ctrl_s_ctrl()
919 return set_ctrl(NULL, ctrl, 0); in __v4l2_ctrl_s_ctrl()
923 int __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val) in __v4l2_ctrl_s_ctrl_int64() argument
925 lockdep_assert_held(ctrl->handler->lock); in __v4l2_ctrl_s_ctrl_int64()
928 if (WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64)) in __v4l2_ctrl_s_ctrl_int64()
930 *ctrl->p_new.p_s64 = val; in __v4l2_ctrl_s_ctrl_int64()
931 return set_ctrl(NULL, ctrl, 0); in __v4l2_ctrl_s_ctrl_int64()
935 int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s) in __v4l2_ctrl_s_ctrl_string() argument
937 lockdep_assert_held(ctrl->handler->lock); in __v4l2_ctrl_s_ctrl_string()
940 if (WARN_ON(ctrl->type != V4L2_CTRL_TYPE_STRING)) in __v4l2_ctrl_s_ctrl_string()
942 strscpy(ctrl->p_new.p_char, s, ctrl->maximum + 1); in __v4l2_ctrl_s_ctrl_string()
943 return set_ctrl(NULL, ctrl, 0); in __v4l2_ctrl_s_ctrl_string()
947 int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl, in __v4l2_ctrl_s_ctrl_compound() argument
950 lockdep_assert_held(ctrl->handler->lock); in __v4l2_ctrl_s_ctrl_compound()
953 if (WARN_ON(ctrl->type != type)) in __v4l2_ctrl_s_ctrl_compound()
956 if (WARN_ON(ctrl->is_dyn_array)) in __v4l2_ctrl_s_ctrl_compound()
958 memcpy(ctrl->p_new.p, p, ctrl->elems * ctrl->elem_size); in __v4l2_ctrl_s_ctrl_compound()
959 return set_ctrl(NULL, ctrl, 0); in __v4l2_ctrl_s_ctrl_compound()
966 int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, in __v4l2_ctrl_modify_range() argument
973 lockdep_assert_held(ctrl->handler->lock); in __v4l2_ctrl_modify_range()
975 switch (ctrl->type) { in __v4l2_ctrl_modify_range()
985 if (ctrl->is_array) in __v4l2_ctrl_modify_range()
987 ret = check_range(ctrl->type, min, max, step, def); in __v4l2_ctrl_modify_range()
994 if (ctrl->minimum != min || ctrl->maximum != max || in __v4l2_ctrl_modify_range()
995 ctrl->step != step || ctrl->default_value != def) { in __v4l2_ctrl_modify_range()
997 ctrl->minimum = min; in __v4l2_ctrl_modify_range()
998 ctrl->maximum = max; in __v4l2_ctrl_modify_range()
999 ctrl->step = step; in __v4l2_ctrl_modify_range()
1000 ctrl->default_value = def; in __v4l2_ctrl_modify_range()
1002 cur_to_new(ctrl); in __v4l2_ctrl_modify_range()
1003 if (validate_new(ctrl, ctrl->p_new)) { in __v4l2_ctrl_modify_range()
1004 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64) in __v4l2_ctrl_modify_range()
1005 *ctrl->p_new.p_s64 = def; in __v4l2_ctrl_modify_range()
1007 *ctrl->p_new.p_s32 = def; in __v4l2_ctrl_modify_range()
1010 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64) in __v4l2_ctrl_modify_range()
1011 value_changed = *ctrl->p_new.p_s64 != *ctrl->p_cur.p_s64; in __v4l2_ctrl_modify_range()
1013 value_changed = *ctrl->p_new.p_s32 != *ctrl->p_cur.p_s32; in __v4l2_ctrl_modify_range()
1015 ret = set_ctrl(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE); in __v4l2_ctrl_modify_range()
1017 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE); in __v4l2_ctrl_modify_range()
1022 int __v4l2_ctrl_modify_dimensions(struct v4l2_ctrl *ctrl, in __v4l2_ctrl_modify_dimensions() argument
1029 lockdep_assert_held(ctrl->handler->lock); in __v4l2_ctrl_modify_dimensions()
1031 if (!ctrl->is_array || ctrl->is_dyn_array) in __v4l2_ctrl_modify_dimensions()
1034 for (i = 0; i < ctrl->nr_of_dims; i++) in __v4l2_ctrl_modify_dimensions()
1038 p_array = kvzalloc(2 * elems * ctrl->elem_size, GFP_KERNEL); in __v4l2_ctrl_modify_dimensions()
1041 kvfree(ctrl->p_array); in __v4l2_ctrl_modify_dimensions()
1042 ctrl->p_array_alloc_elems = elems; in __v4l2_ctrl_modify_dimensions()
1043 ctrl->elems = elems; in __v4l2_ctrl_modify_dimensions()
1044 ctrl->new_elems = elems; in __v4l2_ctrl_modify_dimensions()
1045 ctrl->p_array = p_array; in __v4l2_ctrl_modify_dimensions()
1046 ctrl->p_new.p = p_array; in __v4l2_ctrl_modify_dimensions()
1047 ctrl->p_cur.p = p_array + elems * ctrl->elem_size; in __v4l2_ctrl_modify_dimensions()
1048 for (i = 0; i < ctrl->nr_of_dims; i++) in __v4l2_ctrl_modify_dimensions()
1049 ctrl->dims[i] = dims[i]; in __v4l2_ctrl_modify_dimensions()
1050 ctrl->type_ops->init(ctrl, 0, ctrl->p_cur); in __v4l2_ctrl_modify_dimensions()
1051 cur_to_new(ctrl); in __v4l2_ctrl_modify_dimensions()
1052 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_VALUE | in __v4l2_ctrl_modify_dimensions()
1064 struct v4l2_ctrl *ctrl; in v4l2_query_ext_ctrl() local
1102 is_compound = pos->ctrl->is_array || in v4l2_query_ext_ctrl()
1103 pos->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES; in v4l2_query_ext_ctrl()
1104 if (id < pos->ctrl->id && in v4l2_query_ext_ctrl()
1120 is_compound = pos->ctrl->is_array || in v4l2_query_ext_ctrl()
1121 pos->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES; in v4l2_query_ext_ctrl()
1122 if (id < pos->ctrl->id && in v4l2_query_ext_ctrl()
1135 ctrl = ref->ctrl; in v4l2_query_ext_ctrl()
1140 qc->id = ctrl->id; in v4l2_query_ext_ctrl()
1141 strscpy(qc->name, ctrl->name, sizeof(qc->name)); in v4l2_query_ext_ctrl()
1142 qc->flags = user_flags(ctrl); in v4l2_query_ext_ctrl()
1143 qc->type = ctrl->type; in v4l2_query_ext_ctrl()
1144 qc->elem_size = ctrl->elem_size; in v4l2_query_ext_ctrl()
1145 qc->elems = ctrl->elems; in v4l2_query_ext_ctrl()
1146 qc->nr_of_dims = ctrl->nr_of_dims; in v4l2_query_ext_ctrl()
1147 memcpy(qc->dims, ctrl->dims, qc->nr_of_dims * sizeof(qc->dims[0])); in v4l2_query_ext_ctrl()
1148 qc->minimum = ctrl->minimum; in v4l2_query_ext_ctrl()
1149 qc->maximum = ctrl->maximum; in v4l2_query_ext_ctrl()
1150 qc->default_value = ctrl->default_value; in v4l2_query_ext_ctrl()
1151 if (ctrl->type == V4L2_CTRL_TYPE_MENU || in v4l2_query_ext_ctrl()
1152 ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU) in v4l2_query_ext_ctrl()
1155 qc->step = ctrl->step; in v4l2_query_ext_ctrl()
1209 struct v4l2_ctrl *ctrl; in v4l2_querymenu() local
1212 ctrl = v4l2_ctrl_find(hdl, qm->id); in v4l2_querymenu()
1213 if (!ctrl) in v4l2_querymenu()
1218 switch (ctrl->type) { in v4l2_querymenu()
1220 if (!ctrl->qmenu) in v4l2_querymenu()
1224 if (!ctrl->qmenu_int) in v4l2_querymenu()
1231 if (i < ctrl->minimum || i > ctrl->maximum) in v4l2_querymenu()
1235 if (i < BITS_PER_LONG_LONG && (ctrl->menu_skip_mask & BIT_ULL(i))) in v4l2_querymenu()
1238 if (ctrl->type == V4L2_CTRL_TYPE_MENU) { in v4l2_querymenu()
1239 if (!ctrl->qmenu[i] || ctrl->qmenu[i][0] == '\0') in v4l2_querymenu()
1241 strscpy(qm->name, ctrl->qmenu[i], sizeof(qm->name)); in v4l2_querymenu()
1243 qm->value = ctrl->qmenu_int[i]; in v4l2_querymenu()
1279 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id); in v4l2_ctrl_add_event() local
1281 if (!ctrl) in v4l2_ctrl_add_event()
1284 v4l2_ctrl_lock(ctrl); in v4l2_ctrl_add_event()
1285 list_add_tail(&sev->node, &ctrl->ev_subs); in v4l2_ctrl_add_event()
1286 if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS && in v4l2_ctrl_add_event()
1288 send_initial_event(sev->fh, ctrl); in v4l2_ctrl_add_event()
1289 v4l2_ctrl_unlock(ctrl); in v4l2_ctrl_add_event()
1295 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id); in v4l2_ctrl_del_event() local
1297 if (!ctrl) in v4l2_ctrl_del_event()
1300 v4l2_ctrl_lock(ctrl); in v4l2_ctrl_del_event()
1302 v4l2_ctrl_unlock(ctrl); in v4l2_ctrl_del_event()
1307 u32 old_changes = old->u.ctrl.changes; in v4l2_ctrl_replace()
1309 old->u.ctrl = new->u.ctrl; in v4l2_ctrl_replace()
1310 old->u.ctrl.changes |= old_changes; in v4l2_ctrl_replace()
1316 new->u.ctrl.changes |= old->u.ctrl.changes; in v4l2_ctrl_merge()