1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3     V4L2 controls framework implementation.
4 
5     Copyright (C) 2010  Hans Verkuil <hverkuil@xs4all.nl>
6 
7  */
8 
9 #define pr_fmt(fmt) "v4l2-ctrls: " fmt
10 
11 #include <linux/ctype.h>
12 #include <linux/mm.h>
13 #include <linux/slab.h>
14 #include <linux/export.h>
15 #include <media/v4l2-ioctl.h>
16 #include <media/v4l2-device.h>
17 #include <media/v4l2-ctrls.h>
18 #include <media/v4l2-event.h>
19 #include <media/v4l2-dev.h>
20 
21 #define dprintk(vdev, fmt, arg...) do {					\
22 	if (!WARN_ON(!(vdev)) && ((vdev)->dev_debug & V4L2_DEV_DEBUG_CTRL)) \
23 		printk(KERN_DEBUG pr_fmt("%s: %s: " fmt),		\
24 		       __func__, video_device_node_name(vdev), ##arg);	\
25 } while (0)
26 
27 #define has_op(master, op) \
28 	(master->ops && master->ops->op)
29 #define call_op(master, op) \
30 	(has_op(master, op) ? master->ops->op(master) : 0)
31 
32 /* Internal temporary helper struct, one for each v4l2_ext_control */
33 struct v4l2_ctrl_helper {
34 	/* Pointer to the control reference of the master control */
35 	struct v4l2_ctrl_ref *mref;
36 	/* The control ref corresponding to the v4l2_ext_control ID field. */
37 	struct v4l2_ctrl_ref *ref;
38 	/* v4l2_ext_control index of the next control belonging to the
39 	   same cluster, or 0 if there isn't any. */
40 	u32 next;
41 };
42 
43 /* Small helper function to determine if the autocluster is set to manual
44    mode. */
is_cur_manual(const struct v4l2_ctrl * master)45 static bool is_cur_manual(const struct v4l2_ctrl *master)
46 {
47 	return master->is_auto && master->cur.val == master->manual_mode_value;
48 }
49 
50 /* Same as above, but this checks the against the new value instead of the
51    current value. */
is_new_manual(const struct v4l2_ctrl * master)52 static bool is_new_manual(const struct v4l2_ctrl *master)
53 {
54 	return master->is_auto && master->val == master->manual_mode_value;
55 }
56 
57 /* Returns NULL or a character pointer array containing the menu for
58    the given control ID. The pointer array ends with a NULL pointer.
59    An empty string signifies a menu entry that is invalid. This allows
60    drivers to disable certain options if it is not supported. */
v4l2_ctrl_get_menu(u32 id)61 const char * const *v4l2_ctrl_get_menu(u32 id)
62 {
63 	static const char * const mpeg_audio_sampling_freq[] = {
64 		"44.1 kHz",
65 		"48 kHz",
66 		"32 kHz",
67 		NULL
68 	};
69 	static const char * const mpeg_audio_encoding[] = {
70 		"MPEG-1/2 Layer I",
71 		"MPEG-1/2 Layer II",
72 		"MPEG-1/2 Layer III",
73 		"MPEG-2/4 AAC",
74 		"AC-3",
75 		NULL
76 	};
77 	static const char * const mpeg_audio_l1_bitrate[] = {
78 		"32 kbps",
79 		"64 kbps",
80 		"96 kbps",
81 		"128 kbps",
82 		"160 kbps",
83 		"192 kbps",
84 		"224 kbps",
85 		"256 kbps",
86 		"288 kbps",
87 		"320 kbps",
88 		"352 kbps",
89 		"384 kbps",
90 		"416 kbps",
91 		"448 kbps",
92 		NULL
93 	};
94 	static const char * const mpeg_audio_l2_bitrate[] = {
95 		"32 kbps",
96 		"48 kbps",
97 		"56 kbps",
98 		"64 kbps",
99 		"80 kbps",
100 		"96 kbps",
101 		"112 kbps",
102 		"128 kbps",
103 		"160 kbps",
104 		"192 kbps",
105 		"224 kbps",
106 		"256 kbps",
107 		"320 kbps",
108 		"384 kbps",
109 		NULL
110 	};
111 	static const char * const mpeg_audio_l3_bitrate[] = {
112 		"32 kbps",
113 		"40 kbps",
114 		"48 kbps",
115 		"56 kbps",
116 		"64 kbps",
117 		"80 kbps",
118 		"96 kbps",
119 		"112 kbps",
120 		"128 kbps",
121 		"160 kbps",
122 		"192 kbps",
123 		"224 kbps",
124 		"256 kbps",
125 		"320 kbps",
126 		NULL
127 	};
128 	static const char * const mpeg_audio_ac3_bitrate[] = {
129 		"32 kbps",
130 		"40 kbps",
131 		"48 kbps",
132 		"56 kbps",
133 		"64 kbps",
134 		"80 kbps",
135 		"96 kbps",
136 		"112 kbps",
137 		"128 kbps",
138 		"160 kbps",
139 		"192 kbps",
140 		"224 kbps",
141 		"256 kbps",
142 		"320 kbps",
143 		"384 kbps",
144 		"448 kbps",
145 		"512 kbps",
146 		"576 kbps",
147 		"640 kbps",
148 		NULL
149 	};
150 	static const char * const mpeg_audio_mode[] = {
151 		"Stereo",
152 		"Joint Stereo",
153 		"Dual",
154 		"Mono",
155 		NULL
156 	};
157 	static const char * const mpeg_audio_mode_extension[] = {
158 		"Bound 4",
159 		"Bound 8",
160 		"Bound 12",
161 		"Bound 16",
162 		NULL
163 	};
164 	static const char * const mpeg_audio_emphasis[] = {
165 		"No Emphasis",
166 		"50/15 us",
167 		"CCITT J17",
168 		NULL
169 	};
170 	static const char * const mpeg_audio_crc[] = {
171 		"No CRC",
172 		"16-bit CRC",
173 		NULL
174 	};
175 	static const char * const mpeg_audio_dec_playback[] = {
176 		"Auto",
177 		"Stereo",
178 		"Left",
179 		"Right",
180 		"Mono",
181 		"Swapped Stereo",
182 		NULL
183 	};
184 	static const char * const mpeg_video_encoding[] = {
185 		"MPEG-1",
186 		"MPEG-2",
187 		"MPEG-4 AVC",
188 		NULL
189 	};
190 	static const char * const mpeg_video_aspect[] = {
191 		"1x1",
192 		"4x3",
193 		"16x9",
194 		"2.21x1",
195 		NULL
196 	};
197 	static const char * const mpeg_video_bitrate_mode[] = {
198 		"Variable Bitrate",
199 		"Constant Bitrate",
200 		NULL
201 	};
202 	static const char * const mpeg_stream_type[] = {
203 		"MPEG-2 Program Stream",
204 		"MPEG-2 Transport Stream",
205 		"MPEG-1 System Stream",
206 		"MPEG-2 DVD-compatible Stream",
207 		"MPEG-1 VCD-compatible Stream",
208 		"MPEG-2 SVCD-compatible Stream",
209 		NULL
210 	};
211 	static const char * const mpeg_stream_vbi_fmt[] = {
212 		"No VBI",
213 		"Private Packet, IVTV Format",
214 		NULL
215 	};
216 	static const char * const camera_power_line_frequency[] = {
217 		"Disabled",
218 		"50 Hz",
219 		"60 Hz",
220 		"Auto",
221 		NULL
222 	};
223 	static const char * const camera_exposure_auto[] = {
224 		"Auto Mode",
225 		"Manual Mode",
226 		"Shutter Priority Mode",
227 		"Aperture Priority Mode",
228 		NULL
229 	};
230 	static const char * const camera_exposure_metering[] = {
231 		"Average",
232 		"Center Weighted",
233 		"Spot",
234 		"Matrix",
235 		NULL
236 	};
237 	static const char * const camera_auto_focus_range[] = {
238 		"Auto",
239 		"Normal",
240 		"Macro",
241 		"Infinity",
242 		NULL
243 	};
244 	static const char * const colorfx[] = {
245 		"None",
246 		"Black & White",
247 		"Sepia",
248 		"Negative",
249 		"Emboss",
250 		"Sketch",
251 		"Sky Blue",
252 		"Grass Green",
253 		"Skin Whiten",
254 		"Vivid",
255 		"Aqua",
256 		"Art Freeze",
257 		"Silhouette",
258 		"Solarization",
259 		"Antique",
260 		"Set Cb/Cr",
261 		NULL
262 	};
263 	static const char * const auto_n_preset_white_balance[] = {
264 		"Manual",
265 		"Auto",
266 		"Incandescent",
267 		"Fluorescent",
268 		"Fluorescent H",
269 		"Horizon",
270 		"Daylight",
271 		"Flash",
272 		"Cloudy",
273 		"Shade",
274 		NULL,
275 	};
276 	static const char * const camera_iso_sensitivity_auto[] = {
277 		"Manual",
278 		"Auto",
279 		NULL
280 	};
281 	static const char * const scene_mode[] = {
282 		"None",
283 		"Backlight",
284 		"Beach/Snow",
285 		"Candle Light",
286 		"Dusk/Dawn",
287 		"Fall Colors",
288 		"Fireworks",
289 		"Landscape",
290 		"Night",
291 		"Party/Indoor",
292 		"Portrait",
293 		"Sports",
294 		"Sunset",
295 		"Text",
296 		NULL
297 	};
298 	static const char * const tune_emphasis[] = {
299 		"None",
300 		"50 Microseconds",
301 		"75 Microseconds",
302 		NULL,
303 	};
304 	static const char * const header_mode[] = {
305 		"Separate Buffer",
306 		"Joined With 1st Frame",
307 		NULL,
308 	};
309 	static const char * const multi_slice[] = {
310 		"Single",
311 		"Max Macroblocks",
312 		"Max Bytes",
313 		NULL,
314 	};
315 	static const char * const entropy_mode[] = {
316 		"CAVLC",
317 		"CABAC",
318 		NULL,
319 	};
320 	static const char * const mpeg_h264_level[] = {
321 		"1",
322 		"1b",
323 		"1.1",
324 		"1.2",
325 		"1.3",
326 		"2",
327 		"2.1",
328 		"2.2",
329 		"3",
330 		"3.1",
331 		"3.2",
332 		"4",
333 		"4.1",
334 		"4.2",
335 		"5",
336 		"5.1",
337 		NULL,
338 	};
339 	static const char * const h264_loop_filter[] = {
340 		"Enabled",
341 		"Disabled",
342 		"Disabled at Slice Boundary",
343 		NULL,
344 	};
345 	static const char * const h264_profile[] = {
346 		"Baseline",
347 		"Constrained Baseline",
348 		"Main",
349 		"Extended",
350 		"High",
351 		"High 10",
352 		"High 422",
353 		"High 444 Predictive",
354 		"High 10 Intra",
355 		"High 422 Intra",
356 		"High 444 Intra",
357 		"CAVLC 444 Intra",
358 		"Scalable Baseline",
359 		"Scalable High",
360 		"Scalable High Intra",
361 		"Stereo High",
362 		"Multiview High",
363 		NULL,
364 	};
365 	static const char * const vui_sar_idc[] = {
366 		"Unspecified",
367 		"1:1",
368 		"12:11",
369 		"10:11",
370 		"16:11",
371 		"40:33",
372 		"24:11",
373 		"20:11",
374 		"32:11",
375 		"80:33",
376 		"18:11",
377 		"15:11",
378 		"64:33",
379 		"160:99",
380 		"4:3",
381 		"3:2",
382 		"2:1",
383 		"Extended SAR",
384 		NULL,
385 	};
386 	static const char * const h264_fp_arrangement_type[] = {
387 		"Checkerboard",
388 		"Column",
389 		"Row",
390 		"Side by Side",
391 		"Top Bottom",
392 		"Temporal",
393 		NULL,
394 	};
395 	static const char * const h264_fmo_map_type[] = {
396 		"Interleaved Slices",
397 		"Scattered Slices",
398 		"Foreground with Leftover",
399 		"Box Out",
400 		"Raster Scan",
401 		"Wipe Scan",
402 		"Explicit",
403 		NULL,
404 	};
405 	static const char * const h264_decode_mode[] = {
406 		"Slice-Based",
407 		"Frame-Based",
408 		NULL,
409 	};
410 	static const char * const h264_start_code[] = {
411 		"No Start Code",
412 		"Annex B Start Code",
413 		NULL,
414 	};
415 	static const char * const mpeg_mpeg2_level[] = {
416 		"Low",
417 		"Main",
418 		"High 1440",
419 		"High",
420 		NULL,
421 	};
422 	static const char * const mpeg2_profile[] = {
423 		"Simple",
424 		"Main",
425 		"SNR Scalable",
426 		"Spatially Scalable",
427 		"High",
428 		NULL,
429 	};
430 	static const char * const mpeg_mpeg4_level[] = {
431 		"0",
432 		"0b",
433 		"1",
434 		"2",
435 		"3",
436 		"3b",
437 		"4",
438 		"5",
439 		NULL,
440 	};
441 	static const char * const mpeg4_profile[] = {
442 		"Simple",
443 		"Advanced Simple",
444 		"Core",
445 		"Simple Scalable",
446 		"Advanced Coding Efficiency",
447 		NULL,
448 	};
449 
450 	static const char * const vpx_golden_frame_sel[] = {
451 		"Use Previous Frame",
452 		"Use Previous Specific Frame",
453 		NULL,
454 	};
455 	static const char * const vp8_profile[] = {
456 		"0",
457 		"1",
458 		"2",
459 		"3",
460 		NULL,
461 	};
462 	static const char * const vp9_profile[] = {
463 		"0",
464 		"1",
465 		"2",
466 		"3",
467 		NULL,
468 	};
469 
470 	static const char * const flash_led_mode[] = {
471 		"Off",
472 		"Flash",
473 		"Torch",
474 		NULL,
475 	};
476 	static const char * const flash_strobe_source[] = {
477 		"Software",
478 		"External",
479 		NULL,
480 	};
481 
482 	static const char * const jpeg_chroma_subsampling[] = {
483 		"4:4:4",
484 		"4:2:2",
485 		"4:2:0",
486 		"4:1:1",
487 		"4:1:0",
488 		"Gray",
489 		NULL,
490 	};
491 	static const char * const dv_tx_mode[] = {
492 		"DVI-D",
493 		"HDMI",
494 		NULL,
495 	};
496 	static const char * const dv_rgb_range[] = {
497 		"Automatic",
498 		"RGB Limited Range (16-235)",
499 		"RGB Full Range (0-255)",
500 		NULL,
501 	};
502 	static const char * const dv_it_content_type[] = {
503 		"Graphics",
504 		"Photo",
505 		"Cinema",
506 		"Game",
507 		"No IT Content",
508 		NULL,
509 	};
510 	static const char * const detect_md_mode[] = {
511 		"Disabled",
512 		"Global",
513 		"Threshold Grid",
514 		"Region Grid",
515 		NULL,
516 	};
517 
518 	static const char * const hevc_profile[] = {
519 		"Main",
520 		"Main Still Picture",
521 		"Main 10",
522 		NULL,
523 	};
524 	static const char * const hevc_level[] = {
525 		"1",
526 		"2",
527 		"2.1",
528 		"3",
529 		"3.1",
530 		"4",
531 		"4.1",
532 		"5",
533 		"5.1",
534 		"5.2",
535 		"6",
536 		"6.1",
537 		"6.2",
538 		NULL,
539 	};
540 	static const char * const hevc_hierarchial_coding_type[] = {
541 		"B",
542 		"P",
543 		NULL,
544 	};
545 	static const char * const hevc_refresh_type[] = {
546 		"None",
547 		"CRA",
548 		"IDR",
549 		NULL,
550 	};
551 	static const char * const hevc_size_of_length_field[] = {
552 		"0",
553 		"1",
554 		"2",
555 		"4",
556 		NULL,
557 	};
558 	static const char * const hevc_tier[] = {
559 		"Main",
560 		"High",
561 		NULL,
562 	};
563 	static const char * const hevc_loop_filter_mode[] = {
564 		"Disabled",
565 		"Enabled",
566 		"Disabled at slice boundary",
567 		"NULL",
568 	};
569 
570 	switch (id) {
571 	case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
572 		return mpeg_audio_sampling_freq;
573 	case V4L2_CID_MPEG_AUDIO_ENCODING:
574 		return mpeg_audio_encoding;
575 	case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
576 		return mpeg_audio_l1_bitrate;
577 	case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
578 		return mpeg_audio_l2_bitrate;
579 	case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
580 		return mpeg_audio_l3_bitrate;
581 	case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
582 		return mpeg_audio_ac3_bitrate;
583 	case V4L2_CID_MPEG_AUDIO_MODE:
584 		return mpeg_audio_mode;
585 	case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
586 		return mpeg_audio_mode_extension;
587 	case V4L2_CID_MPEG_AUDIO_EMPHASIS:
588 		return mpeg_audio_emphasis;
589 	case V4L2_CID_MPEG_AUDIO_CRC:
590 		return mpeg_audio_crc;
591 	case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
592 	case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
593 		return mpeg_audio_dec_playback;
594 	case V4L2_CID_MPEG_VIDEO_ENCODING:
595 		return mpeg_video_encoding;
596 	case V4L2_CID_MPEG_VIDEO_ASPECT:
597 		return mpeg_video_aspect;
598 	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
599 		return mpeg_video_bitrate_mode;
600 	case V4L2_CID_MPEG_STREAM_TYPE:
601 		return mpeg_stream_type;
602 	case V4L2_CID_MPEG_STREAM_VBI_FMT:
603 		return mpeg_stream_vbi_fmt;
604 	case V4L2_CID_POWER_LINE_FREQUENCY:
605 		return camera_power_line_frequency;
606 	case V4L2_CID_EXPOSURE_AUTO:
607 		return camera_exposure_auto;
608 	case V4L2_CID_EXPOSURE_METERING:
609 		return camera_exposure_metering;
610 	case V4L2_CID_AUTO_FOCUS_RANGE:
611 		return camera_auto_focus_range;
612 	case V4L2_CID_COLORFX:
613 		return colorfx;
614 	case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
615 		return auto_n_preset_white_balance;
616 	case V4L2_CID_ISO_SENSITIVITY_AUTO:
617 		return camera_iso_sensitivity_auto;
618 	case V4L2_CID_SCENE_MODE:
619 		return scene_mode;
620 	case V4L2_CID_TUNE_PREEMPHASIS:
621 		return tune_emphasis;
622 	case V4L2_CID_TUNE_DEEMPHASIS:
623 		return tune_emphasis;
624 	case V4L2_CID_FLASH_LED_MODE:
625 		return flash_led_mode;
626 	case V4L2_CID_FLASH_STROBE_SOURCE:
627 		return flash_strobe_source;
628 	case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
629 		return header_mode;
630 	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
631 		return multi_slice;
632 	case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
633 		return entropy_mode;
634 	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
635 		return mpeg_h264_level;
636 	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
637 		return h264_loop_filter;
638 	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
639 		return h264_profile;
640 	case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
641 		return vui_sar_idc;
642 	case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:
643 		return h264_fp_arrangement_type;
644 	case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
645 		return h264_fmo_map_type;
646 	case V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE:
647 		return h264_decode_mode;
648 	case V4L2_CID_MPEG_VIDEO_H264_START_CODE:
649 		return h264_start_code;
650 	case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:
651 		return mpeg_mpeg2_level;
652 	case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:
653 		return mpeg2_profile;
654 	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
655 		return mpeg_mpeg4_level;
656 	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
657 		return mpeg4_profile;
658 	case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:
659 		return vpx_golden_frame_sel;
660 	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
661 		return vp8_profile;
662 	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
663 		return vp9_profile;
664 	case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
665 		return jpeg_chroma_subsampling;
666 	case V4L2_CID_DV_TX_MODE:
667 		return dv_tx_mode;
668 	case V4L2_CID_DV_TX_RGB_RANGE:
669 	case V4L2_CID_DV_RX_RGB_RANGE:
670 		return dv_rgb_range;
671 	case V4L2_CID_DV_TX_IT_CONTENT_TYPE:
672 	case V4L2_CID_DV_RX_IT_CONTENT_TYPE:
673 		return dv_it_content_type;
674 	case V4L2_CID_DETECT_MD_MODE:
675 		return detect_md_mode;
676 	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
677 		return hevc_profile;
678 	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
679 		return hevc_level;
680 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
681 		return hevc_hierarchial_coding_type;
682 	case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE:
683 		return hevc_refresh_type;
684 	case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
685 		return hevc_size_of_length_field;
686 	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
687 		return hevc_tier;
688 	case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
689 		return hevc_loop_filter_mode;
690 
691 	default:
692 		return NULL;
693 	}
694 }
695 EXPORT_SYMBOL(v4l2_ctrl_get_menu);
696 
697 #define __v4l2_qmenu_int_len(arr, len) ({ *(len) = ARRAY_SIZE(arr); arr; })
698 /*
699  * Returns NULL or an s64 type array containing the menu for given
700  * control ID. The total number of the menu items is returned in @len.
701  */
v4l2_ctrl_get_int_menu(u32 id,u32 * len)702 const s64 *v4l2_ctrl_get_int_menu(u32 id, u32 *len)
703 {
704 	static const s64 qmenu_int_vpx_num_partitions[] = {
705 		1, 2, 4, 8,
706 	};
707 
708 	static const s64 qmenu_int_vpx_num_ref_frames[] = {
709 		1, 2, 3,
710 	};
711 
712 	switch (id) {
713 	case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:
714 		return __v4l2_qmenu_int_len(qmenu_int_vpx_num_partitions, len);
715 	case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:
716 		return __v4l2_qmenu_int_len(qmenu_int_vpx_num_ref_frames, len);
717 	default:
718 		*len = 0;
719 		return NULL;
720 	}
721 }
722 EXPORT_SYMBOL(v4l2_ctrl_get_int_menu);
723 
724 /* Return the control name. */
v4l2_ctrl_get_name(u32 id)725 const char *v4l2_ctrl_get_name(u32 id)
726 {
727 	switch (id) {
728 	/* USER controls */
729 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
730 	case V4L2_CID_USER_CLASS:		return "User Controls";
731 	case V4L2_CID_BRIGHTNESS:		return "Brightness";
732 	case V4L2_CID_CONTRAST:			return "Contrast";
733 	case V4L2_CID_SATURATION:		return "Saturation";
734 	case V4L2_CID_HUE:			return "Hue";
735 	case V4L2_CID_AUDIO_VOLUME:		return "Volume";
736 	case V4L2_CID_AUDIO_BALANCE:		return "Balance";
737 	case V4L2_CID_AUDIO_BASS:		return "Bass";
738 	case V4L2_CID_AUDIO_TREBLE:		return "Treble";
739 	case V4L2_CID_AUDIO_MUTE:		return "Mute";
740 	case V4L2_CID_AUDIO_LOUDNESS:		return "Loudness";
741 	case V4L2_CID_BLACK_LEVEL:		return "Black Level";
742 	case V4L2_CID_AUTO_WHITE_BALANCE:	return "White Balance, Automatic";
743 	case V4L2_CID_DO_WHITE_BALANCE:		return "Do White Balance";
744 	case V4L2_CID_RED_BALANCE:		return "Red Balance";
745 	case V4L2_CID_BLUE_BALANCE:		return "Blue Balance";
746 	case V4L2_CID_GAMMA:			return "Gamma";
747 	case V4L2_CID_EXPOSURE:			return "Exposure";
748 	case V4L2_CID_AUTOGAIN:			return "Gain, Automatic";
749 	case V4L2_CID_GAIN:			return "Gain";
750 	case V4L2_CID_HFLIP:			return "Horizontal Flip";
751 	case V4L2_CID_VFLIP:			return "Vertical Flip";
752 	case V4L2_CID_POWER_LINE_FREQUENCY:	return "Power Line Frequency";
753 	case V4L2_CID_HUE_AUTO:			return "Hue, Automatic";
754 	case V4L2_CID_WHITE_BALANCE_TEMPERATURE: return "White Balance Temperature";
755 	case V4L2_CID_SHARPNESS:		return "Sharpness";
756 	case V4L2_CID_BACKLIGHT_COMPENSATION:	return "Backlight Compensation";
757 	case V4L2_CID_CHROMA_AGC:		return "Chroma AGC";
758 	case V4L2_CID_COLOR_KILLER:		return "Color Killer";
759 	case V4L2_CID_COLORFX:			return "Color Effects";
760 	case V4L2_CID_AUTOBRIGHTNESS:		return "Brightness, Automatic";
761 	case V4L2_CID_BAND_STOP_FILTER:		return "Band-Stop Filter";
762 	case V4L2_CID_ROTATE:			return "Rotate";
763 	case V4L2_CID_BG_COLOR:			return "Background Color";
764 	case V4L2_CID_CHROMA_GAIN:		return "Chroma Gain";
765 	case V4L2_CID_ILLUMINATORS_1:		return "Illuminator 1";
766 	case V4L2_CID_ILLUMINATORS_2:		return "Illuminator 2";
767 	case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:	return "Min Number of Capture Buffers";
768 	case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:	return "Min Number of Output Buffers";
769 	case V4L2_CID_ALPHA_COMPONENT:		return "Alpha Component";
770 	case V4L2_CID_COLORFX_CBCR:		return "Color Effects, CbCr";
771 
772 	/* Codec controls */
773 	/* The MPEG controls are applicable to all codec controls
774 	 * and the 'MPEG' part of the define is historical */
775 	/* Keep the order of the 'case's the same as in videodev2.h! */
776 	case V4L2_CID_MPEG_CLASS:		return "Codec Controls";
777 	case V4L2_CID_MPEG_STREAM_TYPE:		return "Stream Type";
778 	case V4L2_CID_MPEG_STREAM_PID_PMT:	return "Stream PMT Program ID";
779 	case V4L2_CID_MPEG_STREAM_PID_AUDIO:	return "Stream Audio Program ID";
780 	case V4L2_CID_MPEG_STREAM_PID_VIDEO:	return "Stream Video Program ID";
781 	case V4L2_CID_MPEG_STREAM_PID_PCR:	return "Stream PCR Program ID";
782 	case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: return "Stream PES Audio ID";
783 	case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: return "Stream PES Video ID";
784 	case V4L2_CID_MPEG_STREAM_VBI_FMT:	return "Stream VBI Format";
785 	case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: return "Audio Sampling Frequency";
786 	case V4L2_CID_MPEG_AUDIO_ENCODING:	return "Audio Encoding";
787 	case V4L2_CID_MPEG_AUDIO_L1_BITRATE:	return "Audio Layer I Bitrate";
788 	case V4L2_CID_MPEG_AUDIO_L2_BITRATE:	return "Audio Layer II Bitrate";
789 	case V4L2_CID_MPEG_AUDIO_L3_BITRATE:	return "Audio Layer III Bitrate";
790 	case V4L2_CID_MPEG_AUDIO_MODE:		return "Audio Stereo Mode";
791 	case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: return "Audio Stereo Mode Extension";
792 	case V4L2_CID_MPEG_AUDIO_EMPHASIS:	return "Audio Emphasis";
793 	case V4L2_CID_MPEG_AUDIO_CRC:		return "Audio CRC";
794 	case V4L2_CID_MPEG_AUDIO_MUTE:		return "Audio Mute";
795 	case V4L2_CID_MPEG_AUDIO_AAC_BITRATE:	return "Audio AAC Bitrate";
796 	case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:	return "Audio AC-3 Bitrate";
797 	case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:	return "Audio Playback";
798 	case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK: return "Audio Multilingual Playback";
799 	case V4L2_CID_MPEG_VIDEO_ENCODING:	return "Video Encoding";
800 	case V4L2_CID_MPEG_VIDEO_ASPECT:	return "Video Aspect";
801 	case V4L2_CID_MPEG_VIDEO_B_FRAMES:	return "Video B Frames";
802 	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:	return "Video GOP Size";
803 	case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:	return "Video GOP Closure";
804 	case V4L2_CID_MPEG_VIDEO_PULLDOWN:	return "Video Pulldown";
805 	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:	return "Video Bitrate Mode";
806 	case V4L2_CID_MPEG_VIDEO_BITRATE:	return "Video Bitrate";
807 	case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:	return "Video Peak Bitrate";
808 	case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: return "Video Temporal Decimation";
809 	case V4L2_CID_MPEG_VIDEO_MUTE:		return "Video Mute";
810 	case V4L2_CID_MPEG_VIDEO_MUTE_YUV:	return "Video Mute YUV";
811 	case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:	return "Decoder Slice Interface";
812 	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:	return "MPEG4 Loop Filter Enable";
813 	case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB:	return "Number of Intra Refresh MBs";
814 	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:		return "Frame Level Rate Control Enable";
815 	case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:			return "H264 MB Level Rate Control";
816 	case V4L2_CID_MPEG_VIDEO_HEADER_MODE:			return "Sequence Header Mode";
817 	case V4L2_CID_MPEG_VIDEO_MAX_REF_PIC:			return "Max Number of Reference Pics";
818 	case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP:		return "H263 I-Frame QP Value";
819 	case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP:		return "H263 P-Frame QP Value";
820 	case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP:		return "H263 B-Frame QP Value";
821 	case V4L2_CID_MPEG_VIDEO_H263_MIN_QP:			return "H263 Minimum QP Value";
822 	case V4L2_CID_MPEG_VIDEO_H263_MAX_QP:			return "H263 Maximum QP Value";
823 	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:		return "H264 I-Frame QP Value";
824 	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:		return "H264 P-Frame QP Value";
825 	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:		return "H264 B-Frame QP Value";
826 	case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:			return "H264 Maximum QP Value";
827 	case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:			return "H264 Minimum QP Value";
828 	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:		return "H264 8x8 Transform Enable";
829 	case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE:			return "H264 CPB Buffer Size";
830 	case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:		return "H264 Entropy Mode";
831 	case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD:			return "H264 I-Frame Period";
832 	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:			return "H264 Level";
833 	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:	return "H264 Loop Filter Alpha Offset";
834 	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:		return "H264 Loop Filter Beta Offset";
835 	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:		return "H264 Loop Filter Mode";
836 	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:			return "H264 Profile";
837 	case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT:	return "Vertical Size of SAR";
838 	case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH:	return "Horizontal Size of SAR";
839 	case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:		return "Aspect Ratio VUI Enable";
840 	case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:		return "VUI Aspect Ratio IDC";
841 	case V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING:	return "H264 Enable Frame Packing SEI";
842 	case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0:	return "H264 Set Curr. Frame as Frame0";
843 	case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:	return "H264 FP Arrangement Type";
844 	case V4L2_CID_MPEG_VIDEO_H264_FMO:			return "H264 Flexible MB Ordering";
845 	case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:		return "H264 Map Type for FMO";
846 	case V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP:		return "H264 FMO Number of Slice Groups";
847 	case V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION:	return "H264 FMO Direction of Change";
848 	case V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE:		return "H264 FMO Size of 1st Slice Grp";
849 	case V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH:		return "H264 FMO No. of Consecutive MBs";
850 	case V4L2_CID_MPEG_VIDEO_H264_ASO:			return "H264 Arbitrary Slice Ordering";
851 	case V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER:		return "H264 ASO Slice Order";
852 	case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING:	return "Enable H264 Hierarchical Coding";
853 	case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE:	return "H264 Hierarchical Coding Type";
854 	case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:return "H264 Number of HC Layers";
855 	case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP:
856 								return "H264 Set QP Value for HC Layers";
857 	case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION:
858 								return "H264 Constrained Intra Pred";
859 	case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET:	return "H264 Chroma QP Index Offset";
860 	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP:		return "H264 I-Frame Minimum QP Value";
861 	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:		return "H264 I-Frame Maximum QP Value";
862 	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:		return "H264 P-Frame Minimum QP Value";
863 	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:		return "H264 P-Frame Maximum QP Value";
864 	case V4L2_CID_MPEG_VIDEO_H264_SPS:			return "H264 Sequence Parameter Set";
865 	case V4L2_CID_MPEG_VIDEO_H264_PPS:			return "H264 Picture Parameter Set";
866 	case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:		return "H264 Scaling Matrix";
867 	case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS:		return "H264 Slice Parameters";
868 	case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS:		return "H264 Decode Parameters";
869 	case V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE:		return "H264 Decode Mode";
870 	case V4L2_CID_MPEG_VIDEO_H264_START_CODE:		return "H264 Start Code";
871 	case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:			return "MPEG2 Level";
872 	case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:			return "MPEG2 Profile";
873 	case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP:		return "MPEG4 I-Frame QP Value";
874 	case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP:		return "MPEG4 P-Frame QP Value";
875 	case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP:		return "MPEG4 B-Frame QP Value";
876 	case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP:			return "MPEG4 Minimum QP Value";
877 	case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP:			return "MPEG4 Maximum QP Value";
878 	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:			return "MPEG4 Level";
879 	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:			return "MPEG4 Profile";
880 	case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:			return "Quarter Pixel Search Enable";
881 	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:		return "Maximum Bytes in a Slice";
882 	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:		return "Number of MBs in a Slice";
883 	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:		return "Slice Partitioning Method";
884 	case V4L2_CID_MPEG_VIDEO_VBV_SIZE:			return "VBV Buffer Size";
885 	case V4L2_CID_MPEG_VIDEO_DEC_PTS:			return "Video Decoder PTS";
886 	case V4L2_CID_MPEG_VIDEO_DEC_FRAME:			return "Video Decoder Frame Count";
887 	case V4L2_CID_MPEG_VIDEO_VBV_DELAY:			return "Initial Delay for VBV Control";
888 	case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE:		return "Horizontal MV Search Range";
889 	case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE:		return "Vertical MV Search Range";
890 	case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER:		return "Repeat Sequence Header";
891 	case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:		return "Force Key Frame";
892 	case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:		return "MPEG-2 Slice Parameters";
893 	case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:		return "MPEG-2 Quantization Matrices";
894 	case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS:			return "FWHT Stateless Parameters";
895 	case V4L2_CID_FWHT_I_FRAME_QP:				return "FWHT I-Frame QP Value";
896 	case V4L2_CID_FWHT_P_FRAME_QP:				return "FWHT P-Frame QP Value";
897 
898 	/* VPX controls */
899 	case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:		return "VPX Number of Partitions";
900 	case V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4:		return "VPX Intra Mode Decision Disable";
901 	case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:		return "VPX No. of Refs for P Frame";
902 	case V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL:		return "VPX Loop Filter Level Range";
903 	case V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS:		return "VPX Deblocking Effect Control";
904 	case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD:	return "VPX Golden Frame Refresh Period";
905 	case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:		return "VPX Golden Frame Indicator";
906 	case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP:			return "VPX Minimum QP Value";
907 	case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP:			return "VPX Maximum QP Value";
908 	case V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP:		return "VPX I-Frame QP Value";
909 	case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP:		return "VPX P-Frame QP Value";
910 	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:			return "VP8 Profile";
911 	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:			return "VP9 Profile";
912 	case V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER:		return "VP8 Frame Header";
913 
914 	/* HEVC controls */
915 	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:		return "HEVC I-Frame QP Value";
916 	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:		return "HEVC P-Frame QP Value";
917 	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:		return "HEVC B-Frame QP Value";
918 	case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:			return "HEVC Minimum QP Value";
919 	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:			return "HEVC Maximum QP Value";
920 	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:			return "HEVC Profile";
921 	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:			return "HEVC Level";
922 	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:			return "HEVC Tier";
923 	case V4L2_CID_MPEG_VIDEO_HEVC_FRAME_RATE_RESOLUTION:	return "HEVC Frame Rate Resolution";
924 	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_PARTITION_DEPTH:	return "HEVC Maximum Coding Unit Depth";
925 	case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE:		return "HEVC Refresh Type";
926 	case V4L2_CID_MPEG_VIDEO_HEVC_CONST_INTRA_PRED:		return "HEVC Constant Intra Prediction";
927 	case V4L2_CID_MPEG_VIDEO_HEVC_LOSSLESS_CU:		return "HEVC Lossless Encoding";
928 	case V4L2_CID_MPEG_VIDEO_HEVC_WAVEFRONT:		return "HEVC Wavefront";
929 	case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:		return "HEVC Loop Filter";
930 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP:			return "HEVC QP Values";
931 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:		return "HEVC Hierarchical Coding Type";
932 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER:	return "HEVC Hierarchical Coding Layer";
933 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP:	return "HEVC Hierarchical Layer 0 QP";
934 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP:	return "HEVC Hierarchical Layer 1 QP";
935 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP:	return "HEVC Hierarchical Layer 2 QP";
936 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP:	return "HEVC Hierarchical Layer 3 QP";
937 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP:	return "HEVC Hierarchical Layer 4 QP";
938 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP:	return "HEVC Hierarchical Layer 5 QP";
939 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_QP:	return "HEVC Hierarchical Layer 6 QP";
940 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR:	return "HEVC Hierarchical Lay 0 BitRate";
941 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR:	return "HEVC Hierarchical Lay 1 BitRate";
942 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR:	return "HEVC Hierarchical Lay 2 BitRate";
943 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR:	return "HEVC Hierarchical Lay 3 BitRate";
944 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR:	return "HEVC Hierarchical Lay 4 BitRate";
945 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR:	return "HEVC Hierarchical Lay 5 BitRate";
946 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR:	return "HEVC Hierarchical Lay 6 BitRate";
947 	case V4L2_CID_MPEG_VIDEO_HEVC_GENERAL_PB:		return "HEVC General PB";
948 	case V4L2_CID_MPEG_VIDEO_HEVC_TEMPORAL_ID:		return "HEVC Temporal ID";
949 	case V4L2_CID_MPEG_VIDEO_HEVC_STRONG_SMOOTHING:		return "HEVC Strong Intra Smoothing";
950 	case V4L2_CID_MPEG_VIDEO_HEVC_INTRA_PU_SPLIT:		return "HEVC Intra PU Split";
951 	case V4L2_CID_MPEG_VIDEO_HEVC_TMV_PREDICTION:		return "HEVC TMV Prediction";
952 	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_NUM_MERGE_MV_MINUS1:	return "HEVC Max Num of Candidate MVs";
953 	case V4L2_CID_MPEG_VIDEO_HEVC_WITHOUT_STARTCODE:	return "HEVC ENC Without Startcode";
954 	case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_PERIOD:		return "HEVC Num of I-Frame b/w 2 IDR";
955 	case V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2:	return "HEVC Loop Filter Beta Offset";
956 	case V4L2_CID_MPEG_VIDEO_HEVC_LF_TC_OFFSET_DIV2:	return "HEVC Loop Filter TC Offset";
957 	case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:	return "HEVC Size of Length Field";
958 	case V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES:	return "Reference Frames for a P-Frame";
959 	case V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR:		return "Prepend SPS and PPS to IDR";
960 
961 	/* CAMERA controls */
962 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
963 	case V4L2_CID_CAMERA_CLASS:		return "Camera Controls";
964 	case V4L2_CID_EXPOSURE_AUTO:		return "Auto Exposure";
965 	case V4L2_CID_EXPOSURE_ABSOLUTE:	return "Exposure Time, Absolute";
966 	case V4L2_CID_EXPOSURE_AUTO_PRIORITY:	return "Exposure, Dynamic Framerate";
967 	case V4L2_CID_PAN_RELATIVE:		return "Pan, Relative";
968 	case V4L2_CID_TILT_RELATIVE:		return "Tilt, Relative";
969 	case V4L2_CID_PAN_RESET:		return "Pan, Reset";
970 	case V4L2_CID_TILT_RESET:		return "Tilt, Reset";
971 	case V4L2_CID_PAN_ABSOLUTE:		return "Pan, Absolute";
972 	case V4L2_CID_TILT_ABSOLUTE:		return "Tilt, Absolute";
973 	case V4L2_CID_FOCUS_ABSOLUTE:		return "Focus, Absolute";
974 	case V4L2_CID_FOCUS_RELATIVE:		return "Focus, Relative";
975 	case V4L2_CID_FOCUS_AUTO:		return "Focus, Automatic Continuous";
976 	case V4L2_CID_ZOOM_ABSOLUTE:		return "Zoom, Absolute";
977 	case V4L2_CID_ZOOM_RELATIVE:		return "Zoom, Relative";
978 	case V4L2_CID_ZOOM_CONTINUOUS:		return "Zoom, Continuous";
979 	case V4L2_CID_PRIVACY:			return "Privacy";
980 	case V4L2_CID_IRIS_ABSOLUTE:		return "Iris, Absolute";
981 	case V4L2_CID_IRIS_RELATIVE:		return "Iris, Relative";
982 	case V4L2_CID_AUTO_EXPOSURE_BIAS:	return "Auto Exposure, Bias";
983 	case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: return "White Balance, Auto & Preset";
984 	case V4L2_CID_WIDE_DYNAMIC_RANGE:	return "Wide Dynamic Range";
985 	case V4L2_CID_IMAGE_STABILIZATION:	return "Image Stabilization";
986 	case V4L2_CID_ISO_SENSITIVITY:		return "ISO Sensitivity";
987 	case V4L2_CID_ISO_SENSITIVITY_AUTO:	return "ISO Sensitivity, Auto";
988 	case V4L2_CID_EXPOSURE_METERING:	return "Exposure, Metering Mode";
989 	case V4L2_CID_SCENE_MODE:		return "Scene Mode";
990 	case V4L2_CID_3A_LOCK:			return "3A Lock";
991 	case V4L2_CID_AUTO_FOCUS_START:		return "Auto Focus, Start";
992 	case V4L2_CID_AUTO_FOCUS_STOP:		return "Auto Focus, Stop";
993 	case V4L2_CID_AUTO_FOCUS_STATUS:	return "Auto Focus, Status";
994 	case V4L2_CID_AUTO_FOCUS_RANGE:		return "Auto Focus, Range";
995 	case V4L2_CID_PAN_SPEED:		return "Pan, Speed";
996 	case V4L2_CID_TILT_SPEED:		return "Tilt, Speed";
997 
998 	/* FM Radio Modulator controls */
999 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
1000 	case V4L2_CID_FM_TX_CLASS:		return "FM Radio Modulator Controls";
1001 	case V4L2_CID_RDS_TX_DEVIATION:		return "RDS Signal Deviation";
1002 	case V4L2_CID_RDS_TX_PI:		return "RDS Program ID";
1003 	case V4L2_CID_RDS_TX_PTY:		return "RDS Program Type";
1004 	case V4L2_CID_RDS_TX_PS_NAME:		return "RDS PS Name";
1005 	case V4L2_CID_RDS_TX_RADIO_TEXT:	return "RDS Radio Text";
1006 	case V4L2_CID_RDS_TX_MONO_STEREO:	return "RDS Stereo";
1007 	case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:	return "RDS Artificial Head";
1008 	case V4L2_CID_RDS_TX_COMPRESSED:	return "RDS Compressed";
1009 	case V4L2_CID_RDS_TX_DYNAMIC_PTY:	return "RDS Dynamic PTY";
1010 	case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT: return "RDS Traffic Announcement";
1011 	case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:	return "RDS Traffic Program";
1012 	case V4L2_CID_RDS_TX_MUSIC_SPEECH:	return "RDS Music";
1013 	case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:	return "RDS Enable Alt Frequencies";
1014 	case V4L2_CID_RDS_TX_ALT_FREQS:		return "RDS Alternate Frequencies";
1015 	case V4L2_CID_AUDIO_LIMITER_ENABLED:	return "Audio Limiter Feature Enabled";
1016 	case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME: return "Audio Limiter Release Time";
1017 	case V4L2_CID_AUDIO_LIMITER_DEVIATION:	return "Audio Limiter Deviation";
1018 	case V4L2_CID_AUDIO_COMPRESSION_ENABLED: return "Audio Compression Enabled";
1019 	case V4L2_CID_AUDIO_COMPRESSION_GAIN:	return "Audio Compression Gain";
1020 	case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD: return "Audio Compression Threshold";
1021 	case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME: return "Audio Compression Attack Time";
1022 	case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME: return "Audio Compression Release Time";
1023 	case V4L2_CID_PILOT_TONE_ENABLED:	return "Pilot Tone Feature Enabled";
1024 	case V4L2_CID_PILOT_TONE_DEVIATION:	return "Pilot Tone Deviation";
1025 	case V4L2_CID_PILOT_TONE_FREQUENCY:	return "Pilot Tone Frequency";
1026 	case V4L2_CID_TUNE_PREEMPHASIS:		return "Pre-Emphasis";
1027 	case V4L2_CID_TUNE_POWER_LEVEL:		return "Tune Power Level";
1028 	case V4L2_CID_TUNE_ANTENNA_CAPACITOR:	return "Tune Antenna Capacitor";
1029 
1030 	/* Flash controls */
1031 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
1032 	case V4L2_CID_FLASH_CLASS:		return "Flash Controls";
1033 	case V4L2_CID_FLASH_LED_MODE:		return "LED Mode";
1034 	case V4L2_CID_FLASH_STROBE_SOURCE:	return "Strobe Source";
1035 	case V4L2_CID_FLASH_STROBE:		return "Strobe";
1036 	case V4L2_CID_FLASH_STROBE_STOP:	return "Stop Strobe";
1037 	case V4L2_CID_FLASH_STROBE_STATUS:	return "Strobe Status";
1038 	case V4L2_CID_FLASH_TIMEOUT:		return "Strobe Timeout";
1039 	case V4L2_CID_FLASH_INTENSITY:		return "Intensity, Flash Mode";
1040 	case V4L2_CID_FLASH_TORCH_INTENSITY:	return "Intensity, Torch Mode";
1041 	case V4L2_CID_FLASH_INDICATOR_INTENSITY: return "Intensity, Indicator";
1042 	case V4L2_CID_FLASH_FAULT:		return "Faults";
1043 	case V4L2_CID_FLASH_CHARGE:		return "Charge";
1044 	case V4L2_CID_FLASH_READY:		return "Ready to Strobe";
1045 
1046 	/* JPEG encoder controls */
1047 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
1048 	case V4L2_CID_JPEG_CLASS:		return "JPEG Compression Controls";
1049 	case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:	return "Chroma Subsampling";
1050 	case V4L2_CID_JPEG_RESTART_INTERVAL:	return "Restart Interval";
1051 	case V4L2_CID_JPEG_COMPRESSION_QUALITY:	return "Compression Quality";
1052 	case V4L2_CID_JPEG_ACTIVE_MARKER:	return "Active Markers";
1053 
1054 	/* Image source controls */
1055 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
1056 	case V4L2_CID_IMAGE_SOURCE_CLASS:	return "Image Source Controls";
1057 	case V4L2_CID_VBLANK:			return "Vertical Blanking";
1058 	case V4L2_CID_HBLANK:			return "Horizontal Blanking";
1059 	case V4L2_CID_ANALOGUE_GAIN:		return "Analogue Gain";
1060 	case V4L2_CID_TEST_PATTERN_RED:		return "Red Pixel Value";
1061 	case V4L2_CID_TEST_PATTERN_GREENR:	return "Green (Red) Pixel Value";
1062 	case V4L2_CID_TEST_PATTERN_BLUE:	return "Blue Pixel Value";
1063 	case V4L2_CID_TEST_PATTERN_GREENB:	return "Green (Blue) Pixel Value";
1064 
1065 	/* Image processing controls */
1066 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
1067 	case V4L2_CID_IMAGE_PROC_CLASS:		return "Image Processing Controls";
1068 	case V4L2_CID_LINK_FREQ:		return "Link Frequency";
1069 	case V4L2_CID_PIXEL_RATE:		return "Pixel Rate";
1070 	case V4L2_CID_TEST_PATTERN:		return "Test Pattern";
1071 	case V4L2_CID_DEINTERLACING_MODE:	return "Deinterlacing Mode";
1072 	case V4L2_CID_DIGITAL_GAIN:		return "Digital Gain";
1073 
1074 	/* DV controls */
1075 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
1076 	case V4L2_CID_DV_CLASS:			return "Digital Video Controls";
1077 	case V4L2_CID_DV_TX_HOTPLUG:		return "Hotplug Present";
1078 	case V4L2_CID_DV_TX_RXSENSE:		return "RxSense Present";
1079 	case V4L2_CID_DV_TX_EDID_PRESENT:	return "EDID Present";
1080 	case V4L2_CID_DV_TX_MODE:		return "Transmit Mode";
1081 	case V4L2_CID_DV_TX_RGB_RANGE:		return "Tx RGB Quantization Range";
1082 	case V4L2_CID_DV_TX_IT_CONTENT_TYPE:	return "Tx IT Content Type";
1083 	case V4L2_CID_DV_RX_POWER_PRESENT:	return "Power Present";
1084 	case V4L2_CID_DV_RX_RGB_RANGE:		return "Rx RGB Quantization Range";
1085 	case V4L2_CID_DV_RX_IT_CONTENT_TYPE:	return "Rx IT Content Type";
1086 
1087 	case V4L2_CID_FM_RX_CLASS:		return "FM Radio Receiver Controls";
1088 	case V4L2_CID_TUNE_DEEMPHASIS:		return "De-Emphasis";
1089 	case V4L2_CID_RDS_RECEPTION:		return "RDS Reception";
1090 	case V4L2_CID_RF_TUNER_CLASS:		return "RF Tuner Controls";
1091 	case V4L2_CID_RF_TUNER_RF_GAIN:		return "RF Gain";
1092 	case V4L2_CID_RF_TUNER_LNA_GAIN_AUTO:	return "LNA Gain, Auto";
1093 	case V4L2_CID_RF_TUNER_LNA_GAIN:	return "LNA Gain";
1094 	case V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO:	return "Mixer Gain, Auto";
1095 	case V4L2_CID_RF_TUNER_MIXER_GAIN:	return "Mixer Gain";
1096 	case V4L2_CID_RF_TUNER_IF_GAIN_AUTO:	return "IF Gain, Auto";
1097 	case V4L2_CID_RF_TUNER_IF_GAIN:		return "IF Gain";
1098 	case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:	return "Bandwidth, Auto";
1099 	case V4L2_CID_RF_TUNER_BANDWIDTH:	return "Bandwidth";
1100 	case V4L2_CID_RF_TUNER_PLL_LOCK:	return "PLL Lock";
1101 	case V4L2_CID_RDS_RX_PTY:		return "RDS Program Type";
1102 	case V4L2_CID_RDS_RX_PS_NAME:		return "RDS PS Name";
1103 	case V4L2_CID_RDS_RX_RADIO_TEXT:	return "RDS Radio Text";
1104 	case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT: return "RDS Traffic Announcement";
1105 	case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:	return "RDS Traffic Program";
1106 	case V4L2_CID_RDS_RX_MUSIC_SPEECH:	return "RDS Music";
1107 
1108 	/* Detection controls */
1109 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
1110 	case V4L2_CID_DETECT_CLASS:		return "Detection Controls";
1111 	case V4L2_CID_DETECT_MD_MODE:		return "Motion Detection Mode";
1112 	case V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD: return "MD Global Threshold";
1113 	case V4L2_CID_DETECT_MD_THRESHOLD_GRID:	return "MD Threshold Grid";
1114 	case V4L2_CID_DETECT_MD_REGION_GRID:	return "MD Region Grid";
1115 	default:
1116 		return NULL;
1117 	}
1118 }
1119 EXPORT_SYMBOL(v4l2_ctrl_get_name);
1120 
v4l2_ctrl_fill(u32 id,const char ** name,enum v4l2_ctrl_type * type,s64 * min,s64 * max,u64 * step,s64 * def,u32 * flags)1121 void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
1122 		    s64 *min, s64 *max, u64 *step, s64 *def, u32 *flags)
1123 {
1124 	*name = v4l2_ctrl_get_name(id);
1125 	*flags = 0;
1126 
1127 	switch (id) {
1128 	case V4L2_CID_AUDIO_MUTE:
1129 	case V4L2_CID_AUDIO_LOUDNESS:
1130 	case V4L2_CID_AUTO_WHITE_BALANCE:
1131 	case V4L2_CID_AUTOGAIN:
1132 	case V4L2_CID_HFLIP:
1133 	case V4L2_CID_VFLIP:
1134 	case V4L2_CID_HUE_AUTO:
1135 	case V4L2_CID_CHROMA_AGC:
1136 	case V4L2_CID_COLOR_KILLER:
1137 	case V4L2_CID_AUTOBRIGHTNESS:
1138 	case V4L2_CID_MPEG_AUDIO_MUTE:
1139 	case V4L2_CID_MPEG_VIDEO_MUTE:
1140 	case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
1141 	case V4L2_CID_MPEG_VIDEO_PULLDOWN:
1142 	case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
1143 	case V4L2_CID_FOCUS_AUTO:
1144 	case V4L2_CID_PRIVACY:
1145 	case V4L2_CID_AUDIO_LIMITER_ENABLED:
1146 	case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
1147 	case V4L2_CID_PILOT_TONE_ENABLED:
1148 	case V4L2_CID_ILLUMINATORS_1:
1149 	case V4L2_CID_ILLUMINATORS_2:
1150 	case V4L2_CID_FLASH_STROBE_STATUS:
1151 	case V4L2_CID_FLASH_CHARGE:
1152 	case V4L2_CID_FLASH_READY:
1153 	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
1154 	case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
1155 	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
1156 	case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
1157 	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
1158 	case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:
1159 	case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:
1160 	case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER:
1161 	case V4L2_CID_WIDE_DYNAMIC_RANGE:
1162 	case V4L2_CID_IMAGE_STABILIZATION:
1163 	case V4L2_CID_RDS_RECEPTION:
1164 	case V4L2_CID_RF_TUNER_LNA_GAIN_AUTO:
1165 	case V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO:
1166 	case V4L2_CID_RF_TUNER_IF_GAIN_AUTO:
1167 	case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:
1168 	case V4L2_CID_RF_TUNER_PLL_LOCK:
1169 	case V4L2_CID_RDS_TX_MONO_STEREO:
1170 	case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:
1171 	case V4L2_CID_RDS_TX_COMPRESSED:
1172 	case V4L2_CID_RDS_TX_DYNAMIC_PTY:
1173 	case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT:
1174 	case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:
1175 	case V4L2_CID_RDS_TX_MUSIC_SPEECH:
1176 	case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:
1177 	case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT:
1178 	case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:
1179 	case V4L2_CID_RDS_RX_MUSIC_SPEECH:
1180 		*type = V4L2_CTRL_TYPE_BOOLEAN;
1181 		*min = 0;
1182 		*max = *step = 1;
1183 		break;
1184 	case V4L2_CID_ROTATE:
1185 		*type = V4L2_CTRL_TYPE_INTEGER;
1186 		*flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
1187 		break;
1188 	case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE:
1189 	case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE:
1190 		*type = V4L2_CTRL_TYPE_INTEGER;
1191 		break;
1192 	case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:
1193 	case V4L2_CID_PAN_RESET:
1194 	case V4L2_CID_TILT_RESET:
1195 	case V4L2_CID_FLASH_STROBE:
1196 	case V4L2_CID_FLASH_STROBE_STOP:
1197 	case V4L2_CID_AUTO_FOCUS_START:
1198 	case V4L2_CID_AUTO_FOCUS_STOP:
1199 	case V4L2_CID_DO_WHITE_BALANCE:
1200 		*type = V4L2_CTRL_TYPE_BUTTON;
1201 		*flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
1202 			  V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
1203 		*min = *max = *step = *def = 0;
1204 		break;
1205 	case V4L2_CID_POWER_LINE_FREQUENCY:
1206 	case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1207 	case V4L2_CID_MPEG_AUDIO_ENCODING:
1208 	case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1209 	case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1210 	case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1211 	case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
1212 	case V4L2_CID_MPEG_AUDIO_MODE:
1213 	case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1214 	case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1215 	case V4L2_CID_MPEG_AUDIO_CRC:
1216 	case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
1217 	case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
1218 	case V4L2_CID_MPEG_VIDEO_ENCODING:
1219 	case V4L2_CID_MPEG_VIDEO_ASPECT:
1220 	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1221 	case V4L2_CID_MPEG_STREAM_TYPE:
1222 	case V4L2_CID_MPEG_STREAM_VBI_FMT:
1223 	case V4L2_CID_EXPOSURE_AUTO:
1224 	case V4L2_CID_AUTO_FOCUS_RANGE:
1225 	case V4L2_CID_COLORFX:
1226 	case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
1227 	case V4L2_CID_TUNE_PREEMPHASIS:
1228 	case V4L2_CID_FLASH_LED_MODE:
1229 	case V4L2_CID_FLASH_STROBE_SOURCE:
1230 	case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
1231 	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
1232 	case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
1233 	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
1234 	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
1235 	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
1236 	case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
1237 	case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:
1238 	case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
1239 	case V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE:
1240 	case V4L2_CID_MPEG_VIDEO_H264_START_CODE:
1241 	case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:
1242 	case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:
1243 	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
1244 	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
1245 	case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
1246 	case V4L2_CID_ISO_SENSITIVITY_AUTO:
1247 	case V4L2_CID_EXPOSURE_METERING:
1248 	case V4L2_CID_SCENE_MODE:
1249 	case V4L2_CID_DV_TX_MODE:
1250 	case V4L2_CID_DV_TX_RGB_RANGE:
1251 	case V4L2_CID_DV_TX_IT_CONTENT_TYPE:
1252 	case V4L2_CID_DV_RX_RGB_RANGE:
1253 	case V4L2_CID_DV_RX_IT_CONTENT_TYPE:
1254 	case V4L2_CID_TEST_PATTERN:
1255 	case V4L2_CID_DEINTERLACING_MODE:
1256 	case V4L2_CID_TUNE_DEEMPHASIS:
1257 	case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:
1258 	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
1259 	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
1260 	case V4L2_CID_DETECT_MD_MODE:
1261 	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
1262 	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
1263 	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
1264 	case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE:
1265 	case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
1266 	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
1267 	case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
1268 		*type = V4L2_CTRL_TYPE_MENU;
1269 		break;
1270 	case V4L2_CID_LINK_FREQ:
1271 		*type = V4L2_CTRL_TYPE_INTEGER_MENU;
1272 		break;
1273 	case V4L2_CID_RDS_TX_PS_NAME:
1274 	case V4L2_CID_RDS_TX_RADIO_TEXT:
1275 	case V4L2_CID_RDS_RX_PS_NAME:
1276 	case V4L2_CID_RDS_RX_RADIO_TEXT:
1277 		*type = V4L2_CTRL_TYPE_STRING;
1278 		break;
1279 	case V4L2_CID_ISO_SENSITIVITY:
1280 	case V4L2_CID_AUTO_EXPOSURE_BIAS:
1281 	case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:
1282 	case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:
1283 		*type = V4L2_CTRL_TYPE_INTEGER_MENU;
1284 		break;
1285 	case V4L2_CID_USER_CLASS:
1286 	case V4L2_CID_CAMERA_CLASS:
1287 	case V4L2_CID_MPEG_CLASS:
1288 	case V4L2_CID_FM_TX_CLASS:
1289 	case V4L2_CID_FLASH_CLASS:
1290 	case V4L2_CID_JPEG_CLASS:
1291 	case V4L2_CID_IMAGE_SOURCE_CLASS:
1292 	case V4L2_CID_IMAGE_PROC_CLASS:
1293 	case V4L2_CID_DV_CLASS:
1294 	case V4L2_CID_FM_RX_CLASS:
1295 	case V4L2_CID_RF_TUNER_CLASS:
1296 	case V4L2_CID_DETECT_CLASS:
1297 		*type = V4L2_CTRL_TYPE_CTRL_CLASS;
1298 		/* You can neither read not write these */
1299 		*flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY;
1300 		*min = *max = *step = *def = 0;
1301 		break;
1302 	case V4L2_CID_BG_COLOR:
1303 		*type = V4L2_CTRL_TYPE_INTEGER;
1304 		*step = 1;
1305 		*min = 0;
1306 		/* Max is calculated as RGB888 that is 2^24 */
1307 		*max = 0xFFFFFF;
1308 		break;
1309 	case V4L2_CID_FLASH_FAULT:
1310 	case V4L2_CID_JPEG_ACTIVE_MARKER:
1311 	case V4L2_CID_3A_LOCK:
1312 	case V4L2_CID_AUTO_FOCUS_STATUS:
1313 	case V4L2_CID_DV_TX_HOTPLUG:
1314 	case V4L2_CID_DV_TX_RXSENSE:
1315 	case V4L2_CID_DV_TX_EDID_PRESENT:
1316 	case V4L2_CID_DV_RX_POWER_PRESENT:
1317 		*type = V4L2_CTRL_TYPE_BITMASK;
1318 		break;
1319 	case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
1320 	case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
1321 		*type = V4L2_CTRL_TYPE_INTEGER;
1322 		*flags |= V4L2_CTRL_FLAG_READ_ONLY;
1323 		break;
1324 	case V4L2_CID_MPEG_VIDEO_DEC_PTS:
1325 		*type = V4L2_CTRL_TYPE_INTEGER64;
1326 		*flags |= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY;
1327 		*min = *def = 0;
1328 		*max = 0x1ffffffffLL;
1329 		*step = 1;
1330 		break;
1331 	case V4L2_CID_MPEG_VIDEO_DEC_FRAME:
1332 		*type = V4L2_CTRL_TYPE_INTEGER64;
1333 		*flags |= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY;
1334 		*min = *def = 0;
1335 		*max = 0x7fffffffffffffffLL;
1336 		*step = 1;
1337 		break;
1338 	case V4L2_CID_PIXEL_RATE:
1339 		*type = V4L2_CTRL_TYPE_INTEGER64;
1340 		*flags |= V4L2_CTRL_FLAG_READ_ONLY;
1341 		break;
1342 	case V4L2_CID_DETECT_MD_REGION_GRID:
1343 		*type = V4L2_CTRL_TYPE_U8;
1344 		break;
1345 	case V4L2_CID_DETECT_MD_THRESHOLD_GRID:
1346 		*type = V4L2_CTRL_TYPE_U16;
1347 		break;
1348 	case V4L2_CID_RDS_TX_ALT_FREQS:
1349 		*type = V4L2_CTRL_TYPE_U32;
1350 		break;
1351 	case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:
1352 		*type = V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS;
1353 		break;
1354 	case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:
1355 		*type = V4L2_CTRL_TYPE_MPEG2_QUANTIZATION;
1356 		break;
1357 	case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS:
1358 		*type = V4L2_CTRL_TYPE_FWHT_PARAMS;
1359 		break;
1360 	case V4L2_CID_MPEG_VIDEO_H264_SPS:
1361 		*type = V4L2_CTRL_TYPE_H264_SPS;
1362 		break;
1363 	case V4L2_CID_MPEG_VIDEO_H264_PPS:
1364 		*type = V4L2_CTRL_TYPE_H264_PPS;
1365 		break;
1366 	case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:
1367 		*type = V4L2_CTRL_TYPE_H264_SCALING_MATRIX;
1368 		break;
1369 	case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS:
1370 		*type = V4L2_CTRL_TYPE_H264_SLICE_PARAMS;
1371 		break;
1372 	case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS:
1373 		*type = V4L2_CTRL_TYPE_H264_DECODE_PARAMS;
1374 		break;
1375 	case V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER:
1376 		*type = V4L2_CTRL_TYPE_VP8_FRAME_HEADER;
1377 		break;
1378 	default:
1379 		*type = V4L2_CTRL_TYPE_INTEGER;
1380 		break;
1381 	}
1382 	switch (id) {
1383 	case V4L2_CID_MPEG_AUDIO_ENCODING:
1384 	case V4L2_CID_MPEG_AUDIO_MODE:
1385 	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1386 	case V4L2_CID_MPEG_VIDEO_B_FRAMES:
1387 	case V4L2_CID_MPEG_STREAM_TYPE:
1388 		*flags |= V4L2_CTRL_FLAG_UPDATE;
1389 		break;
1390 	case V4L2_CID_AUDIO_VOLUME:
1391 	case V4L2_CID_AUDIO_BALANCE:
1392 	case V4L2_CID_AUDIO_BASS:
1393 	case V4L2_CID_AUDIO_TREBLE:
1394 	case V4L2_CID_BRIGHTNESS:
1395 	case V4L2_CID_CONTRAST:
1396 	case V4L2_CID_SATURATION:
1397 	case V4L2_CID_HUE:
1398 	case V4L2_CID_RED_BALANCE:
1399 	case V4L2_CID_BLUE_BALANCE:
1400 	case V4L2_CID_GAMMA:
1401 	case V4L2_CID_SHARPNESS:
1402 	case V4L2_CID_CHROMA_GAIN:
1403 	case V4L2_CID_RDS_TX_DEVIATION:
1404 	case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
1405 	case V4L2_CID_AUDIO_LIMITER_DEVIATION:
1406 	case V4L2_CID_AUDIO_COMPRESSION_GAIN:
1407 	case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
1408 	case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
1409 	case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
1410 	case V4L2_CID_PILOT_TONE_DEVIATION:
1411 	case V4L2_CID_PILOT_TONE_FREQUENCY:
1412 	case V4L2_CID_TUNE_POWER_LEVEL:
1413 	case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1414 	case V4L2_CID_RF_TUNER_RF_GAIN:
1415 	case V4L2_CID_RF_TUNER_LNA_GAIN:
1416 	case V4L2_CID_RF_TUNER_MIXER_GAIN:
1417 	case V4L2_CID_RF_TUNER_IF_GAIN:
1418 	case V4L2_CID_RF_TUNER_BANDWIDTH:
1419 	case V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD:
1420 		*flags |= V4L2_CTRL_FLAG_SLIDER;
1421 		break;
1422 	case V4L2_CID_PAN_RELATIVE:
1423 	case V4L2_CID_TILT_RELATIVE:
1424 	case V4L2_CID_FOCUS_RELATIVE:
1425 	case V4L2_CID_IRIS_RELATIVE:
1426 	case V4L2_CID_ZOOM_RELATIVE:
1427 		*flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
1428 			  V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
1429 		break;
1430 	case V4L2_CID_FLASH_STROBE_STATUS:
1431 	case V4L2_CID_AUTO_FOCUS_STATUS:
1432 	case V4L2_CID_FLASH_READY:
1433 	case V4L2_CID_DV_TX_HOTPLUG:
1434 	case V4L2_CID_DV_TX_RXSENSE:
1435 	case V4L2_CID_DV_TX_EDID_PRESENT:
1436 	case V4L2_CID_DV_RX_POWER_PRESENT:
1437 	case V4L2_CID_DV_RX_IT_CONTENT_TYPE:
1438 	case V4L2_CID_RDS_RX_PTY:
1439 	case V4L2_CID_RDS_RX_PS_NAME:
1440 	case V4L2_CID_RDS_RX_RADIO_TEXT:
1441 	case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT:
1442 	case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:
1443 	case V4L2_CID_RDS_RX_MUSIC_SPEECH:
1444 		*flags |= V4L2_CTRL_FLAG_READ_ONLY;
1445 		break;
1446 	case V4L2_CID_RF_TUNER_PLL_LOCK:
1447 		*flags |= V4L2_CTRL_FLAG_VOLATILE;
1448 		break;
1449 	}
1450 }
1451 EXPORT_SYMBOL(v4l2_ctrl_fill);
1452 
user_flags(const struct v4l2_ctrl * ctrl)1453 static u32 user_flags(const struct v4l2_ctrl *ctrl)
1454 {
1455 	u32 flags = ctrl->flags;
1456 
1457 	if (ctrl->is_ptr)
1458 		flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
1459 
1460 	return flags;
1461 }
1462 
fill_event(struct v4l2_event * ev,struct v4l2_ctrl * ctrl,u32 changes)1463 static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes)
1464 {
1465 	memset(ev, 0, sizeof(*ev));
1466 	ev->type = V4L2_EVENT_CTRL;
1467 	ev->id = ctrl->id;
1468 	ev->u.ctrl.changes = changes;
1469 	ev->u.ctrl.type = ctrl->type;
1470 	ev->u.ctrl.flags = user_flags(ctrl);
1471 	if (ctrl->is_ptr)
1472 		ev->u.ctrl.value64 = 0;
1473 	else
1474 		ev->u.ctrl.value64 = *ctrl->p_cur.p_s64;
1475 	ev->u.ctrl.minimum = ctrl->minimum;
1476 	ev->u.ctrl.maximum = ctrl->maximum;
1477 	if (ctrl->type == V4L2_CTRL_TYPE_MENU
1478 	    || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
1479 		ev->u.ctrl.step = 1;
1480 	else
1481 		ev->u.ctrl.step = ctrl->step;
1482 	ev->u.ctrl.default_value = ctrl->default_value;
1483 }
1484 
send_event(struct v4l2_fh * fh,struct v4l2_ctrl * ctrl,u32 changes)1485 static void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
1486 {
1487 	struct v4l2_event ev;
1488 	struct v4l2_subscribed_event *sev;
1489 
1490 	if (list_empty(&ctrl->ev_subs))
1491 		return;
1492 	fill_event(&ev, ctrl, changes);
1493 
1494 	list_for_each_entry(sev, &ctrl->ev_subs, node)
1495 		if (sev->fh != fh ||
1496 		    (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
1497 			v4l2_event_queue_fh(sev->fh, &ev);
1498 }
1499 
std_equal(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr1,union v4l2_ctrl_ptr ptr2)1500 static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx,
1501 		      union v4l2_ctrl_ptr ptr1,
1502 		      union v4l2_ctrl_ptr ptr2)
1503 {
1504 	switch (ctrl->type) {
1505 	case V4L2_CTRL_TYPE_BUTTON:
1506 		return false;
1507 	case V4L2_CTRL_TYPE_STRING:
1508 		idx *= ctrl->elem_size;
1509 		/* strings are always 0-terminated */
1510 		return !strcmp(ptr1.p_char + idx, ptr2.p_char + idx);
1511 	case V4L2_CTRL_TYPE_INTEGER64:
1512 		return ptr1.p_s64[idx] == ptr2.p_s64[idx];
1513 	case V4L2_CTRL_TYPE_U8:
1514 		return ptr1.p_u8[idx] == ptr2.p_u8[idx];
1515 	case V4L2_CTRL_TYPE_U16:
1516 		return ptr1.p_u16[idx] == ptr2.p_u16[idx];
1517 	case V4L2_CTRL_TYPE_U32:
1518 		return ptr1.p_u32[idx] == ptr2.p_u32[idx];
1519 	default:
1520 		if (ctrl->is_int)
1521 			return ptr1.p_s32[idx] == ptr2.p_s32[idx];
1522 		idx *= ctrl->elem_size;
1523 		return !memcmp(ptr1.p + idx, ptr2.p + idx, ctrl->elem_size);
1524 	}
1525 }
1526 
std_init_compound(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)1527 static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
1528 			      union v4l2_ctrl_ptr ptr)
1529 {
1530 	struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
1531 	void *p = ptr.p + idx * ctrl->elem_size;
1532 
1533 	memset(p, 0, ctrl->elem_size);
1534 
1535 	/*
1536 	 * The cast is needed to get rid of a gcc warning complaining that
1537 	 * V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS is not part of the
1538 	 * v4l2_ctrl_type enum.
1539 	 */
1540 	switch ((u32)ctrl->type) {
1541 	case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
1542 		p_mpeg2_slice_params = p;
1543 		/* 4:2:0 */
1544 		p_mpeg2_slice_params->sequence.chroma_format = 1;
1545 		/* interlaced top field */
1546 		p_mpeg2_slice_params->picture.picture_structure = 1;
1547 		p_mpeg2_slice_params->picture.picture_coding_type =
1548 					V4L2_MPEG2_PICTURE_CODING_TYPE_I;
1549 		break;
1550 	}
1551 }
1552 
std_init(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)1553 static void std_init(const struct v4l2_ctrl *ctrl, u32 idx,
1554 		     union v4l2_ctrl_ptr ptr)
1555 {
1556 	switch (ctrl->type) {
1557 	case V4L2_CTRL_TYPE_STRING:
1558 		idx *= ctrl->elem_size;
1559 		memset(ptr.p_char + idx, ' ', ctrl->minimum);
1560 		ptr.p_char[idx + ctrl->minimum] = '\0';
1561 		break;
1562 	case V4L2_CTRL_TYPE_INTEGER64:
1563 		ptr.p_s64[idx] = ctrl->default_value;
1564 		break;
1565 	case V4L2_CTRL_TYPE_INTEGER:
1566 	case V4L2_CTRL_TYPE_INTEGER_MENU:
1567 	case V4L2_CTRL_TYPE_MENU:
1568 	case V4L2_CTRL_TYPE_BITMASK:
1569 	case V4L2_CTRL_TYPE_BOOLEAN:
1570 		ptr.p_s32[idx] = ctrl->default_value;
1571 		break;
1572 	case V4L2_CTRL_TYPE_BUTTON:
1573 	case V4L2_CTRL_TYPE_CTRL_CLASS:
1574 		ptr.p_s32[idx] = 0;
1575 		break;
1576 	case V4L2_CTRL_TYPE_U8:
1577 		ptr.p_u8[idx] = ctrl->default_value;
1578 		break;
1579 	case V4L2_CTRL_TYPE_U16:
1580 		ptr.p_u16[idx] = ctrl->default_value;
1581 		break;
1582 	case V4L2_CTRL_TYPE_U32:
1583 		ptr.p_u32[idx] = ctrl->default_value;
1584 		break;
1585 	default:
1586 		std_init_compound(ctrl, idx, ptr);
1587 		break;
1588 	}
1589 }
1590 
std_log(const struct v4l2_ctrl * ctrl)1591 static void std_log(const struct v4l2_ctrl *ctrl)
1592 {
1593 	union v4l2_ctrl_ptr ptr = ctrl->p_cur;
1594 
1595 	if (ctrl->is_array) {
1596 		unsigned i;
1597 
1598 		for (i = 0; i < ctrl->nr_of_dims; i++)
1599 			pr_cont("[%u]", ctrl->dims[i]);
1600 		pr_cont(" ");
1601 	}
1602 
1603 	switch (ctrl->type) {
1604 	case V4L2_CTRL_TYPE_INTEGER:
1605 		pr_cont("%d", *ptr.p_s32);
1606 		break;
1607 	case V4L2_CTRL_TYPE_BOOLEAN:
1608 		pr_cont("%s", *ptr.p_s32 ? "true" : "false");
1609 		break;
1610 	case V4L2_CTRL_TYPE_MENU:
1611 		pr_cont("%s", ctrl->qmenu[*ptr.p_s32]);
1612 		break;
1613 	case V4L2_CTRL_TYPE_INTEGER_MENU:
1614 		pr_cont("%lld", ctrl->qmenu_int[*ptr.p_s32]);
1615 		break;
1616 	case V4L2_CTRL_TYPE_BITMASK:
1617 		pr_cont("0x%08x", *ptr.p_s32);
1618 		break;
1619 	case V4L2_CTRL_TYPE_INTEGER64:
1620 		pr_cont("%lld", *ptr.p_s64);
1621 		break;
1622 	case V4L2_CTRL_TYPE_STRING:
1623 		pr_cont("%s", ptr.p_char);
1624 		break;
1625 	case V4L2_CTRL_TYPE_U8:
1626 		pr_cont("%u", (unsigned)*ptr.p_u8);
1627 		break;
1628 	case V4L2_CTRL_TYPE_U16:
1629 		pr_cont("%u", (unsigned)*ptr.p_u16);
1630 		break;
1631 	case V4L2_CTRL_TYPE_U32:
1632 		pr_cont("%u", (unsigned)*ptr.p_u32);
1633 		break;
1634 	default:
1635 		pr_cont("unknown type %d", ctrl->type);
1636 		break;
1637 	}
1638 }
1639 
1640 /*
1641  * Round towards the closest legal value. Be careful when we are
1642  * close to the maximum range of the control type to prevent
1643  * wrap-arounds.
1644  */
1645 #define ROUND_TO_RANGE(val, offset_type, ctrl)			\
1646 ({								\
1647 	offset_type offset;					\
1648 	if ((ctrl)->maximum >= 0 &&				\
1649 	    val >= (ctrl)->maximum - (s32)((ctrl)->step / 2))	\
1650 		val = (ctrl)->maximum;				\
1651 	else							\
1652 		val += (s32)((ctrl)->step / 2);			\
1653 	val = clamp_t(typeof(val), val,				\
1654 		      (ctrl)->minimum, (ctrl)->maximum);	\
1655 	offset = (val) - (ctrl)->minimum;			\
1656 	offset = (ctrl)->step * (offset / (u32)(ctrl)->step);	\
1657 	val = (ctrl)->minimum + offset;				\
1658 	0;							\
1659 })
1660 
1661 /* Validate a new control */
1662 
1663 #define zero_padding(s) \
1664 	memset(&(s).padding, 0, sizeof((s).padding))
1665 
1666 /*
1667  * Compound controls validation requires setting unused fields/flags to zero
1668  * in order to properly detect unchanged controls with std_equal's memcmp.
1669  */
std_validate_compound(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)1670 static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
1671 				 union v4l2_ctrl_ptr ptr)
1672 {
1673 	struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
1674 	struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;
1675 	void *p = ptr.p + idx * ctrl->elem_size;
1676 
1677 	switch ((u32)ctrl->type) {
1678 	case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
1679 		p_mpeg2_slice_params = p;
1680 
1681 		switch (p_mpeg2_slice_params->sequence.chroma_format) {
1682 		case 1: /* 4:2:0 */
1683 		case 2: /* 4:2:2 */
1684 		case 3: /* 4:4:4 */
1685 			break;
1686 		default:
1687 			return -EINVAL;
1688 		}
1689 
1690 		switch (p_mpeg2_slice_params->picture.intra_dc_precision) {
1691 		case 0: /* 8 bits */
1692 		case 1: /* 9 bits */
1693 		case 2: /* 10 bits */
1694 		case 3: /* 11 bits */
1695 			break;
1696 		default:
1697 			return -EINVAL;
1698 		}
1699 
1700 		switch (p_mpeg2_slice_params->picture.picture_structure) {
1701 		case 1: /* interlaced top field */
1702 		case 2: /* interlaced bottom field */
1703 		case 3: /* progressive */
1704 			break;
1705 		default:
1706 			return -EINVAL;
1707 		}
1708 
1709 		switch (p_mpeg2_slice_params->picture.picture_coding_type) {
1710 		case V4L2_MPEG2_PICTURE_CODING_TYPE_I:
1711 		case V4L2_MPEG2_PICTURE_CODING_TYPE_P:
1712 		case V4L2_MPEG2_PICTURE_CODING_TYPE_B:
1713 			break;
1714 		default:
1715 			return -EINVAL;
1716 		}
1717 
1718 		break;
1719 
1720 	case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
1721 		break;
1722 
1723 	case V4L2_CTRL_TYPE_FWHT_PARAMS:
1724 		break;
1725 
1726 	case V4L2_CTRL_TYPE_H264_SPS:
1727 	case V4L2_CTRL_TYPE_H264_PPS:
1728 	case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
1729 	case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
1730 	case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
1731 		break;
1732 
1733 	case V4L2_CTRL_TYPE_VP8_FRAME_HEADER:
1734 		p_vp8_frame_header = p;
1735 
1736 		switch (p_vp8_frame_header->num_dct_parts) {
1737 		case 1:
1738 		case 2:
1739 		case 4:
1740 		case 8:
1741 			break;
1742 		default:
1743 			return -EINVAL;
1744 		}
1745 		zero_padding(p_vp8_frame_header->segment_header);
1746 		zero_padding(p_vp8_frame_header->lf_header);
1747 		zero_padding(p_vp8_frame_header->quant_header);
1748 		zero_padding(p_vp8_frame_header->entropy_header);
1749 		zero_padding(p_vp8_frame_header->coder_state);
1750 		break;
1751 	default:
1752 		return -EINVAL;
1753 	}
1754 
1755 	return 0;
1756 }
1757 
std_validate(const struct v4l2_ctrl * ctrl,u32 idx,union v4l2_ctrl_ptr ptr)1758 static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
1759 			union v4l2_ctrl_ptr ptr)
1760 {
1761 	size_t len;
1762 	u64 offset;
1763 	s64 val;
1764 
1765 	switch ((u32)ctrl->type) {
1766 	case V4L2_CTRL_TYPE_INTEGER:
1767 		return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl);
1768 	case V4L2_CTRL_TYPE_INTEGER64:
1769 		/*
1770 		 * We can't use the ROUND_TO_RANGE define here due to
1771 		 * the u64 divide that needs special care.
1772 		 */
1773 		val = ptr.p_s64[idx];
1774 		if (ctrl->maximum >= 0 && val >= ctrl->maximum - (s64)(ctrl->step / 2))
1775 			val = ctrl->maximum;
1776 		else
1777 			val += (s64)(ctrl->step / 2);
1778 		val = clamp_t(s64, val, ctrl->minimum, ctrl->maximum);
1779 		offset = val - ctrl->minimum;
1780 		do_div(offset, ctrl->step);
1781 		ptr.p_s64[idx] = ctrl->minimum + offset * ctrl->step;
1782 		return 0;
1783 	case V4L2_CTRL_TYPE_U8:
1784 		return ROUND_TO_RANGE(ptr.p_u8[idx], u8, ctrl);
1785 	case V4L2_CTRL_TYPE_U16:
1786 		return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl);
1787 	case V4L2_CTRL_TYPE_U32:
1788 		return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl);
1789 
1790 	case V4L2_CTRL_TYPE_BOOLEAN:
1791 		ptr.p_s32[idx] = !!ptr.p_s32[idx];
1792 		return 0;
1793 
1794 	case V4L2_CTRL_TYPE_MENU:
1795 	case V4L2_CTRL_TYPE_INTEGER_MENU:
1796 		if (ptr.p_s32[idx] < ctrl->minimum || ptr.p_s32[idx] > ctrl->maximum)
1797 			return -ERANGE;
1798 		if (ctrl->menu_skip_mask & (1ULL << ptr.p_s32[idx]))
1799 			return -EINVAL;
1800 		if (ctrl->type == V4L2_CTRL_TYPE_MENU &&
1801 		    ctrl->qmenu[ptr.p_s32[idx]][0] == '\0')
1802 			return -EINVAL;
1803 		return 0;
1804 
1805 	case V4L2_CTRL_TYPE_BITMASK:
1806 		ptr.p_s32[idx] &= ctrl->maximum;
1807 		return 0;
1808 
1809 	case V4L2_CTRL_TYPE_BUTTON:
1810 	case V4L2_CTRL_TYPE_CTRL_CLASS:
1811 		ptr.p_s32[idx] = 0;
1812 		return 0;
1813 
1814 	case V4L2_CTRL_TYPE_STRING:
1815 		idx *= ctrl->elem_size;
1816 		len = strlen(ptr.p_char + idx);
1817 		if (len < ctrl->minimum)
1818 			return -ERANGE;
1819 		if ((len - (u32)ctrl->minimum) % (u32)ctrl->step)
1820 			return -ERANGE;
1821 		return 0;
1822 
1823 	default:
1824 		return std_validate_compound(ctrl, idx, ptr);
1825 	}
1826 }
1827 
1828 static const struct v4l2_ctrl_type_ops std_type_ops = {
1829 	.equal = std_equal,
1830 	.init = std_init,
1831 	.log = std_log,
1832 	.validate = std_validate,
1833 };
1834 
1835 /* Helper function: copy the given control value back to the caller */
ptr_to_user(struct v4l2_ext_control * c,struct v4l2_ctrl * ctrl,union v4l2_ctrl_ptr ptr)1836 static int ptr_to_user(struct v4l2_ext_control *c,
1837 		       struct v4l2_ctrl *ctrl,
1838 		       union v4l2_ctrl_ptr ptr)
1839 {
1840 	u32 len;
1841 
1842 	if (ctrl->is_ptr && !ctrl->is_string)
1843 		return copy_to_user(c->ptr, ptr.p, c->size) ?
1844 		       -EFAULT : 0;
1845 
1846 	switch (ctrl->type) {
1847 	case V4L2_CTRL_TYPE_STRING:
1848 		len = strlen(ptr.p_char);
1849 		if (c->size < len + 1) {
1850 			c->size = ctrl->elem_size;
1851 			return -ENOSPC;
1852 		}
1853 		return copy_to_user(c->string, ptr.p_char, len + 1) ?
1854 		       -EFAULT : 0;
1855 	case V4L2_CTRL_TYPE_INTEGER64:
1856 		c->value64 = *ptr.p_s64;
1857 		break;
1858 	default:
1859 		c->value = *ptr.p_s32;
1860 		break;
1861 	}
1862 	return 0;
1863 }
1864 
1865 /* Helper function: copy the current control value back to the caller */
cur_to_user(struct v4l2_ext_control * c,struct v4l2_ctrl * ctrl)1866 static int cur_to_user(struct v4l2_ext_control *c,
1867 		       struct v4l2_ctrl *ctrl)
1868 {
1869 	return ptr_to_user(c, ctrl, ctrl->p_cur);
1870 }
1871 
1872 /* Helper function: copy the new control value back to the caller */
new_to_user(struct v4l2_ext_control * c,struct v4l2_ctrl * ctrl)1873 static int new_to_user(struct v4l2_ext_control *c,
1874 		       struct v4l2_ctrl *ctrl)
1875 {
1876 	return ptr_to_user(c, ctrl, ctrl->p_new);
1877 }
1878 
1879 /* Helper function: copy the request value back to the caller */
req_to_user(struct v4l2_ext_control * c,struct v4l2_ctrl_ref * ref)1880 static int req_to_user(struct v4l2_ext_control *c,
1881 		       struct v4l2_ctrl_ref *ref)
1882 {
1883 	return ptr_to_user(c, ref->ctrl, ref->p_req);
1884 }
1885 
1886 /* Helper function: copy the initial control value back to the caller */
def_to_user(struct v4l2_ext_control * c,struct v4l2_ctrl * ctrl)1887 static int def_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl)
1888 {
1889 	int idx;
1890 
1891 	for (idx = 0; idx < ctrl->elems; idx++)
1892 		ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
1893 
1894 	return ptr_to_user(c, ctrl, ctrl->p_new);
1895 }
1896 
1897 /* Helper function: copy the caller-provider value to the given control value */
user_to_ptr(struct v4l2_ext_control * c,struct v4l2_ctrl * ctrl,union v4l2_ctrl_ptr ptr)1898 static int user_to_ptr(struct v4l2_ext_control *c,
1899 		       struct v4l2_ctrl *ctrl,
1900 		       union v4l2_ctrl_ptr ptr)
1901 {
1902 	int ret;
1903 	u32 size;
1904 
1905 	ctrl->is_new = 1;
1906 	if (ctrl->is_ptr && !ctrl->is_string) {
1907 		unsigned idx;
1908 
1909 		ret = copy_from_user(ptr.p, c->ptr, c->size) ? -EFAULT : 0;
1910 		if (ret || !ctrl->is_array)
1911 			return ret;
1912 		for (idx = c->size / ctrl->elem_size; idx < ctrl->elems; idx++)
1913 			ctrl->type_ops->init(ctrl, idx, ptr);
1914 		return 0;
1915 	}
1916 
1917 	switch (ctrl->type) {
1918 	case V4L2_CTRL_TYPE_INTEGER64:
1919 		*ptr.p_s64 = c->value64;
1920 		break;
1921 	case V4L2_CTRL_TYPE_STRING:
1922 		size = c->size;
1923 		if (size == 0)
1924 			return -ERANGE;
1925 		if (size > ctrl->maximum + 1)
1926 			size = ctrl->maximum + 1;
1927 		ret = copy_from_user(ptr.p_char, c->string, size) ? -EFAULT : 0;
1928 		if (!ret) {
1929 			char last = ptr.p_char[size - 1];
1930 
1931 			ptr.p_char[size - 1] = 0;
1932 			/* If the string was longer than ctrl->maximum,
1933 			   then return an error. */
1934 			if (strlen(ptr.p_char) == ctrl->maximum && last)
1935 				return -ERANGE;
1936 		}
1937 		return ret;
1938 	default:
1939 		*ptr.p_s32 = c->value;
1940 		break;
1941 	}
1942 	return 0;
1943 }
1944 
1945 /* Helper function: copy the caller-provider value as the new control value */
user_to_new(struct v4l2_ext_control * c,struct v4l2_ctrl * ctrl)1946 static int user_to_new(struct v4l2_ext_control *c,
1947 		       struct v4l2_ctrl *ctrl)
1948 {
1949 	return user_to_ptr(c, ctrl, ctrl->p_new);
1950 }
1951 
1952 /* Copy the one value to another. */
ptr_to_ptr(struct v4l2_ctrl * ctrl,union v4l2_ctrl_ptr from,union v4l2_ctrl_ptr to)1953 static void ptr_to_ptr(struct v4l2_ctrl *ctrl,
1954 		       union v4l2_ctrl_ptr from, union v4l2_ctrl_ptr to)
1955 {
1956 	if (ctrl == NULL)
1957 		return;
1958 	memcpy(to.p, from.p, ctrl->elems * ctrl->elem_size);
1959 }
1960 
1961 /* Copy the new value to the current value. */
new_to_cur(struct v4l2_fh * fh,struct v4l2_ctrl * ctrl,u32 ch_flags)1962 static void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
1963 {
1964 	bool changed;
1965 
1966 	if (ctrl == NULL)
1967 		return;
1968 
1969 	/* has_changed is set by cluster_changed */
1970 	changed = ctrl->has_changed;
1971 	if (changed)
1972 		ptr_to_ptr(ctrl, ctrl->p_new, ctrl->p_cur);
1973 
1974 	if (ch_flags & V4L2_EVENT_CTRL_CH_FLAGS) {
1975 		/* Note: CH_FLAGS is only set for auto clusters. */
1976 		ctrl->flags &=
1977 			~(V4L2_CTRL_FLAG_INACTIVE | V4L2_CTRL_FLAG_VOLATILE);
1978 		if (!is_cur_manual(ctrl->cluster[0])) {
1979 			ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
1980 			if (ctrl->cluster[0]->has_volatiles)
1981 				ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
1982 		}
1983 		fh = NULL;
1984 	}
1985 	if (changed || ch_flags) {
1986 		/* If a control was changed that was not one of the controls
1987 		   modified by the application, then send the event to all. */
1988 		if (!ctrl->is_new)
1989 			fh = NULL;
1990 		send_event(fh, ctrl,
1991 			(changed ? V4L2_EVENT_CTRL_CH_VALUE : 0) | ch_flags);
1992 		if (ctrl->call_notify && changed && ctrl->handler->notify)
1993 			ctrl->handler->notify(ctrl, ctrl->handler->notify_priv);
1994 	}
1995 }
1996 
1997 /* Copy the current value to the new value */
cur_to_new(struct v4l2_ctrl * ctrl)1998 static void cur_to_new(struct v4l2_ctrl *ctrl)
1999 {
2000 	if (ctrl == NULL)
2001 		return;
2002 	ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new);
2003 }
2004 
2005 /* Copy the new value to the request value */
new_to_req(struct v4l2_ctrl_ref * ref)2006 static void new_to_req(struct v4l2_ctrl_ref *ref)
2007 {
2008 	if (!ref)
2009 		return;
2010 	ptr_to_ptr(ref->ctrl, ref->ctrl->p_new, ref->p_req);
2011 	ref->req = ref;
2012 }
2013 
2014 /* Copy the request value to the new value */
req_to_new(struct v4l2_ctrl_ref * ref)2015 static void req_to_new(struct v4l2_ctrl_ref *ref)
2016 {
2017 	if (!ref)
2018 		return;
2019 	if (ref->req)
2020 		ptr_to_ptr(ref->ctrl, ref->req->p_req, ref->ctrl->p_new);
2021 	else
2022 		ptr_to_ptr(ref->ctrl, ref->ctrl->p_cur, ref->ctrl->p_new);
2023 }
2024 
2025 /* Return non-zero if one or more of the controls in the cluster has a new
2026    value that differs from the current value. */
cluster_changed(struct v4l2_ctrl * master)2027 static int cluster_changed(struct v4l2_ctrl *master)
2028 {
2029 	bool changed = false;
2030 	unsigned idx;
2031 	int i;
2032 
2033 	for (i = 0; i < master->ncontrols; i++) {
2034 		struct v4l2_ctrl *ctrl = master->cluster[i];
2035 		bool ctrl_changed = false;
2036 
2037 		if (ctrl == NULL)
2038 			continue;
2039 
2040 		if (ctrl->flags & V4L2_CTRL_FLAG_EXECUTE_ON_WRITE)
2041 			changed = ctrl_changed = true;
2042 
2043 		/*
2044 		 * Set has_changed to false to avoid generating
2045 		 * the event V4L2_EVENT_CTRL_CH_VALUE
2046 		 */
2047 		if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
2048 			ctrl->has_changed = false;
2049 			continue;
2050 		}
2051 
2052 		for (idx = 0; !ctrl_changed && idx < ctrl->elems; idx++)
2053 			ctrl_changed = !ctrl->type_ops->equal(ctrl, idx,
2054 				ctrl->p_cur, ctrl->p_new);
2055 		ctrl->has_changed = ctrl_changed;
2056 		changed |= ctrl->has_changed;
2057 	}
2058 	return changed;
2059 }
2060 
2061 /* Control range checking */
check_range(enum v4l2_ctrl_type type,s64 min,s64 max,u64 step,s64 def)2062 static int check_range(enum v4l2_ctrl_type type,
2063 		s64 min, s64 max, u64 step, s64 def)
2064 {
2065 	switch (type) {
2066 	case V4L2_CTRL_TYPE_BOOLEAN:
2067 		if (step != 1 || max > 1 || min < 0)
2068 			return -ERANGE;
2069 		/* fall through */
2070 	case V4L2_CTRL_TYPE_U8:
2071 	case V4L2_CTRL_TYPE_U16:
2072 	case V4L2_CTRL_TYPE_U32:
2073 	case V4L2_CTRL_TYPE_INTEGER:
2074 	case V4L2_CTRL_TYPE_INTEGER64:
2075 		if (step == 0 || min > max || def < min || def > max)
2076 			return -ERANGE;
2077 		return 0;
2078 	case V4L2_CTRL_TYPE_BITMASK:
2079 		if (step || min || !max || (def & ~max))
2080 			return -ERANGE;
2081 		return 0;
2082 	case V4L2_CTRL_TYPE_MENU:
2083 	case V4L2_CTRL_TYPE_INTEGER_MENU:
2084 		if (min > max || def < min || def > max)
2085 			return -ERANGE;
2086 		/* Note: step == menu_skip_mask for menu controls.
2087 		   So here we check if the default value is masked out. */
2088 		if (step && ((1 << def) & step))
2089 			return -EINVAL;
2090 		return 0;
2091 	case V4L2_CTRL_TYPE_STRING:
2092 		if (min > max || min < 0 || step < 1 || def)
2093 			return -ERANGE;
2094 		return 0;
2095 	default:
2096 		return 0;
2097 	}
2098 }
2099 
2100 /* Validate a new control */
validate_new(const struct v4l2_ctrl * ctrl,union v4l2_ctrl_ptr p_new)2101 static int validate_new(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr p_new)
2102 {
2103 	unsigned idx;
2104 	int err = 0;
2105 
2106 	for (idx = 0; !err && idx < ctrl->elems; idx++)
2107 		err = ctrl->type_ops->validate(ctrl, idx, p_new);
2108 	return err;
2109 }
2110 
node2id(struct list_head * node)2111 static inline u32 node2id(struct list_head *node)
2112 {
2113 	return list_entry(node, struct v4l2_ctrl_ref, node)->ctrl->id;
2114 }
2115 
2116 /* Set the handler's error code if it wasn't set earlier already */
handler_set_err(struct v4l2_ctrl_handler * hdl,int err)2117 static inline int handler_set_err(struct v4l2_ctrl_handler *hdl, int err)
2118 {
2119 	if (hdl->error == 0)
2120 		hdl->error = err;
2121 	return err;
2122 }
2123 
2124 /* Initialize the handler */
v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler * hdl,unsigned nr_of_controls_hint,struct lock_class_key * key,const char * name)2125 int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl,
2126 				 unsigned nr_of_controls_hint,
2127 				 struct lock_class_key *key, const char *name)
2128 {
2129 	mutex_init(&hdl->_lock);
2130 	hdl->lock = &hdl->_lock;
2131 	lockdep_set_class_and_name(hdl->lock, key, name);
2132 	INIT_LIST_HEAD(&hdl->ctrls);
2133 	INIT_LIST_HEAD(&hdl->ctrl_refs);
2134 	INIT_LIST_HEAD(&hdl->requests);
2135 	INIT_LIST_HEAD(&hdl->requests_queued);
2136 	hdl->request_is_queued = false;
2137 	hdl->nr_of_buckets = 1 + nr_of_controls_hint / 8;
2138 	hdl->buckets = kvmalloc_array(hdl->nr_of_buckets,
2139 				      sizeof(hdl->buckets[0]),
2140 				      GFP_KERNEL | __GFP_ZERO);
2141 	hdl->error = hdl->buckets ? 0 : -ENOMEM;
2142 	media_request_object_init(&hdl->req_obj);
2143 	return hdl->error;
2144 }
2145 EXPORT_SYMBOL(v4l2_ctrl_handler_init_class);
2146 
2147 /* Free all controls and control refs */
v4l2_ctrl_handler_free(struct v4l2_ctrl_handler * hdl)2148 void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
2149 {
2150 	struct v4l2_ctrl_ref *ref, *next_ref;
2151 	struct v4l2_ctrl *ctrl, *next_ctrl;
2152 	struct v4l2_subscribed_event *sev, *next_sev;
2153 
2154 	if (hdl == NULL || hdl->buckets == NULL)
2155 		return;
2156 
2157 	if (!hdl->req_obj.req && !list_empty(&hdl->requests)) {
2158 		struct v4l2_ctrl_handler *req, *next_req;
2159 
2160 		list_for_each_entry_safe(req, next_req, &hdl->requests, requests) {
2161 			media_request_object_unbind(&req->req_obj);
2162 			media_request_object_put(&req->req_obj);
2163 		}
2164 	}
2165 	mutex_lock(hdl->lock);
2166 	/* Free all nodes */
2167 	list_for_each_entry_safe(ref, next_ref, &hdl->ctrl_refs, node) {
2168 		list_del(&ref->node);
2169 		kfree(ref);
2170 	}
2171 	/* Free all controls owned by the handler */
2172 	list_for_each_entry_safe(ctrl, next_ctrl, &hdl->ctrls, node) {
2173 		list_del(&ctrl->node);
2174 		list_for_each_entry_safe(sev, next_sev, &ctrl->ev_subs, node)
2175 			list_del(&sev->node);
2176 		kvfree(ctrl);
2177 	}
2178 	kvfree(hdl->buckets);
2179 	hdl->buckets = NULL;
2180 	hdl->cached = NULL;
2181 	hdl->error = 0;
2182 	mutex_unlock(hdl->lock);
2183 	mutex_destroy(&hdl->_lock);
2184 }
2185 EXPORT_SYMBOL(v4l2_ctrl_handler_free);
2186 
2187 /* For backwards compatibility: V4L2_CID_PRIVATE_BASE should no longer
2188    be used except in G_CTRL, S_CTRL, QUERYCTRL and QUERYMENU when dealing
2189    with applications that do not use the NEXT_CTRL flag.
2190 
2191    We just find the n-th private user control. It's O(N), but that should not
2192    be an issue in this particular case. */
find_private_ref(struct v4l2_ctrl_handler * hdl,u32 id)2193 static struct v4l2_ctrl_ref *find_private_ref(
2194 		struct v4l2_ctrl_handler *hdl, u32 id)
2195 {
2196 	struct v4l2_ctrl_ref *ref;
2197 
2198 	id -= V4L2_CID_PRIVATE_BASE;
2199 	list_for_each_entry(ref, &hdl->ctrl_refs, node) {
2200 		/* Search for private user controls that are compatible with
2201 		   VIDIOC_G/S_CTRL. */
2202 		if (V4L2_CTRL_ID2WHICH(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
2203 		    V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
2204 			if (!ref->ctrl->is_int)
2205 				continue;
2206 			if (id == 0)
2207 				return ref;
2208 			id--;
2209 		}
2210 	}
2211 	return NULL;
2212 }
2213 
2214 /* Find a control with the given ID. */
find_ref(struct v4l2_ctrl_handler * hdl,u32 id)2215 static struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
2216 {
2217 	struct v4l2_ctrl_ref *ref;
2218 	int bucket;
2219 
2220 	id &= V4L2_CTRL_ID_MASK;
2221 
2222 	/* Old-style private controls need special handling */
2223 	if (id >= V4L2_CID_PRIVATE_BASE)
2224 		return find_private_ref(hdl, id);
2225 	bucket = id % hdl->nr_of_buckets;
2226 
2227 	/* Simple optimization: cache the last control found */
2228 	if (hdl->cached && hdl->cached->ctrl->id == id)
2229 		return hdl->cached;
2230 
2231 	/* Not in cache, search the hash */
2232 	ref = hdl->buckets ? hdl->buckets[bucket] : NULL;
2233 	while (ref && ref->ctrl->id != id)
2234 		ref = ref->next;
2235 
2236 	if (ref)
2237 		hdl->cached = ref; /* cache it! */
2238 	return ref;
2239 }
2240 
2241 /* Find a control with the given ID. Take the handler's lock first. */
find_ref_lock(struct v4l2_ctrl_handler * hdl,u32 id)2242 static struct v4l2_ctrl_ref *find_ref_lock(
2243 		struct v4l2_ctrl_handler *hdl, u32 id)
2244 {
2245 	struct v4l2_ctrl_ref *ref = NULL;
2246 
2247 	if (hdl) {
2248 		mutex_lock(hdl->lock);
2249 		ref = find_ref(hdl, id);
2250 		mutex_unlock(hdl->lock);
2251 	}
2252 	return ref;
2253 }
2254 
2255 /* Find a control with the given ID. */
v4l2_ctrl_find(struct v4l2_ctrl_handler * hdl,u32 id)2256 struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
2257 {
2258 	struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
2259 
2260 	return ref ? ref->ctrl : NULL;
2261 }
2262 EXPORT_SYMBOL(v4l2_ctrl_find);
2263 
2264 /* Allocate a new v4l2_ctrl_ref and hook it into the handler. */
handler_new_ref(struct v4l2_ctrl_handler * hdl,struct v4l2_ctrl * ctrl,struct v4l2_ctrl_ref ** ctrl_ref,bool from_other_dev,bool allocate_req)2265 static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
2266 			   struct v4l2_ctrl *ctrl,
2267 			   struct v4l2_ctrl_ref **ctrl_ref,
2268 			   bool from_other_dev, bool allocate_req)
2269 {
2270 	struct v4l2_ctrl_ref *ref;
2271 	struct v4l2_ctrl_ref *new_ref;
2272 	u32 id = ctrl->id;
2273 	u32 class_ctrl = V4L2_CTRL_ID2WHICH(id) | 1;
2274 	int bucket = id % hdl->nr_of_buckets;	/* which bucket to use */
2275 	unsigned int size_extra_req = 0;
2276 
2277 	if (ctrl_ref)
2278 		*ctrl_ref = NULL;
2279 
2280 	/*
2281 	 * Automatically add the control class if it is not yet present and
2282 	 * the new control is not a compound control.
2283 	 */
2284 	if (ctrl->type < V4L2_CTRL_COMPOUND_TYPES &&
2285 	    id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)
2286 		if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))
2287 			return hdl->error;
2288 
2289 	if (hdl->error)
2290 		return hdl->error;
2291 
2292 	if (allocate_req)
2293 		size_extra_req = ctrl->elems * ctrl->elem_size;
2294 	new_ref = kzalloc(sizeof(*new_ref) + size_extra_req, GFP_KERNEL);
2295 	if (!new_ref)
2296 		return handler_set_err(hdl, -ENOMEM);
2297 	new_ref->ctrl = ctrl;
2298 	new_ref->from_other_dev = from_other_dev;
2299 	if (size_extra_req)
2300 		new_ref->p_req.p = &new_ref[1];
2301 
2302 	INIT_LIST_HEAD(&new_ref->node);
2303 
2304 	mutex_lock(hdl->lock);
2305 
2306 	/* Add immediately at the end of the list if the list is empty, or if
2307 	   the last element in the list has a lower ID.
2308 	   This ensures that when elements are added in ascending order the
2309 	   insertion is an O(1) operation. */
2310 	if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
2311 		list_add_tail(&new_ref->node, &hdl->ctrl_refs);
2312 		goto insert_in_hash;
2313 	}
2314 
2315 	/* Find insert position in sorted list */
2316 	list_for_each_entry(ref, &hdl->ctrl_refs, node) {
2317 		if (ref->ctrl->id < id)
2318 			continue;
2319 		/* Don't add duplicates */
2320 		if (ref->ctrl->id == id) {
2321 			kfree(new_ref);
2322 			goto unlock;
2323 		}
2324 		list_add(&new_ref->node, ref->node.prev);
2325 		break;
2326 	}
2327 
2328 insert_in_hash:
2329 	/* Insert the control node in the hash */
2330 	new_ref->next = hdl->buckets[bucket];
2331 	hdl->buckets[bucket] = new_ref;
2332 	if (ctrl_ref)
2333 		*ctrl_ref = new_ref;
2334 	if (ctrl->handler == hdl) {
2335 		/* By default each control starts in a cluster of its own.
2336 		 * new_ref->ctrl is basically a cluster array with one
2337 		 * element, so that's perfect to use as the cluster pointer.
2338 		 * But only do this for the handler that owns the control.
2339 		 */
2340 		ctrl->cluster = &new_ref->ctrl;
2341 		ctrl->ncontrols = 1;
2342 	}
2343 
2344 unlock:
2345 	mutex_unlock(hdl->lock);
2346 	return 0;
2347 }
2348 
2349 /* Add a new control */
v4l2_ctrl_new(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,const struct v4l2_ctrl_type_ops * type_ops,u32 id,const char * name,enum v4l2_ctrl_type type,s64 min,s64 max,u64 step,s64 def,const u32 dims[V4L2_CTRL_MAX_DIMS],u32 elem_size,u32 flags,const char * const * qmenu,const s64 * qmenu_int,void * priv)2350 static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
2351 			const struct v4l2_ctrl_ops *ops,
2352 			const struct v4l2_ctrl_type_ops *type_ops,
2353 			u32 id, const char *name, enum v4l2_ctrl_type type,
2354 			s64 min, s64 max, u64 step, s64 def,
2355 			const u32 dims[V4L2_CTRL_MAX_DIMS], u32 elem_size,
2356 			u32 flags, const char * const *qmenu,
2357 			const s64 *qmenu_int, void *priv)
2358 {
2359 	struct v4l2_ctrl *ctrl;
2360 	unsigned sz_extra;
2361 	unsigned nr_of_dims = 0;
2362 	unsigned elems = 1;
2363 	bool is_array;
2364 	unsigned tot_ctrl_size;
2365 	unsigned idx;
2366 	void *data;
2367 	int err;
2368 
2369 	if (hdl->error)
2370 		return NULL;
2371 
2372 	while (dims && dims[nr_of_dims]) {
2373 		elems *= dims[nr_of_dims];
2374 		nr_of_dims++;
2375 		if (nr_of_dims == V4L2_CTRL_MAX_DIMS)
2376 			break;
2377 	}
2378 	is_array = nr_of_dims > 0;
2379 
2380 	/* Prefill elem_size for all types handled by std_type_ops */
2381 	switch ((u32)type) {
2382 	case V4L2_CTRL_TYPE_INTEGER64:
2383 		elem_size = sizeof(s64);
2384 		break;
2385 	case V4L2_CTRL_TYPE_STRING:
2386 		elem_size = max + 1;
2387 		break;
2388 	case V4L2_CTRL_TYPE_U8:
2389 		elem_size = sizeof(u8);
2390 		break;
2391 	case V4L2_CTRL_TYPE_U16:
2392 		elem_size = sizeof(u16);
2393 		break;
2394 	case V4L2_CTRL_TYPE_U32:
2395 		elem_size = sizeof(u32);
2396 		break;
2397 	case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
2398 		elem_size = sizeof(struct v4l2_ctrl_mpeg2_slice_params);
2399 		break;
2400 	case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
2401 		elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantization);
2402 		break;
2403 	case V4L2_CTRL_TYPE_FWHT_PARAMS:
2404 		elem_size = sizeof(struct v4l2_ctrl_fwht_params);
2405 		break;
2406 	case V4L2_CTRL_TYPE_H264_SPS:
2407 		elem_size = sizeof(struct v4l2_ctrl_h264_sps);
2408 		break;
2409 	case V4L2_CTRL_TYPE_H264_PPS:
2410 		elem_size = sizeof(struct v4l2_ctrl_h264_pps);
2411 		break;
2412 	case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
2413 		elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix);
2414 		break;
2415 	case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
2416 		elem_size = sizeof(struct v4l2_ctrl_h264_slice_params);
2417 		break;
2418 	case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
2419 		elem_size = sizeof(struct v4l2_ctrl_h264_decode_params);
2420 		break;
2421 	case V4L2_CTRL_TYPE_VP8_FRAME_HEADER:
2422 		elem_size = sizeof(struct v4l2_ctrl_vp8_frame_header);
2423 		break;
2424 	default:
2425 		if (type < V4L2_CTRL_COMPOUND_TYPES)
2426 			elem_size = sizeof(s32);
2427 		break;
2428 	}
2429 	tot_ctrl_size = elem_size * elems;
2430 
2431 	/* Sanity checks */
2432 	if (id == 0 || name == NULL || !elem_size ||
2433 	    id >= V4L2_CID_PRIVATE_BASE ||
2434 	    (type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
2435 	    (type == V4L2_CTRL_TYPE_INTEGER_MENU && qmenu_int == NULL)) {
2436 		handler_set_err(hdl, -ERANGE);
2437 		return NULL;
2438 	}
2439 	err = check_range(type, min, max, step, def);
2440 	if (err) {
2441 		handler_set_err(hdl, err);
2442 		return NULL;
2443 	}
2444 	if (is_array &&
2445 	    (type == V4L2_CTRL_TYPE_BUTTON ||
2446 	     type == V4L2_CTRL_TYPE_CTRL_CLASS)) {
2447 		handler_set_err(hdl, -EINVAL);
2448 		return NULL;
2449 	}
2450 
2451 	sz_extra = 0;
2452 	if (type == V4L2_CTRL_TYPE_BUTTON)
2453 		flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
2454 			V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
2455 	else if (type == V4L2_CTRL_TYPE_CTRL_CLASS)
2456 		flags |= V4L2_CTRL_FLAG_READ_ONLY;
2457 	else if (type == V4L2_CTRL_TYPE_INTEGER64 ||
2458 		 type == V4L2_CTRL_TYPE_STRING ||
2459 		 type >= V4L2_CTRL_COMPOUND_TYPES ||
2460 		 is_array)
2461 		sz_extra += 2 * tot_ctrl_size;
2462 
2463 	ctrl = kvzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
2464 	if (ctrl == NULL) {
2465 		handler_set_err(hdl, -ENOMEM);
2466 		return NULL;
2467 	}
2468 
2469 	INIT_LIST_HEAD(&ctrl->node);
2470 	INIT_LIST_HEAD(&ctrl->ev_subs);
2471 	ctrl->handler = hdl;
2472 	ctrl->ops = ops;
2473 	ctrl->type_ops = type_ops ? type_ops : &std_type_ops;
2474 	ctrl->id = id;
2475 	ctrl->name = name;
2476 	ctrl->type = type;
2477 	ctrl->flags = flags;
2478 	ctrl->minimum = min;
2479 	ctrl->maximum = max;
2480 	ctrl->step = step;
2481 	ctrl->default_value = def;
2482 	ctrl->is_string = !is_array && type == V4L2_CTRL_TYPE_STRING;
2483 	ctrl->is_ptr = is_array || type >= V4L2_CTRL_COMPOUND_TYPES || ctrl->is_string;
2484 	ctrl->is_int = !ctrl->is_ptr && type != V4L2_CTRL_TYPE_INTEGER64;
2485 	ctrl->is_array = is_array;
2486 	ctrl->elems = elems;
2487 	ctrl->nr_of_dims = nr_of_dims;
2488 	if (nr_of_dims)
2489 		memcpy(ctrl->dims, dims, nr_of_dims * sizeof(dims[0]));
2490 	ctrl->elem_size = elem_size;
2491 	if (type == V4L2_CTRL_TYPE_MENU)
2492 		ctrl->qmenu = qmenu;
2493 	else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2494 		ctrl->qmenu_int = qmenu_int;
2495 	ctrl->priv = priv;
2496 	ctrl->cur.val = ctrl->val = def;
2497 	data = &ctrl[1];
2498 
2499 	if (!ctrl->is_int) {
2500 		ctrl->p_new.p = data;
2501 		ctrl->p_cur.p = data + tot_ctrl_size;
2502 	} else {
2503 		ctrl->p_new.p = &ctrl->val;
2504 		ctrl->p_cur.p = &ctrl->cur.val;
2505 	}
2506 	for (idx = 0; idx < elems; idx++) {
2507 		ctrl->type_ops->init(ctrl, idx, ctrl->p_cur);
2508 		ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
2509 	}
2510 
2511 	if (handler_new_ref(hdl, ctrl, NULL, false, false)) {
2512 		kvfree(ctrl);
2513 		return NULL;
2514 	}
2515 	mutex_lock(hdl->lock);
2516 	list_add_tail(&ctrl->node, &hdl->ctrls);
2517 	mutex_unlock(hdl->lock);
2518 	return ctrl;
2519 }
2520 
v4l2_ctrl_new_custom(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_config * cfg,void * priv)2521 struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
2522 			const struct v4l2_ctrl_config *cfg, void *priv)
2523 {
2524 	bool is_menu;
2525 	struct v4l2_ctrl *ctrl;
2526 	const char *name = cfg->name;
2527 	const char * const *qmenu = cfg->qmenu;
2528 	const s64 *qmenu_int = cfg->qmenu_int;
2529 	enum v4l2_ctrl_type type = cfg->type;
2530 	u32 flags = cfg->flags;
2531 	s64 min = cfg->min;
2532 	s64 max = cfg->max;
2533 	u64 step = cfg->step;
2534 	s64 def = cfg->def;
2535 
2536 	if (name == NULL)
2537 		v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step,
2538 								&def, &flags);
2539 
2540 	is_menu = (type == V4L2_CTRL_TYPE_MENU ||
2541 		   type == V4L2_CTRL_TYPE_INTEGER_MENU);
2542 	if (is_menu)
2543 		WARN_ON(step);
2544 	else
2545 		WARN_ON(cfg->menu_skip_mask);
2546 	if (type == V4L2_CTRL_TYPE_MENU && !qmenu) {
2547 		qmenu = v4l2_ctrl_get_menu(cfg->id);
2548 	} else if (type == V4L2_CTRL_TYPE_INTEGER_MENU && !qmenu_int) {
2549 		handler_set_err(hdl, -EINVAL);
2550 		return NULL;
2551 	}
2552 
2553 	ctrl = v4l2_ctrl_new(hdl, cfg->ops, cfg->type_ops, cfg->id, name,
2554 			type, min, max,
2555 			is_menu ? cfg->menu_skip_mask : step, def,
2556 			cfg->dims, cfg->elem_size,
2557 			flags, qmenu, qmenu_int, priv);
2558 	if (ctrl)
2559 		ctrl->is_private = cfg->is_private;
2560 	return ctrl;
2561 }
2562 EXPORT_SYMBOL(v4l2_ctrl_new_custom);
2563 
2564 /* Helper function for standard non-menu controls */
v4l2_ctrl_new_std(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,s64 min,s64 max,u64 step,s64 def)2565 struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
2566 			const struct v4l2_ctrl_ops *ops,
2567 			u32 id, s64 min, s64 max, u64 step, s64 def)
2568 {
2569 	const char *name;
2570 	enum v4l2_ctrl_type type;
2571 	u32 flags;
2572 
2573 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2574 	if (type == V4L2_CTRL_TYPE_MENU ||
2575 	    type == V4L2_CTRL_TYPE_INTEGER_MENU ||
2576 	    type >= V4L2_CTRL_COMPOUND_TYPES) {
2577 		handler_set_err(hdl, -EINVAL);
2578 		return NULL;
2579 	}
2580 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2581 			     min, max, step, def, NULL, 0,
2582 			     flags, NULL, NULL, NULL);
2583 }
2584 EXPORT_SYMBOL(v4l2_ctrl_new_std);
2585 
2586 /* Helper function for standard menu controls */
v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,u8 _max,u64 mask,u8 _def)2587 struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
2588 			const struct v4l2_ctrl_ops *ops,
2589 			u32 id, u8 _max, u64 mask, u8 _def)
2590 {
2591 	const char * const *qmenu = NULL;
2592 	const s64 *qmenu_int = NULL;
2593 	unsigned int qmenu_int_len = 0;
2594 	const char *name;
2595 	enum v4l2_ctrl_type type;
2596 	s64 min;
2597 	s64 max = _max;
2598 	s64 def = _def;
2599 	u64 step;
2600 	u32 flags;
2601 
2602 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2603 
2604 	if (type == V4L2_CTRL_TYPE_MENU)
2605 		qmenu = v4l2_ctrl_get_menu(id);
2606 	else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2607 		qmenu_int = v4l2_ctrl_get_int_menu(id, &qmenu_int_len);
2608 
2609 	if ((!qmenu && !qmenu_int) || (qmenu_int && max > qmenu_int_len)) {
2610 		handler_set_err(hdl, -EINVAL);
2611 		return NULL;
2612 	}
2613 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2614 			     0, max, mask, def, NULL, 0,
2615 			     flags, qmenu, qmenu_int, NULL);
2616 }
2617 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
2618 
2619 /* Helper function for standard menu controls with driver defined menu */
v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,u8 _max,u64 mask,u8 _def,const char * const * qmenu)2620 struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl,
2621 			const struct v4l2_ctrl_ops *ops, u32 id, u8 _max,
2622 			u64 mask, u8 _def, const char * const *qmenu)
2623 {
2624 	enum v4l2_ctrl_type type;
2625 	const char *name;
2626 	u32 flags;
2627 	u64 step;
2628 	s64 min;
2629 	s64 max = _max;
2630 	s64 def = _def;
2631 
2632 	/* v4l2_ctrl_new_std_menu_items() should only be called for
2633 	 * standard controls without a standard menu.
2634 	 */
2635 	if (v4l2_ctrl_get_menu(id)) {
2636 		handler_set_err(hdl, -EINVAL);
2637 		return NULL;
2638 	}
2639 
2640 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2641 	if (type != V4L2_CTRL_TYPE_MENU || qmenu == NULL) {
2642 		handler_set_err(hdl, -EINVAL);
2643 		return NULL;
2644 	}
2645 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2646 			     0, max, mask, def, NULL, 0,
2647 			     flags, qmenu, NULL, NULL);
2648 
2649 }
2650 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
2651 
2652 /* Helper function for standard integer menu controls */
v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_ops * ops,u32 id,u8 _max,u8 _def,const s64 * qmenu_int)2653 struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
2654 			const struct v4l2_ctrl_ops *ops,
2655 			u32 id, u8 _max, u8 _def, const s64 *qmenu_int)
2656 {
2657 	const char *name;
2658 	enum v4l2_ctrl_type type;
2659 	s64 min;
2660 	u64 step;
2661 	s64 max = _max;
2662 	s64 def = _def;
2663 	u32 flags;
2664 
2665 	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2666 	if (type != V4L2_CTRL_TYPE_INTEGER_MENU) {
2667 		handler_set_err(hdl, -EINVAL);
2668 		return NULL;
2669 	}
2670 	return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2671 			     0, max, 0, def, NULL, 0,
2672 			     flags, NULL, qmenu_int, NULL);
2673 }
2674 EXPORT_SYMBOL(v4l2_ctrl_new_int_menu);
2675 
2676 /* Add the controls from another handler to our own. */
v4l2_ctrl_add_handler(struct v4l2_ctrl_handler * hdl,struct v4l2_ctrl_handler * add,bool (* filter)(const struct v4l2_ctrl * ctrl),bool from_other_dev)2677 int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
2678 			  struct v4l2_ctrl_handler *add,
2679 			  bool (*filter)(const struct v4l2_ctrl *ctrl),
2680 			  bool from_other_dev)
2681 {
2682 	struct v4l2_ctrl_ref *ref;
2683 	int ret = 0;
2684 
2685 	/* Do nothing if either handler is NULL or if they are the same */
2686 	if (!hdl || !add || hdl == add)
2687 		return 0;
2688 	if (hdl->error)
2689 		return hdl->error;
2690 	mutex_lock(add->lock);
2691 	list_for_each_entry(ref, &add->ctrl_refs, node) {
2692 		struct v4l2_ctrl *ctrl = ref->ctrl;
2693 
2694 		/* Skip handler-private controls. */
2695 		if (ctrl->is_private)
2696 			continue;
2697 		/* And control classes */
2698 		if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2699 			continue;
2700 		/* Filter any unwanted controls */
2701 		if (filter && !filter(ctrl))
2702 			continue;
2703 		ret = handler_new_ref(hdl, ctrl, NULL, from_other_dev, false);
2704 		if (ret)
2705 			break;
2706 	}
2707 	mutex_unlock(add->lock);
2708 	return ret;
2709 }
2710 EXPORT_SYMBOL(v4l2_ctrl_add_handler);
2711 
v4l2_ctrl_radio_filter(const struct v4l2_ctrl * ctrl)2712 bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl)
2713 {
2714 	if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_TX)
2715 		return true;
2716 	if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_RX)
2717 		return true;
2718 	switch (ctrl->id) {
2719 	case V4L2_CID_AUDIO_MUTE:
2720 	case V4L2_CID_AUDIO_VOLUME:
2721 	case V4L2_CID_AUDIO_BALANCE:
2722 	case V4L2_CID_AUDIO_BASS:
2723 	case V4L2_CID_AUDIO_TREBLE:
2724 	case V4L2_CID_AUDIO_LOUDNESS:
2725 		return true;
2726 	default:
2727 		break;
2728 	}
2729 	return false;
2730 }
2731 EXPORT_SYMBOL(v4l2_ctrl_radio_filter);
2732 
2733 /* Cluster controls */
v4l2_ctrl_cluster(unsigned ncontrols,struct v4l2_ctrl ** controls)2734 void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls)
2735 {
2736 	bool has_volatiles = false;
2737 	int i;
2738 
2739 	/* The first control is the master control and it must not be NULL */
2740 	if (WARN_ON(ncontrols == 0 || controls[0] == NULL))
2741 		return;
2742 
2743 	for (i = 0; i < ncontrols; i++) {
2744 		if (controls[i]) {
2745 			controls[i]->cluster = controls;
2746 			controls[i]->ncontrols = ncontrols;
2747 			if (controls[i]->flags & V4L2_CTRL_FLAG_VOLATILE)
2748 				has_volatiles = true;
2749 		}
2750 	}
2751 	controls[0]->has_volatiles = has_volatiles;
2752 }
2753 EXPORT_SYMBOL(v4l2_ctrl_cluster);
2754 
v4l2_ctrl_auto_cluster(unsigned ncontrols,struct v4l2_ctrl ** controls,u8 manual_val,bool set_volatile)2755 void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
2756 			    u8 manual_val, bool set_volatile)
2757 {
2758 	struct v4l2_ctrl *master = controls[0];
2759 	u32 flag = 0;
2760 	int i;
2761 
2762 	v4l2_ctrl_cluster(ncontrols, controls);
2763 	WARN_ON(ncontrols <= 1);
2764 	WARN_ON(manual_val < master->minimum || manual_val > master->maximum);
2765 	WARN_ON(set_volatile && !has_op(master, g_volatile_ctrl));
2766 	master->is_auto = true;
2767 	master->has_volatiles = set_volatile;
2768 	master->manual_mode_value = manual_val;
2769 	master->flags |= V4L2_CTRL_FLAG_UPDATE;
2770 
2771 	if (!is_cur_manual(master))
2772 		flag = V4L2_CTRL_FLAG_INACTIVE |
2773 			(set_volatile ? V4L2_CTRL_FLAG_VOLATILE : 0);
2774 
2775 	for (i = 1; i < ncontrols; i++)
2776 		if (controls[i])
2777 			controls[i]->flags |= flag;
2778 }
2779 EXPORT_SYMBOL(v4l2_ctrl_auto_cluster);
2780 
2781 /* Activate/deactivate a control. */
v4l2_ctrl_activate(struct v4l2_ctrl * ctrl,bool active)2782 void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
2783 {
2784 	/* invert since the actual flag is called 'inactive' */
2785 	bool inactive = !active;
2786 	bool old;
2787 
2788 	if (ctrl == NULL)
2789 		return;
2790 
2791 	if (inactive)
2792 		/* set V4L2_CTRL_FLAG_INACTIVE */
2793 		old = test_and_set_bit(4, &ctrl->flags);
2794 	else
2795 		/* clear V4L2_CTRL_FLAG_INACTIVE */
2796 		old = test_and_clear_bit(4, &ctrl->flags);
2797 	if (old != inactive)
2798 		send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2799 }
2800 EXPORT_SYMBOL(v4l2_ctrl_activate);
2801 
__v4l2_ctrl_grab(struct v4l2_ctrl * ctrl,bool grabbed)2802 void __v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
2803 {
2804 	bool old;
2805 
2806 	if (ctrl == NULL)
2807 		return;
2808 
2809 	lockdep_assert_held(ctrl->handler->lock);
2810 
2811 	if (grabbed)
2812 		/* set V4L2_CTRL_FLAG_GRABBED */
2813 		old = test_and_set_bit(1, &ctrl->flags);
2814 	else
2815 		/* clear V4L2_CTRL_FLAG_GRABBED */
2816 		old = test_and_clear_bit(1, &ctrl->flags);
2817 	if (old != grabbed)
2818 		send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2819 }
2820 EXPORT_SYMBOL(__v4l2_ctrl_grab);
2821 
2822 /* Log the control name and value */
log_ctrl(const struct v4l2_ctrl * ctrl,const char * prefix,const char * colon)2823 static void log_ctrl(const struct v4l2_ctrl *ctrl,
2824 		     const char *prefix, const char *colon)
2825 {
2826 	if (ctrl->flags & (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_WRITE_ONLY))
2827 		return;
2828 	if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2829 		return;
2830 
2831 	pr_info("%s%s%s: ", prefix, colon, ctrl->name);
2832 
2833 	ctrl->type_ops->log(ctrl);
2834 
2835 	if (ctrl->flags & (V4L2_CTRL_FLAG_INACTIVE |
2836 			   V4L2_CTRL_FLAG_GRABBED |
2837 			   V4L2_CTRL_FLAG_VOLATILE)) {
2838 		if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
2839 			pr_cont(" inactive");
2840 		if (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)
2841 			pr_cont(" grabbed");
2842 		if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE)
2843 			pr_cont(" volatile");
2844 	}
2845 	pr_cont("\n");
2846 }
2847 
2848 /* Log all controls owned by the handler */
v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler * hdl,const char * prefix)2849 void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
2850 				  const char *prefix)
2851 {
2852 	struct v4l2_ctrl *ctrl;
2853 	const char *colon = "";
2854 	int len;
2855 
2856 	if (hdl == NULL)
2857 		return;
2858 	if (prefix == NULL)
2859 		prefix = "";
2860 	len = strlen(prefix);
2861 	if (len && prefix[len - 1] != ' ')
2862 		colon = ": ";
2863 	mutex_lock(hdl->lock);
2864 	list_for_each_entry(ctrl, &hdl->ctrls, node)
2865 		if (!(ctrl->flags & V4L2_CTRL_FLAG_DISABLED))
2866 			log_ctrl(ctrl, prefix, colon);
2867 	mutex_unlock(hdl->lock);
2868 }
2869 EXPORT_SYMBOL(v4l2_ctrl_handler_log_status);
2870 
v4l2_ctrl_subdev_log_status(struct v4l2_subdev * sd)2871 int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd)
2872 {
2873 	v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name);
2874 	return 0;
2875 }
2876 EXPORT_SYMBOL(v4l2_ctrl_subdev_log_status);
2877 
2878 /* Call s_ctrl for all controls owned by the handler */
__v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler * hdl)2879 int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2880 {
2881 	struct v4l2_ctrl *ctrl;
2882 	int ret = 0;
2883 
2884 	if (hdl == NULL)
2885 		return 0;
2886 
2887 	lockdep_assert_held(hdl->lock);
2888 
2889 	list_for_each_entry(ctrl, &hdl->ctrls, node)
2890 		ctrl->done = false;
2891 
2892 	list_for_each_entry(ctrl, &hdl->ctrls, node) {
2893 		struct v4l2_ctrl *master = ctrl->cluster[0];
2894 		int i;
2895 
2896 		/* Skip if this control was already handled by a cluster. */
2897 		/* Skip button controls and read-only controls. */
2898 		if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
2899 		    (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
2900 			continue;
2901 
2902 		for (i = 0; i < master->ncontrols; i++) {
2903 			if (master->cluster[i]) {
2904 				cur_to_new(master->cluster[i]);
2905 				master->cluster[i]->is_new = 1;
2906 				master->cluster[i]->done = true;
2907 			}
2908 		}
2909 		ret = call_op(master, s_ctrl);
2910 		if (ret)
2911 			break;
2912 	}
2913 
2914 	return ret;
2915 }
2916 EXPORT_SYMBOL_GPL(__v4l2_ctrl_handler_setup);
2917 
v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler * hdl)2918 int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2919 {
2920 	int ret;
2921 
2922 	if (hdl == NULL)
2923 		return 0;
2924 
2925 	mutex_lock(hdl->lock);
2926 	ret = __v4l2_ctrl_handler_setup(hdl);
2927 	mutex_unlock(hdl->lock);
2928 
2929 	return ret;
2930 }
2931 EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
2932 
2933 /* Implement VIDIOC_QUERY_EXT_CTRL */
v4l2_query_ext_ctrl(struct v4l2_ctrl_handler * hdl,struct v4l2_query_ext_ctrl * qc)2934 int v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_query_ext_ctrl *qc)
2935 {
2936 	const unsigned next_flags = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
2937 	u32 id = qc->id & V4L2_CTRL_ID_MASK;
2938 	struct v4l2_ctrl_ref *ref;
2939 	struct v4l2_ctrl *ctrl;
2940 
2941 	if (hdl == NULL)
2942 		return -EINVAL;
2943 
2944 	mutex_lock(hdl->lock);
2945 
2946 	/* Try to find it */
2947 	ref = find_ref(hdl, id);
2948 
2949 	if ((qc->id & next_flags) && !list_empty(&hdl->ctrl_refs)) {
2950 		bool is_compound;
2951 		/* Match any control that is not hidden */
2952 		unsigned mask = 1;
2953 		bool match = false;
2954 
2955 		if ((qc->id & next_flags) == V4L2_CTRL_FLAG_NEXT_COMPOUND) {
2956 			/* Match any hidden control */
2957 			match = true;
2958 		} else if ((qc->id & next_flags) == next_flags) {
2959 			/* Match any control, compound or not */
2960 			mask = 0;
2961 		}
2962 
2963 		/* Find the next control with ID > qc->id */
2964 
2965 		/* Did we reach the end of the control list? */
2966 		if (id >= node2id(hdl->ctrl_refs.prev)) {
2967 			ref = NULL; /* Yes, so there is no next control */
2968 		} else if (ref) {
2969 			/* We found a control with the given ID, so just get
2970 			   the next valid one in the list. */
2971 			list_for_each_entry_continue(ref, &hdl->ctrl_refs, node) {
2972 				is_compound = ref->ctrl->is_array ||
2973 					ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
2974 				if (id < ref->ctrl->id &&
2975 				    (is_compound & mask) == match)
2976 					break;
2977 			}
2978 			if (&ref->node == &hdl->ctrl_refs)
2979 				ref = NULL;
2980 		} else {
2981 			/* No control with the given ID exists, so start
2982 			   searching for the next largest ID. We know there
2983 			   is one, otherwise the first 'if' above would have
2984 			   been true. */
2985 			list_for_each_entry(ref, &hdl->ctrl_refs, node) {
2986 				is_compound = ref->ctrl->is_array ||
2987 					ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
2988 				if (id < ref->ctrl->id &&
2989 				    (is_compound & mask) == match)
2990 					break;
2991 			}
2992 			if (&ref->node == &hdl->ctrl_refs)
2993 				ref = NULL;
2994 		}
2995 	}
2996 	mutex_unlock(hdl->lock);
2997 
2998 	if (!ref)
2999 		return -EINVAL;
3000 
3001 	ctrl = ref->ctrl;
3002 	memset(qc, 0, sizeof(*qc));
3003 	if (id >= V4L2_CID_PRIVATE_BASE)
3004 		qc->id = id;
3005 	else
3006 		qc->id = ctrl->id;
3007 	strscpy(qc->name, ctrl->name, sizeof(qc->name));
3008 	qc->flags = user_flags(ctrl);
3009 	qc->type = ctrl->type;
3010 	qc->elem_size = ctrl->elem_size;
3011 	qc->elems = ctrl->elems;
3012 	qc->nr_of_dims = ctrl->nr_of_dims;
3013 	memcpy(qc->dims, ctrl->dims, qc->nr_of_dims * sizeof(qc->dims[0]));
3014 	qc->minimum = ctrl->minimum;
3015 	qc->maximum = ctrl->maximum;
3016 	qc->default_value = ctrl->default_value;
3017 	if (ctrl->type == V4L2_CTRL_TYPE_MENU
3018 	    || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
3019 		qc->step = 1;
3020 	else
3021 		qc->step = ctrl->step;
3022 	return 0;
3023 }
3024 EXPORT_SYMBOL(v4l2_query_ext_ctrl);
3025 
3026 /* Implement VIDIOC_QUERYCTRL */
v4l2_queryctrl(struct v4l2_ctrl_handler * hdl,struct v4l2_queryctrl * qc)3027 int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc)
3028 {
3029 	struct v4l2_query_ext_ctrl qec = { qc->id };
3030 	int rc;
3031 
3032 	rc = v4l2_query_ext_ctrl(hdl, &qec);
3033 	if (rc)
3034 		return rc;
3035 
3036 	qc->id = qec.id;
3037 	qc->type = qec.type;
3038 	qc->flags = qec.flags;
3039 	strscpy(qc->name, qec.name, sizeof(qc->name));
3040 	switch (qc->type) {
3041 	case V4L2_CTRL_TYPE_INTEGER:
3042 	case V4L2_CTRL_TYPE_BOOLEAN:
3043 	case V4L2_CTRL_TYPE_MENU:
3044 	case V4L2_CTRL_TYPE_INTEGER_MENU:
3045 	case V4L2_CTRL_TYPE_STRING:
3046 	case V4L2_CTRL_TYPE_BITMASK:
3047 		qc->minimum = qec.minimum;
3048 		qc->maximum = qec.maximum;
3049 		qc->step = qec.step;
3050 		qc->default_value = qec.default_value;
3051 		break;
3052 	default:
3053 		qc->minimum = 0;
3054 		qc->maximum = 0;
3055 		qc->step = 0;
3056 		qc->default_value = 0;
3057 		break;
3058 	}
3059 	return 0;
3060 }
3061 EXPORT_SYMBOL(v4l2_queryctrl);
3062 
3063 /* Implement VIDIOC_QUERYMENU */
v4l2_querymenu(struct v4l2_ctrl_handler * hdl,struct v4l2_querymenu * qm)3064 int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm)
3065 {
3066 	struct v4l2_ctrl *ctrl;
3067 	u32 i = qm->index;
3068 
3069 	ctrl = v4l2_ctrl_find(hdl, qm->id);
3070 	if (!ctrl)
3071 		return -EINVAL;
3072 
3073 	qm->reserved = 0;
3074 	/* Sanity checks */
3075 	switch (ctrl->type) {
3076 	case V4L2_CTRL_TYPE_MENU:
3077 		if (ctrl->qmenu == NULL)
3078 			return -EINVAL;
3079 		break;
3080 	case V4L2_CTRL_TYPE_INTEGER_MENU:
3081 		if (ctrl->qmenu_int == NULL)
3082 			return -EINVAL;
3083 		break;
3084 	default:
3085 		return -EINVAL;
3086 	}
3087 
3088 	if (i < ctrl->minimum || i > ctrl->maximum)
3089 		return -EINVAL;
3090 
3091 	/* Use mask to see if this menu item should be skipped */
3092 	if (ctrl->menu_skip_mask & (1ULL << i))
3093 		return -EINVAL;
3094 	/* Empty menu items should also be skipped */
3095 	if (ctrl->type == V4L2_CTRL_TYPE_MENU) {
3096 		if (ctrl->qmenu[i] == NULL || ctrl->qmenu[i][0] == '\0')
3097 			return -EINVAL;
3098 		strscpy(qm->name, ctrl->qmenu[i], sizeof(qm->name));
3099 	} else {
3100 		qm->value = ctrl->qmenu_int[i];
3101 	}
3102 	return 0;
3103 }
3104 EXPORT_SYMBOL(v4l2_querymenu);
3105 
v4l2_ctrl_request_clone(struct v4l2_ctrl_handler * hdl,const struct v4l2_ctrl_handler * from)3106 static int v4l2_ctrl_request_clone(struct v4l2_ctrl_handler *hdl,
3107 				   const struct v4l2_ctrl_handler *from)
3108 {
3109 	struct v4l2_ctrl_ref *ref;
3110 	int err = 0;
3111 
3112 	if (WARN_ON(!hdl || hdl == from))
3113 		return -EINVAL;
3114 
3115 	if (hdl->error)
3116 		return hdl->error;
3117 
3118 	WARN_ON(hdl->lock != &hdl->_lock);
3119 
3120 	mutex_lock(from->lock);
3121 	list_for_each_entry(ref, &from->ctrl_refs, node) {
3122 		struct v4l2_ctrl *ctrl = ref->ctrl;
3123 		struct v4l2_ctrl_ref *new_ref;
3124 
3125 		/* Skip refs inherited from other devices */
3126 		if (ref->from_other_dev)
3127 			continue;
3128 		/* And buttons */
3129 		if (ctrl->type == V4L2_CTRL_TYPE_BUTTON)
3130 			continue;
3131 		err = handler_new_ref(hdl, ctrl, &new_ref, false, true);
3132 		if (err)
3133 			break;
3134 	}
3135 	mutex_unlock(from->lock);
3136 	return err;
3137 }
3138 
v4l2_ctrl_request_queue(struct media_request_object * obj)3139 static void v4l2_ctrl_request_queue(struct media_request_object *obj)
3140 {
3141 	struct v4l2_ctrl_handler *hdl =
3142 		container_of(obj, struct v4l2_ctrl_handler, req_obj);
3143 	struct v4l2_ctrl_handler *main_hdl = obj->priv;
3144 	struct v4l2_ctrl_handler *prev_hdl = NULL;
3145 	struct v4l2_ctrl_ref *ref_ctrl, *ref_ctrl_prev = NULL;
3146 
3147 	if (list_empty(&main_hdl->requests_queued))
3148 		goto queue;
3149 
3150 	prev_hdl = list_last_entry(&main_hdl->requests_queued,
3151 				   struct v4l2_ctrl_handler, requests_queued);
3152 	/*
3153 	 * Note: prev_hdl and hdl must contain the same list of control
3154 	 * references, so if any differences are detected then that is a
3155 	 * driver bug and the WARN_ON is triggered.
3156 	 */
3157 	mutex_lock(prev_hdl->lock);
3158 	ref_ctrl_prev = list_first_entry(&prev_hdl->ctrl_refs,
3159 					 struct v4l2_ctrl_ref, node);
3160 	list_for_each_entry(ref_ctrl, &hdl->ctrl_refs, node) {
3161 		if (ref_ctrl->req)
3162 			continue;
3163 		while (ref_ctrl_prev->ctrl->id < ref_ctrl->ctrl->id) {
3164 			/* Should never happen, but just in case... */
3165 			if (list_is_last(&ref_ctrl_prev->node,
3166 					 &prev_hdl->ctrl_refs))
3167 				break;
3168 			ref_ctrl_prev = list_next_entry(ref_ctrl_prev, node);
3169 		}
3170 		if (WARN_ON(ref_ctrl_prev->ctrl->id != ref_ctrl->ctrl->id))
3171 			break;
3172 		ref_ctrl->req = ref_ctrl_prev->req;
3173 	}
3174 	mutex_unlock(prev_hdl->lock);
3175 queue:
3176 	list_add_tail(&hdl->requests_queued, &main_hdl->requests_queued);
3177 	hdl->request_is_queued = true;
3178 }
3179 
v4l2_ctrl_request_unbind(struct media_request_object * obj)3180 static void v4l2_ctrl_request_unbind(struct media_request_object *obj)
3181 {
3182 	struct v4l2_ctrl_handler *hdl =
3183 		container_of(obj, struct v4l2_ctrl_handler, req_obj);
3184 
3185 	list_del_init(&hdl->requests);
3186 	if (hdl->request_is_queued) {
3187 		list_del_init(&hdl->requests_queued);
3188 		hdl->request_is_queued = false;
3189 	}
3190 }
3191 
v4l2_ctrl_request_release(struct media_request_object * obj)3192 static void v4l2_ctrl_request_release(struct media_request_object *obj)
3193 {
3194 	struct v4l2_ctrl_handler *hdl =
3195 		container_of(obj, struct v4l2_ctrl_handler, req_obj);
3196 
3197 	v4l2_ctrl_handler_free(hdl);
3198 	kfree(hdl);
3199 }
3200 
3201 static const struct media_request_object_ops req_ops = {
3202 	.queue = v4l2_ctrl_request_queue,
3203 	.unbind = v4l2_ctrl_request_unbind,
3204 	.release = v4l2_ctrl_request_release,
3205 };
3206 
v4l2_ctrl_request_hdl_find(struct media_request * req,struct v4l2_ctrl_handler * parent)3207 struct v4l2_ctrl_handler *v4l2_ctrl_request_hdl_find(struct media_request *req,
3208 					struct v4l2_ctrl_handler *parent)
3209 {
3210 	struct media_request_object *obj;
3211 
3212 	if (WARN_ON(req->state != MEDIA_REQUEST_STATE_VALIDATING &&
3213 		    req->state != MEDIA_REQUEST_STATE_QUEUED))
3214 		return NULL;
3215 
3216 	obj = media_request_object_find(req, &req_ops, parent);
3217 	if (obj)
3218 		return container_of(obj, struct v4l2_ctrl_handler, req_obj);
3219 	return NULL;
3220 }
3221 EXPORT_SYMBOL_GPL(v4l2_ctrl_request_hdl_find);
3222 
3223 struct v4l2_ctrl *
v4l2_ctrl_request_hdl_ctrl_find(struct v4l2_ctrl_handler * hdl,u32 id)3224 v4l2_ctrl_request_hdl_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
3225 {
3226 	struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
3227 
3228 	return (ref && ref->req == ref) ? ref->ctrl : NULL;
3229 }
3230 EXPORT_SYMBOL_GPL(v4l2_ctrl_request_hdl_ctrl_find);
3231 
v4l2_ctrl_request_bind(struct media_request * req,struct v4l2_ctrl_handler * hdl,struct v4l2_ctrl_handler * from)3232 static int v4l2_ctrl_request_bind(struct media_request *req,
3233 			   struct v4l2_ctrl_handler *hdl,
3234 			   struct v4l2_ctrl_handler *from)
3235 {
3236 	int ret;
3237 
3238 	ret = v4l2_ctrl_request_clone(hdl, from);
3239 
3240 	if (!ret) {
3241 		ret = media_request_object_bind(req, &req_ops,
3242 						from, false, &hdl->req_obj);
3243 		if (!ret)
3244 			list_add_tail(&hdl->requests, &from->requests);
3245 	}
3246 	return ret;
3247 }
3248 
3249 /* Some general notes on the atomic requirements of VIDIOC_G/TRY/S_EXT_CTRLS:
3250 
3251    It is not a fully atomic operation, just best-effort only. After all, if
3252    multiple controls have to be set through multiple i2c writes (for example)
3253    then some initial writes may succeed while others fail. Thus leaving the
3254    system in an inconsistent state. The question is how much effort you are
3255    willing to spend on trying to make something atomic that really isn't.
3256 
3257    From the point of view of an application the main requirement is that
3258    when you call VIDIOC_S_EXT_CTRLS and some values are invalid then an
3259    error should be returned without actually affecting any controls.
3260 
3261    If all the values are correct, then it is acceptable to just give up
3262    in case of low-level errors.
3263 
3264    It is important though that the application can tell when only a partial
3265    configuration was done. The way we do that is through the error_idx field
3266    of struct v4l2_ext_controls: if that is equal to the count field then no
3267    controls were affected. Otherwise all controls before that index were
3268    successful in performing their 'get' or 'set' operation, the control at
3269    the given index failed, and you don't know what happened with the controls
3270    after the failed one. Since if they were part of a control cluster they
3271    could have been successfully processed (if a cluster member was encountered
3272    at index < error_idx), they could have failed (if a cluster member was at
3273    error_idx), or they may not have been processed yet (if the first cluster
3274    member appeared after error_idx).
3275 
3276    It is all fairly theoretical, though. In practice all you can do is to
3277    bail out. If error_idx == count, then it is an application bug. If
3278    error_idx < count then it is only an application bug if the error code was
3279    EBUSY. That usually means that something started streaming just when you
3280    tried to set the controls. In all other cases it is a driver/hardware
3281    problem and all you can do is to retry or bail out.
3282 
3283    Note that these rules do not apply to VIDIOC_TRY_EXT_CTRLS: since that
3284    never modifies controls the error_idx is just set to whatever control
3285    has an invalid value.
3286  */
3287 
3288 /* Prepare for the extended g/s/try functions.
3289    Find the controls in the control array and do some basic checks. */
prepare_ext_ctrls(struct v4l2_ctrl_handler * hdl,struct v4l2_ext_controls * cs,struct v4l2_ctrl_helper * helpers,struct video_device * vdev,bool get)3290 static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
3291 			     struct v4l2_ext_controls *cs,
3292 			     struct v4l2_ctrl_helper *helpers,
3293 			     struct video_device *vdev,
3294 			     bool get)
3295 {
3296 	struct v4l2_ctrl_helper *h;
3297 	bool have_clusters = false;
3298 	u32 i;
3299 
3300 	for (i = 0, h = helpers; i < cs->count; i++, h++) {
3301 		struct v4l2_ext_control *c = &cs->controls[i];
3302 		struct v4l2_ctrl_ref *ref;
3303 		struct v4l2_ctrl *ctrl;
3304 		u32 id = c->id & V4L2_CTRL_ID_MASK;
3305 
3306 		cs->error_idx = i;
3307 
3308 		if (cs->which &&
3309 		    cs->which != V4L2_CTRL_WHICH_DEF_VAL &&
3310 		    cs->which != V4L2_CTRL_WHICH_REQUEST_VAL &&
3311 		    V4L2_CTRL_ID2WHICH(id) != cs->which) {
3312 			dprintk(vdev,
3313 				"invalid which 0x%x or control id 0x%x\n",
3314 				cs->which, id);
3315 			return -EINVAL;
3316 		}
3317 
3318 		/* Old-style private controls are not allowed for
3319 		   extended controls */
3320 		if (id >= V4L2_CID_PRIVATE_BASE) {
3321 			dprintk(vdev,
3322 				"old-style private controls not allowed\n");
3323 			return -EINVAL;
3324 		}
3325 		ref = find_ref_lock(hdl, id);
3326 		if (ref == NULL) {
3327 			dprintk(vdev, "cannot find control id 0x%x\n", id);
3328 			return -EINVAL;
3329 		}
3330 		h->ref = ref;
3331 		ctrl = ref->ctrl;
3332 		if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED) {
3333 			dprintk(vdev, "control id 0x%x is disabled\n", id);
3334 			return -EINVAL;
3335 		}
3336 
3337 		if (ctrl->cluster[0]->ncontrols > 1)
3338 			have_clusters = true;
3339 		if (ctrl->cluster[0] != ctrl)
3340 			ref = find_ref_lock(hdl, ctrl->cluster[0]->id);
3341 		if (ctrl->is_ptr && !ctrl->is_string) {
3342 			unsigned tot_size = ctrl->elems * ctrl->elem_size;
3343 
3344 			if (c->size < tot_size) {
3345 				/*
3346 				 * In the get case the application first
3347 				 * queries to obtain the size of the control.
3348 				 */
3349 				if (get) {
3350 					c->size = tot_size;
3351 					return -ENOSPC;
3352 				}
3353 				dprintk(vdev,
3354 					"pointer control id 0x%x size too small, %d bytes but %d bytes needed\n",
3355 					id, c->size, tot_size);
3356 				return -EFAULT;
3357 			}
3358 			c->size = tot_size;
3359 		}
3360 		/* Store the ref to the master control of the cluster */
3361 		h->mref = ref;
3362 		/* Initially set next to 0, meaning that there is no other
3363 		   control in this helper array belonging to the same
3364 		   cluster */
3365 		h->next = 0;
3366 	}
3367 
3368 	/* We are done if there were no controls that belong to a multi-
3369 	   control cluster. */
3370 	if (!have_clusters)
3371 		return 0;
3372 
3373 	/* The code below figures out in O(n) time which controls in the list
3374 	   belong to the same cluster. */
3375 
3376 	/* This has to be done with the handler lock taken. */
3377 	mutex_lock(hdl->lock);
3378 
3379 	/* First zero the helper field in the master control references */
3380 	for (i = 0; i < cs->count; i++)
3381 		helpers[i].mref->helper = NULL;
3382 	for (i = 0, h = helpers; i < cs->count; i++, h++) {
3383 		struct v4l2_ctrl_ref *mref = h->mref;
3384 
3385 		/* If the mref->helper is set, then it points to an earlier
3386 		   helper that belongs to the same cluster. */
3387 		if (mref->helper) {
3388 			/* Set the next field of mref->helper to the current
3389 			   index: this means that that earlier helper now
3390 			   points to the next helper in the same cluster. */
3391 			mref->helper->next = i;
3392 			/* mref should be set only for the first helper in the
3393 			   cluster, clear the others. */
3394 			h->mref = NULL;
3395 		}
3396 		/* Point the mref helper to the current helper struct. */
3397 		mref->helper = h;
3398 	}
3399 	mutex_unlock(hdl->lock);
3400 	return 0;
3401 }
3402 
3403 /* Handles the corner case where cs->count == 0. It checks whether the
3404    specified control class exists. If that class ID is 0, then it checks
3405    whether there are any controls at all. */
class_check(struct v4l2_ctrl_handler * hdl,u32 which)3406 static int class_check(struct v4l2_ctrl_handler *hdl, u32 which)
3407 {
3408 	if (which == 0 || which == V4L2_CTRL_WHICH_DEF_VAL ||
3409 	    which == V4L2_CTRL_WHICH_REQUEST_VAL)
3410 		return 0;
3411 	return find_ref_lock(hdl, which | 1) ? 0 : -EINVAL;
3412 }
3413 
3414 /* Get extended controls. Allocates the helpers array if needed. */
v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler * hdl,struct v4l2_ext_controls * cs,struct video_device * vdev)3415 static int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *hdl,
3416 				   struct v4l2_ext_controls *cs,
3417 				   struct video_device *vdev)
3418 {
3419 	struct v4l2_ctrl_helper helper[4];
3420 	struct v4l2_ctrl_helper *helpers = helper;
3421 	int ret;
3422 	int i, j;
3423 	bool def_value;
3424 
3425 	def_value = (cs->which == V4L2_CTRL_WHICH_DEF_VAL);
3426 
3427 	cs->error_idx = cs->count;
3428 	cs->which = V4L2_CTRL_ID2WHICH(cs->which);
3429 
3430 	if (hdl == NULL)
3431 		return -EINVAL;
3432 
3433 	if (cs->count == 0)
3434 		return class_check(hdl, cs->which);
3435 
3436 	if (cs->count > ARRAY_SIZE(helper)) {
3437 		helpers = kvmalloc_array(cs->count, sizeof(helper[0]),
3438 					 GFP_KERNEL);
3439 		if (helpers == NULL)
3440 			return -ENOMEM;
3441 	}
3442 
3443 	ret = prepare_ext_ctrls(hdl, cs, helpers, vdev, true);
3444 	cs->error_idx = cs->count;
3445 
3446 	for (i = 0; !ret && i < cs->count; i++)
3447 		if (helpers[i].ref->ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
3448 			ret = -EACCES;
3449 
3450 	for (i = 0; !ret && i < cs->count; i++) {
3451 		int (*ctrl_to_user)(struct v4l2_ext_control *c,
3452 				    struct v4l2_ctrl *ctrl);
3453 		struct v4l2_ctrl *master;
3454 
3455 		ctrl_to_user = def_value ? def_to_user : cur_to_user;
3456 
3457 		if (helpers[i].mref == NULL)
3458 			continue;
3459 
3460 		master = helpers[i].mref->ctrl;
3461 		cs->error_idx = i;
3462 
3463 		v4l2_ctrl_lock(master);
3464 
3465 		/* g_volatile_ctrl will update the new control values */
3466 		if (!def_value &&
3467 		    ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
3468 		    (master->has_volatiles && !is_cur_manual(master)))) {
3469 			for (j = 0; j < master->ncontrols; j++)
3470 				cur_to_new(master->cluster[j]);
3471 			ret = call_op(master, g_volatile_ctrl);
3472 			ctrl_to_user = new_to_user;
3473 		}
3474 		/* If OK, then copy the current (for non-volatile controls)
3475 		   or the new (for volatile controls) control values to the
3476 		   caller */
3477 		if (!ret) {
3478 			u32 idx = i;
3479 
3480 			do {
3481 				if (helpers[idx].ref->req)
3482 					ret = req_to_user(cs->controls + idx,
3483 						helpers[idx].ref->req);
3484 				else
3485 					ret = ctrl_to_user(cs->controls + idx,
3486 						helpers[idx].ref->ctrl);
3487 				idx = helpers[idx].next;
3488 			} while (!ret && idx);
3489 		}
3490 		v4l2_ctrl_unlock(master);
3491 	}
3492 
3493 	if (cs->count > ARRAY_SIZE(helper))
3494 		kvfree(helpers);
3495 	return ret;
3496 }
3497 
3498 static struct media_request_object *
v4l2_ctrls_find_req_obj(struct v4l2_ctrl_handler * hdl,struct media_request * req,bool set)3499 v4l2_ctrls_find_req_obj(struct v4l2_ctrl_handler *hdl,
3500 			struct media_request *req, bool set)
3501 {
3502 	struct media_request_object *obj;
3503 	struct v4l2_ctrl_handler *new_hdl;
3504 	int ret;
3505 
3506 	if (IS_ERR(req))
3507 		return ERR_CAST(req);
3508 
3509 	if (set && WARN_ON(req->state != MEDIA_REQUEST_STATE_UPDATING))
3510 		return ERR_PTR(-EBUSY);
3511 
3512 	obj = media_request_object_find(req, &req_ops, hdl);
3513 	if (obj)
3514 		return obj;
3515 	if (!set)
3516 		return ERR_PTR(-ENOENT);
3517 
3518 	new_hdl = kzalloc(sizeof(*new_hdl), GFP_KERNEL);
3519 	if (!new_hdl)
3520 		return ERR_PTR(-ENOMEM);
3521 
3522 	obj = &new_hdl->req_obj;
3523 	ret = v4l2_ctrl_handler_init(new_hdl, (hdl->nr_of_buckets - 1) * 8);
3524 	if (!ret)
3525 		ret = v4l2_ctrl_request_bind(req, new_hdl, hdl);
3526 	if (ret) {
3527 		kfree(new_hdl);
3528 
3529 		return ERR_PTR(ret);
3530 	}
3531 
3532 	media_request_object_get(obj);
3533 	return obj;
3534 }
3535 
v4l2_g_ext_ctrls(struct v4l2_ctrl_handler * hdl,struct video_device * vdev,struct media_device * mdev,struct v4l2_ext_controls * cs)3536 int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct video_device *vdev,
3537 		     struct media_device *mdev, struct v4l2_ext_controls *cs)
3538 {
3539 	struct media_request_object *obj = NULL;
3540 	struct media_request *req = NULL;
3541 	int ret;
3542 
3543 	if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL) {
3544 		if (!mdev || cs->request_fd < 0)
3545 			return -EINVAL;
3546 
3547 		req = media_request_get_by_fd(mdev, cs->request_fd);
3548 		if (IS_ERR(req))
3549 			return PTR_ERR(req);
3550 
3551 		if (req->state != MEDIA_REQUEST_STATE_COMPLETE) {
3552 			media_request_put(req);
3553 			return -EACCES;
3554 		}
3555 
3556 		ret = media_request_lock_for_access(req);
3557 		if (ret) {
3558 			media_request_put(req);
3559 			return ret;
3560 		}
3561 
3562 		obj = v4l2_ctrls_find_req_obj(hdl, req, false);
3563 		if (IS_ERR(obj)) {
3564 			media_request_unlock_for_access(req);
3565 			media_request_put(req);
3566 			return PTR_ERR(obj);
3567 		}
3568 
3569 		hdl = container_of(obj, struct v4l2_ctrl_handler,
3570 				   req_obj);
3571 	}
3572 
3573 	ret = v4l2_g_ext_ctrls_common(hdl, cs, vdev);
3574 
3575 	if (obj) {
3576 		media_request_unlock_for_access(req);
3577 		media_request_object_put(obj);
3578 		media_request_put(req);
3579 	}
3580 	return ret;
3581 }
3582 EXPORT_SYMBOL(v4l2_g_ext_ctrls);
3583 
3584 /* Helper function to get a single control */
get_ctrl(struct v4l2_ctrl * ctrl,struct v4l2_ext_control * c)3585 static int get_ctrl(struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
3586 {
3587 	struct v4l2_ctrl *master = ctrl->cluster[0];
3588 	int ret = 0;
3589 	int i;
3590 
3591 	/* Compound controls are not supported. The new_to_user() and
3592 	 * cur_to_user() calls below would need to be modified not to access
3593 	 * userspace memory when called from get_ctrl().
3594 	 */
3595 	if (!ctrl->is_int && ctrl->type != V4L2_CTRL_TYPE_INTEGER64)
3596 		return -EINVAL;
3597 
3598 	if (ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
3599 		return -EACCES;
3600 
3601 	v4l2_ctrl_lock(master);
3602 	/* g_volatile_ctrl will update the current control values */
3603 	if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
3604 		for (i = 0; i < master->ncontrols; i++)
3605 			cur_to_new(master->cluster[i]);
3606 		ret = call_op(master, g_volatile_ctrl);
3607 		new_to_user(c, ctrl);
3608 	} else {
3609 		cur_to_user(c, ctrl);
3610 	}
3611 	v4l2_ctrl_unlock(master);
3612 	return ret;
3613 }
3614 
v4l2_g_ctrl(struct v4l2_ctrl_handler * hdl,struct v4l2_control * control)3615 int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
3616 {
3617 	struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
3618 	struct v4l2_ext_control c;
3619 	int ret;
3620 
3621 	if (ctrl == NULL || !ctrl->is_int)
3622 		return -EINVAL;
3623 	ret = get_ctrl(ctrl, &c);
3624 	control->value = c.value;
3625 	return ret;
3626 }
3627 EXPORT_SYMBOL(v4l2_g_ctrl);
3628 
v4l2_ctrl_g_ctrl(struct v4l2_ctrl * ctrl)3629 s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
3630 {
3631 	struct v4l2_ext_control c;
3632 
3633 	/* It's a driver bug if this happens. */
3634 	WARN_ON(!ctrl->is_int);
3635 	c.value = 0;
3636 	get_ctrl(ctrl, &c);
3637 	return c.value;
3638 }
3639 EXPORT_SYMBOL(v4l2_ctrl_g_ctrl);
3640 
v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl * ctrl)3641 s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl)
3642 {
3643 	struct v4l2_ext_control c;
3644 
3645 	/* It's a driver bug if this happens. */
3646 	WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
3647 	c.value64 = 0;
3648 	get_ctrl(ctrl, &c);
3649 	return c.value64;
3650 }
3651 EXPORT_SYMBOL(v4l2_ctrl_g_ctrl_int64);
3652 
3653 
3654 /* Core function that calls try/s_ctrl and ensures that the new value is
3655    copied to the current value on a set.
3656    Must be called with ctrl->handler->lock held. */
try_or_set_cluster(struct v4l2_fh * fh,struct v4l2_ctrl * master,bool set,u32 ch_flags)3657 static int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
3658 			      bool set, u32 ch_flags)
3659 {
3660 	bool update_flag;
3661 	int ret;
3662 	int i;
3663 
3664 	/* Go through the cluster and either validate the new value or
3665 	   (if no new value was set), copy the current value to the new
3666 	   value, ensuring a consistent view for the control ops when
3667 	   called. */
3668 	for (i = 0; i < master->ncontrols; i++) {
3669 		struct v4l2_ctrl *ctrl = master->cluster[i];
3670 
3671 		if (ctrl == NULL)
3672 			continue;
3673 
3674 		if (!ctrl->is_new) {
3675 			cur_to_new(ctrl);
3676 			continue;
3677 		}
3678 		/* Check again: it may have changed since the
3679 		   previous check in try_or_set_ext_ctrls(). */
3680 		if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
3681 			return -EBUSY;
3682 	}
3683 
3684 	ret = call_op(master, try_ctrl);
3685 
3686 	/* Don't set if there is no change */
3687 	if (ret || !set || !cluster_changed(master))
3688 		return ret;
3689 	ret = call_op(master, s_ctrl);
3690 	if (ret)
3691 		return ret;
3692 
3693 	/* If OK, then make the new values permanent. */
3694 	update_flag = is_cur_manual(master) != is_new_manual(master);
3695 
3696 	for (i = 0; i < master->ncontrols; i++) {
3697 		/*
3698 		 * If we switch from auto to manual mode, and this cluster
3699 		 * contains volatile controls, then all non-master controls
3700 		 * have to be marked as changed. The 'new' value contains
3701 		 * the volatile value (obtained by update_from_auto_cluster),
3702 		 * which now has to become the current value.
3703 		 */
3704 		if (i && update_flag && is_new_manual(master) &&
3705 		    master->has_volatiles && master->cluster[i])
3706 			master->cluster[i]->has_changed = true;
3707 
3708 		new_to_cur(fh, master->cluster[i], ch_flags |
3709 			((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
3710 	}
3711 	return 0;
3712 }
3713 
3714 /* Validate controls. */
validate_ctrls(struct v4l2_ext_controls * cs,struct v4l2_ctrl_helper * helpers,struct video_device * vdev,bool set)3715 static int validate_ctrls(struct v4l2_ext_controls *cs,
3716 			  struct v4l2_ctrl_helper *helpers,
3717 			  struct video_device *vdev,
3718 			  bool set)
3719 {
3720 	unsigned i;
3721 	int ret = 0;
3722 
3723 	cs->error_idx = cs->count;
3724 	for (i = 0; i < cs->count; i++) {
3725 		struct v4l2_ctrl *ctrl = helpers[i].ref->ctrl;
3726 		union v4l2_ctrl_ptr p_new;
3727 
3728 		cs->error_idx = i;
3729 
3730 		if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) {
3731 			dprintk(vdev,
3732 				"control id 0x%x is read-only\n",
3733 				ctrl->id);
3734 			return -EACCES;
3735 		}
3736 		/* This test is also done in try_set_control_cluster() which
3737 		   is called in atomic context, so that has the final say,
3738 		   but it makes sense to do an up-front check as well. Once
3739 		   an error occurs in try_set_control_cluster() some other
3740 		   controls may have been set already and we want to do a
3741 		   best-effort to avoid that. */
3742 		if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)) {
3743 			dprintk(vdev,
3744 				"control id 0x%x is grabbed, cannot set\n",
3745 				ctrl->id);
3746 			return -EBUSY;
3747 		}
3748 		/*
3749 		 * Skip validation for now if the payload needs to be copied
3750 		 * from userspace into kernelspace. We'll validate those later.
3751 		 */
3752 		if (ctrl->is_ptr)
3753 			continue;
3754 		if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
3755 			p_new.p_s64 = &cs->controls[i].value64;
3756 		else
3757 			p_new.p_s32 = &cs->controls[i].value;
3758 		ret = validate_new(ctrl, p_new);
3759 		if (ret)
3760 			return ret;
3761 	}
3762 	return 0;
3763 }
3764 
3765 /* Obtain the current volatile values of an autocluster and mark them
3766    as new. */
update_from_auto_cluster(struct v4l2_ctrl * master)3767 static void update_from_auto_cluster(struct v4l2_ctrl *master)
3768 {
3769 	int i;
3770 
3771 	for (i = 1; i < master->ncontrols; i++)
3772 		cur_to_new(master->cluster[i]);
3773 	if (!call_op(master, g_volatile_ctrl))
3774 		for (i = 1; i < master->ncontrols; i++)
3775 			if (master->cluster[i])
3776 				master->cluster[i]->is_new = 1;
3777 }
3778 
3779 /* Try or try-and-set controls */
try_set_ext_ctrls_common(struct v4l2_fh * fh,struct v4l2_ctrl_handler * hdl,struct v4l2_ext_controls * cs,struct video_device * vdev,bool set)3780 static int try_set_ext_ctrls_common(struct v4l2_fh *fh,
3781 				    struct v4l2_ctrl_handler *hdl,
3782 				    struct v4l2_ext_controls *cs,
3783 				    struct video_device *vdev, bool set)
3784 {
3785 	struct v4l2_ctrl_helper helper[4];
3786 	struct v4l2_ctrl_helper *helpers = helper;
3787 	unsigned i, j;
3788 	int ret;
3789 
3790 	cs->error_idx = cs->count;
3791 
3792 	/* Default value cannot be changed */
3793 	if (cs->which == V4L2_CTRL_WHICH_DEF_VAL) {
3794 		dprintk(vdev, "%s: cannot change default value\n",
3795 			video_device_node_name(vdev));
3796 		return -EINVAL;
3797 	}
3798 
3799 	cs->which = V4L2_CTRL_ID2WHICH(cs->which);
3800 
3801 	if (hdl == NULL) {
3802 		dprintk(vdev, "%s: invalid null control handler\n",
3803 			video_device_node_name(vdev));
3804 		return -EINVAL;
3805 	}
3806 
3807 	if (cs->count == 0)
3808 		return class_check(hdl, cs->which);
3809 
3810 	if (cs->count > ARRAY_SIZE(helper)) {
3811 		helpers = kvmalloc_array(cs->count, sizeof(helper[0]),
3812 					 GFP_KERNEL);
3813 		if (!helpers)
3814 			return -ENOMEM;
3815 	}
3816 	ret = prepare_ext_ctrls(hdl, cs, helpers, vdev, false);
3817 	if (!ret)
3818 		ret = validate_ctrls(cs, helpers, vdev, set);
3819 	if (ret && set)
3820 		cs->error_idx = cs->count;
3821 	for (i = 0; !ret && i < cs->count; i++) {
3822 		struct v4l2_ctrl *master;
3823 		u32 idx = i;
3824 
3825 		if (helpers[i].mref == NULL)
3826 			continue;
3827 
3828 		cs->error_idx = i;
3829 		master = helpers[i].mref->ctrl;
3830 		v4l2_ctrl_lock(master);
3831 
3832 		/* Reset the 'is_new' flags of the cluster */
3833 		for (j = 0; j < master->ncontrols; j++)
3834 			if (master->cluster[j])
3835 				master->cluster[j]->is_new = 0;
3836 
3837 		/* For volatile autoclusters that are currently in auto mode
3838 		   we need to discover if it will be set to manual mode.
3839 		   If so, then we have to copy the current volatile values
3840 		   first since those will become the new manual values (which
3841 		   may be overwritten by explicit new values from this set
3842 		   of controls). */
3843 		if (master->is_auto && master->has_volatiles &&
3844 						!is_cur_manual(master)) {
3845 			/* Pick an initial non-manual value */
3846 			s32 new_auto_val = master->manual_mode_value + 1;
3847 			u32 tmp_idx = idx;
3848 
3849 			do {
3850 				/* Check if the auto control is part of the
3851 				   list, and remember the new value. */
3852 				if (helpers[tmp_idx].ref->ctrl == master)
3853 					new_auto_val = cs->controls[tmp_idx].value;
3854 				tmp_idx = helpers[tmp_idx].next;
3855 			} while (tmp_idx);
3856 			/* If the new value == the manual value, then copy
3857 			   the current volatile values. */
3858 			if (new_auto_val == master->manual_mode_value)
3859 				update_from_auto_cluster(master);
3860 		}
3861 
3862 		/* Copy the new caller-supplied control values.
3863 		   user_to_new() sets 'is_new' to 1. */
3864 		do {
3865 			struct v4l2_ctrl *ctrl = helpers[idx].ref->ctrl;
3866 
3867 			ret = user_to_new(cs->controls + idx, ctrl);
3868 			if (!ret && ctrl->is_ptr)
3869 				ret = validate_new(ctrl, ctrl->p_new);
3870 			idx = helpers[idx].next;
3871 		} while (!ret && idx);
3872 
3873 		if (!ret)
3874 			ret = try_or_set_cluster(fh, master,
3875 						 !hdl->req_obj.req && set, 0);
3876 		if (!ret && hdl->req_obj.req && set) {
3877 			for (j = 0; j < master->ncontrols; j++) {
3878 				struct v4l2_ctrl_ref *ref =
3879 					find_ref(hdl, master->cluster[j]->id);
3880 
3881 				new_to_req(ref);
3882 			}
3883 		}
3884 
3885 		/* Copy the new values back to userspace. */
3886 		if (!ret) {
3887 			idx = i;
3888 			do {
3889 				ret = new_to_user(cs->controls + idx,
3890 						helpers[idx].ref->ctrl);
3891 				idx = helpers[idx].next;
3892 			} while (!ret && idx);
3893 		}
3894 		v4l2_ctrl_unlock(master);
3895 	}
3896 
3897 	if (cs->count > ARRAY_SIZE(helper))
3898 		kvfree(helpers);
3899 	return ret;
3900 }
3901 
try_set_ext_ctrls(struct v4l2_fh * fh,struct v4l2_ctrl_handler * hdl,struct video_device * vdev,struct media_device * mdev,struct v4l2_ext_controls * cs,bool set)3902 static int try_set_ext_ctrls(struct v4l2_fh *fh,
3903 			     struct v4l2_ctrl_handler *hdl,
3904 			     struct video_device *vdev,
3905 			     struct media_device *mdev,
3906 			     struct v4l2_ext_controls *cs, bool set)
3907 {
3908 	struct media_request_object *obj = NULL;
3909 	struct media_request *req = NULL;
3910 	int ret;
3911 
3912 	if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL) {
3913 		if (!mdev) {
3914 			dprintk(vdev, "%s: missing media device\n",
3915 				video_device_node_name(vdev));
3916 			return -EINVAL;
3917 		}
3918 
3919 		if (cs->request_fd < 0) {
3920 			dprintk(vdev, "%s: invalid request fd %d\n",
3921 				video_device_node_name(vdev), cs->request_fd);
3922 			return -EINVAL;
3923 		}
3924 
3925 		req = media_request_get_by_fd(mdev, cs->request_fd);
3926 		if (IS_ERR(req)) {
3927 			dprintk(vdev, "%s: cannot find request fd %d\n",
3928 				video_device_node_name(vdev), cs->request_fd);
3929 			return PTR_ERR(req);
3930 		}
3931 
3932 		ret = media_request_lock_for_update(req);
3933 		if (ret) {
3934 			dprintk(vdev, "%s: cannot lock request fd %d\n",
3935 				video_device_node_name(vdev), cs->request_fd);
3936 			media_request_put(req);
3937 			return ret;
3938 		}
3939 
3940 		obj = v4l2_ctrls_find_req_obj(hdl, req, set);
3941 		if (IS_ERR(obj)) {
3942 			dprintk(vdev,
3943 				"%s: cannot find request object for request fd %d\n",
3944 				video_device_node_name(vdev),
3945 				cs->request_fd);
3946 			media_request_unlock_for_update(req);
3947 			media_request_put(req);
3948 			return PTR_ERR(obj);
3949 		}
3950 		hdl = container_of(obj, struct v4l2_ctrl_handler,
3951 				   req_obj);
3952 	}
3953 
3954 	ret = try_set_ext_ctrls_common(fh, hdl, cs, vdev, set);
3955 	if (ret)
3956 		dprintk(vdev,
3957 			"%s: try_set_ext_ctrls_common failed (%d)\n",
3958 			video_device_node_name(vdev), ret);
3959 
3960 	if (obj) {
3961 		media_request_unlock_for_update(req);
3962 		media_request_object_put(obj);
3963 		media_request_put(req);
3964 	}
3965 
3966 	return ret;
3967 }
3968 
v4l2_try_ext_ctrls(struct v4l2_ctrl_handler * hdl,struct video_device * vdev,struct media_device * mdev,struct v4l2_ext_controls * cs)3969 int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl,
3970 		       struct video_device *vdev,
3971 		       struct media_device *mdev,
3972 		       struct v4l2_ext_controls *cs)
3973 {
3974 	return try_set_ext_ctrls(NULL, hdl, vdev, mdev, cs, false);
3975 }
3976 EXPORT_SYMBOL(v4l2_try_ext_ctrls);
3977 
v4l2_s_ext_ctrls(struct v4l2_fh * fh,struct v4l2_ctrl_handler * hdl,struct video_device * vdev,struct media_device * mdev,struct v4l2_ext_controls * cs)3978 int v4l2_s_ext_ctrls(struct v4l2_fh *fh,
3979 		     struct v4l2_ctrl_handler *hdl,
3980 		     struct video_device *vdev,
3981 		     struct media_device *mdev,
3982 		     struct v4l2_ext_controls *cs)
3983 {
3984 	return try_set_ext_ctrls(fh, hdl, vdev, mdev, cs, true);
3985 }
3986 EXPORT_SYMBOL(v4l2_s_ext_ctrls);
3987 
3988 /* Helper function for VIDIOC_S_CTRL compatibility */
set_ctrl(struct v4l2_fh * fh,struct v4l2_ctrl * ctrl,u32 ch_flags)3989 static int set_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
3990 {
3991 	struct v4l2_ctrl *master = ctrl->cluster[0];
3992 	int ret;
3993 	int i;
3994 
3995 	/* Reset the 'is_new' flags of the cluster */
3996 	for (i = 0; i < master->ncontrols; i++)
3997 		if (master->cluster[i])
3998 			master->cluster[i]->is_new = 0;
3999 
4000 	ret = validate_new(ctrl, ctrl->p_new);
4001 	if (ret)
4002 		return ret;
4003 
4004 	/* For autoclusters with volatiles that are switched from auto to
4005 	   manual mode we have to update the current volatile values since
4006 	   those will become the initial manual values after such a switch. */
4007 	if (master->is_auto && master->has_volatiles && ctrl == master &&
4008 	    !is_cur_manual(master) && ctrl->val == master->manual_mode_value)
4009 		update_from_auto_cluster(master);
4010 
4011 	ctrl->is_new = 1;
4012 	return try_or_set_cluster(fh, master, true, ch_flags);
4013 }
4014 
4015 /* Helper function for VIDIOC_S_CTRL compatibility */
set_ctrl_lock(struct v4l2_fh * fh,struct v4l2_ctrl * ctrl,struct v4l2_ext_control * c)4016 static int set_ctrl_lock(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
4017 			 struct v4l2_ext_control *c)
4018 {
4019 	int ret;
4020 
4021 	v4l2_ctrl_lock(ctrl);
4022 	user_to_new(c, ctrl);
4023 	ret = set_ctrl(fh, ctrl, 0);
4024 	if (!ret)
4025 		cur_to_user(c, ctrl);
4026 	v4l2_ctrl_unlock(ctrl);
4027 	return ret;
4028 }
4029 
v4l2_s_ctrl(struct v4l2_fh * fh,struct v4l2_ctrl_handler * hdl,struct v4l2_control * control)4030 int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
4031 					struct v4l2_control *control)
4032 {
4033 	struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
4034 	struct v4l2_ext_control c = { control->id };
4035 	int ret;
4036 
4037 	if (ctrl == NULL || !ctrl->is_int)
4038 		return -EINVAL;
4039 
4040 	if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
4041 		return -EACCES;
4042 
4043 	c.value = control->value;
4044 	ret = set_ctrl_lock(fh, ctrl, &c);
4045 	control->value = c.value;
4046 	return ret;
4047 }
4048 EXPORT_SYMBOL(v4l2_s_ctrl);
4049 
__v4l2_ctrl_s_ctrl(struct v4l2_ctrl * ctrl,s32 val)4050 int __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
4051 {
4052 	lockdep_assert_held(ctrl->handler->lock);
4053 
4054 	/* It's a driver bug if this happens. */
4055 	WARN_ON(!ctrl->is_int);
4056 	ctrl->val = val;
4057 	return set_ctrl(NULL, ctrl, 0);
4058 }
4059 EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl);
4060 
__v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl * ctrl,s64 val)4061 int __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val)
4062 {
4063 	lockdep_assert_held(ctrl->handler->lock);
4064 
4065 	/* It's a driver bug if this happens. */
4066 	WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
4067 	*ctrl->p_new.p_s64 = val;
4068 	return set_ctrl(NULL, ctrl, 0);
4069 }
4070 EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_int64);
4071 
__v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl * ctrl,const char * s)4072 int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
4073 {
4074 	lockdep_assert_held(ctrl->handler->lock);
4075 
4076 	/* It's a driver bug if this happens. */
4077 	WARN_ON(ctrl->type != V4L2_CTRL_TYPE_STRING);
4078 	strscpy(ctrl->p_new.p_char, s, ctrl->maximum + 1);
4079 	return set_ctrl(NULL, ctrl, 0);
4080 }
4081 EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
4082 
v4l2_ctrl_request_complete(struct media_request * req,struct v4l2_ctrl_handler * main_hdl)4083 void v4l2_ctrl_request_complete(struct media_request *req,
4084 				struct v4l2_ctrl_handler *main_hdl)
4085 {
4086 	struct media_request_object *obj;
4087 	struct v4l2_ctrl_handler *hdl;
4088 	struct v4l2_ctrl_ref *ref;
4089 
4090 	if (!req || !main_hdl)
4091 		return;
4092 
4093 	/*
4094 	 * Note that it is valid if nothing was found. It means
4095 	 * that this request doesn't have any controls and so just
4096 	 * wants to leave the controls unchanged.
4097 	 */
4098 	obj = media_request_object_find(req, &req_ops, main_hdl);
4099 	if (!obj)
4100 		return;
4101 	hdl = container_of(obj, struct v4l2_ctrl_handler, req_obj);
4102 
4103 	list_for_each_entry(ref, &hdl->ctrl_refs, node) {
4104 		struct v4l2_ctrl *ctrl = ref->ctrl;
4105 		struct v4l2_ctrl *master = ctrl->cluster[0];
4106 		unsigned int i;
4107 
4108 		if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
4109 			ref->req = ref;
4110 
4111 			v4l2_ctrl_lock(master);
4112 			/* g_volatile_ctrl will update the current control values */
4113 			for (i = 0; i < master->ncontrols; i++)
4114 				cur_to_new(master->cluster[i]);
4115 			call_op(master, g_volatile_ctrl);
4116 			new_to_req(ref);
4117 			v4l2_ctrl_unlock(master);
4118 			continue;
4119 		}
4120 		if (ref->req == ref)
4121 			continue;
4122 
4123 		v4l2_ctrl_lock(ctrl);
4124 		if (ref->req)
4125 			ptr_to_ptr(ctrl, ref->req->p_req, ref->p_req);
4126 		else
4127 			ptr_to_ptr(ctrl, ctrl->p_cur, ref->p_req);
4128 		v4l2_ctrl_unlock(ctrl);
4129 	}
4130 
4131 	WARN_ON(!hdl->request_is_queued);
4132 	list_del_init(&hdl->requests_queued);
4133 	hdl->request_is_queued = false;
4134 	media_request_object_complete(obj);
4135 	media_request_object_put(obj);
4136 }
4137 EXPORT_SYMBOL(v4l2_ctrl_request_complete);
4138 
v4l2_ctrl_request_setup(struct media_request * req,struct v4l2_ctrl_handler * main_hdl)4139 int v4l2_ctrl_request_setup(struct media_request *req,
4140 			     struct v4l2_ctrl_handler *main_hdl)
4141 {
4142 	struct media_request_object *obj;
4143 	struct v4l2_ctrl_handler *hdl;
4144 	struct v4l2_ctrl_ref *ref;
4145 	int ret = 0;
4146 
4147 	if (!req || !main_hdl)
4148 		return 0;
4149 
4150 	if (WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED))
4151 		return -EBUSY;
4152 
4153 	/*
4154 	 * Note that it is valid if nothing was found. It means
4155 	 * that this request doesn't have any controls and so just
4156 	 * wants to leave the controls unchanged.
4157 	 */
4158 	obj = media_request_object_find(req, &req_ops, main_hdl);
4159 	if (!obj)
4160 		return 0;
4161 	if (obj->completed) {
4162 		media_request_object_put(obj);
4163 		return -EBUSY;
4164 	}
4165 	hdl = container_of(obj, struct v4l2_ctrl_handler, req_obj);
4166 
4167 	list_for_each_entry(ref, &hdl->ctrl_refs, node)
4168 		ref->req_done = false;
4169 
4170 	list_for_each_entry(ref, &hdl->ctrl_refs, node) {
4171 		struct v4l2_ctrl *ctrl = ref->ctrl;
4172 		struct v4l2_ctrl *master = ctrl->cluster[0];
4173 		bool have_new_data = false;
4174 		int i;
4175 
4176 		/*
4177 		 * Skip if this control was already handled by a cluster.
4178 		 * Skip button controls and read-only controls.
4179 		 */
4180 		if (ref->req_done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
4181 		    (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
4182 			continue;
4183 
4184 		v4l2_ctrl_lock(master);
4185 		for (i = 0; i < master->ncontrols; i++) {
4186 			if (master->cluster[i]) {
4187 				struct v4l2_ctrl_ref *r =
4188 					find_ref(hdl, master->cluster[i]->id);
4189 
4190 				if (r->req && r == r->req) {
4191 					have_new_data = true;
4192 					break;
4193 				}
4194 			}
4195 		}
4196 		if (!have_new_data) {
4197 			v4l2_ctrl_unlock(master);
4198 			continue;
4199 		}
4200 
4201 		for (i = 0; i < master->ncontrols; i++) {
4202 			if (master->cluster[i]) {
4203 				struct v4l2_ctrl_ref *r =
4204 					find_ref(hdl, master->cluster[i]->id);
4205 
4206 				req_to_new(r);
4207 				master->cluster[i]->is_new = 1;
4208 				r->req_done = true;
4209 			}
4210 		}
4211 		/*
4212 		 * For volatile autoclusters that are currently in auto mode
4213 		 * we need to discover if it will be set to manual mode.
4214 		 * If so, then we have to copy the current volatile values
4215 		 * first since those will become the new manual values (which
4216 		 * may be overwritten by explicit new values from this set
4217 		 * of controls).
4218 		 */
4219 		if (master->is_auto && master->has_volatiles &&
4220 		    !is_cur_manual(master)) {
4221 			s32 new_auto_val = *master->p_new.p_s32;
4222 
4223 			/*
4224 			 * If the new value == the manual value, then copy
4225 			 * the current volatile values.
4226 			 */
4227 			if (new_auto_val == master->manual_mode_value)
4228 				update_from_auto_cluster(master);
4229 		}
4230 
4231 		ret = try_or_set_cluster(NULL, master, true, 0);
4232 		v4l2_ctrl_unlock(master);
4233 
4234 		if (ret)
4235 			break;
4236 	}
4237 
4238 	media_request_object_put(obj);
4239 	return ret;
4240 }
4241 EXPORT_SYMBOL(v4l2_ctrl_request_setup);
4242 
v4l2_ctrl_notify(struct v4l2_ctrl * ctrl,v4l2_ctrl_notify_fnc notify,void * priv)4243 void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv)
4244 {
4245 	if (ctrl == NULL)
4246 		return;
4247 	if (notify == NULL) {
4248 		ctrl->call_notify = 0;
4249 		return;
4250 	}
4251 	if (WARN_ON(ctrl->handler->notify && ctrl->handler->notify != notify))
4252 		return;
4253 	ctrl->handler->notify = notify;
4254 	ctrl->handler->notify_priv = priv;
4255 	ctrl->call_notify = 1;
4256 }
4257 EXPORT_SYMBOL(v4l2_ctrl_notify);
4258 
__v4l2_ctrl_modify_range(struct v4l2_ctrl * ctrl,s64 min,s64 max,u64 step,s64 def)4259 int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
4260 			s64 min, s64 max, u64 step, s64 def)
4261 {
4262 	bool value_changed;
4263 	bool range_changed = false;
4264 	int ret;
4265 
4266 	lockdep_assert_held(ctrl->handler->lock);
4267 
4268 	switch (ctrl->type) {
4269 	case V4L2_CTRL_TYPE_INTEGER:
4270 	case V4L2_CTRL_TYPE_INTEGER64:
4271 	case V4L2_CTRL_TYPE_BOOLEAN:
4272 	case V4L2_CTRL_TYPE_MENU:
4273 	case V4L2_CTRL_TYPE_INTEGER_MENU:
4274 	case V4L2_CTRL_TYPE_BITMASK:
4275 	case V4L2_CTRL_TYPE_U8:
4276 	case V4L2_CTRL_TYPE_U16:
4277 	case V4L2_CTRL_TYPE_U32:
4278 		if (ctrl->is_array)
4279 			return -EINVAL;
4280 		ret = check_range(ctrl->type, min, max, step, def);
4281 		if (ret)
4282 			return ret;
4283 		break;
4284 	default:
4285 		return -EINVAL;
4286 	}
4287 	if ((ctrl->minimum != min) || (ctrl->maximum != max) ||
4288 		(ctrl->step != step) || ctrl->default_value != def) {
4289 		range_changed = true;
4290 		ctrl->minimum = min;
4291 		ctrl->maximum = max;
4292 		ctrl->step = step;
4293 		ctrl->default_value = def;
4294 	}
4295 	cur_to_new(ctrl);
4296 	if (validate_new(ctrl, ctrl->p_new)) {
4297 		if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
4298 			*ctrl->p_new.p_s64 = def;
4299 		else
4300 			*ctrl->p_new.p_s32 = def;
4301 	}
4302 
4303 	if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
4304 		value_changed = *ctrl->p_new.p_s64 != *ctrl->p_cur.p_s64;
4305 	else
4306 		value_changed = *ctrl->p_new.p_s32 != *ctrl->p_cur.p_s32;
4307 	if (value_changed)
4308 		ret = set_ctrl(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
4309 	else if (range_changed)
4310 		send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
4311 	return ret;
4312 }
4313 EXPORT_SYMBOL(__v4l2_ctrl_modify_range);
4314 
v4l2_ctrl_add_event(struct v4l2_subscribed_event * sev,unsigned elems)4315 static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev, unsigned elems)
4316 {
4317 	struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
4318 
4319 	if (ctrl == NULL)
4320 		return -EINVAL;
4321 
4322 	v4l2_ctrl_lock(ctrl);
4323 	list_add_tail(&sev->node, &ctrl->ev_subs);
4324 	if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
4325 	    (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL)) {
4326 		struct v4l2_event ev;
4327 		u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
4328 
4329 		if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
4330 			changes |= V4L2_EVENT_CTRL_CH_VALUE;
4331 		fill_event(&ev, ctrl, changes);
4332 		/* Mark the queue as active, allowing this initial
4333 		   event to be accepted. */
4334 		sev->elems = elems;
4335 		v4l2_event_queue_fh(sev->fh, &ev);
4336 	}
4337 	v4l2_ctrl_unlock(ctrl);
4338 	return 0;
4339 }
4340 
v4l2_ctrl_del_event(struct v4l2_subscribed_event * sev)4341 static void v4l2_ctrl_del_event(struct v4l2_subscribed_event *sev)
4342 {
4343 	struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
4344 
4345 	if (ctrl == NULL)
4346 		return;
4347 
4348 	v4l2_ctrl_lock(ctrl);
4349 	list_del(&sev->node);
4350 	v4l2_ctrl_unlock(ctrl);
4351 }
4352 
v4l2_ctrl_replace(struct v4l2_event * old,const struct v4l2_event * new)4353 void v4l2_ctrl_replace(struct v4l2_event *old, const struct v4l2_event *new)
4354 {
4355 	u32 old_changes = old->u.ctrl.changes;
4356 
4357 	old->u.ctrl = new->u.ctrl;
4358 	old->u.ctrl.changes |= old_changes;
4359 }
4360 EXPORT_SYMBOL(v4l2_ctrl_replace);
4361 
v4l2_ctrl_merge(const struct v4l2_event * old,struct v4l2_event * new)4362 void v4l2_ctrl_merge(const struct v4l2_event *old, struct v4l2_event *new)
4363 {
4364 	new->u.ctrl.changes |= old->u.ctrl.changes;
4365 }
4366 EXPORT_SYMBOL(v4l2_ctrl_merge);
4367 
4368 const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops = {
4369 	.add = v4l2_ctrl_add_event,
4370 	.del = v4l2_ctrl_del_event,
4371 	.replace = v4l2_ctrl_replace,
4372 	.merge = v4l2_ctrl_merge,
4373 };
4374 EXPORT_SYMBOL(v4l2_ctrl_sub_ev_ops);
4375 
v4l2_ctrl_log_status(struct file * file,void * fh)4376 int v4l2_ctrl_log_status(struct file *file, void *fh)
4377 {
4378 	struct video_device *vfd = video_devdata(file);
4379 	struct v4l2_fh *vfh = file->private_data;
4380 
4381 	if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) && vfd->v4l2_dev)
4382 		v4l2_ctrl_handler_log_status(vfh->ctrl_handler,
4383 			vfd->v4l2_dev->name);
4384 	return 0;
4385 }
4386 EXPORT_SYMBOL(v4l2_ctrl_log_status);
4387 
v4l2_ctrl_subscribe_event(struct v4l2_fh * fh,const struct v4l2_event_subscription * sub)4388 int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
4389 				const struct v4l2_event_subscription *sub)
4390 {
4391 	if (sub->type == V4L2_EVENT_CTRL)
4392 		return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
4393 	return -EINVAL;
4394 }
4395 EXPORT_SYMBOL(v4l2_ctrl_subscribe_event);
4396 
v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev * sd,struct v4l2_fh * fh,struct v4l2_event_subscription * sub)4397 int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
4398 				     struct v4l2_event_subscription *sub)
4399 {
4400 	if (!sd->ctrl_handler)
4401 		return -EINVAL;
4402 	return v4l2_ctrl_subscribe_event(fh, sub);
4403 }
4404 EXPORT_SYMBOL(v4l2_ctrl_subdev_subscribe_event);
4405 
v4l2_ctrl_poll(struct file * file,struct poll_table_struct * wait)4406 __poll_t v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait)
4407 {
4408 	struct v4l2_fh *fh = file->private_data;
4409 
4410 	poll_wait(file, &fh->wait, wait);
4411 	if (v4l2_event_pending(fh))
4412 		return EPOLLPRI;
4413 	return 0;
4414 }
4415 EXPORT_SYMBOL(v4l2_ctrl_poll);
4416