0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/export.h>
0009 #include <linux/mm.h>
0010 #include <linux/slab.h>
0011 #include <media/v4l2-ctrls.h>
0012 #include <media/v4l2-event.h>
0013 #include <media/v4l2-fwnode.h>
0014
0015 #include "v4l2-ctrls-priv.h"
0016
0017 static const union v4l2_ctrl_ptr ptr_null;
0018
0019 static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl,
0020 u32 changes)
0021 {
0022 memset(ev, 0, sizeof(*ev));
0023 ev->type = V4L2_EVENT_CTRL;
0024 ev->id = ctrl->id;
0025 ev->u.ctrl.changes = changes;
0026 ev->u.ctrl.type = ctrl->type;
0027 ev->u.ctrl.flags = user_flags(ctrl);
0028 if (ctrl->is_ptr)
0029 ev->u.ctrl.value64 = 0;
0030 else
0031 ev->u.ctrl.value64 = *ctrl->p_cur.p_s64;
0032 ev->u.ctrl.minimum = ctrl->minimum;
0033 ev->u.ctrl.maximum = ctrl->maximum;
0034 if (ctrl->type == V4L2_CTRL_TYPE_MENU
0035 || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
0036 ev->u.ctrl.step = 1;
0037 else
0038 ev->u.ctrl.step = ctrl->step;
0039 ev->u.ctrl.default_value = ctrl->default_value;
0040 }
0041
0042 void send_initial_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl)
0043 {
0044 struct v4l2_event ev;
0045 u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
0046
0047 if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
0048 changes |= V4L2_EVENT_CTRL_CH_VALUE;
0049 fill_event(&ev, ctrl, changes);
0050 v4l2_event_queue_fh(fh, &ev);
0051 }
0052
0053 void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
0054 {
0055 struct v4l2_event ev;
0056 struct v4l2_subscribed_event *sev;
0057
0058 if (list_empty(&ctrl->ev_subs))
0059 return;
0060 fill_event(&ev, ctrl, changes);
0061
0062 list_for_each_entry(sev, &ctrl->ev_subs, node)
0063 if (sev->fh != fh ||
0064 (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
0065 v4l2_event_queue_fh(sev->fh, &ev);
0066 }
0067
0068 static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx,
0069 union v4l2_ctrl_ptr ptr1,
0070 union v4l2_ctrl_ptr ptr2)
0071 {
0072 switch (ctrl->type) {
0073 case V4L2_CTRL_TYPE_BUTTON:
0074 return false;
0075 case V4L2_CTRL_TYPE_STRING:
0076 idx *= ctrl->elem_size;
0077
0078 return !strcmp(ptr1.p_char + idx, ptr2.p_char + idx);
0079 case V4L2_CTRL_TYPE_INTEGER64:
0080 return ptr1.p_s64[idx] == ptr2.p_s64[idx];
0081 case V4L2_CTRL_TYPE_U8:
0082 return ptr1.p_u8[idx] == ptr2.p_u8[idx];
0083 case V4L2_CTRL_TYPE_U16:
0084 return ptr1.p_u16[idx] == ptr2.p_u16[idx];
0085 case V4L2_CTRL_TYPE_U32:
0086 return ptr1.p_u32[idx] == ptr2.p_u32[idx];
0087 default:
0088 if (ctrl->is_int)
0089 return ptr1.p_s32[idx] == ptr2.p_s32[idx];
0090 idx *= ctrl->elem_size;
0091 return !memcmp(ptr1.p_const + idx, ptr2.p_const + idx,
0092 ctrl->elem_size);
0093 }
0094 }
0095
0096
0097 static const u8 mpeg2_intra_quant_matrix[64] = {
0098 8, 16, 16, 19, 16, 19, 22, 22,
0099 22, 22, 22, 22, 26, 24, 26, 27,
0100 27, 27, 26, 26, 26, 26, 27, 27,
0101 27, 29, 29, 29, 34, 34, 34, 29,
0102 29, 29, 27, 27, 29, 29, 32, 32,
0103 34, 34, 37, 38, 37, 35, 35, 34,
0104 35, 38, 38, 40, 40, 40, 48, 48,
0105 46, 46, 56, 56, 58, 69, 69, 83
0106 };
0107
0108 static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
0109 union v4l2_ctrl_ptr ptr)
0110 {
0111 struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
0112 struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
0113 struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quant;
0114 struct v4l2_ctrl_vp8_frame *p_vp8_frame;
0115 struct v4l2_ctrl_vp9_frame *p_vp9_frame;
0116 struct v4l2_ctrl_fwht_params *p_fwht_params;
0117 struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix;
0118 void *p = ptr.p + idx * ctrl->elem_size;
0119
0120 if (ctrl->p_def.p_const)
0121 memcpy(p, ctrl->p_def.p_const, ctrl->elem_size);
0122 else
0123 memset(p, 0, ctrl->elem_size);
0124
0125 switch ((u32)ctrl->type) {
0126 case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
0127 p_mpeg2_sequence = p;
0128
0129
0130 p_mpeg2_sequence->chroma_format = 1;
0131 break;
0132 case V4L2_CTRL_TYPE_MPEG2_PICTURE:
0133 p_mpeg2_picture = p;
0134
0135
0136 p_mpeg2_picture->picture_structure = V4L2_MPEG2_PIC_TOP_FIELD;
0137 p_mpeg2_picture->picture_coding_type =
0138 V4L2_MPEG2_PIC_CODING_TYPE_I;
0139 break;
0140 case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
0141 p_mpeg2_quant = p;
0142
0143 memcpy(p_mpeg2_quant->intra_quantiser_matrix,
0144 mpeg2_intra_quant_matrix,
0145 ARRAY_SIZE(mpeg2_intra_quant_matrix));
0146
0147
0148
0149
0150 memset(p_mpeg2_quant->non_intra_quantiser_matrix, 16,
0151 sizeof(p_mpeg2_quant->non_intra_quantiser_matrix));
0152 break;
0153 case V4L2_CTRL_TYPE_VP8_FRAME:
0154 p_vp8_frame = p;
0155 p_vp8_frame->num_dct_parts = 1;
0156 break;
0157 case V4L2_CTRL_TYPE_VP9_FRAME:
0158 p_vp9_frame = p;
0159 p_vp9_frame->profile = 0;
0160 p_vp9_frame->bit_depth = 8;
0161 p_vp9_frame->flags |= V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING |
0162 V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING;
0163 break;
0164 case V4L2_CTRL_TYPE_FWHT_PARAMS:
0165 p_fwht_params = p;
0166 p_fwht_params->version = V4L2_FWHT_VERSION;
0167 p_fwht_params->width = 1280;
0168 p_fwht_params->height = 720;
0169 p_fwht_params->flags = V4L2_FWHT_FL_PIXENC_YUV |
0170 (2 << V4L2_FWHT_FL_COMPONENTS_NUM_OFFSET);
0171 break;
0172 case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
0173 p_h264_scaling_matrix = p;
0174
0175
0176
0177
0178
0179 memset(p_h264_scaling_matrix, 16, sizeof(*p_h264_scaling_matrix));
0180 break;
0181 }
0182 }
0183
0184 static void std_init(const struct v4l2_ctrl *ctrl, u32 idx,
0185 union v4l2_ctrl_ptr ptr)
0186 {
0187 switch (ctrl->type) {
0188 case V4L2_CTRL_TYPE_STRING:
0189 idx *= ctrl->elem_size;
0190 memset(ptr.p_char + idx, ' ', ctrl->minimum);
0191 ptr.p_char[idx + ctrl->minimum] = '\0';
0192 break;
0193 case V4L2_CTRL_TYPE_INTEGER64:
0194 ptr.p_s64[idx] = ctrl->default_value;
0195 break;
0196 case V4L2_CTRL_TYPE_INTEGER:
0197 case V4L2_CTRL_TYPE_INTEGER_MENU:
0198 case V4L2_CTRL_TYPE_MENU:
0199 case V4L2_CTRL_TYPE_BITMASK:
0200 case V4L2_CTRL_TYPE_BOOLEAN:
0201 ptr.p_s32[idx] = ctrl->default_value;
0202 break;
0203 case V4L2_CTRL_TYPE_BUTTON:
0204 case V4L2_CTRL_TYPE_CTRL_CLASS:
0205 ptr.p_s32[idx] = 0;
0206 break;
0207 case V4L2_CTRL_TYPE_U8:
0208 ptr.p_u8[idx] = ctrl->default_value;
0209 break;
0210 case V4L2_CTRL_TYPE_U16:
0211 ptr.p_u16[idx] = ctrl->default_value;
0212 break;
0213 case V4L2_CTRL_TYPE_U32:
0214 ptr.p_u32[idx] = ctrl->default_value;
0215 break;
0216 default:
0217 std_init_compound(ctrl, idx, ptr);
0218 break;
0219 }
0220 }
0221
0222 static void std_log(const struct v4l2_ctrl *ctrl)
0223 {
0224 union v4l2_ctrl_ptr ptr = ctrl->p_cur;
0225
0226 if (ctrl->is_array) {
0227 unsigned i;
0228
0229 for (i = 0; i < ctrl->nr_of_dims; i++)
0230 pr_cont("[%u]", ctrl->dims[i]);
0231 pr_cont(" ");
0232 }
0233
0234 switch (ctrl->type) {
0235 case V4L2_CTRL_TYPE_INTEGER:
0236 pr_cont("%d", *ptr.p_s32);
0237 break;
0238 case V4L2_CTRL_TYPE_BOOLEAN:
0239 pr_cont("%s", *ptr.p_s32 ? "true" : "false");
0240 break;
0241 case V4L2_CTRL_TYPE_MENU:
0242 pr_cont("%s", ctrl->qmenu[*ptr.p_s32]);
0243 break;
0244 case V4L2_CTRL_TYPE_INTEGER_MENU:
0245 pr_cont("%lld", ctrl->qmenu_int[*ptr.p_s32]);
0246 break;
0247 case V4L2_CTRL_TYPE_BITMASK:
0248 pr_cont("0x%08x", *ptr.p_s32);
0249 break;
0250 case V4L2_CTRL_TYPE_INTEGER64:
0251 pr_cont("%lld", *ptr.p_s64);
0252 break;
0253 case V4L2_CTRL_TYPE_STRING:
0254 pr_cont("%s", ptr.p_char);
0255 break;
0256 case V4L2_CTRL_TYPE_U8:
0257 pr_cont("%u", (unsigned)*ptr.p_u8);
0258 break;
0259 case V4L2_CTRL_TYPE_U16:
0260 pr_cont("%u", (unsigned)*ptr.p_u16);
0261 break;
0262 case V4L2_CTRL_TYPE_U32:
0263 pr_cont("%u", (unsigned)*ptr.p_u32);
0264 break;
0265 case V4L2_CTRL_TYPE_H264_SPS:
0266 pr_cont("H264_SPS");
0267 break;
0268 case V4L2_CTRL_TYPE_H264_PPS:
0269 pr_cont("H264_PPS");
0270 break;
0271 case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
0272 pr_cont("H264_SCALING_MATRIX");
0273 break;
0274 case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
0275 pr_cont("H264_SLICE_PARAMS");
0276 break;
0277 case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
0278 pr_cont("H264_DECODE_PARAMS");
0279 break;
0280 case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
0281 pr_cont("H264_PRED_WEIGHTS");
0282 break;
0283 case V4L2_CTRL_TYPE_FWHT_PARAMS:
0284 pr_cont("FWHT_PARAMS");
0285 break;
0286 case V4L2_CTRL_TYPE_VP8_FRAME:
0287 pr_cont("VP8_FRAME");
0288 break;
0289 case V4L2_CTRL_TYPE_HDR10_CLL_INFO:
0290 pr_cont("HDR10_CLL_INFO");
0291 break;
0292 case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY:
0293 pr_cont("HDR10_MASTERING_DISPLAY");
0294 break;
0295 case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
0296 pr_cont("MPEG2_QUANTISATION");
0297 break;
0298 case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
0299 pr_cont("MPEG2_SEQUENCE");
0300 break;
0301 case V4L2_CTRL_TYPE_MPEG2_PICTURE:
0302 pr_cont("MPEG2_PICTURE");
0303 break;
0304 case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR:
0305 pr_cont("VP9_COMPRESSED_HDR");
0306 break;
0307 case V4L2_CTRL_TYPE_VP9_FRAME:
0308 pr_cont("VP9_FRAME");
0309 break;
0310 case V4L2_CTRL_TYPE_HEVC_SPS:
0311 pr_cont("HEVC_SPS");
0312 break;
0313 case V4L2_CTRL_TYPE_HEVC_PPS:
0314 pr_cont("HEVC_PPS");
0315 break;
0316 case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
0317 pr_cont("HEVC_SLICE_PARAMS");
0318 break;
0319 case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
0320 pr_cont("HEVC_SCALING_MATRIX");
0321 break;
0322 case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
0323 pr_cont("HEVC_DECODE_PARAMS");
0324 break;
0325 default:
0326 pr_cont("unknown type %d", ctrl->type);
0327 break;
0328 }
0329 }
0330
0331
0332
0333
0334
0335
0336 #define ROUND_TO_RANGE(val, offset_type, ctrl) \
0337 ({ \
0338 offset_type offset; \
0339 if ((ctrl)->maximum >= 0 && \
0340 val >= (ctrl)->maximum - (s32)((ctrl)->step / 2)) \
0341 val = (ctrl)->maximum; \
0342 else \
0343 val += (s32)((ctrl)->step / 2); \
0344 val = clamp_t(typeof(val), val, \
0345 (ctrl)->minimum, (ctrl)->maximum); \
0346 offset = (val) - (ctrl)->minimum; \
0347 offset = (ctrl)->step * (offset / (u32)(ctrl)->step); \
0348 val = (ctrl)->minimum + offset; \
0349 0; \
0350 })
0351
0352
0353
0354 #define zero_padding(s) \
0355 memset(&(s).padding, 0, sizeof((s).padding))
0356 #define zero_reserved(s) \
0357 memset(&(s).reserved, 0, sizeof((s).reserved))
0358
0359 static int
0360 validate_vp9_lf_params(struct v4l2_vp9_loop_filter *lf)
0361 {
0362 unsigned int i;
0363
0364 if (lf->flags & ~(V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED |
0365 V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE))
0366 return -EINVAL;
0367
0368
0369 if (lf->level > GENMASK(5, 0))
0370 return -EINVAL;
0371
0372 if (lf->sharpness > GENMASK(2, 0))
0373 return -EINVAL;
0374
0375 for (i = 0; i < ARRAY_SIZE(lf->ref_deltas); i++)
0376 if (lf->ref_deltas[i] < -63 || lf->ref_deltas[i] > 63)
0377 return -EINVAL;
0378
0379 for (i = 0; i < ARRAY_SIZE(lf->mode_deltas); i++)
0380 if (lf->mode_deltas[i] < -63 || lf->mode_deltas[i] > 63)
0381 return -EINVAL;
0382
0383 zero_reserved(*lf);
0384 return 0;
0385 }
0386
0387 static int
0388 validate_vp9_quant_params(struct v4l2_vp9_quantization *quant)
0389 {
0390 if (quant->delta_q_y_dc < -15 || quant->delta_q_y_dc > 15 ||
0391 quant->delta_q_uv_dc < -15 || quant->delta_q_uv_dc > 15 ||
0392 quant->delta_q_uv_ac < -15 || quant->delta_q_uv_ac > 15)
0393 return -EINVAL;
0394
0395 zero_reserved(*quant);
0396 return 0;
0397 }
0398
0399 static int
0400 validate_vp9_seg_params(struct v4l2_vp9_segmentation *seg)
0401 {
0402 unsigned int i, j;
0403
0404 if (seg->flags & ~(V4L2_VP9_SEGMENTATION_FLAG_ENABLED |
0405 V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP |
0406 V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE |
0407 V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA |
0408 V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE))
0409 return -EINVAL;
0410
0411 for (i = 0; i < ARRAY_SIZE(seg->feature_enabled); i++) {
0412 if (seg->feature_enabled[i] &
0413 ~V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK)
0414 return -EINVAL;
0415 }
0416
0417 for (i = 0; i < ARRAY_SIZE(seg->feature_data); i++) {
0418 static const int range[] = { 255, 63, 3, 0 };
0419
0420 for (j = 0; j < ARRAY_SIZE(seg->feature_data[j]); j++) {
0421 if (seg->feature_data[i][j] < -range[j] ||
0422 seg->feature_data[i][j] > range[j])
0423 return -EINVAL;
0424 }
0425 }
0426
0427 zero_reserved(*seg);
0428 return 0;
0429 }
0430
0431 static int
0432 validate_vp9_compressed_hdr(struct v4l2_ctrl_vp9_compressed_hdr *hdr)
0433 {
0434 if (hdr->tx_mode > V4L2_VP9_TX_MODE_SELECT)
0435 return -EINVAL;
0436
0437 return 0;
0438 }
0439
0440 static int
0441 validate_vp9_frame(struct v4l2_ctrl_vp9_frame *frame)
0442 {
0443 int ret;
0444
0445
0446 if (frame->flags & ~(V4L2_VP9_FRAME_FLAG_KEY_FRAME |
0447 V4L2_VP9_FRAME_FLAG_SHOW_FRAME |
0448 V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT |
0449 V4L2_VP9_FRAME_FLAG_INTRA_ONLY |
0450 V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV |
0451 V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX |
0452 V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE |
0453 V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING |
0454 V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING |
0455 V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING))
0456 return -EINVAL;
0457
0458 if (frame->flags & V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT &&
0459 frame->flags & V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX)
0460 return -EINVAL;
0461
0462 if (frame->profile > V4L2_VP9_PROFILE_MAX)
0463 return -EINVAL;
0464
0465 if (frame->reset_frame_context > V4L2_VP9_RESET_FRAME_CTX_ALL)
0466 return -EINVAL;
0467
0468 if (frame->frame_context_idx >= V4L2_VP9_NUM_FRAME_CTX)
0469 return -EINVAL;
0470
0471
0472
0473
0474
0475 if ((frame->profile < 2 && frame->bit_depth != 8) ||
0476 (frame->profile >= 2 &&
0477 (frame->bit_depth != 10 && frame->bit_depth != 12)))
0478 return -EINVAL;
0479
0480
0481 if ((frame->profile == 0 || frame->profile == 2) &&
0482 (!(frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) ||
0483 !(frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING)))
0484 return -EINVAL;
0485
0486
0487 if ((frame->profile == 1 || frame->profile == 3) &&
0488 ((frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) &&
0489 (frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING)))
0490 return -EINVAL;
0491
0492 if (frame->interpolation_filter > V4L2_VP9_INTERP_FILTER_SWITCHABLE)
0493 return -EINVAL;
0494
0495
0496
0497
0498
0499 if (frame->tile_cols_log2 > 6)
0500 return -EINVAL;
0501
0502 if (frame->reference_mode > V4L2_VP9_REFERENCE_MODE_SELECT)
0503 return -EINVAL;
0504
0505 ret = validate_vp9_lf_params(&frame->lf);
0506 if (ret)
0507 return ret;
0508
0509 ret = validate_vp9_quant_params(&frame->quant);
0510 if (ret)
0511 return ret;
0512
0513 ret = validate_vp9_seg_params(&frame->seg);
0514 if (ret)
0515 return ret;
0516
0517 zero_reserved(*frame);
0518 return 0;
0519 }
0520
0521
0522
0523
0524
0525 static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
0526 union v4l2_ctrl_ptr ptr)
0527 {
0528 struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
0529 struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
0530 struct v4l2_ctrl_vp8_frame *p_vp8_frame;
0531 struct v4l2_ctrl_fwht_params *p_fwht_params;
0532 struct v4l2_ctrl_h264_sps *p_h264_sps;
0533 struct v4l2_ctrl_h264_pps *p_h264_pps;
0534 struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights;
0535 struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;
0536 struct v4l2_ctrl_h264_decode_params *p_h264_dec_params;
0537 struct v4l2_ctrl_hevc_sps *p_hevc_sps;
0538 struct v4l2_ctrl_hevc_pps *p_hevc_pps;
0539 struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
0540 struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params;
0541 struct v4l2_area *area;
0542 void *p = ptr.p + idx * ctrl->elem_size;
0543 unsigned int i;
0544
0545 switch ((u32)ctrl->type) {
0546 case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
0547 p_mpeg2_sequence = p;
0548
0549 switch (p_mpeg2_sequence->chroma_format) {
0550 case 1:
0551 case 2:
0552 case 3:
0553 break;
0554 default:
0555 return -EINVAL;
0556 }
0557 break;
0558
0559 case V4L2_CTRL_TYPE_MPEG2_PICTURE:
0560 p_mpeg2_picture = p;
0561
0562 switch (p_mpeg2_picture->intra_dc_precision) {
0563 case 0:
0564 case 1:
0565 case 2:
0566 case 3:
0567 break;
0568 default:
0569 return -EINVAL;
0570 }
0571
0572 switch (p_mpeg2_picture->picture_structure) {
0573 case V4L2_MPEG2_PIC_TOP_FIELD:
0574 case V4L2_MPEG2_PIC_BOTTOM_FIELD:
0575 case V4L2_MPEG2_PIC_FRAME:
0576 break;
0577 default:
0578 return -EINVAL;
0579 }
0580
0581 switch (p_mpeg2_picture->picture_coding_type) {
0582 case V4L2_MPEG2_PIC_CODING_TYPE_I:
0583 case V4L2_MPEG2_PIC_CODING_TYPE_P:
0584 case V4L2_MPEG2_PIC_CODING_TYPE_B:
0585 break;
0586 default:
0587 return -EINVAL;
0588 }
0589 zero_reserved(*p_mpeg2_picture);
0590 break;
0591
0592 case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
0593 break;
0594
0595 case V4L2_CTRL_TYPE_FWHT_PARAMS:
0596 p_fwht_params = p;
0597 if (p_fwht_params->version < V4L2_FWHT_VERSION)
0598 return -EINVAL;
0599 if (!p_fwht_params->width || !p_fwht_params->height)
0600 return -EINVAL;
0601 break;
0602
0603 case V4L2_CTRL_TYPE_H264_SPS:
0604 p_h264_sps = p;
0605
0606
0607 if (p_h264_sps->pic_order_cnt_type != 0) {
0608 p_h264_sps->log2_max_pic_order_cnt_lsb_minus4 = 0;
0609 } else if (p_h264_sps->pic_order_cnt_type != 1) {
0610 p_h264_sps->num_ref_frames_in_pic_order_cnt_cycle = 0;
0611 p_h264_sps->offset_for_non_ref_pic = 0;
0612 p_h264_sps->offset_for_top_to_bottom_field = 0;
0613 memset(&p_h264_sps->offset_for_ref_frame, 0,
0614 sizeof(p_h264_sps->offset_for_ref_frame));
0615 }
0616
0617 if (!V4L2_H264_SPS_HAS_CHROMA_FORMAT(p_h264_sps)) {
0618 p_h264_sps->chroma_format_idc = 1;
0619 p_h264_sps->bit_depth_luma_minus8 = 0;
0620 p_h264_sps->bit_depth_chroma_minus8 = 0;
0621
0622 p_h264_sps->flags &=
0623 ~V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS;
0624
0625 if (p_h264_sps->chroma_format_idc < 3)
0626 p_h264_sps->flags &=
0627 ~V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE;
0628 }
0629
0630 if (p_h264_sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)
0631 p_h264_sps->flags &=
0632 ~V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD;
0633
0634
0635
0636
0637
0638
0639
0640
0641 if (p_h264_sps->profile_idc < 122 &&
0642 p_h264_sps->chroma_format_idc > 1)
0643 return -EINVAL;
0644
0645 if (p_h264_sps->profile_idc < 244 &&
0646 p_h264_sps->chroma_format_idc > 2)
0647 return -EINVAL;
0648 if (p_h264_sps->chroma_format_idc > 3)
0649 return -EINVAL;
0650
0651 if (p_h264_sps->bit_depth_luma_minus8 > 6)
0652 return -EINVAL;
0653 if (p_h264_sps->bit_depth_chroma_minus8 > 6)
0654 return -EINVAL;
0655 if (p_h264_sps->log2_max_frame_num_minus4 > 12)
0656 return -EINVAL;
0657 if (p_h264_sps->pic_order_cnt_type > 2)
0658 return -EINVAL;
0659 if (p_h264_sps->log2_max_pic_order_cnt_lsb_minus4 > 12)
0660 return -EINVAL;
0661 if (p_h264_sps->max_num_ref_frames > V4L2_H264_REF_LIST_LEN)
0662 return -EINVAL;
0663 break;
0664
0665 case V4L2_CTRL_TYPE_H264_PPS:
0666 p_h264_pps = p;
0667
0668 if (p_h264_pps->num_slice_groups_minus1 > 7)
0669 return -EINVAL;
0670 if (p_h264_pps->num_ref_idx_l0_default_active_minus1 >
0671 (V4L2_H264_REF_LIST_LEN - 1))
0672 return -EINVAL;
0673 if (p_h264_pps->num_ref_idx_l1_default_active_minus1 >
0674 (V4L2_H264_REF_LIST_LEN - 1))
0675 return -EINVAL;
0676 if (p_h264_pps->weighted_bipred_idc > 2)
0677 return -EINVAL;
0678
0679
0680
0681
0682
0683 if (p_h264_pps->pic_init_qp_minus26 < -62 ||
0684 p_h264_pps->pic_init_qp_minus26 > 25)
0685 return -EINVAL;
0686 if (p_h264_pps->pic_init_qs_minus26 < -26 ||
0687 p_h264_pps->pic_init_qs_minus26 > 25)
0688 return -EINVAL;
0689 if (p_h264_pps->chroma_qp_index_offset < -12 ||
0690 p_h264_pps->chroma_qp_index_offset > 12)
0691 return -EINVAL;
0692 if (p_h264_pps->second_chroma_qp_index_offset < -12 ||
0693 p_h264_pps->second_chroma_qp_index_offset > 12)
0694 return -EINVAL;
0695 break;
0696
0697 case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
0698 break;
0699
0700 case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
0701 p_h264_pred_weights = p;
0702
0703 if (p_h264_pred_weights->luma_log2_weight_denom > 7)
0704 return -EINVAL;
0705 if (p_h264_pred_weights->chroma_log2_weight_denom > 7)
0706 return -EINVAL;
0707 break;
0708
0709 case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
0710 p_h264_slice_params = p;
0711
0712 if (p_h264_slice_params->slice_type != V4L2_H264_SLICE_TYPE_B)
0713 p_h264_slice_params->flags &=
0714 ~V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED;
0715
0716 if (p_h264_slice_params->colour_plane_id > 2)
0717 return -EINVAL;
0718 if (p_h264_slice_params->cabac_init_idc > 2)
0719 return -EINVAL;
0720 if (p_h264_slice_params->disable_deblocking_filter_idc > 2)
0721 return -EINVAL;
0722 if (p_h264_slice_params->slice_alpha_c0_offset_div2 < -6 ||
0723 p_h264_slice_params->slice_alpha_c0_offset_div2 > 6)
0724 return -EINVAL;
0725 if (p_h264_slice_params->slice_beta_offset_div2 < -6 ||
0726 p_h264_slice_params->slice_beta_offset_div2 > 6)
0727 return -EINVAL;
0728
0729 if (p_h264_slice_params->slice_type == V4L2_H264_SLICE_TYPE_I ||
0730 p_h264_slice_params->slice_type == V4L2_H264_SLICE_TYPE_SI)
0731 p_h264_slice_params->num_ref_idx_l0_active_minus1 = 0;
0732 if (p_h264_slice_params->slice_type != V4L2_H264_SLICE_TYPE_B)
0733 p_h264_slice_params->num_ref_idx_l1_active_minus1 = 0;
0734
0735 if (p_h264_slice_params->num_ref_idx_l0_active_minus1 >
0736 (V4L2_H264_REF_LIST_LEN - 1))
0737 return -EINVAL;
0738 if (p_h264_slice_params->num_ref_idx_l1_active_minus1 >
0739 (V4L2_H264_REF_LIST_LEN - 1))
0740 return -EINVAL;
0741 zero_reserved(*p_h264_slice_params);
0742 break;
0743
0744 case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
0745 p_h264_dec_params = p;
0746
0747 if (p_h264_dec_params->nal_ref_idc > 3)
0748 return -EINVAL;
0749 for (i = 0; i < V4L2_H264_NUM_DPB_ENTRIES; i++) {
0750 struct v4l2_h264_dpb_entry *dpb_entry =
0751 &p_h264_dec_params->dpb[i];
0752
0753 zero_reserved(*dpb_entry);
0754 }
0755 zero_reserved(*p_h264_dec_params);
0756 break;
0757
0758 case V4L2_CTRL_TYPE_VP8_FRAME:
0759 p_vp8_frame = p;
0760
0761 switch (p_vp8_frame->num_dct_parts) {
0762 case 1:
0763 case 2:
0764 case 4:
0765 case 8:
0766 break;
0767 default:
0768 return -EINVAL;
0769 }
0770 zero_padding(p_vp8_frame->segment);
0771 zero_padding(p_vp8_frame->lf);
0772 zero_padding(p_vp8_frame->quant);
0773 zero_padding(p_vp8_frame->entropy);
0774 zero_padding(p_vp8_frame->coder_state);
0775 break;
0776
0777 case V4L2_CTRL_TYPE_HEVC_SPS:
0778 p_hevc_sps = p;
0779
0780 if (!(p_hevc_sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED)) {
0781 p_hevc_sps->pcm_sample_bit_depth_luma_minus1 = 0;
0782 p_hevc_sps->pcm_sample_bit_depth_chroma_minus1 = 0;
0783 p_hevc_sps->log2_min_pcm_luma_coding_block_size_minus3 = 0;
0784 p_hevc_sps->log2_diff_max_min_pcm_luma_coding_block_size = 0;
0785 }
0786
0787 if (!(p_hevc_sps->flags &
0788 V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT))
0789 p_hevc_sps->num_long_term_ref_pics_sps = 0;
0790 break;
0791
0792 case V4L2_CTRL_TYPE_HEVC_PPS:
0793 p_hevc_pps = p;
0794
0795 if (!(p_hevc_pps->flags &
0796 V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED))
0797 p_hevc_pps->diff_cu_qp_delta_depth = 0;
0798
0799 if (!(p_hevc_pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED)) {
0800 p_hevc_pps->num_tile_columns_minus1 = 0;
0801 p_hevc_pps->num_tile_rows_minus1 = 0;
0802 memset(&p_hevc_pps->column_width_minus1, 0,
0803 sizeof(p_hevc_pps->column_width_minus1));
0804 memset(&p_hevc_pps->row_height_minus1, 0,
0805 sizeof(p_hevc_pps->row_height_minus1));
0806
0807 p_hevc_pps->flags &=
0808 ~V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED;
0809 }
0810
0811 if (p_hevc_pps->flags &
0812 V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER) {
0813 p_hevc_pps->pps_beta_offset_div2 = 0;
0814 p_hevc_pps->pps_tc_offset_div2 = 0;
0815 }
0816 break;
0817
0818 case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
0819 p_hevc_decode_params = p;
0820
0821 if (p_hevc_decode_params->num_active_dpb_entries >
0822 V4L2_HEVC_DPB_ENTRIES_NUM_MAX)
0823 return -EINVAL;
0824 break;
0825
0826 case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
0827 break;
0828
0829 case V4L2_CTRL_TYPE_HDR10_CLL_INFO:
0830 break;
0831
0832 case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY:
0833 p_hdr10_mastering = p;
0834
0835 for (i = 0; i < 3; ++i) {
0836 if (p_hdr10_mastering->display_primaries_x[i] <
0837 V4L2_HDR10_MASTERING_PRIMARIES_X_LOW ||
0838 p_hdr10_mastering->display_primaries_x[i] >
0839 V4L2_HDR10_MASTERING_PRIMARIES_X_HIGH ||
0840 p_hdr10_mastering->display_primaries_y[i] <
0841 V4L2_HDR10_MASTERING_PRIMARIES_Y_LOW ||
0842 p_hdr10_mastering->display_primaries_y[i] >
0843 V4L2_HDR10_MASTERING_PRIMARIES_Y_HIGH)
0844 return -EINVAL;
0845 }
0846
0847 if (p_hdr10_mastering->white_point_x <
0848 V4L2_HDR10_MASTERING_WHITE_POINT_X_LOW ||
0849 p_hdr10_mastering->white_point_x >
0850 V4L2_HDR10_MASTERING_WHITE_POINT_X_HIGH ||
0851 p_hdr10_mastering->white_point_y <
0852 V4L2_HDR10_MASTERING_WHITE_POINT_Y_LOW ||
0853 p_hdr10_mastering->white_point_y >
0854 V4L2_HDR10_MASTERING_WHITE_POINT_Y_HIGH)
0855 return -EINVAL;
0856
0857 if (p_hdr10_mastering->max_display_mastering_luminance <
0858 V4L2_HDR10_MASTERING_MAX_LUMA_LOW ||
0859 p_hdr10_mastering->max_display_mastering_luminance >
0860 V4L2_HDR10_MASTERING_MAX_LUMA_HIGH ||
0861 p_hdr10_mastering->min_display_mastering_luminance <
0862 V4L2_HDR10_MASTERING_MIN_LUMA_LOW ||
0863 p_hdr10_mastering->min_display_mastering_luminance >
0864 V4L2_HDR10_MASTERING_MIN_LUMA_HIGH)
0865 return -EINVAL;
0866
0867
0868 if (p_hdr10_mastering->max_display_mastering_luminance ==
0869 V4L2_HDR10_MASTERING_MAX_LUMA_LOW &&
0870 p_hdr10_mastering->min_display_mastering_luminance ==
0871 V4L2_HDR10_MASTERING_MIN_LUMA_HIGH)
0872 return -EINVAL;
0873
0874 break;
0875
0876 case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
0877 break;
0878
0879 case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR:
0880 return validate_vp9_compressed_hdr(p);
0881
0882 case V4L2_CTRL_TYPE_VP9_FRAME:
0883 return validate_vp9_frame(p);
0884
0885 case V4L2_CTRL_TYPE_AREA:
0886 area = p;
0887 if (!area->width || !area->height)
0888 return -EINVAL;
0889 break;
0890
0891 default:
0892 return -EINVAL;
0893 }
0894
0895 return 0;
0896 }
0897
0898 static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
0899 union v4l2_ctrl_ptr ptr)
0900 {
0901 size_t len;
0902 u64 offset;
0903 s64 val;
0904
0905 switch ((u32)ctrl->type) {
0906 case V4L2_CTRL_TYPE_INTEGER:
0907 return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl);
0908 case V4L2_CTRL_TYPE_INTEGER64:
0909
0910
0911
0912
0913 val = ptr.p_s64[idx];
0914 if (ctrl->maximum >= 0 && val >= ctrl->maximum - (s64)(ctrl->step / 2))
0915 val = ctrl->maximum;
0916 else
0917 val += (s64)(ctrl->step / 2);
0918 val = clamp_t(s64, val, ctrl->minimum, ctrl->maximum);
0919 offset = val - ctrl->minimum;
0920 do_div(offset, ctrl->step);
0921 ptr.p_s64[idx] = ctrl->minimum + offset * ctrl->step;
0922 return 0;
0923 case V4L2_CTRL_TYPE_U8:
0924 return ROUND_TO_RANGE(ptr.p_u8[idx], u8, ctrl);
0925 case V4L2_CTRL_TYPE_U16:
0926 return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl);
0927 case V4L2_CTRL_TYPE_U32:
0928 return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl);
0929
0930 case V4L2_CTRL_TYPE_BOOLEAN:
0931 ptr.p_s32[idx] = !!ptr.p_s32[idx];
0932 return 0;
0933
0934 case V4L2_CTRL_TYPE_MENU:
0935 case V4L2_CTRL_TYPE_INTEGER_MENU:
0936 if (ptr.p_s32[idx] < ctrl->minimum || ptr.p_s32[idx] > ctrl->maximum)
0937 return -ERANGE;
0938 if (ptr.p_s32[idx] < BITS_PER_LONG_LONG &&
0939 (ctrl->menu_skip_mask & BIT_ULL(ptr.p_s32[idx])))
0940 return -EINVAL;
0941 if (ctrl->type == V4L2_CTRL_TYPE_MENU &&
0942 ctrl->qmenu[ptr.p_s32[idx]][0] == '\0')
0943 return -EINVAL;
0944 return 0;
0945
0946 case V4L2_CTRL_TYPE_BITMASK:
0947 ptr.p_s32[idx] &= ctrl->maximum;
0948 return 0;
0949
0950 case V4L2_CTRL_TYPE_BUTTON:
0951 case V4L2_CTRL_TYPE_CTRL_CLASS:
0952 ptr.p_s32[idx] = 0;
0953 return 0;
0954
0955 case V4L2_CTRL_TYPE_STRING:
0956 idx *= ctrl->elem_size;
0957 len = strlen(ptr.p_char + idx);
0958 if (len < ctrl->minimum)
0959 return -ERANGE;
0960 if ((len - (u32)ctrl->minimum) % (u32)ctrl->step)
0961 return -ERANGE;
0962 return 0;
0963
0964 default:
0965 return std_validate_compound(ctrl, idx, ptr);
0966 }
0967 }
0968
0969 static const struct v4l2_ctrl_type_ops std_type_ops = {
0970 .equal = std_equal,
0971 .init = std_init,
0972 .log = std_log,
0973 .validate = std_validate,
0974 };
0975
0976 void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv)
0977 {
0978 if (!ctrl)
0979 return;
0980 if (!notify) {
0981 ctrl->call_notify = 0;
0982 return;
0983 }
0984 if (WARN_ON(ctrl->handler->notify && ctrl->handler->notify != notify))
0985 return;
0986 ctrl->handler->notify = notify;
0987 ctrl->handler->notify_priv = priv;
0988 ctrl->call_notify = 1;
0989 }
0990 EXPORT_SYMBOL(v4l2_ctrl_notify);
0991
0992
0993 static void ptr_to_ptr(struct v4l2_ctrl *ctrl,
0994 union v4l2_ctrl_ptr from, union v4l2_ctrl_ptr to,
0995 unsigned int elems)
0996 {
0997 if (ctrl == NULL)
0998 return;
0999 memcpy(to.p, from.p_const, elems * ctrl->elem_size);
1000 }
1001
1002
1003 void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
1004 {
1005 bool changed;
1006
1007 if (ctrl == NULL)
1008 return;
1009
1010
1011 changed = ctrl->has_changed;
1012 if (changed) {
1013 if (ctrl->is_dyn_array)
1014 ctrl->elems = ctrl->new_elems;
1015 ptr_to_ptr(ctrl, ctrl->p_new, ctrl->p_cur, ctrl->elems);
1016 }
1017
1018 if (ch_flags & V4L2_EVENT_CTRL_CH_FLAGS) {
1019
1020 ctrl->flags &=
1021 ~(V4L2_CTRL_FLAG_INACTIVE | V4L2_CTRL_FLAG_VOLATILE);
1022 if (!is_cur_manual(ctrl->cluster[0])) {
1023 ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
1024 if (ctrl->cluster[0]->has_volatiles)
1025 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
1026 }
1027 fh = NULL;
1028 }
1029 if (changed || ch_flags) {
1030
1031
1032 if (!ctrl->is_new)
1033 fh = NULL;
1034 send_event(fh, ctrl,
1035 (changed ? V4L2_EVENT_CTRL_CH_VALUE : 0) | ch_flags);
1036 if (ctrl->call_notify && changed && ctrl->handler->notify)
1037 ctrl->handler->notify(ctrl, ctrl->handler->notify_priv);
1038 }
1039 }
1040
1041
1042 void cur_to_new(struct v4l2_ctrl *ctrl)
1043 {
1044 if (ctrl == NULL)
1045 return;
1046 if (ctrl->is_dyn_array)
1047 ctrl->new_elems = ctrl->elems;
1048 ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new, ctrl->new_elems);
1049 }
1050
1051 static bool req_alloc_dyn_array(struct v4l2_ctrl_ref *ref, u32 elems)
1052 {
1053 void *tmp;
1054
1055 if (elems < ref->p_req_dyn_alloc_elems)
1056 return true;
1057
1058 tmp = kvmalloc(elems * ref->ctrl->elem_size, GFP_KERNEL);
1059
1060 if (!tmp) {
1061 ref->p_req_dyn_enomem = true;
1062 return false;
1063 }
1064 ref->p_req_dyn_enomem = false;
1065 kvfree(ref->p_req.p);
1066 ref->p_req.p = tmp;
1067 ref->p_req_dyn_alloc_elems = elems;
1068 return true;
1069 }
1070
1071
1072 void new_to_req(struct v4l2_ctrl_ref *ref)
1073 {
1074 struct v4l2_ctrl *ctrl;
1075
1076 if (!ref)
1077 return;
1078
1079 ctrl = ref->ctrl;
1080 if (ctrl->is_dyn_array && !req_alloc_dyn_array(ref, ctrl->new_elems))
1081 return;
1082
1083 ref->p_req_elems = ctrl->new_elems;
1084 ptr_to_ptr(ctrl, ctrl->p_new, ref->p_req, ref->p_req_elems);
1085 ref->p_req_valid = true;
1086 }
1087
1088
1089 void cur_to_req(struct v4l2_ctrl_ref *ref)
1090 {
1091 struct v4l2_ctrl *ctrl;
1092
1093 if (!ref)
1094 return;
1095
1096 ctrl = ref->ctrl;
1097 if (ctrl->is_dyn_array && !req_alloc_dyn_array(ref, ctrl->elems))
1098 return;
1099
1100 ref->p_req_elems = ctrl->elems;
1101 ptr_to_ptr(ctrl, ctrl->p_cur, ref->p_req, ctrl->elems);
1102 ref->p_req_valid = true;
1103 }
1104
1105
1106 int req_to_new(struct v4l2_ctrl_ref *ref)
1107 {
1108 struct v4l2_ctrl *ctrl;
1109
1110 if (!ref)
1111 return 0;
1112
1113 ctrl = ref->ctrl;
1114
1115
1116
1117
1118
1119 if (!ref->p_req_valid) {
1120 if (ctrl->is_dyn_array)
1121 ctrl->new_elems = ctrl->elems;
1122 ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new, ctrl->new_elems);
1123 return 0;
1124 }
1125
1126
1127 if (!ctrl->is_dyn_array) {
1128 ptr_to_ptr(ctrl, ref->p_req, ctrl->p_new, ctrl->new_elems);
1129 return 0;
1130 }
1131
1132
1133 if (WARN_ON(!ref->p_req_dyn_alloc_elems))
1134 return -ENOMEM;
1135
1136
1137
1138
1139
1140
1141
1142
1143 if (ref->p_req_elems > ctrl->p_dyn_alloc_elems) {
1144 unsigned int sz = ref->p_req_elems * ctrl->elem_size;
1145 void *old = ctrl->p_dyn;
1146 void *tmp = kvzalloc(2 * sz, GFP_KERNEL);
1147
1148 if (!tmp)
1149 return -ENOMEM;
1150 memcpy(tmp, ctrl->p_new.p, ctrl->elems * ctrl->elem_size);
1151 memcpy(tmp + sz, ctrl->p_cur.p, ctrl->elems * ctrl->elem_size);
1152 ctrl->p_new.p = tmp;
1153 ctrl->p_cur.p = tmp + sz;
1154 ctrl->p_dyn = tmp;
1155 ctrl->p_dyn_alloc_elems = ref->p_req_elems;
1156 kvfree(old);
1157 }
1158
1159 ctrl->new_elems = ref->p_req_elems;
1160 ptr_to_ptr(ctrl, ref->p_req, ctrl->p_new, ctrl->new_elems);
1161 return 0;
1162 }
1163
1164
1165 int check_range(enum v4l2_ctrl_type type,
1166 s64 min, s64 max, u64 step, s64 def)
1167 {
1168 switch (type) {
1169 case V4L2_CTRL_TYPE_BOOLEAN:
1170 if (step != 1 || max > 1 || min < 0)
1171 return -ERANGE;
1172 fallthrough;
1173 case V4L2_CTRL_TYPE_U8:
1174 case V4L2_CTRL_TYPE_U16:
1175 case V4L2_CTRL_TYPE_U32:
1176 case V4L2_CTRL_TYPE_INTEGER:
1177 case V4L2_CTRL_TYPE_INTEGER64:
1178 if (step == 0 || min > max || def < min || def > max)
1179 return -ERANGE;
1180 return 0;
1181 case V4L2_CTRL_TYPE_BITMASK:
1182 if (step || min || !max || (def & ~max))
1183 return -ERANGE;
1184 return 0;
1185 case V4L2_CTRL_TYPE_MENU:
1186 case V4L2_CTRL_TYPE_INTEGER_MENU:
1187 if (min > max || def < min || def > max)
1188 return -ERANGE;
1189
1190
1191 if (step && ((1 << def) & step))
1192 return -EINVAL;
1193 return 0;
1194 case V4L2_CTRL_TYPE_STRING:
1195 if (min > max || min < 0 || step < 1 || def)
1196 return -ERANGE;
1197 return 0;
1198 default:
1199 return 0;
1200 }
1201 }
1202
1203
1204 static inline int handler_set_err(struct v4l2_ctrl_handler *hdl, int err)
1205 {
1206 if (hdl->error == 0)
1207 hdl->error = err;
1208 return err;
1209 }
1210
1211
1212 int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl,
1213 unsigned nr_of_controls_hint,
1214 struct lock_class_key *key, const char *name)
1215 {
1216 mutex_init(&hdl->_lock);
1217 hdl->lock = &hdl->_lock;
1218 lockdep_set_class_and_name(hdl->lock, key, name);
1219 INIT_LIST_HEAD(&hdl->ctrls);
1220 INIT_LIST_HEAD(&hdl->ctrl_refs);
1221 hdl->nr_of_buckets = 1 + nr_of_controls_hint / 8;
1222 hdl->buckets = kvcalloc(hdl->nr_of_buckets, sizeof(hdl->buckets[0]),
1223 GFP_KERNEL);
1224 hdl->error = hdl->buckets ? 0 : -ENOMEM;
1225 v4l2_ctrl_handler_init_request(hdl);
1226 return hdl->error;
1227 }
1228 EXPORT_SYMBOL(v4l2_ctrl_handler_init_class);
1229
1230
1231 void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
1232 {
1233 struct v4l2_ctrl_ref *ref, *next_ref;
1234 struct v4l2_ctrl *ctrl, *next_ctrl;
1235 struct v4l2_subscribed_event *sev, *next_sev;
1236
1237 if (hdl == NULL || hdl->buckets == NULL)
1238 return;
1239
1240 v4l2_ctrl_handler_free_request(hdl);
1241
1242 mutex_lock(hdl->lock);
1243
1244 list_for_each_entry_safe(ref, next_ref, &hdl->ctrl_refs, node) {
1245 list_del(&ref->node);
1246 if (ref->p_req_dyn_alloc_elems)
1247 kvfree(ref->p_req.p);
1248 kfree(ref);
1249 }
1250
1251 list_for_each_entry_safe(ctrl, next_ctrl, &hdl->ctrls, node) {
1252 list_del(&ctrl->node);
1253 list_for_each_entry_safe(sev, next_sev, &ctrl->ev_subs, node)
1254 list_del(&sev->node);
1255 kvfree(ctrl->p_dyn);
1256 kvfree(ctrl);
1257 }
1258 kvfree(hdl->buckets);
1259 hdl->buckets = NULL;
1260 hdl->cached = NULL;
1261 hdl->error = 0;
1262 mutex_unlock(hdl->lock);
1263 mutex_destroy(&hdl->_lock);
1264 }
1265 EXPORT_SYMBOL(v4l2_ctrl_handler_free);
1266
1267
1268
1269
1270
1271
1272
1273 static struct v4l2_ctrl_ref *find_private_ref(
1274 struct v4l2_ctrl_handler *hdl, u32 id)
1275 {
1276 struct v4l2_ctrl_ref *ref;
1277
1278 id -= V4L2_CID_PRIVATE_BASE;
1279 list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1280
1281
1282 if (V4L2_CTRL_ID2WHICH(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
1283 V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
1284 if (!ref->ctrl->is_int)
1285 continue;
1286 if (id == 0)
1287 return ref;
1288 id--;
1289 }
1290 }
1291 return NULL;
1292 }
1293
1294
1295 struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
1296 {
1297 struct v4l2_ctrl_ref *ref;
1298 int bucket;
1299
1300 id &= V4L2_CTRL_ID_MASK;
1301
1302
1303 if (id >= V4L2_CID_PRIVATE_BASE)
1304 return find_private_ref(hdl, id);
1305 bucket = id % hdl->nr_of_buckets;
1306
1307
1308 if (hdl->cached && hdl->cached->ctrl->id == id)
1309 return hdl->cached;
1310
1311
1312 ref = hdl->buckets ? hdl->buckets[bucket] : NULL;
1313 while (ref && ref->ctrl->id != id)
1314 ref = ref->next;
1315
1316 if (ref)
1317 hdl->cached = ref;
1318 return ref;
1319 }
1320
1321
1322 struct v4l2_ctrl_ref *find_ref_lock(struct v4l2_ctrl_handler *hdl, u32 id)
1323 {
1324 struct v4l2_ctrl_ref *ref = NULL;
1325
1326 if (hdl) {
1327 mutex_lock(hdl->lock);
1328 ref = find_ref(hdl, id);
1329 mutex_unlock(hdl->lock);
1330 }
1331 return ref;
1332 }
1333
1334
1335 struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
1336 {
1337 struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
1338
1339 return ref ? ref->ctrl : NULL;
1340 }
1341 EXPORT_SYMBOL(v4l2_ctrl_find);
1342
1343
1344 int handler_new_ref(struct v4l2_ctrl_handler *hdl,
1345 struct v4l2_ctrl *ctrl,
1346 struct v4l2_ctrl_ref **ctrl_ref,
1347 bool from_other_dev, bool allocate_req)
1348 {
1349 struct v4l2_ctrl_ref *ref;
1350 struct v4l2_ctrl_ref *new_ref;
1351 u32 id = ctrl->id;
1352 u32 class_ctrl = V4L2_CTRL_ID2WHICH(id) | 1;
1353 int bucket = id % hdl->nr_of_buckets;
1354 unsigned int size_extra_req = 0;
1355
1356 if (ctrl_ref)
1357 *ctrl_ref = NULL;
1358
1359
1360
1361
1362
1363 if (ctrl->type < V4L2_CTRL_COMPOUND_TYPES &&
1364 id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)
1365 if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))
1366 return hdl->error;
1367
1368 if (hdl->error)
1369 return hdl->error;
1370
1371 if (allocate_req && !ctrl->is_dyn_array)
1372 size_extra_req = ctrl->elems * ctrl->elem_size;
1373 new_ref = kzalloc(sizeof(*new_ref) + size_extra_req, GFP_KERNEL);
1374 if (!new_ref)
1375 return handler_set_err(hdl, -ENOMEM);
1376 new_ref->ctrl = ctrl;
1377 new_ref->from_other_dev = from_other_dev;
1378 if (size_extra_req)
1379 new_ref->p_req.p = &new_ref[1];
1380
1381 INIT_LIST_HEAD(&new_ref->node);
1382
1383 mutex_lock(hdl->lock);
1384
1385
1386
1387
1388
1389 if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
1390 list_add_tail(&new_ref->node, &hdl->ctrl_refs);
1391 goto insert_in_hash;
1392 }
1393
1394
1395 list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1396 if (ref->ctrl->id < id)
1397 continue;
1398
1399 if (ref->ctrl->id == id) {
1400 kfree(new_ref);
1401 goto unlock;
1402 }
1403 list_add(&new_ref->node, ref->node.prev);
1404 break;
1405 }
1406
1407 insert_in_hash:
1408
1409 new_ref->next = hdl->buckets[bucket];
1410 hdl->buckets[bucket] = new_ref;
1411 if (ctrl_ref)
1412 *ctrl_ref = new_ref;
1413 if (ctrl->handler == hdl) {
1414
1415
1416
1417
1418
1419 ctrl->cluster = &new_ref->ctrl;
1420 ctrl->ncontrols = 1;
1421 }
1422
1423 unlock:
1424 mutex_unlock(hdl->lock);
1425 return 0;
1426 }
1427
1428
1429 static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
1430 const struct v4l2_ctrl_ops *ops,
1431 const struct v4l2_ctrl_type_ops *type_ops,
1432 u32 id, const char *name, enum v4l2_ctrl_type type,
1433 s64 min, s64 max, u64 step, s64 def,
1434 const u32 dims[V4L2_CTRL_MAX_DIMS], u32 elem_size,
1435 u32 flags, const char * const *qmenu,
1436 const s64 *qmenu_int, const union v4l2_ctrl_ptr p_def,
1437 void *priv)
1438 {
1439 struct v4l2_ctrl *ctrl;
1440 unsigned sz_extra;
1441 unsigned nr_of_dims = 0;
1442 unsigned elems = 1;
1443 bool is_array;
1444 unsigned tot_ctrl_size;
1445 unsigned idx;
1446 void *data;
1447 int err;
1448
1449 if (hdl->error)
1450 return NULL;
1451
1452 while (dims && dims[nr_of_dims]) {
1453 elems *= dims[nr_of_dims];
1454 nr_of_dims++;
1455 if (nr_of_dims == V4L2_CTRL_MAX_DIMS)
1456 break;
1457 }
1458 is_array = nr_of_dims > 0;
1459
1460
1461 switch ((u32)type) {
1462 case V4L2_CTRL_TYPE_INTEGER64:
1463 elem_size = sizeof(s64);
1464 break;
1465 case V4L2_CTRL_TYPE_STRING:
1466 elem_size = max + 1;
1467 break;
1468 case V4L2_CTRL_TYPE_U8:
1469 elem_size = sizeof(u8);
1470 break;
1471 case V4L2_CTRL_TYPE_U16:
1472 elem_size = sizeof(u16);
1473 break;
1474 case V4L2_CTRL_TYPE_U32:
1475 elem_size = sizeof(u32);
1476 break;
1477 case V4L2_CTRL_TYPE_MPEG2_SEQUENCE:
1478 elem_size = sizeof(struct v4l2_ctrl_mpeg2_sequence);
1479 break;
1480 case V4L2_CTRL_TYPE_MPEG2_PICTURE:
1481 elem_size = sizeof(struct v4l2_ctrl_mpeg2_picture);
1482 break;
1483 case V4L2_CTRL_TYPE_MPEG2_QUANTISATION:
1484 elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantisation);
1485 break;
1486 case V4L2_CTRL_TYPE_FWHT_PARAMS:
1487 elem_size = sizeof(struct v4l2_ctrl_fwht_params);
1488 break;
1489 case V4L2_CTRL_TYPE_H264_SPS:
1490 elem_size = sizeof(struct v4l2_ctrl_h264_sps);
1491 break;
1492 case V4L2_CTRL_TYPE_H264_PPS:
1493 elem_size = sizeof(struct v4l2_ctrl_h264_pps);
1494 break;
1495 case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
1496 elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix);
1497 break;
1498 case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
1499 elem_size = sizeof(struct v4l2_ctrl_h264_slice_params);
1500 break;
1501 case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
1502 elem_size = sizeof(struct v4l2_ctrl_h264_decode_params);
1503 break;
1504 case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
1505 elem_size = sizeof(struct v4l2_ctrl_h264_pred_weights);
1506 break;
1507 case V4L2_CTRL_TYPE_VP8_FRAME:
1508 elem_size = sizeof(struct v4l2_ctrl_vp8_frame);
1509 break;
1510 case V4L2_CTRL_TYPE_HEVC_SPS:
1511 elem_size = sizeof(struct v4l2_ctrl_hevc_sps);
1512 break;
1513 case V4L2_CTRL_TYPE_HEVC_PPS:
1514 elem_size = sizeof(struct v4l2_ctrl_hevc_pps);
1515 break;
1516 case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
1517 elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params);
1518 break;
1519 case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
1520 elem_size = sizeof(struct v4l2_ctrl_hevc_scaling_matrix);
1521 break;
1522 case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
1523 elem_size = sizeof(struct v4l2_ctrl_hevc_decode_params);
1524 break;
1525 case V4L2_CTRL_TYPE_HDR10_CLL_INFO:
1526 elem_size = sizeof(struct v4l2_ctrl_hdr10_cll_info);
1527 break;
1528 case V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY:
1529 elem_size = sizeof(struct v4l2_ctrl_hdr10_mastering_display);
1530 break;
1531 case V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR:
1532 elem_size = sizeof(struct v4l2_ctrl_vp9_compressed_hdr);
1533 break;
1534 case V4L2_CTRL_TYPE_VP9_FRAME:
1535 elem_size = sizeof(struct v4l2_ctrl_vp9_frame);
1536 break;
1537 case V4L2_CTRL_TYPE_AREA:
1538 elem_size = sizeof(struct v4l2_area);
1539 break;
1540 default:
1541 if (type < V4L2_CTRL_COMPOUND_TYPES)
1542 elem_size = sizeof(s32);
1543 break;
1544 }
1545
1546
1547 if (id == 0 || name == NULL || !elem_size ||
1548 id >= V4L2_CID_PRIVATE_BASE ||
1549 (type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
1550 (type == V4L2_CTRL_TYPE_INTEGER_MENU && qmenu_int == NULL)) {
1551 handler_set_err(hdl, -ERANGE);
1552 return NULL;
1553 }
1554 err = check_range(type, min, max, step, def);
1555 if (err) {
1556 handler_set_err(hdl, err);
1557 return NULL;
1558 }
1559 if (is_array &&
1560 (type == V4L2_CTRL_TYPE_BUTTON ||
1561 type == V4L2_CTRL_TYPE_CTRL_CLASS)) {
1562 handler_set_err(hdl, -EINVAL);
1563 return NULL;
1564 }
1565 if (flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) {
1566
1567
1568
1569
1570
1571
1572 if (nr_of_dims != 1) {
1573 handler_set_err(hdl, -EINVAL);
1574 return NULL;
1575 }
1576
1577 elems = 1;
1578 }
1579
1580 tot_ctrl_size = elem_size * elems;
1581 sz_extra = 0;
1582 if (type == V4L2_CTRL_TYPE_BUTTON)
1583 flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
1584 V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
1585 else if (type == V4L2_CTRL_TYPE_CTRL_CLASS)
1586 flags |= V4L2_CTRL_FLAG_READ_ONLY;
1587 else if (!(flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) &&
1588 (type == V4L2_CTRL_TYPE_INTEGER64 ||
1589 type == V4L2_CTRL_TYPE_STRING ||
1590 type >= V4L2_CTRL_COMPOUND_TYPES ||
1591 is_array))
1592 sz_extra += 2 * tot_ctrl_size;
1593
1594 if (type >= V4L2_CTRL_COMPOUND_TYPES && p_def.p_const)
1595 sz_extra += elem_size;
1596
1597 ctrl = kvzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
1598 if (ctrl == NULL) {
1599 handler_set_err(hdl, -ENOMEM);
1600 return NULL;
1601 }
1602
1603 INIT_LIST_HEAD(&ctrl->node);
1604 INIT_LIST_HEAD(&ctrl->ev_subs);
1605 ctrl->handler = hdl;
1606 ctrl->ops = ops;
1607 ctrl->type_ops = type_ops ? type_ops : &std_type_ops;
1608 ctrl->id = id;
1609 ctrl->name = name;
1610 ctrl->type = type;
1611 ctrl->flags = flags;
1612 ctrl->minimum = min;
1613 ctrl->maximum = max;
1614 ctrl->step = step;
1615 ctrl->default_value = def;
1616 ctrl->is_string = !is_array && type == V4L2_CTRL_TYPE_STRING;
1617 ctrl->is_ptr = is_array || type >= V4L2_CTRL_COMPOUND_TYPES || ctrl->is_string;
1618 ctrl->is_int = !ctrl->is_ptr && type != V4L2_CTRL_TYPE_INTEGER64;
1619 ctrl->is_array = is_array;
1620 ctrl->is_dyn_array = !!(flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY);
1621 ctrl->elems = elems;
1622 ctrl->new_elems = elems;
1623 ctrl->nr_of_dims = nr_of_dims;
1624 if (nr_of_dims)
1625 memcpy(ctrl->dims, dims, nr_of_dims * sizeof(dims[0]));
1626 ctrl->elem_size = elem_size;
1627 if (type == V4L2_CTRL_TYPE_MENU)
1628 ctrl->qmenu = qmenu;
1629 else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
1630 ctrl->qmenu_int = qmenu_int;
1631 ctrl->priv = priv;
1632 ctrl->cur.val = ctrl->val = def;
1633 data = &ctrl[1];
1634
1635 if (ctrl->is_dyn_array) {
1636 ctrl->p_dyn_alloc_elems = elems;
1637 ctrl->p_dyn = kvzalloc(2 * elems * elem_size, GFP_KERNEL);
1638 if (!ctrl->p_dyn) {
1639 kvfree(ctrl);
1640 return NULL;
1641 }
1642 data = ctrl->p_dyn;
1643 }
1644
1645 if (!ctrl->is_int) {
1646 ctrl->p_new.p = data;
1647 ctrl->p_cur.p = data + tot_ctrl_size;
1648 } else {
1649 ctrl->p_new.p = &ctrl->val;
1650 ctrl->p_cur.p = &ctrl->cur.val;
1651 }
1652
1653 if (type >= V4L2_CTRL_COMPOUND_TYPES && p_def.p_const) {
1654 if (ctrl->is_dyn_array)
1655 ctrl->p_def.p = &ctrl[1];
1656 else
1657 ctrl->p_def.p = ctrl->p_cur.p + tot_ctrl_size;
1658 memcpy(ctrl->p_def.p, p_def.p_const, elem_size);
1659 }
1660
1661 for (idx = 0; idx < elems; idx++) {
1662 ctrl->type_ops->init(ctrl, idx, ctrl->p_cur);
1663 ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
1664 }
1665
1666 if (handler_new_ref(hdl, ctrl, NULL, false, false)) {
1667 kvfree(ctrl->p_dyn);
1668 kvfree(ctrl);
1669 return NULL;
1670 }
1671 mutex_lock(hdl->lock);
1672 list_add_tail(&ctrl->node, &hdl->ctrls);
1673 mutex_unlock(hdl->lock);
1674 return ctrl;
1675 }
1676
1677 struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
1678 const struct v4l2_ctrl_config *cfg, void *priv)
1679 {
1680 bool is_menu;
1681 struct v4l2_ctrl *ctrl;
1682 const char *name = cfg->name;
1683 const char * const *qmenu = cfg->qmenu;
1684 const s64 *qmenu_int = cfg->qmenu_int;
1685 enum v4l2_ctrl_type type = cfg->type;
1686 u32 flags = cfg->flags;
1687 s64 min = cfg->min;
1688 s64 max = cfg->max;
1689 u64 step = cfg->step;
1690 s64 def = cfg->def;
1691
1692 if (name == NULL)
1693 v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step,
1694 &def, &flags);
1695
1696 is_menu = (type == V4L2_CTRL_TYPE_MENU ||
1697 type == V4L2_CTRL_TYPE_INTEGER_MENU);
1698 if (is_menu)
1699 WARN_ON(step);
1700 else
1701 WARN_ON(cfg->menu_skip_mask);
1702 if (type == V4L2_CTRL_TYPE_MENU && !qmenu) {
1703 qmenu = v4l2_ctrl_get_menu(cfg->id);
1704 } else if (type == V4L2_CTRL_TYPE_INTEGER_MENU && !qmenu_int) {
1705 handler_set_err(hdl, -EINVAL);
1706 return NULL;
1707 }
1708
1709 ctrl = v4l2_ctrl_new(hdl, cfg->ops, cfg->type_ops, cfg->id, name,
1710 type, min, max,
1711 is_menu ? cfg->menu_skip_mask : step, def,
1712 cfg->dims, cfg->elem_size,
1713 flags, qmenu, qmenu_int, cfg->p_def, priv);
1714 if (ctrl)
1715 ctrl->is_private = cfg->is_private;
1716 return ctrl;
1717 }
1718 EXPORT_SYMBOL(v4l2_ctrl_new_custom);
1719
1720
1721 struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
1722 const struct v4l2_ctrl_ops *ops,
1723 u32 id, s64 min, s64 max, u64 step, s64 def)
1724 {
1725 const char *name;
1726 enum v4l2_ctrl_type type;
1727 u32 flags;
1728
1729 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1730 if (type == V4L2_CTRL_TYPE_MENU ||
1731 type == V4L2_CTRL_TYPE_INTEGER_MENU ||
1732 type >= V4L2_CTRL_COMPOUND_TYPES) {
1733 handler_set_err(hdl, -EINVAL);
1734 return NULL;
1735 }
1736 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
1737 min, max, step, def, NULL, 0,
1738 flags, NULL, NULL, ptr_null, NULL);
1739 }
1740 EXPORT_SYMBOL(v4l2_ctrl_new_std);
1741
1742
1743 struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
1744 const struct v4l2_ctrl_ops *ops,
1745 u32 id, u8 _max, u64 mask, u8 _def)
1746 {
1747 const char * const *qmenu = NULL;
1748 const s64 *qmenu_int = NULL;
1749 unsigned int qmenu_int_len = 0;
1750 const char *name;
1751 enum v4l2_ctrl_type type;
1752 s64 min;
1753 s64 max = _max;
1754 s64 def = _def;
1755 u64 step;
1756 u32 flags;
1757
1758 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1759
1760 if (type == V4L2_CTRL_TYPE_MENU)
1761 qmenu = v4l2_ctrl_get_menu(id);
1762 else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
1763 qmenu_int = v4l2_ctrl_get_int_menu(id, &qmenu_int_len);
1764
1765 if ((!qmenu && !qmenu_int) || (qmenu_int && max > qmenu_int_len)) {
1766 handler_set_err(hdl, -EINVAL);
1767 return NULL;
1768 }
1769 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
1770 0, max, mask, def, NULL, 0,
1771 flags, qmenu, qmenu_int, ptr_null, NULL);
1772 }
1773 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
1774
1775
1776 struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl,
1777 const struct v4l2_ctrl_ops *ops, u32 id, u8 _max,
1778 u64 mask, u8 _def, const char * const *qmenu)
1779 {
1780 enum v4l2_ctrl_type type;
1781 const char *name;
1782 u32 flags;
1783 u64 step;
1784 s64 min;
1785 s64 max = _max;
1786 s64 def = _def;
1787
1788
1789
1790
1791 if (v4l2_ctrl_get_menu(id)) {
1792 handler_set_err(hdl, -EINVAL);
1793 return NULL;
1794 }
1795
1796 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1797 if (type != V4L2_CTRL_TYPE_MENU || qmenu == NULL) {
1798 handler_set_err(hdl, -EINVAL);
1799 return NULL;
1800 }
1801 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
1802 0, max, mask, def, NULL, 0,
1803 flags, qmenu, NULL, ptr_null, NULL);
1804
1805 }
1806 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
1807
1808
1809 struct v4l2_ctrl *v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler *hdl,
1810 const struct v4l2_ctrl_ops *ops, u32 id,
1811 const union v4l2_ctrl_ptr p_def)
1812 {
1813 const char *name;
1814 enum v4l2_ctrl_type type;
1815 u32 flags;
1816 s64 min, max, step, def;
1817
1818 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1819 if (type < V4L2_CTRL_COMPOUND_TYPES) {
1820 handler_set_err(hdl, -EINVAL);
1821 return NULL;
1822 }
1823 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
1824 min, max, step, def, NULL, 0,
1825 flags, NULL, NULL, p_def, NULL);
1826 }
1827 EXPORT_SYMBOL(v4l2_ctrl_new_std_compound);
1828
1829
1830 struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
1831 const struct v4l2_ctrl_ops *ops,
1832 u32 id, u8 _max, u8 _def, const s64 *qmenu_int)
1833 {
1834 const char *name;
1835 enum v4l2_ctrl_type type;
1836 s64 min;
1837 u64 step;
1838 s64 max = _max;
1839 s64 def = _def;
1840 u32 flags;
1841
1842 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1843 if (type != V4L2_CTRL_TYPE_INTEGER_MENU) {
1844 handler_set_err(hdl, -EINVAL);
1845 return NULL;
1846 }
1847 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
1848 0, max, 0, def, NULL, 0,
1849 flags, NULL, qmenu_int, ptr_null, NULL);
1850 }
1851 EXPORT_SYMBOL(v4l2_ctrl_new_int_menu);
1852
1853
1854 int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
1855 struct v4l2_ctrl_handler *add,
1856 bool (*filter)(const struct v4l2_ctrl *ctrl),
1857 bool from_other_dev)
1858 {
1859 struct v4l2_ctrl_ref *ref;
1860 int ret = 0;
1861
1862
1863 if (!hdl || !add || hdl == add)
1864 return 0;
1865 if (hdl->error)
1866 return hdl->error;
1867 mutex_lock(add->lock);
1868 list_for_each_entry(ref, &add->ctrl_refs, node) {
1869 struct v4l2_ctrl *ctrl = ref->ctrl;
1870
1871
1872 if (ctrl->is_private)
1873 continue;
1874
1875 if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
1876 continue;
1877
1878 if (filter && !filter(ctrl))
1879 continue;
1880 ret = handler_new_ref(hdl, ctrl, NULL, from_other_dev, false);
1881 if (ret)
1882 break;
1883 }
1884 mutex_unlock(add->lock);
1885 return ret;
1886 }
1887 EXPORT_SYMBOL(v4l2_ctrl_add_handler);
1888
1889 bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl)
1890 {
1891 if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_TX)
1892 return true;
1893 if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_RX)
1894 return true;
1895 switch (ctrl->id) {
1896 case V4L2_CID_AUDIO_MUTE:
1897 case V4L2_CID_AUDIO_VOLUME:
1898 case V4L2_CID_AUDIO_BALANCE:
1899 case V4L2_CID_AUDIO_BASS:
1900 case V4L2_CID_AUDIO_TREBLE:
1901 case V4L2_CID_AUDIO_LOUDNESS:
1902 return true;
1903 default:
1904 break;
1905 }
1906 return false;
1907 }
1908 EXPORT_SYMBOL(v4l2_ctrl_radio_filter);
1909
1910
1911 void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls)
1912 {
1913 bool has_volatiles = false;
1914 int i;
1915
1916
1917 if (WARN_ON(ncontrols == 0 || controls[0] == NULL))
1918 return;
1919
1920 for (i = 0; i < ncontrols; i++) {
1921 if (controls[i]) {
1922 controls[i]->cluster = controls;
1923 controls[i]->ncontrols = ncontrols;
1924 if (controls[i]->flags & V4L2_CTRL_FLAG_VOLATILE)
1925 has_volatiles = true;
1926 }
1927 }
1928 controls[0]->has_volatiles = has_volatiles;
1929 }
1930 EXPORT_SYMBOL(v4l2_ctrl_cluster);
1931
1932 void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
1933 u8 manual_val, bool set_volatile)
1934 {
1935 struct v4l2_ctrl *master = controls[0];
1936 u32 flag = 0;
1937 int i;
1938
1939 v4l2_ctrl_cluster(ncontrols, controls);
1940 WARN_ON(ncontrols <= 1);
1941 WARN_ON(manual_val < master->minimum || manual_val > master->maximum);
1942 WARN_ON(set_volatile && !has_op(master, g_volatile_ctrl));
1943 master->is_auto = true;
1944 master->has_volatiles = set_volatile;
1945 master->manual_mode_value = manual_val;
1946 master->flags |= V4L2_CTRL_FLAG_UPDATE;
1947
1948 if (!is_cur_manual(master))
1949 flag = V4L2_CTRL_FLAG_INACTIVE |
1950 (set_volatile ? V4L2_CTRL_FLAG_VOLATILE : 0);
1951
1952 for (i = 1; i < ncontrols; i++)
1953 if (controls[i])
1954 controls[i]->flags |= flag;
1955 }
1956 EXPORT_SYMBOL(v4l2_ctrl_auto_cluster);
1957
1958
1959
1960
1961
1962 void update_from_auto_cluster(struct v4l2_ctrl *master)
1963 {
1964 int i;
1965
1966 for (i = 1; i < master->ncontrols; i++)
1967 cur_to_new(master->cluster[i]);
1968 if (!call_op(master, g_volatile_ctrl))
1969 for (i = 1; i < master->ncontrols; i++)
1970 if (master->cluster[i])
1971 master->cluster[i]->is_new = 1;
1972 }
1973
1974
1975
1976
1977
1978 static int cluster_changed(struct v4l2_ctrl *master)
1979 {
1980 bool changed = false;
1981 unsigned int idx;
1982 int i;
1983
1984 for (i = 0; i < master->ncontrols; i++) {
1985 struct v4l2_ctrl *ctrl = master->cluster[i];
1986 bool ctrl_changed = false;
1987
1988 if (!ctrl)
1989 continue;
1990
1991 if (ctrl->flags & V4L2_CTRL_FLAG_EXECUTE_ON_WRITE) {
1992 changed = true;
1993 ctrl_changed = true;
1994 }
1995
1996
1997
1998
1999
2000 if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
2001 ctrl->has_changed = false;
2002 continue;
2003 }
2004
2005 if (ctrl->elems != ctrl->new_elems)
2006 ctrl_changed = true;
2007
2008 for (idx = 0; !ctrl_changed && idx < ctrl->elems; idx++)
2009 ctrl_changed = !ctrl->type_ops->equal(ctrl, idx,
2010 ctrl->p_cur, ctrl->p_new);
2011 ctrl->has_changed = ctrl_changed;
2012 changed |= ctrl->has_changed;
2013 }
2014 return changed;
2015 }
2016
2017
2018
2019
2020
2021
2022 int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
2023 bool set, u32 ch_flags)
2024 {
2025 bool update_flag;
2026 int ret;
2027 int i;
2028
2029
2030
2031
2032
2033
2034
2035 for (i = 0; i < master->ncontrols; i++) {
2036 struct v4l2_ctrl *ctrl = master->cluster[i];
2037
2038 if (!ctrl)
2039 continue;
2040
2041 if (!ctrl->is_new) {
2042 cur_to_new(ctrl);
2043 continue;
2044 }
2045
2046
2047
2048
2049 if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
2050 return -EBUSY;
2051 }
2052
2053 ret = call_op(master, try_ctrl);
2054
2055
2056 if (ret || !set || !cluster_changed(master))
2057 return ret;
2058 ret = call_op(master, s_ctrl);
2059 if (ret)
2060 return ret;
2061
2062
2063 update_flag = is_cur_manual(master) != is_new_manual(master);
2064
2065 for (i = 0; i < master->ncontrols; i++) {
2066
2067
2068
2069
2070
2071
2072
2073 if (i && update_flag && is_new_manual(master) &&
2074 master->has_volatiles && master->cluster[i])
2075 master->cluster[i]->has_changed = true;
2076
2077 new_to_cur(fh, master->cluster[i], ch_flags |
2078 ((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
2079 }
2080 return 0;
2081 }
2082
2083
2084 void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
2085 {
2086
2087 bool inactive = !active;
2088 bool old;
2089
2090 if (ctrl == NULL)
2091 return;
2092
2093 if (inactive)
2094
2095 old = test_and_set_bit(4, &ctrl->flags);
2096 else
2097
2098 old = test_and_clear_bit(4, &ctrl->flags);
2099 if (old != inactive)
2100 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2101 }
2102 EXPORT_SYMBOL(v4l2_ctrl_activate);
2103
2104 void __v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
2105 {
2106 bool old;
2107
2108 if (ctrl == NULL)
2109 return;
2110
2111 lockdep_assert_held(ctrl->handler->lock);
2112
2113 if (grabbed)
2114
2115 old = test_and_set_bit(1, &ctrl->flags);
2116 else
2117
2118 old = test_and_clear_bit(1, &ctrl->flags);
2119 if (old != grabbed)
2120 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2121 }
2122 EXPORT_SYMBOL(__v4l2_ctrl_grab);
2123
2124
2125 int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2126 {
2127 struct v4l2_ctrl *ctrl;
2128 int ret = 0;
2129
2130 if (hdl == NULL)
2131 return 0;
2132
2133 lockdep_assert_held(hdl->lock);
2134
2135 list_for_each_entry(ctrl, &hdl->ctrls, node)
2136 ctrl->done = false;
2137
2138 list_for_each_entry(ctrl, &hdl->ctrls, node) {
2139 struct v4l2_ctrl *master = ctrl->cluster[0];
2140 int i;
2141
2142
2143
2144 if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
2145 (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
2146 continue;
2147
2148 for (i = 0; i < master->ncontrols; i++) {
2149 if (master->cluster[i]) {
2150 cur_to_new(master->cluster[i]);
2151 master->cluster[i]->is_new = 1;
2152 master->cluster[i]->done = true;
2153 }
2154 }
2155 ret = call_op(master, s_ctrl);
2156 if (ret)
2157 break;
2158 }
2159
2160 return ret;
2161 }
2162 EXPORT_SYMBOL_GPL(__v4l2_ctrl_handler_setup);
2163
2164 int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2165 {
2166 int ret;
2167
2168 if (hdl == NULL)
2169 return 0;
2170
2171 mutex_lock(hdl->lock);
2172 ret = __v4l2_ctrl_handler_setup(hdl);
2173 mutex_unlock(hdl->lock);
2174
2175 return ret;
2176 }
2177 EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
2178
2179
2180 static void log_ctrl(const struct v4l2_ctrl *ctrl,
2181 const char *prefix, const char *colon)
2182 {
2183 if (ctrl->flags & (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_WRITE_ONLY))
2184 return;
2185 if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2186 return;
2187
2188 pr_info("%s%s%s: ", prefix, colon, ctrl->name);
2189
2190 ctrl->type_ops->log(ctrl);
2191
2192 if (ctrl->flags & (V4L2_CTRL_FLAG_INACTIVE |
2193 V4L2_CTRL_FLAG_GRABBED |
2194 V4L2_CTRL_FLAG_VOLATILE)) {
2195 if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
2196 pr_cont(" inactive");
2197 if (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)
2198 pr_cont(" grabbed");
2199 if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE)
2200 pr_cont(" volatile");
2201 }
2202 pr_cont("\n");
2203 }
2204
2205
2206 void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
2207 const char *prefix)
2208 {
2209 struct v4l2_ctrl *ctrl;
2210 const char *colon = "";
2211 int len;
2212
2213 if (!hdl)
2214 return;
2215 if (!prefix)
2216 prefix = "";
2217 len = strlen(prefix);
2218 if (len && prefix[len - 1] != ' ')
2219 colon = ": ";
2220 mutex_lock(hdl->lock);
2221 list_for_each_entry(ctrl, &hdl->ctrls, node)
2222 if (!(ctrl->flags & V4L2_CTRL_FLAG_DISABLED))
2223 log_ctrl(ctrl, prefix, colon);
2224 mutex_unlock(hdl->lock);
2225 }
2226 EXPORT_SYMBOL(v4l2_ctrl_handler_log_status);
2227
2228 int v4l2_ctrl_new_fwnode_properties(struct v4l2_ctrl_handler *hdl,
2229 const struct v4l2_ctrl_ops *ctrl_ops,
2230 const struct v4l2_fwnode_device_properties *p)
2231 {
2232 if (p->orientation != V4L2_FWNODE_PROPERTY_UNSET) {
2233 u32 orientation_ctrl;
2234
2235 switch (p->orientation) {
2236 case V4L2_FWNODE_ORIENTATION_FRONT:
2237 orientation_ctrl = V4L2_CAMERA_ORIENTATION_FRONT;
2238 break;
2239 case V4L2_FWNODE_ORIENTATION_BACK:
2240 orientation_ctrl = V4L2_CAMERA_ORIENTATION_BACK;
2241 break;
2242 case V4L2_FWNODE_ORIENTATION_EXTERNAL:
2243 orientation_ctrl = V4L2_CAMERA_ORIENTATION_EXTERNAL;
2244 break;
2245 default:
2246 return -EINVAL;
2247 }
2248 if (!v4l2_ctrl_new_std_menu(hdl, ctrl_ops,
2249 V4L2_CID_CAMERA_ORIENTATION,
2250 V4L2_CAMERA_ORIENTATION_EXTERNAL, 0,
2251 orientation_ctrl))
2252 return hdl->error;
2253 }
2254
2255 if (p->rotation != V4L2_FWNODE_PROPERTY_UNSET) {
2256 if (!v4l2_ctrl_new_std(hdl, ctrl_ops,
2257 V4L2_CID_CAMERA_SENSOR_ROTATION,
2258 p->rotation, p->rotation, 1,
2259 p->rotation))
2260 return hdl->error;
2261 }
2262
2263 return hdl->error;
2264 }
2265 EXPORT_SYMBOL(v4l2_ctrl_new_fwnode_properties);