1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/ctype.h>
22#include <linux/slab.h>
23#include <linux/export.h>
24#include <media/v4l2-ioctl.h>
25#include <media/v4l2-device.h>
26#include <media/v4l2-ctrls.h>
27#include <media/v4l2-event.h>
28#include <media/v4l2-dev.h>
29
30#define has_op(master, op) \
31 (master->ops && master->ops->op)
32#define call_op(master, op) \
33 (has_op(master, op) ? master->ops->op(master) : 0)
34
35
36struct v4l2_ctrl_helper {
37
38 struct v4l2_ctrl_ref *mref;
39
40 struct v4l2_ctrl *ctrl;
41
42
43 u32 next;
44};
45
46
47
48static bool is_cur_manual(const struct v4l2_ctrl *master)
49{
50 return master->is_auto && master->cur.val == master->manual_mode_value;
51}
52
53
54
55static bool is_new_manual(const struct v4l2_ctrl *master)
56{
57 return master->is_auto && master->val == master->manual_mode_value;
58}
59
60
61
62
63
64const char * const *v4l2_ctrl_get_menu(u32 id)
65{
66 static const char * const mpeg_audio_sampling_freq[] = {
67 "44.1 kHz",
68 "48 kHz",
69 "32 kHz",
70 NULL
71 };
72 static const char * const mpeg_audio_encoding[] = {
73 "MPEG-1/2 Layer I",
74 "MPEG-1/2 Layer II",
75 "MPEG-1/2 Layer III",
76 "MPEG-2/4 AAC",
77 "AC-3",
78 NULL
79 };
80 static const char * const mpeg_audio_l1_bitrate[] = {
81 "32 kbps",
82 "64 kbps",
83 "96 kbps",
84 "128 kbps",
85 "160 kbps",
86 "192 kbps",
87 "224 kbps",
88 "256 kbps",
89 "288 kbps",
90 "320 kbps",
91 "352 kbps",
92 "384 kbps",
93 "416 kbps",
94 "448 kbps",
95 NULL
96 };
97 static const char * const mpeg_audio_l2_bitrate[] = {
98 "32 kbps",
99 "48 kbps",
100 "56 kbps",
101 "64 kbps",
102 "80 kbps",
103 "96 kbps",
104 "112 kbps",
105 "128 kbps",
106 "160 kbps",
107 "192 kbps",
108 "224 kbps",
109 "256 kbps",
110 "320 kbps",
111 "384 kbps",
112 NULL
113 };
114 static const char * const mpeg_audio_l3_bitrate[] = {
115 "32 kbps",
116 "40 kbps",
117 "48 kbps",
118 "56 kbps",
119 "64 kbps",
120 "80 kbps",
121 "96 kbps",
122 "112 kbps",
123 "128 kbps",
124 "160 kbps",
125 "192 kbps",
126 "224 kbps",
127 "256 kbps",
128 "320 kbps",
129 NULL
130 };
131 static const char * const mpeg_audio_ac3_bitrate[] = {
132 "32 kbps",
133 "40 kbps",
134 "48 kbps",
135 "56 kbps",
136 "64 kbps",
137 "80 kbps",
138 "96 kbps",
139 "112 kbps",
140 "128 kbps",
141 "160 kbps",
142 "192 kbps",
143 "224 kbps",
144 "256 kbps",
145 "320 kbps",
146 "384 kbps",
147 "448 kbps",
148 "512 kbps",
149 "576 kbps",
150 "640 kbps",
151 NULL
152 };
153 static const char * const mpeg_audio_mode[] = {
154 "Stereo",
155 "Joint Stereo",
156 "Dual",
157 "Mono",
158 NULL
159 };
160 static const char * const mpeg_audio_mode_extension[] = {
161 "Bound 4",
162 "Bound 8",
163 "Bound 12",
164 "Bound 16",
165 NULL
166 };
167 static const char * const mpeg_audio_emphasis[] = {
168 "No Emphasis",
169 "50/15 us",
170 "CCITT J17",
171 NULL
172 };
173 static const char * const mpeg_audio_crc[] = {
174 "No CRC",
175 "16-bit CRC",
176 NULL
177 };
178 static const char * const mpeg_audio_dec_playback[] = {
179 "Auto",
180 "Stereo",
181 "Left",
182 "Right",
183 "Mono",
184 "Swapped Stereo",
185 NULL
186 };
187 static const char * const mpeg_video_encoding[] = {
188 "MPEG-1",
189 "MPEG-2",
190 "MPEG-4 AVC",
191 NULL
192 };
193 static const char * const mpeg_video_aspect[] = {
194 "1x1",
195 "4x3",
196 "16x9",
197 "2.21x1",
198 NULL
199 };
200 static const char * const mpeg_video_bitrate_mode[] = {
201 "Variable Bitrate",
202 "Constant Bitrate",
203 NULL
204 };
205 static const char * const mpeg_stream_type[] = {
206 "MPEG-2 Program Stream",
207 "MPEG-2 Transport Stream",
208 "MPEG-1 System Stream",
209 "MPEG-2 DVD-compatible Stream",
210 "MPEG-1 VCD-compatible Stream",
211 "MPEG-2 SVCD-compatible Stream",
212 NULL
213 };
214 static const char * const mpeg_stream_vbi_fmt[] = {
215 "No VBI",
216 "Private Packet, IVTV Format",
217 NULL
218 };
219 static const char * const camera_power_line_frequency[] = {
220 "Disabled",
221 "50 Hz",
222 "60 Hz",
223 "Auto",
224 NULL
225 };
226 static const char * const camera_exposure_auto[] = {
227 "Auto Mode",
228 "Manual Mode",
229 "Shutter Priority Mode",
230 "Aperture Priority Mode",
231 NULL
232 };
233 static const char * const camera_exposure_metering[] = {
234 "Average",
235 "Center Weighted",
236 "Spot",
237 "Matrix",
238 NULL
239 };
240 static const char * const camera_auto_focus_range[] = {
241 "Auto",
242 "Normal",
243 "Macro",
244 "Infinity",
245 NULL
246 };
247 static const char * const colorfx[] = {
248 "None",
249 "Black & White",
250 "Sepia",
251 "Negative",
252 "Emboss",
253 "Sketch",
254 "Sky Blue",
255 "Grass Green",
256 "Skin Whiten",
257 "Vivid",
258 "Aqua",
259 "Art Freeze",
260 "Silhouette",
261 "Solarization",
262 "Antique",
263 "Set Cb/Cr",
264 NULL
265 };
266 static const char * const auto_n_preset_white_balance[] = {
267 "Manual",
268 "Auto",
269 "Incandescent",
270 "Fluorescent",
271 "Fluorescent H",
272 "Horizon",
273 "Daylight",
274 "Flash",
275 "Cloudy",
276 "Shade",
277 NULL,
278 };
279 static const char * const camera_iso_sensitivity_auto[] = {
280 "Manual",
281 "Auto",
282 NULL
283 };
284 static const char * const scene_mode[] = {
285 "None",
286 "Backlight",
287 "Beach/Snow",
288 "Candle Light",
289 "Dusk/Dawn",
290 "Fall Colors",
291 "Fireworks",
292 "Landscape",
293 "Night",
294 "Party/Indoor",
295 "Portrait",
296 "Sports",
297 "Sunset",
298 "Text",
299 NULL
300 };
301 static const char * const tune_emphasis[] = {
302 "None",
303 "50 Microseconds",
304 "75 Microseconds",
305 NULL,
306 };
307 static const char * const header_mode[] = {
308 "Separate Buffer",
309 "Joined With 1st Frame",
310 NULL,
311 };
312 static const char * const multi_slice[] = {
313 "Single",
314 "Max Macroblocks",
315 "Max Bytes",
316 NULL,
317 };
318 static const char * const entropy_mode[] = {
319 "CAVLC",
320 "CABAC",
321 NULL,
322 };
323 static const char * const mpeg_h264_level[] = {
324 "1",
325 "1b",
326 "1.1",
327 "1.2",
328 "1.3",
329 "2",
330 "2.1",
331 "2.2",
332 "3",
333 "3.1",
334 "3.2",
335 "4",
336 "4.1",
337 "4.2",
338 "5",
339 "5.1",
340 NULL,
341 };
342 static const char * const h264_loop_filter[] = {
343 "Enabled",
344 "Disabled",
345 "Disabled at Slice Boundary",
346 NULL,
347 };
348 static const char * const h264_profile[] = {
349 "Baseline",
350 "Constrained Baseline",
351 "Main",
352 "Extended",
353 "High",
354 "High 10",
355 "High 422",
356 "High 444 Predictive",
357 "High 10 Intra",
358 "High 422 Intra",
359 "High 444 Intra",
360 "CAVLC 444 Intra",
361 "Scalable Baseline",
362 "Scalable High",
363 "Scalable High Intra",
364 "Multiview High",
365 NULL,
366 };
367 static const char * const vui_sar_idc[] = {
368 "Unspecified",
369 "1:1",
370 "12:11",
371 "10:11",
372 "16:11",
373 "40:33",
374 "24:11",
375 "20:11",
376 "32:11",
377 "80:33",
378 "18:11",
379 "15:11",
380 "64:33",
381 "160:99",
382 "4:3",
383 "3:2",
384 "2:1",
385 "Extended SAR",
386 NULL,
387 };
388 static const char * const h264_fp_arrangement_type[] = {
389 "Checkerboard",
390 "Column",
391 "Row",
392 "Side by Side",
393 "Top Bottom",
394 "Temporal",
395 NULL,
396 };
397 static const char * const h264_fmo_map_type[] = {
398 "Interleaved Slices",
399 "Scattered Slices",
400 "Foreground with Leftover",
401 "Box Out",
402 "Raster Scan",
403 "Wipe Scan",
404 "Explicit",
405 NULL,
406 };
407 static const char * const mpeg_mpeg4_level[] = {
408 "0",
409 "0b",
410 "1",
411 "2",
412 "3",
413 "3b",
414 "4",
415 "5",
416 NULL,
417 };
418 static const char * const mpeg4_profile[] = {
419 "Simple",
420 "Advanced Simple",
421 "Core",
422 "Simple Scalable",
423 "Advanced Coding Efficiency",
424 NULL,
425 };
426
427 static const char * const vpx_golden_frame_sel[] = {
428 "Use Previous Frame",
429 "Use Previous Specific Frame",
430 NULL,
431 };
432
433 static const char * const flash_led_mode[] = {
434 "Off",
435 "Flash",
436 "Torch",
437 NULL,
438 };
439 static const char * const flash_strobe_source[] = {
440 "Software",
441 "External",
442 NULL,
443 };
444
445 static const char * const jpeg_chroma_subsampling[] = {
446 "4:4:4",
447 "4:2:2",
448 "4:2:0",
449 "4:1:1",
450 "4:1:0",
451 "Gray",
452 NULL,
453 };
454 static const char * const dv_tx_mode[] = {
455 "DVI-D",
456 "HDMI",
457 NULL,
458 };
459 static const char * const dv_rgb_range[] = {
460 "Automatic",
461 "RGB limited range (16-235)",
462 "RGB full range (0-255)",
463 NULL,
464 };
465 static const char * const detect_md_mode[] = {
466 "Disabled",
467 "Global",
468 "Threshold Grid",
469 "Region Grid",
470 NULL,
471 };
472
473
474 switch (id) {
475 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
476 return mpeg_audio_sampling_freq;
477 case V4L2_CID_MPEG_AUDIO_ENCODING:
478 return mpeg_audio_encoding;
479 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
480 return mpeg_audio_l1_bitrate;
481 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
482 return mpeg_audio_l2_bitrate;
483 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
484 return mpeg_audio_l3_bitrate;
485 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
486 return mpeg_audio_ac3_bitrate;
487 case V4L2_CID_MPEG_AUDIO_MODE:
488 return mpeg_audio_mode;
489 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
490 return mpeg_audio_mode_extension;
491 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
492 return mpeg_audio_emphasis;
493 case V4L2_CID_MPEG_AUDIO_CRC:
494 return mpeg_audio_crc;
495 case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
496 case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
497 return mpeg_audio_dec_playback;
498 case V4L2_CID_MPEG_VIDEO_ENCODING:
499 return mpeg_video_encoding;
500 case V4L2_CID_MPEG_VIDEO_ASPECT:
501 return mpeg_video_aspect;
502 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
503 return mpeg_video_bitrate_mode;
504 case V4L2_CID_MPEG_STREAM_TYPE:
505 return mpeg_stream_type;
506 case V4L2_CID_MPEG_STREAM_VBI_FMT:
507 return mpeg_stream_vbi_fmt;
508 case V4L2_CID_POWER_LINE_FREQUENCY:
509 return camera_power_line_frequency;
510 case V4L2_CID_EXPOSURE_AUTO:
511 return camera_exposure_auto;
512 case V4L2_CID_EXPOSURE_METERING:
513 return camera_exposure_metering;
514 case V4L2_CID_AUTO_FOCUS_RANGE:
515 return camera_auto_focus_range;
516 case V4L2_CID_COLORFX:
517 return colorfx;
518 case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
519 return auto_n_preset_white_balance;
520 case V4L2_CID_ISO_SENSITIVITY_AUTO:
521 return camera_iso_sensitivity_auto;
522 case V4L2_CID_SCENE_MODE:
523 return scene_mode;
524 case V4L2_CID_TUNE_PREEMPHASIS:
525 return tune_emphasis;
526 case V4L2_CID_TUNE_DEEMPHASIS:
527 return tune_emphasis;
528 case V4L2_CID_FLASH_LED_MODE:
529 return flash_led_mode;
530 case V4L2_CID_FLASH_STROBE_SOURCE:
531 return flash_strobe_source;
532 case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
533 return header_mode;
534 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
535 return multi_slice;
536 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
537 return entropy_mode;
538 case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
539 return mpeg_h264_level;
540 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
541 return h264_loop_filter;
542 case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
543 return h264_profile;
544 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
545 return vui_sar_idc;
546 case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:
547 return h264_fp_arrangement_type;
548 case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
549 return h264_fmo_map_type;
550 case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
551 return mpeg_mpeg4_level;
552 case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
553 return mpeg4_profile;
554 case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:
555 return vpx_golden_frame_sel;
556 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
557 return jpeg_chroma_subsampling;
558 case V4L2_CID_DV_TX_MODE:
559 return dv_tx_mode;
560 case V4L2_CID_DV_TX_RGB_RANGE:
561 case V4L2_CID_DV_RX_RGB_RANGE:
562 return dv_rgb_range;
563 case V4L2_CID_DETECT_MD_MODE:
564 return detect_md_mode;
565
566 default:
567 return NULL;
568 }
569}
570EXPORT_SYMBOL(v4l2_ctrl_get_menu);
571
572#define __v4l2_qmenu_int_len(arr, len) ({ *(len) = ARRAY_SIZE(arr); arr; })
573
574
575
576
577const s64 *v4l2_ctrl_get_int_menu(u32 id, u32 *len)
578{
579 static const s64 qmenu_int_vpx_num_partitions[] = {
580 1, 2, 4, 8,
581 };
582
583 static const s64 qmenu_int_vpx_num_ref_frames[] = {
584 1, 2, 3,
585 };
586
587 switch (id) {
588 case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:
589 return __v4l2_qmenu_int_len(qmenu_int_vpx_num_partitions, len);
590 case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:
591 return __v4l2_qmenu_int_len(qmenu_int_vpx_num_ref_frames, len);
592 default:
593 *len = 0;
594 return NULL;
595 }
596}
597EXPORT_SYMBOL(v4l2_ctrl_get_int_menu);
598
599
600const char *v4l2_ctrl_get_name(u32 id)
601{
602 switch (id) {
603
604
605 case V4L2_CID_USER_CLASS: return "User Controls";
606 case V4L2_CID_BRIGHTNESS: return "Brightness";
607 case V4L2_CID_CONTRAST: return "Contrast";
608 case V4L2_CID_SATURATION: return "Saturation";
609 case V4L2_CID_HUE: return "Hue";
610 case V4L2_CID_AUDIO_VOLUME: return "Volume";
611 case V4L2_CID_AUDIO_BALANCE: return "Balance";
612 case V4L2_CID_AUDIO_BASS: return "Bass";
613 case V4L2_CID_AUDIO_TREBLE: return "Treble";
614 case V4L2_CID_AUDIO_MUTE: return "Mute";
615 case V4L2_CID_AUDIO_LOUDNESS: return "Loudness";
616 case V4L2_CID_BLACK_LEVEL: return "Black Level";
617 case V4L2_CID_AUTO_WHITE_BALANCE: return "White Balance, Automatic";
618 case V4L2_CID_DO_WHITE_BALANCE: return "Do White Balance";
619 case V4L2_CID_RED_BALANCE: return "Red Balance";
620 case V4L2_CID_BLUE_BALANCE: return "Blue Balance";
621 case V4L2_CID_GAMMA: return "Gamma";
622 case V4L2_CID_EXPOSURE: return "Exposure";
623 case V4L2_CID_AUTOGAIN: return "Gain, Automatic";
624 case V4L2_CID_GAIN: return "Gain";
625 case V4L2_CID_HFLIP: return "Horizontal Flip";
626 case V4L2_CID_VFLIP: return "Vertical Flip";
627 case V4L2_CID_POWER_LINE_FREQUENCY: return "Power Line Frequency";
628 case V4L2_CID_HUE_AUTO: return "Hue, Automatic";
629 case V4L2_CID_WHITE_BALANCE_TEMPERATURE: return "White Balance Temperature";
630 case V4L2_CID_SHARPNESS: return "Sharpness";
631 case V4L2_CID_BACKLIGHT_COMPENSATION: return "Backlight Compensation";
632 case V4L2_CID_CHROMA_AGC: return "Chroma AGC";
633 case V4L2_CID_COLOR_KILLER: return "Color Killer";
634 case V4L2_CID_COLORFX: return "Color Effects";
635 case V4L2_CID_AUTOBRIGHTNESS: return "Brightness, Automatic";
636 case V4L2_CID_BAND_STOP_FILTER: return "Band-Stop Filter";
637 case V4L2_CID_ROTATE: return "Rotate";
638 case V4L2_CID_BG_COLOR: return "Background Color";
639 case V4L2_CID_CHROMA_GAIN: return "Chroma Gain";
640 case V4L2_CID_ILLUMINATORS_1: return "Illuminator 1";
641 case V4L2_CID_ILLUMINATORS_2: return "Illuminator 2";
642 case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: return "Min Number of Capture Buffers";
643 case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT: return "Min Number of Output Buffers";
644 case V4L2_CID_ALPHA_COMPONENT: return "Alpha Component";
645 case V4L2_CID_COLORFX_CBCR: return "Color Effects, CbCr";
646
647
648
649
650
651 case V4L2_CID_MPEG_CLASS: return "Codec Controls";
652 case V4L2_CID_MPEG_STREAM_TYPE: return "Stream Type";
653 case V4L2_CID_MPEG_STREAM_PID_PMT: return "Stream PMT Program ID";
654 case V4L2_CID_MPEG_STREAM_PID_AUDIO: return "Stream Audio Program ID";
655 case V4L2_CID_MPEG_STREAM_PID_VIDEO: return "Stream Video Program ID";
656 case V4L2_CID_MPEG_STREAM_PID_PCR: return "Stream PCR Program ID";
657 case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: return "Stream PES Audio ID";
658 case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: return "Stream PES Video ID";
659 case V4L2_CID_MPEG_STREAM_VBI_FMT: return "Stream VBI Format";
660 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: return "Audio Sampling Frequency";
661 case V4L2_CID_MPEG_AUDIO_ENCODING: return "Audio Encoding";
662 case V4L2_CID_MPEG_AUDIO_L1_BITRATE: return "Audio Layer I Bitrate";
663 case V4L2_CID_MPEG_AUDIO_L2_BITRATE: return "Audio Layer II Bitrate";
664 case V4L2_CID_MPEG_AUDIO_L3_BITRATE: return "Audio Layer III Bitrate";
665 case V4L2_CID_MPEG_AUDIO_MODE: return "Audio Stereo Mode";
666 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: return "Audio Stereo Mode Extension";
667 case V4L2_CID_MPEG_AUDIO_EMPHASIS: return "Audio Emphasis";
668 case V4L2_CID_MPEG_AUDIO_CRC: return "Audio CRC";
669 case V4L2_CID_MPEG_AUDIO_MUTE: return "Audio Mute";
670 case V4L2_CID_MPEG_AUDIO_AAC_BITRATE: return "Audio AAC Bitrate";
671 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE: return "Audio AC-3 Bitrate";
672 case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK: return "Audio Playback";
673 case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK: return "Audio Multilingual Playback";
674 case V4L2_CID_MPEG_VIDEO_ENCODING: return "Video Encoding";
675 case V4L2_CID_MPEG_VIDEO_ASPECT: return "Video Aspect";
676 case V4L2_CID_MPEG_VIDEO_B_FRAMES: return "Video B Frames";
677 case V4L2_CID_MPEG_VIDEO_GOP_SIZE: return "Video GOP Size";
678 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: return "Video GOP Closure";
679 case V4L2_CID_MPEG_VIDEO_PULLDOWN: return "Video Pulldown";
680 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: return "Video Bitrate Mode";
681 case V4L2_CID_MPEG_VIDEO_BITRATE: return "Video Bitrate";
682 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: return "Video Peak Bitrate";
683 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: return "Video Temporal Decimation";
684 case V4L2_CID_MPEG_VIDEO_MUTE: return "Video Mute";
685 case V4L2_CID_MPEG_VIDEO_MUTE_YUV: return "Video Mute YUV";
686 case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE: return "Decoder Slice Interface";
687 case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER: return "MPEG4 Loop Filter Enable";
688 case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB: return "Number of Intra Refresh MBs";
689 case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE: return "Frame Level Rate Control Enable";
690 case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE: return "H264 MB Level Rate Control";
691 case V4L2_CID_MPEG_VIDEO_HEADER_MODE: return "Sequence Header Mode";
692 case V4L2_CID_MPEG_VIDEO_MAX_REF_PIC: return "Max Number of Reference Pics";
693 case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP: return "H263 I-Frame QP Value";
694 case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP: return "H263 P-Frame QP Value";
695 case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP: return "H263 B-Frame QP Value";
696 case V4L2_CID_MPEG_VIDEO_H263_MIN_QP: return "H263 Minimum QP Value";
697 case V4L2_CID_MPEG_VIDEO_H263_MAX_QP: return "H263 Maximum QP Value";
698 case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: return "H264 I-Frame QP Value";
699 case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: return "H264 P-Frame QP Value";
700 case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: return "H264 B-Frame QP Value";
701 case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: return "H264 Maximum QP Value";
702 case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: return "H264 Minimum QP Value";
703 case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM: return "H264 8x8 Transform Enable";
704 case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE: return "H264 CPB Buffer Size";
705 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: return "H264 Entropy Mode";
706 case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: return "H264 I-Frame Period";
707 case V4L2_CID_MPEG_VIDEO_H264_LEVEL: return "H264 Level";
708 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA: return "H264 Loop Filter Alpha Offset";
709 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA: return "H264 Loop Filter Beta Offset";
710 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE: return "H264 Loop Filter Mode";
711 case V4L2_CID_MPEG_VIDEO_H264_PROFILE: return "H264 Profile";
712 case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT: return "Vertical Size of SAR";
713 case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH: return "Horizontal Size of SAR";
714 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE: return "Aspect Ratio VUI Enable";
715 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC: return "VUI Aspect Ratio IDC";
716 case V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING: return "H264 Enable Frame Packing SEI";
717 case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0: return "H264 Set Curr. Frame as Frame0";
718 case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE: return "H264 FP Arrangement Type";
719 case V4L2_CID_MPEG_VIDEO_H264_FMO: return "H264 Flexible MB Ordering";
720 case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE: return "H264 Map Type for FMO";
721 case V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP: return "H264 FMO Number of Slice Groups";
722 case V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION: return "H264 FMO Direction of Change";
723 case V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE: return "H264 FMO Size of 1st Slice Grp";
724 case V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH: return "H264 FMO No. of Consecutive MBs";
725 case V4L2_CID_MPEG_VIDEO_H264_ASO: return "H264 Arbitrary Slice Ordering";
726 case V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER: return "H264 ASO Slice Order";
727 case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING: return "Enable H264 Hierarchical Coding";
728 case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE: return "H264 Hierarchical Coding Type";
729 case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:return "H264 Number of HC Layers";
730 case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP:
731 return "H264 Set QP Value for HC Layers";
732 case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value";
733 case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P-Frame QP Value";
734 case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B-Frame QP Value";
735 case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP: return "MPEG4 Minimum QP Value";
736 case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP: return "MPEG4 Maximum QP Value";
737 case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: return "MPEG4 Level";
738 case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: return "MPEG4 Profile";
739 case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL: return "Quarter Pixel Search Enable";
740 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES: return "Maximum Bytes in a Slice";
741 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB: return "Number of MBs in a Slice";
742 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: return "Slice Partitioning Method";
743 case V4L2_CID_MPEG_VIDEO_VBV_SIZE: return "VBV Buffer Size";
744 case V4L2_CID_MPEG_VIDEO_DEC_PTS: return "Video Decoder PTS";
745 case V4L2_CID_MPEG_VIDEO_DEC_FRAME: return "Video Decoder Frame Count";
746 case V4L2_CID_MPEG_VIDEO_VBV_DELAY: return "Initial Delay for VBV Control";
747 case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE: return "Horizontal MV Search Range";
748 case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE: return "Vertical MV Search Range";
749 case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER: return "Repeat Sequence Header";
750
751
752 case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS: return "VPX Number of Partitions";
753 case V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4: return "VPX Intra Mode Decision Disable";
754 case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES: return "VPX No. of Refs for P Frame";
755 case V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL: return "VPX Loop Filter Level Range";
756 case V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS: return "VPX Deblocking Effect Control";
757 case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD: return "VPX Golden Frame Refresh Period";
758 case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL: return "VPX Golden Frame Indicator";
759 case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP: return "VPX Minimum QP Value";
760 case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP: return "VPX Maximum QP Value";
761 case V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP: return "VPX I-Frame QP Value";
762 case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP: return "VPX P-Frame QP Value";
763 case V4L2_CID_MPEG_VIDEO_VPX_PROFILE: return "VPX Profile";
764
765
766
767 case V4L2_CID_CAMERA_CLASS: return "Camera Controls";
768 case V4L2_CID_EXPOSURE_AUTO: return "Auto Exposure";
769 case V4L2_CID_EXPOSURE_ABSOLUTE: return "Exposure Time, Absolute";
770 case V4L2_CID_EXPOSURE_AUTO_PRIORITY: return "Exposure, Dynamic Framerate";
771 case V4L2_CID_PAN_RELATIVE: return "Pan, Relative";
772 case V4L2_CID_TILT_RELATIVE: return "Tilt, Relative";
773 case V4L2_CID_PAN_RESET: return "Pan, Reset";
774 case V4L2_CID_TILT_RESET: return "Tilt, Reset";
775 case V4L2_CID_PAN_ABSOLUTE: return "Pan, Absolute";
776 case V4L2_CID_TILT_ABSOLUTE: return "Tilt, Absolute";
777 case V4L2_CID_FOCUS_ABSOLUTE: return "Focus, Absolute";
778 case V4L2_CID_FOCUS_RELATIVE: return "Focus, Relative";
779 case V4L2_CID_FOCUS_AUTO: return "Focus, Automatic Continuous";
780 case V4L2_CID_ZOOM_ABSOLUTE: return "Zoom, Absolute";
781 case V4L2_CID_ZOOM_RELATIVE: return "Zoom, Relative";
782 case V4L2_CID_ZOOM_CONTINUOUS: return "Zoom, Continuous";
783 case V4L2_CID_PRIVACY: return "Privacy";
784 case V4L2_CID_IRIS_ABSOLUTE: return "Iris, Absolute";
785 case V4L2_CID_IRIS_RELATIVE: return "Iris, Relative";
786 case V4L2_CID_AUTO_EXPOSURE_BIAS: return "Auto Exposure, Bias";
787 case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: return "White Balance, Auto & Preset";
788 case V4L2_CID_WIDE_DYNAMIC_RANGE: return "Wide Dynamic Range";
789 case V4L2_CID_IMAGE_STABILIZATION: return "Image Stabilization";
790 case V4L2_CID_ISO_SENSITIVITY: return "ISO Sensitivity";
791 case V4L2_CID_ISO_SENSITIVITY_AUTO: return "ISO Sensitivity, Auto";
792 case V4L2_CID_EXPOSURE_METERING: return "Exposure, Metering Mode";
793 case V4L2_CID_SCENE_MODE: return "Scene Mode";
794 case V4L2_CID_3A_LOCK: return "3A Lock";
795 case V4L2_CID_AUTO_FOCUS_START: return "Auto Focus, Start";
796 case V4L2_CID_AUTO_FOCUS_STOP: return "Auto Focus, Stop";
797 case V4L2_CID_AUTO_FOCUS_STATUS: return "Auto Focus, Status";
798 case V4L2_CID_AUTO_FOCUS_RANGE: return "Auto Focus, Range";
799 case V4L2_CID_PAN_SPEED: return "Pan, Speed";
800 case V4L2_CID_TILT_SPEED: return "Tilt, Speed";
801
802
803
804 case V4L2_CID_FM_TX_CLASS: return "FM Radio Modulator Controls";
805 case V4L2_CID_RDS_TX_DEVIATION: return "RDS Signal Deviation";
806 case V4L2_CID_RDS_TX_PI: return "RDS Program ID";
807 case V4L2_CID_RDS_TX_PTY: return "RDS Program Type";
808 case V4L2_CID_RDS_TX_PS_NAME: return "RDS PS Name";
809 case V4L2_CID_RDS_TX_RADIO_TEXT: return "RDS Radio Text";
810 case V4L2_CID_RDS_TX_MONO_STEREO: return "RDS Stereo";
811 case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD: return "RDS Artificial Head";
812 case V4L2_CID_RDS_TX_COMPRESSED: return "RDS Compressed";
813 case V4L2_CID_RDS_TX_DYNAMIC_PTY: return "RDS Dynamic PTY";
814 case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT: return "RDS Traffic Announcement";
815 case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM: return "RDS Traffic Program";
816 case V4L2_CID_RDS_TX_MUSIC_SPEECH: return "RDS Music";
817 case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE: return "RDS Enable Alt Frequencies";
818 case V4L2_CID_RDS_TX_ALT_FREQS: return "RDS Alternate Frequencies";
819 case V4L2_CID_AUDIO_LIMITER_ENABLED: return "Audio Limiter Feature Enabled";
820 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME: return "Audio Limiter Release Time";
821 case V4L2_CID_AUDIO_LIMITER_DEVIATION: return "Audio Limiter Deviation";
822 case V4L2_CID_AUDIO_COMPRESSION_ENABLED: return "Audio Compression Enabled";
823 case V4L2_CID_AUDIO_COMPRESSION_GAIN: return "Audio Compression Gain";
824 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD: return "Audio Compression Threshold";
825 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME: return "Audio Compression Attack Time";
826 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME: return "Audio Compression Release Time";
827 case V4L2_CID_PILOT_TONE_ENABLED: return "Pilot Tone Feature Enabled";
828 case V4L2_CID_PILOT_TONE_DEVIATION: return "Pilot Tone Deviation";
829 case V4L2_CID_PILOT_TONE_FREQUENCY: return "Pilot Tone Frequency";
830 case V4L2_CID_TUNE_PREEMPHASIS: return "Pre-Emphasis";
831 case V4L2_CID_TUNE_POWER_LEVEL: return "Tune Power Level";
832 case V4L2_CID_TUNE_ANTENNA_CAPACITOR: return "Tune Antenna Capacitor";
833
834
835
836 case V4L2_CID_FLASH_CLASS: return "Flash Controls";
837 case V4L2_CID_FLASH_LED_MODE: return "LED Mode";
838 case V4L2_CID_FLASH_STROBE_SOURCE: return "Strobe Source";
839 case V4L2_CID_FLASH_STROBE: return "Strobe";
840 case V4L2_CID_FLASH_STROBE_STOP: return "Stop Strobe";
841 case V4L2_CID_FLASH_STROBE_STATUS: return "Strobe Status";
842 case V4L2_CID_FLASH_TIMEOUT: return "Strobe Timeout";
843 case V4L2_CID_FLASH_INTENSITY: return "Intensity, Flash Mode";
844 case V4L2_CID_FLASH_TORCH_INTENSITY: return "Intensity, Torch Mode";
845 case V4L2_CID_FLASH_INDICATOR_INTENSITY: return "Intensity, Indicator";
846 case V4L2_CID_FLASH_FAULT: return "Faults";
847 case V4L2_CID_FLASH_CHARGE: return "Charge";
848 case V4L2_CID_FLASH_READY: return "Ready to Strobe";
849
850
851
852 case V4L2_CID_JPEG_CLASS: return "JPEG Compression Controls";
853 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING: return "Chroma Subsampling";
854 case V4L2_CID_JPEG_RESTART_INTERVAL: return "Restart Interval";
855 case V4L2_CID_JPEG_COMPRESSION_QUALITY: return "Compression Quality";
856 case V4L2_CID_JPEG_ACTIVE_MARKER: return "Active Markers";
857
858
859
860 case V4L2_CID_IMAGE_SOURCE_CLASS: return "Image Source Controls";
861 case V4L2_CID_VBLANK: return "Vertical Blanking";
862 case V4L2_CID_HBLANK: return "Horizontal Blanking";
863 case V4L2_CID_ANALOGUE_GAIN: return "Analogue Gain";
864 case V4L2_CID_TEST_PATTERN_RED: return "Red Pixel Value";
865 case V4L2_CID_TEST_PATTERN_GREENR: return "Green (Red) Pixel Value";
866 case V4L2_CID_TEST_PATTERN_BLUE: return "Blue Pixel Value";
867 case V4L2_CID_TEST_PATTERN_GREENB: return "Green (Blue) Pixel Value";
868
869
870
871 case V4L2_CID_IMAGE_PROC_CLASS: return "Image Processing Controls";
872 case V4L2_CID_LINK_FREQ: return "Link Frequency";
873 case V4L2_CID_PIXEL_RATE: return "Pixel Rate";
874 case V4L2_CID_TEST_PATTERN: return "Test Pattern";
875
876
877
878 case V4L2_CID_DV_CLASS: return "Digital Video Controls";
879 case V4L2_CID_DV_TX_HOTPLUG: return "Hotplug Present";
880 case V4L2_CID_DV_TX_RXSENSE: return "RxSense Present";
881 case V4L2_CID_DV_TX_EDID_PRESENT: return "EDID Present";
882 case V4L2_CID_DV_TX_MODE: return "Transmit Mode";
883 case V4L2_CID_DV_TX_RGB_RANGE: return "Tx RGB Quantization Range";
884 case V4L2_CID_DV_RX_POWER_PRESENT: return "Power Present";
885 case V4L2_CID_DV_RX_RGB_RANGE: return "Rx RGB Quantization Range";
886
887 case V4L2_CID_FM_RX_CLASS: return "FM Radio Receiver Controls";
888 case V4L2_CID_TUNE_DEEMPHASIS: return "De-Emphasis";
889 case V4L2_CID_RDS_RECEPTION: return "RDS Reception";
890 case V4L2_CID_RF_TUNER_CLASS: return "RF Tuner Controls";
891 case V4L2_CID_RF_TUNER_LNA_GAIN_AUTO: return "LNA Gain, Auto";
892 case V4L2_CID_RF_TUNER_LNA_GAIN: return "LNA Gain";
893 case V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO: return "Mixer Gain, Auto";
894 case V4L2_CID_RF_TUNER_MIXER_GAIN: return "Mixer Gain";
895 case V4L2_CID_RF_TUNER_IF_GAIN_AUTO: return "IF Gain, Auto";
896 case V4L2_CID_RF_TUNER_IF_GAIN: return "IF Gain";
897 case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO: return "Bandwidth, Auto";
898 case V4L2_CID_RF_TUNER_BANDWIDTH: return "Bandwidth";
899 case V4L2_CID_RF_TUNER_PLL_LOCK: return "PLL Lock";
900 case V4L2_CID_RDS_RX_PTY: return "RDS Program Type";
901 case V4L2_CID_RDS_RX_PS_NAME: return "RDS PS Name";
902 case V4L2_CID_RDS_RX_RADIO_TEXT: return "RDS Radio Text";
903 case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT: return "RDS Traffic Announcement";
904 case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM: return "RDS Traffic Program";
905 case V4L2_CID_RDS_RX_MUSIC_SPEECH: return "RDS Music";
906
907
908
909 case V4L2_CID_DETECT_CLASS: return "Detection Controls";
910 case V4L2_CID_DETECT_MD_MODE: return "Motion Detection Mode";
911 case V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD: return "MD Global Threshold";
912 case V4L2_CID_DETECT_MD_THRESHOLD_GRID: return "MD Threshold Grid";
913 case V4L2_CID_DETECT_MD_REGION_GRID: return "MD Region Grid";
914 default:
915 return NULL;
916 }
917}
918EXPORT_SYMBOL(v4l2_ctrl_get_name);
919
920void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
921 s64 *min, s64 *max, u64 *step, s64 *def, u32 *flags)
922{
923 *name = v4l2_ctrl_get_name(id);
924 *flags = 0;
925
926 switch (id) {
927 case V4L2_CID_AUDIO_MUTE:
928 case V4L2_CID_AUDIO_LOUDNESS:
929 case V4L2_CID_AUTO_WHITE_BALANCE:
930 case V4L2_CID_AUTOGAIN:
931 case V4L2_CID_HFLIP:
932 case V4L2_CID_VFLIP:
933 case V4L2_CID_HUE_AUTO:
934 case V4L2_CID_CHROMA_AGC:
935 case V4L2_CID_COLOR_KILLER:
936 case V4L2_CID_AUTOBRIGHTNESS:
937 case V4L2_CID_MPEG_AUDIO_MUTE:
938 case V4L2_CID_MPEG_VIDEO_MUTE:
939 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
940 case V4L2_CID_MPEG_VIDEO_PULLDOWN:
941 case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
942 case V4L2_CID_FOCUS_AUTO:
943 case V4L2_CID_PRIVACY:
944 case V4L2_CID_AUDIO_LIMITER_ENABLED:
945 case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
946 case V4L2_CID_PILOT_TONE_ENABLED:
947 case V4L2_CID_ILLUMINATORS_1:
948 case V4L2_CID_ILLUMINATORS_2:
949 case V4L2_CID_FLASH_STROBE_STATUS:
950 case V4L2_CID_FLASH_CHARGE:
951 case V4L2_CID_FLASH_READY:
952 case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
953 case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
954 case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
955 case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
956 case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
957 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:
958 case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:
959 case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER:
960 case V4L2_CID_WIDE_DYNAMIC_RANGE:
961 case V4L2_CID_IMAGE_STABILIZATION:
962 case V4L2_CID_RDS_RECEPTION:
963 case V4L2_CID_RF_TUNER_LNA_GAIN_AUTO:
964 case V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO:
965 case V4L2_CID_RF_TUNER_IF_GAIN_AUTO:
966 case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:
967 case V4L2_CID_RF_TUNER_PLL_LOCK:
968 case V4L2_CID_RDS_TX_MONO_STEREO:
969 case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:
970 case V4L2_CID_RDS_TX_COMPRESSED:
971 case V4L2_CID_RDS_TX_DYNAMIC_PTY:
972 case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT:
973 case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:
974 case V4L2_CID_RDS_TX_MUSIC_SPEECH:
975 case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:
976 case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT:
977 case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:
978 case V4L2_CID_RDS_RX_MUSIC_SPEECH:
979 *type = V4L2_CTRL_TYPE_BOOLEAN;
980 *min = 0;
981 *max = *step = 1;
982 break;
983 case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE:
984 case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE:
985 *type = V4L2_CTRL_TYPE_INTEGER;
986 break;
987 case V4L2_CID_PAN_RESET:
988 case V4L2_CID_TILT_RESET:
989 case V4L2_CID_FLASH_STROBE:
990 case V4L2_CID_FLASH_STROBE_STOP:
991 case V4L2_CID_AUTO_FOCUS_START:
992 case V4L2_CID_AUTO_FOCUS_STOP:
993 *type = V4L2_CTRL_TYPE_BUTTON;
994 *flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
995 *min = *max = *step = *def = 0;
996 break;
997 case V4L2_CID_POWER_LINE_FREQUENCY:
998 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
999 case V4L2_CID_MPEG_AUDIO_ENCODING:
1000 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1001 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1002 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1003 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
1004 case V4L2_CID_MPEG_AUDIO_MODE:
1005 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1006 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1007 case V4L2_CID_MPEG_AUDIO_CRC:
1008 case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
1009 case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
1010 case V4L2_CID_MPEG_VIDEO_ENCODING:
1011 case V4L2_CID_MPEG_VIDEO_ASPECT:
1012 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1013 case V4L2_CID_MPEG_STREAM_TYPE:
1014 case V4L2_CID_MPEG_STREAM_VBI_FMT:
1015 case V4L2_CID_EXPOSURE_AUTO:
1016 case V4L2_CID_AUTO_FOCUS_RANGE:
1017 case V4L2_CID_COLORFX:
1018 case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
1019 case V4L2_CID_TUNE_PREEMPHASIS:
1020 case V4L2_CID_FLASH_LED_MODE:
1021 case V4L2_CID_FLASH_STROBE_SOURCE:
1022 case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
1023 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
1024 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
1025 case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
1026 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
1027 case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
1028 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
1029 case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:
1030 case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
1031 case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
1032 case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
1033 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
1034 case V4L2_CID_ISO_SENSITIVITY_AUTO:
1035 case V4L2_CID_EXPOSURE_METERING:
1036 case V4L2_CID_SCENE_MODE:
1037 case V4L2_CID_DV_TX_MODE:
1038 case V4L2_CID_DV_TX_RGB_RANGE:
1039 case V4L2_CID_DV_RX_RGB_RANGE:
1040 case V4L2_CID_TEST_PATTERN:
1041 case V4L2_CID_TUNE_DEEMPHASIS:
1042 case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:
1043 case V4L2_CID_DETECT_MD_MODE:
1044 *type = V4L2_CTRL_TYPE_MENU;
1045 break;
1046 case V4L2_CID_LINK_FREQ:
1047 *type = V4L2_CTRL_TYPE_INTEGER_MENU;
1048 break;
1049 case V4L2_CID_RDS_TX_PS_NAME:
1050 case V4L2_CID_RDS_TX_RADIO_TEXT:
1051 case V4L2_CID_RDS_RX_PS_NAME:
1052 case V4L2_CID_RDS_RX_RADIO_TEXT:
1053 *type = V4L2_CTRL_TYPE_STRING;
1054 break;
1055 case V4L2_CID_ISO_SENSITIVITY:
1056 case V4L2_CID_AUTO_EXPOSURE_BIAS:
1057 case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:
1058 case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:
1059 *type = V4L2_CTRL_TYPE_INTEGER_MENU;
1060 break;
1061 case V4L2_CID_USER_CLASS:
1062 case V4L2_CID_CAMERA_CLASS:
1063 case V4L2_CID_MPEG_CLASS:
1064 case V4L2_CID_FM_TX_CLASS:
1065 case V4L2_CID_FLASH_CLASS:
1066 case V4L2_CID_JPEG_CLASS:
1067 case V4L2_CID_IMAGE_SOURCE_CLASS:
1068 case V4L2_CID_IMAGE_PROC_CLASS:
1069 case V4L2_CID_DV_CLASS:
1070 case V4L2_CID_FM_RX_CLASS:
1071 case V4L2_CID_RF_TUNER_CLASS:
1072 case V4L2_CID_DETECT_CLASS:
1073 *type = V4L2_CTRL_TYPE_CTRL_CLASS;
1074
1075 *flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY;
1076 *min = *max = *step = *def = 0;
1077 break;
1078 case V4L2_CID_BG_COLOR:
1079 *type = V4L2_CTRL_TYPE_INTEGER;
1080 *step = 1;
1081 *min = 0;
1082
1083 *max = 0xFFFFFF;
1084 break;
1085 case V4L2_CID_FLASH_FAULT:
1086 case V4L2_CID_JPEG_ACTIVE_MARKER:
1087 case V4L2_CID_3A_LOCK:
1088 case V4L2_CID_AUTO_FOCUS_STATUS:
1089 case V4L2_CID_DV_TX_HOTPLUG:
1090 case V4L2_CID_DV_TX_RXSENSE:
1091 case V4L2_CID_DV_TX_EDID_PRESENT:
1092 case V4L2_CID_DV_RX_POWER_PRESENT:
1093 *type = V4L2_CTRL_TYPE_BITMASK;
1094 break;
1095 case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
1096 case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
1097 *type = V4L2_CTRL_TYPE_INTEGER;
1098 *flags |= V4L2_CTRL_FLAG_READ_ONLY;
1099 break;
1100 case V4L2_CID_MPEG_VIDEO_DEC_PTS:
1101 *type = V4L2_CTRL_TYPE_INTEGER64;
1102 *flags |= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY;
1103 *min = *def = 0;
1104 *max = 0x1ffffffffLL;
1105 *step = 1;
1106 break;
1107 case V4L2_CID_MPEG_VIDEO_DEC_FRAME:
1108 *type = V4L2_CTRL_TYPE_INTEGER64;
1109 *flags |= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY;
1110 *min = *def = 0;
1111 *max = 0x7fffffffffffffffLL;
1112 *step = 1;
1113 break;
1114 case V4L2_CID_PIXEL_RATE:
1115 *type = V4L2_CTRL_TYPE_INTEGER64;
1116 *flags |= V4L2_CTRL_FLAG_READ_ONLY;
1117 break;
1118 case V4L2_CID_DETECT_MD_REGION_GRID:
1119 *type = V4L2_CTRL_TYPE_U8;
1120 break;
1121 case V4L2_CID_DETECT_MD_THRESHOLD_GRID:
1122 *type = V4L2_CTRL_TYPE_U16;
1123 break;
1124 case V4L2_CID_RDS_TX_ALT_FREQS:
1125 *type = V4L2_CTRL_TYPE_U32;
1126 break;
1127 default:
1128 *type = V4L2_CTRL_TYPE_INTEGER;
1129 break;
1130 }
1131 switch (id) {
1132 case V4L2_CID_MPEG_AUDIO_ENCODING:
1133 case V4L2_CID_MPEG_AUDIO_MODE:
1134 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1135 case V4L2_CID_MPEG_VIDEO_B_FRAMES:
1136 case V4L2_CID_MPEG_STREAM_TYPE:
1137 *flags |= V4L2_CTRL_FLAG_UPDATE;
1138 break;
1139 case V4L2_CID_AUDIO_VOLUME:
1140 case V4L2_CID_AUDIO_BALANCE:
1141 case V4L2_CID_AUDIO_BASS:
1142 case V4L2_CID_AUDIO_TREBLE:
1143 case V4L2_CID_BRIGHTNESS:
1144 case V4L2_CID_CONTRAST:
1145 case V4L2_CID_SATURATION:
1146 case V4L2_CID_HUE:
1147 case V4L2_CID_RED_BALANCE:
1148 case V4L2_CID_BLUE_BALANCE:
1149 case V4L2_CID_GAMMA:
1150 case V4L2_CID_SHARPNESS:
1151 case V4L2_CID_CHROMA_GAIN:
1152 case V4L2_CID_RDS_TX_DEVIATION:
1153 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
1154 case V4L2_CID_AUDIO_LIMITER_DEVIATION:
1155 case V4L2_CID_AUDIO_COMPRESSION_GAIN:
1156 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
1157 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
1158 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
1159 case V4L2_CID_PILOT_TONE_DEVIATION:
1160 case V4L2_CID_PILOT_TONE_FREQUENCY:
1161 case V4L2_CID_TUNE_POWER_LEVEL:
1162 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1163 case V4L2_CID_RF_TUNER_LNA_GAIN:
1164 case V4L2_CID_RF_TUNER_MIXER_GAIN:
1165 case V4L2_CID_RF_TUNER_IF_GAIN:
1166 case V4L2_CID_RF_TUNER_BANDWIDTH:
1167 case V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD:
1168 *flags |= V4L2_CTRL_FLAG_SLIDER;
1169 break;
1170 case V4L2_CID_PAN_RELATIVE:
1171 case V4L2_CID_TILT_RELATIVE:
1172 case V4L2_CID_FOCUS_RELATIVE:
1173 case V4L2_CID_IRIS_RELATIVE:
1174 case V4L2_CID_ZOOM_RELATIVE:
1175 *flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
1176 break;
1177 case V4L2_CID_FLASH_STROBE_STATUS:
1178 case V4L2_CID_AUTO_FOCUS_STATUS:
1179 case V4L2_CID_FLASH_READY:
1180 case V4L2_CID_DV_TX_HOTPLUG:
1181 case V4L2_CID_DV_TX_RXSENSE:
1182 case V4L2_CID_DV_TX_EDID_PRESENT:
1183 case V4L2_CID_DV_RX_POWER_PRESENT:
1184 case V4L2_CID_RDS_RX_PTY:
1185 case V4L2_CID_RDS_RX_PS_NAME:
1186 case V4L2_CID_RDS_RX_RADIO_TEXT:
1187 case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT:
1188 case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:
1189 case V4L2_CID_RDS_RX_MUSIC_SPEECH:
1190 *flags |= V4L2_CTRL_FLAG_READ_ONLY;
1191 break;
1192 case V4L2_CID_RF_TUNER_PLL_LOCK:
1193 *flags |= V4L2_CTRL_FLAG_VOLATILE;
1194 break;
1195 }
1196}
1197EXPORT_SYMBOL(v4l2_ctrl_fill);
1198
1199static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes)
1200{
1201 memset(ev->reserved, 0, sizeof(ev->reserved));
1202 ev->type = V4L2_EVENT_CTRL;
1203 ev->id = ctrl->id;
1204 ev->u.ctrl.changes = changes;
1205 ev->u.ctrl.type = ctrl->type;
1206 ev->u.ctrl.flags = ctrl->flags;
1207 if (ctrl->is_ptr)
1208 ev->u.ctrl.value64 = 0;
1209 else
1210 ev->u.ctrl.value64 = *ctrl->p_cur.p_s64;
1211 ev->u.ctrl.minimum = ctrl->minimum;
1212 ev->u.ctrl.maximum = ctrl->maximum;
1213 if (ctrl->type == V4L2_CTRL_TYPE_MENU
1214 || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
1215 ev->u.ctrl.step = 1;
1216 else
1217 ev->u.ctrl.step = ctrl->step;
1218 ev->u.ctrl.default_value = ctrl->default_value;
1219}
1220
1221static void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
1222{
1223 struct v4l2_event ev;
1224 struct v4l2_subscribed_event *sev;
1225
1226 if (list_empty(&ctrl->ev_subs))
1227 return;
1228 fill_event(&ev, ctrl, changes);
1229
1230 list_for_each_entry(sev, &ctrl->ev_subs, node)
1231 if (sev->fh != fh ||
1232 (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
1233 v4l2_event_queue_fh(sev->fh, &ev);
1234}
1235
1236static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx,
1237 union v4l2_ctrl_ptr ptr1,
1238 union v4l2_ctrl_ptr ptr2)
1239{
1240 switch (ctrl->type) {
1241 case V4L2_CTRL_TYPE_BUTTON:
1242 return false;
1243 case V4L2_CTRL_TYPE_STRING:
1244 idx *= ctrl->elem_size;
1245
1246 return !strcmp(ptr1.p_char + idx, ptr2.p_char + idx);
1247 case V4L2_CTRL_TYPE_INTEGER64:
1248 return ptr1.p_s64[idx] == ptr2.p_s64[idx];
1249 case V4L2_CTRL_TYPE_U8:
1250 return ptr1.p_u8[idx] == ptr2.p_u8[idx];
1251 case V4L2_CTRL_TYPE_U16:
1252 return ptr1.p_u16[idx] == ptr2.p_u16[idx];
1253 case V4L2_CTRL_TYPE_U32:
1254 return ptr1.p_u32[idx] == ptr2.p_u32[idx];
1255 default:
1256 if (ctrl->is_int)
1257 return ptr1.p_s32[idx] == ptr2.p_s32[idx];
1258 idx *= ctrl->elem_size;
1259 return !memcmp(ptr1.p + idx, ptr2.p + idx, ctrl->elem_size);
1260 }
1261}
1262
1263static void std_init(const struct v4l2_ctrl *ctrl, u32 idx,
1264 union v4l2_ctrl_ptr ptr)
1265{
1266 switch (ctrl->type) {
1267 case V4L2_CTRL_TYPE_STRING:
1268 idx *= ctrl->elem_size;
1269 memset(ptr.p_char + idx, ' ', ctrl->minimum);
1270 ptr.p_char[idx + ctrl->minimum] = '\0';
1271 break;
1272 case V4L2_CTRL_TYPE_INTEGER64:
1273 ptr.p_s64[idx] = ctrl->default_value;
1274 break;
1275 case V4L2_CTRL_TYPE_INTEGER:
1276 case V4L2_CTRL_TYPE_INTEGER_MENU:
1277 case V4L2_CTRL_TYPE_MENU:
1278 case V4L2_CTRL_TYPE_BITMASK:
1279 case V4L2_CTRL_TYPE_BOOLEAN:
1280 ptr.p_s32[idx] = ctrl->default_value;
1281 break;
1282 case V4L2_CTRL_TYPE_U8:
1283 ptr.p_u8[idx] = ctrl->default_value;
1284 break;
1285 case V4L2_CTRL_TYPE_U16:
1286 ptr.p_u16[idx] = ctrl->default_value;
1287 break;
1288 case V4L2_CTRL_TYPE_U32:
1289 ptr.p_u32[idx] = ctrl->default_value;
1290 break;
1291 default:
1292 idx *= ctrl->elem_size;
1293 memset(ptr.p + idx, 0, ctrl->elem_size);
1294 break;
1295 }
1296}
1297
1298static void std_log(const struct v4l2_ctrl *ctrl)
1299{
1300 union v4l2_ctrl_ptr ptr = ctrl->p_cur;
1301
1302 if (ctrl->is_array) {
1303 unsigned i;
1304
1305 for (i = 0; i < ctrl->nr_of_dims; i++)
1306 pr_cont("[%u]", ctrl->dims[i]);
1307 pr_cont(" ");
1308 }
1309
1310 switch (ctrl->type) {
1311 case V4L2_CTRL_TYPE_INTEGER:
1312 pr_cont("%d", *ptr.p_s32);
1313 break;
1314 case V4L2_CTRL_TYPE_BOOLEAN:
1315 pr_cont("%s", *ptr.p_s32 ? "true" : "false");
1316 break;
1317 case V4L2_CTRL_TYPE_MENU:
1318 pr_cont("%s", ctrl->qmenu[*ptr.p_s32]);
1319 break;
1320 case V4L2_CTRL_TYPE_INTEGER_MENU:
1321 pr_cont("%lld", ctrl->qmenu_int[*ptr.p_s32]);
1322 break;
1323 case V4L2_CTRL_TYPE_BITMASK:
1324 pr_cont("0x%08x", *ptr.p_s32);
1325 break;
1326 case V4L2_CTRL_TYPE_INTEGER64:
1327 pr_cont("%lld", *ptr.p_s64);
1328 break;
1329 case V4L2_CTRL_TYPE_STRING:
1330 pr_cont("%s", ptr.p_char);
1331 break;
1332 case V4L2_CTRL_TYPE_U8:
1333 pr_cont("%u", (unsigned)*ptr.p_u8);
1334 break;
1335 case V4L2_CTRL_TYPE_U16:
1336 pr_cont("%u", (unsigned)*ptr.p_u16);
1337 break;
1338 case V4L2_CTRL_TYPE_U32:
1339 pr_cont("%u", (unsigned)*ptr.p_u32);
1340 break;
1341 default:
1342 pr_cont("unknown type %d", ctrl->type);
1343 break;
1344 }
1345}
1346
1347
1348
1349
1350
1351
1352#define ROUND_TO_RANGE(val, offset_type, ctrl) \
1353({ \
1354 offset_type offset; \
1355 if ((ctrl)->maximum >= 0 && \
1356 val >= (ctrl)->maximum - (s32)((ctrl)->step / 2)) \
1357 val = (ctrl)->maximum; \
1358 else \
1359 val += (s32)((ctrl)->step / 2); \
1360 val = clamp_t(typeof(val), val, \
1361 (ctrl)->minimum, (ctrl)->maximum); \
1362 offset = (val) - (ctrl)->minimum; \
1363 offset = (ctrl)->step * (offset / (u32)(ctrl)->step); \
1364 val = (ctrl)->minimum + offset; \
1365 0; \
1366})
1367
1368
1369static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
1370 union v4l2_ctrl_ptr ptr)
1371{
1372 size_t len;
1373 u64 offset;
1374 s64 val;
1375
1376 switch (ctrl->type) {
1377 case V4L2_CTRL_TYPE_INTEGER:
1378 return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl);
1379 case V4L2_CTRL_TYPE_INTEGER64:
1380
1381
1382
1383
1384 val = ptr.p_s64[idx];
1385 if (ctrl->maximum >= 0 && val >= ctrl->maximum - (s64)(ctrl->step / 2))
1386 val = ctrl->maximum;
1387 else
1388 val += (s64)(ctrl->step / 2);
1389 val = clamp_t(s64, val, ctrl->minimum, ctrl->maximum);
1390 offset = val - ctrl->minimum;
1391 do_div(offset, ctrl->step);
1392 ptr.p_s64[idx] = ctrl->minimum + offset * ctrl->step;
1393 return 0;
1394 case V4L2_CTRL_TYPE_U8:
1395 return ROUND_TO_RANGE(ptr.p_u8[idx], u8, ctrl);
1396 case V4L2_CTRL_TYPE_U16:
1397 return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl);
1398 case V4L2_CTRL_TYPE_U32:
1399 return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl);
1400
1401 case V4L2_CTRL_TYPE_BOOLEAN:
1402 ptr.p_s32[idx] = !!ptr.p_s32[idx];
1403 return 0;
1404
1405 case V4L2_CTRL_TYPE_MENU:
1406 case V4L2_CTRL_TYPE_INTEGER_MENU:
1407 if (ptr.p_s32[idx] < ctrl->minimum || ptr.p_s32[idx] > ctrl->maximum)
1408 return -ERANGE;
1409 if (ctrl->menu_skip_mask & (1 << ptr.p_s32[idx]))
1410 return -EINVAL;
1411 if (ctrl->type == V4L2_CTRL_TYPE_MENU &&
1412 ctrl->qmenu[ptr.p_s32[idx]][0] == '\0')
1413 return -EINVAL;
1414 return 0;
1415
1416 case V4L2_CTRL_TYPE_BITMASK:
1417 ptr.p_s32[idx] &= ctrl->maximum;
1418 return 0;
1419
1420 case V4L2_CTRL_TYPE_BUTTON:
1421 case V4L2_CTRL_TYPE_CTRL_CLASS:
1422 ptr.p_s32[idx] = 0;
1423 return 0;
1424
1425 case V4L2_CTRL_TYPE_STRING:
1426 idx *= ctrl->elem_size;
1427 len = strlen(ptr.p_char + idx);
1428 if (len < ctrl->minimum)
1429 return -ERANGE;
1430 if ((len - (u32)ctrl->minimum) % (u32)ctrl->step)
1431 return -ERANGE;
1432 return 0;
1433
1434 default:
1435 return -EINVAL;
1436 }
1437}
1438
1439static const struct v4l2_ctrl_type_ops std_type_ops = {
1440 .equal = std_equal,
1441 .init = std_init,
1442 .log = std_log,
1443 .validate = std_validate,
1444};
1445
1446
1447static int ptr_to_user(struct v4l2_ext_control *c,
1448 struct v4l2_ctrl *ctrl,
1449 union v4l2_ctrl_ptr ptr)
1450{
1451 u32 len;
1452
1453 if (ctrl->is_ptr && !ctrl->is_string)
1454 return copy_to_user(c->ptr, ptr.p, c->size) ?
1455 -EFAULT : 0;
1456
1457 switch (ctrl->type) {
1458 case V4L2_CTRL_TYPE_STRING:
1459 len = strlen(ptr.p_char);
1460 if (c->size < len + 1) {
1461 c->size = ctrl->elem_size;
1462 return -ENOSPC;
1463 }
1464 return copy_to_user(c->string, ptr.p_char, len + 1) ?
1465 -EFAULT : 0;
1466 case V4L2_CTRL_TYPE_INTEGER64:
1467 c->value64 = *ptr.p_s64;
1468 break;
1469 default:
1470 c->value = *ptr.p_s32;
1471 break;
1472 }
1473 return 0;
1474}
1475
1476
1477static int cur_to_user(struct v4l2_ext_control *c,
1478 struct v4l2_ctrl *ctrl)
1479{
1480 return ptr_to_user(c, ctrl, ctrl->p_cur);
1481}
1482
1483
1484static int new_to_user(struct v4l2_ext_control *c,
1485 struct v4l2_ctrl *ctrl)
1486{
1487 return ptr_to_user(c, ctrl, ctrl->p_new);
1488}
1489
1490
1491static int user_to_ptr(struct v4l2_ext_control *c,
1492 struct v4l2_ctrl *ctrl,
1493 union v4l2_ctrl_ptr ptr)
1494{
1495 int ret;
1496 u32 size;
1497
1498 ctrl->is_new = 1;
1499 if (ctrl->is_ptr && !ctrl->is_string) {
1500 unsigned idx;
1501
1502 ret = copy_from_user(ptr.p, c->ptr, c->size) ? -EFAULT : 0;
1503 if (ret || !ctrl->is_array)
1504 return ret;
1505 for (idx = c->size / ctrl->elem_size; idx < ctrl->elems; idx++)
1506 ctrl->type_ops->init(ctrl, idx, ptr);
1507 return 0;
1508 }
1509
1510 switch (ctrl->type) {
1511 case V4L2_CTRL_TYPE_INTEGER64:
1512 *ptr.p_s64 = c->value64;
1513 break;
1514 case V4L2_CTRL_TYPE_STRING:
1515 size = c->size;
1516 if (size == 0)
1517 return -ERANGE;
1518 if (size > ctrl->maximum + 1)
1519 size = ctrl->maximum + 1;
1520 ret = copy_from_user(ptr.p_char, c->string, size) ? -EFAULT : 0;
1521 if (!ret) {
1522 char last = ptr.p_char[size - 1];
1523
1524 ptr.p_char[size - 1] = 0;
1525
1526
1527 if (strlen(ptr.p_char) == ctrl->maximum && last)
1528 return -ERANGE;
1529 }
1530 return ret;
1531 default:
1532 *ptr.p_s32 = c->value;
1533 break;
1534 }
1535 return 0;
1536}
1537
1538
1539static int user_to_new(struct v4l2_ext_control *c,
1540 struct v4l2_ctrl *ctrl)
1541{
1542 return user_to_ptr(c, ctrl, ctrl->p_new);
1543}
1544
1545
1546static void ptr_to_ptr(struct v4l2_ctrl *ctrl,
1547 union v4l2_ctrl_ptr from, union v4l2_ctrl_ptr to)
1548{
1549 if (ctrl == NULL)
1550 return;
1551 memcpy(to.p, from.p, ctrl->elems * ctrl->elem_size);
1552}
1553
1554
1555static void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
1556{
1557 bool changed;
1558
1559 if (ctrl == NULL)
1560 return;
1561
1562
1563 changed = ctrl->has_changed;
1564 if (changed)
1565 ptr_to_ptr(ctrl, ctrl->p_new, ctrl->p_cur);
1566
1567 if (ch_flags & V4L2_EVENT_CTRL_CH_FLAGS) {
1568
1569 ctrl->flags &=
1570 ~(V4L2_CTRL_FLAG_INACTIVE | V4L2_CTRL_FLAG_VOLATILE);
1571 if (!is_cur_manual(ctrl->cluster[0])) {
1572 ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
1573 if (ctrl->cluster[0]->has_volatiles)
1574 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
1575 }
1576 fh = NULL;
1577 }
1578 if (changed || ch_flags) {
1579
1580
1581 if (!ctrl->is_new)
1582 fh = NULL;
1583 send_event(fh, ctrl,
1584 (changed ? V4L2_EVENT_CTRL_CH_VALUE : 0) | ch_flags);
1585 if (ctrl->call_notify && changed && ctrl->handler->notify)
1586 ctrl->handler->notify(ctrl, ctrl->handler->notify_priv);
1587 }
1588}
1589
1590
1591static void cur_to_new(struct v4l2_ctrl *ctrl)
1592{
1593 if (ctrl == NULL)
1594 return;
1595 ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new);
1596}
1597
1598
1599
1600static int cluster_changed(struct v4l2_ctrl *master)
1601{
1602 bool changed = false;
1603 unsigned idx;
1604 int i;
1605
1606 for (i = 0; i < master->ncontrols; i++) {
1607 struct v4l2_ctrl *ctrl = master->cluster[i];
1608 bool ctrl_changed = false;
1609
1610 if (ctrl == NULL)
1611 continue;
1612 for (idx = 0; !ctrl_changed && idx < ctrl->elems; idx++)
1613 ctrl_changed = !ctrl->type_ops->equal(ctrl, idx,
1614 ctrl->p_cur, ctrl->p_new);
1615 ctrl->has_changed = ctrl_changed;
1616 changed |= ctrl->has_changed;
1617 }
1618 return changed;
1619}
1620
1621
1622static int check_range(enum v4l2_ctrl_type type,
1623 s64 min, s64 max, u64 step, s64 def)
1624{
1625 switch (type) {
1626 case V4L2_CTRL_TYPE_BOOLEAN:
1627 if (step != 1 || max > 1 || min < 0)
1628 return -ERANGE;
1629
1630 case V4L2_CTRL_TYPE_U8:
1631 case V4L2_CTRL_TYPE_U16:
1632 case V4L2_CTRL_TYPE_U32:
1633 case V4L2_CTRL_TYPE_INTEGER:
1634 case V4L2_CTRL_TYPE_INTEGER64:
1635 if (step == 0 || min > max || def < min || def > max)
1636 return -ERANGE;
1637 return 0;
1638 case V4L2_CTRL_TYPE_BITMASK:
1639 if (step || min || !max || (def & ~max))
1640 return -ERANGE;
1641 return 0;
1642 case V4L2_CTRL_TYPE_MENU:
1643 case V4L2_CTRL_TYPE_INTEGER_MENU:
1644 if (min > max || def < min || def > max)
1645 return -ERANGE;
1646
1647
1648 if (step && ((1 << def) & step))
1649 return -EINVAL;
1650 return 0;
1651 case V4L2_CTRL_TYPE_STRING:
1652 if (min > max || min < 0 || step < 1 || def)
1653 return -ERANGE;
1654 return 0;
1655 default:
1656 return 0;
1657 }
1658}
1659
1660
1661static int validate_new(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr p_new)
1662{
1663 unsigned idx;
1664 int err = 0;
1665
1666 if (!ctrl->is_ptr) {
1667 switch (ctrl->type) {
1668 case V4L2_CTRL_TYPE_INTEGER:
1669 case V4L2_CTRL_TYPE_INTEGER_MENU:
1670 case V4L2_CTRL_TYPE_MENU:
1671 case V4L2_CTRL_TYPE_BITMASK:
1672 case V4L2_CTRL_TYPE_BOOLEAN:
1673 case V4L2_CTRL_TYPE_BUTTON:
1674 case V4L2_CTRL_TYPE_CTRL_CLASS:
1675 case V4L2_CTRL_TYPE_INTEGER64:
1676 return ctrl->type_ops->validate(ctrl, 0, p_new);
1677 default:
1678 break;
1679 }
1680 }
1681 for (idx = 0; !err && idx < ctrl->elems; idx++)
1682 err = ctrl->type_ops->validate(ctrl, idx, p_new);
1683 return err;
1684}
1685
1686static inline u32 node2id(struct list_head *node)
1687{
1688 return list_entry(node, struct v4l2_ctrl_ref, node)->ctrl->id;
1689}
1690
1691
1692static inline int handler_set_err(struct v4l2_ctrl_handler *hdl, int err)
1693{
1694 if (hdl->error == 0)
1695 hdl->error = err;
1696 return err;
1697}
1698
1699
1700int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl,
1701 unsigned nr_of_controls_hint,
1702 struct lock_class_key *key, const char *name)
1703{
1704 hdl->lock = &hdl->_lock;
1705 mutex_init(hdl->lock);
1706 lockdep_set_class_and_name(hdl->lock, key, name);
1707 INIT_LIST_HEAD(&hdl->ctrls);
1708 INIT_LIST_HEAD(&hdl->ctrl_refs);
1709 hdl->nr_of_buckets = 1 + nr_of_controls_hint / 8;
1710 hdl->buckets = kcalloc(hdl->nr_of_buckets, sizeof(hdl->buckets[0]),
1711 GFP_KERNEL);
1712 hdl->error = hdl->buckets ? 0 : -ENOMEM;
1713 return hdl->error;
1714}
1715EXPORT_SYMBOL(v4l2_ctrl_handler_init_class);
1716
1717
1718void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
1719{
1720 struct v4l2_ctrl_ref *ref, *next_ref;
1721 struct v4l2_ctrl *ctrl, *next_ctrl;
1722 struct v4l2_subscribed_event *sev, *next_sev;
1723
1724 if (hdl == NULL || hdl->buckets == NULL)
1725 return;
1726
1727 mutex_lock(hdl->lock);
1728
1729 list_for_each_entry_safe(ref, next_ref, &hdl->ctrl_refs, node) {
1730 list_del(&ref->node);
1731 kfree(ref);
1732 }
1733
1734 list_for_each_entry_safe(ctrl, next_ctrl, &hdl->ctrls, node) {
1735 list_del(&ctrl->node);
1736 list_for_each_entry_safe(sev, next_sev, &ctrl->ev_subs, node)
1737 list_del(&sev->node);
1738 kfree(ctrl);
1739 }
1740 kfree(hdl->buckets);
1741 hdl->buckets = NULL;
1742 hdl->cached = NULL;
1743 hdl->error = 0;
1744 mutex_unlock(hdl->lock);
1745}
1746EXPORT_SYMBOL(v4l2_ctrl_handler_free);
1747
1748
1749
1750
1751
1752
1753
1754static struct v4l2_ctrl_ref *find_private_ref(
1755 struct v4l2_ctrl_handler *hdl, u32 id)
1756{
1757 struct v4l2_ctrl_ref *ref;
1758
1759 id -= V4L2_CID_PRIVATE_BASE;
1760 list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1761
1762
1763 if (V4L2_CTRL_ID2CLASS(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
1764 V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
1765 if (!ref->ctrl->is_int)
1766 continue;
1767 if (id == 0)
1768 return ref;
1769 id--;
1770 }
1771 }
1772 return NULL;
1773}
1774
1775
1776static struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
1777{
1778 struct v4l2_ctrl_ref *ref;
1779 int bucket;
1780
1781 id &= V4L2_CTRL_ID_MASK;
1782
1783
1784 if (id >= V4L2_CID_PRIVATE_BASE)
1785 return find_private_ref(hdl, id);
1786 bucket = id % hdl->nr_of_buckets;
1787
1788
1789 if (hdl->cached && hdl->cached->ctrl->id == id)
1790 return hdl->cached;
1791
1792
1793 ref = hdl->buckets ? hdl->buckets[bucket] : NULL;
1794 while (ref && ref->ctrl->id != id)
1795 ref = ref->next;
1796
1797 if (ref)
1798 hdl->cached = ref;
1799 return ref;
1800}
1801
1802
1803static struct v4l2_ctrl_ref *find_ref_lock(
1804 struct v4l2_ctrl_handler *hdl, u32 id)
1805{
1806 struct v4l2_ctrl_ref *ref = NULL;
1807
1808 if (hdl) {
1809 mutex_lock(hdl->lock);
1810 ref = find_ref(hdl, id);
1811 mutex_unlock(hdl->lock);
1812 }
1813 return ref;
1814}
1815
1816
1817struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
1818{
1819 struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
1820
1821 return ref ? ref->ctrl : NULL;
1822}
1823EXPORT_SYMBOL(v4l2_ctrl_find);
1824
1825
1826static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
1827 struct v4l2_ctrl *ctrl)
1828{
1829 struct v4l2_ctrl_ref *ref;
1830 struct v4l2_ctrl_ref *new_ref;
1831 u32 id = ctrl->id;
1832 u32 class_ctrl = V4L2_CTRL_ID2CLASS(id) | 1;
1833 int bucket = id % hdl->nr_of_buckets;
1834
1835
1836
1837
1838
1839 if (ctrl->type < V4L2_CTRL_COMPOUND_TYPES &&
1840 id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)
1841 if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))
1842 return hdl->error;
1843
1844 if (hdl->error)
1845 return hdl->error;
1846
1847 new_ref = kzalloc(sizeof(*new_ref), GFP_KERNEL);
1848 if (!new_ref)
1849 return handler_set_err(hdl, -ENOMEM);
1850 new_ref->ctrl = ctrl;
1851 if (ctrl->handler == hdl) {
1852
1853
1854
1855
1856 ctrl->cluster = &new_ref->ctrl;
1857 ctrl->ncontrols = 1;
1858 }
1859
1860 INIT_LIST_HEAD(&new_ref->node);
1861
1862 mutex_lock(hdl->lock);
1863
1864
1865
1866
1867
1868 if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
1869 list_add_tail(&new_ref->node, &hdl->ctrl_refs);
1870 goto insert_in_hash;
1871 }
1872
1873
1874 list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1875 if (ref->ctrl->id < id)
1876 continue;
1877
1878 if (ref->ctrl->id == id) {
1879 kfree(new_ref);
1880 goto unlock;
1881 }
1882 list_add(&new_ref->node, ref->node.prev);
1883 break;
1884 }
1885
1886insert_in_hash:
1887
1888 new_ref->next = hdl->buckets[bucket];
1889 hdl->buckets[bucket] = new_ref;
1890
1891unlock:
1892 mutex_unlock(hdl->lock);
1893 return 0;
1894}
1895
1896
1897static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
1898 const struct v4l2_ctrl_ops *ops,
1899 const struct v4l2_ctrl_type_ops *type_ops,
1900 u32 id, const char *name, enum v4l2_ctrl_type type,
1901 s64 min, s64 max, u64 step, s64 def,
1902 const u32 dims[V4L2_CTRL_MAX_DIMS], u32 elem_size,
1903 u32 flags, const char * const *qmenu,
1904 const s64 *qmenu_int, void *priv)
1905{
1906 struct v4l2_ctrl *ctrl;
1907 unsigned sz_extra;
1908 unsigned nr_of_dims = 0;
1909 unsigned elems = 1;
1910 bool is_array;
1911 unsigned tot_ctrl_size;
1912 unsigned idx;
1913 void *data;
1914 int err;
1915
1916 if (hdl->error)
1917 return NULL;
1918
1919 while (dims && dims[nr_of_dims]) {
1920 elems *= dims[nr_of_dims];
1921 nr_of_dims++;
1922 if (nr_of_dims == V4L2_CTRL_MAX_DIMS)
1923 break;
1924 }
1925 is_array = nr_of_dims > 0;
1926
1927
1928 switch (type) {
1929 case V4L2_CTRL_TYPE_INTEGER64:
1930 elem_size = sizeof(s64);
1931 break;
1932 case V4L2_CTRL_TYPE_STRING:
1933 elem_size = max + 1;
1934 break;
1935 case V4L2_CTRL_TYPE_U8:
1936 elem_size = sizeof(u8);
1937 break;
1938 case V4L2_CTRL_TYPE_U16:
1939 elem_size = sizeof(u16);
1940 break;
1941 case V4L2_CTRL_TYPE_U32:
1942 elem_size = sizeof(u32);
1943 break;
1944 default:
1945 if (type < V4L2_CTRL_COMPOUND_TYPES)
1946 elem_size = sizeof(s32);
1947 break;
1948 }
1949 tot_ctrl_size = elem_size * elems;
1950
1951
1952 if (id == 0 || name == NULL || !elem_size ||
1953 id >= V4L2_CID_PRIVATE_BASE ||
1954 (type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
1955 (type == V4L2_CTRL_TYPE_INTEGER_MENU && qmenu_int == NULL)) {
1956 handler_set_err(hdl, -ERANGE);
1957 return NULL;
1958 }
1959 err = check_range(type, min, max, step, def);
1960 if (err) {
1961 handler_set_err(hdl, err);
1962 return NULL;
1963 }
1964 if (type == V4L2_CTRL_TYPE_BITMASK && ((def & ~max) || min || step)) {
1965 handler_set_err(hdl, -ERANGE);
1966 return NULL;
1967 }
1968 if (is_array &&
1969 (type == V4L2_CTRL_TYPE_BUTTON ||
1970 type == V4L2_CTRL_TYPE_CTRL_CLASS)) {
1971 handler_set_err(hdl, -EINVAL);
1972 return NULL;
1973 }
1974
1975 sz_extra = 0;
1976 if (type == V4L2_CTRL_TYPE_BUTTON)
1977 flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
1978 else if (type == V4L2_CTRL_TYPE_CTRL_CLASS)
1979 flags |= V4L2_CTRL_FLAG_READ_ONLY;
1980 else if (type == V4L2_CTRL_TYPE_INTEGER64 ||
1981 type == V4L2_CTRL_TYPE_STRING ||
1982 type >= V4L2_CTRL_COMPOUND_TYPES ||
1983 is_array)
1984 sz_extra += 2 * tot_ctrl_size;
1985
1986 ctrl = kzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
1987 if (ctrl == NULL) {
1988 handler_set_err(hdl, -ENOMEM);
1989 return NULL;
1990 }
1991
1992 INIT_LIST_HEAD(&ctrl->node);
1993 INIT_LIST_HEAD(&ctrl->ev_subs);
1994 ctrl->handler = hdl;
1995 ctrl->ops = ops;
1996 ctrl->type_ops = type_ops ? type_ops : &std_type_ops;
1997 ctrl->id = id;
1998 ctrl->name = name;
1999 ctrl->type = type;
2000 ctrl->flags = flags;
2001 ctrl->minimum = min;
2002 ctrl->maximum = max;
2003 ctrl->step = step;
2004 ctrl->default_value = def;
2005 ctrl->is_string = !is_array && type == V4L2_CTRL_TYPE_STRING;
2006 ctrl->is_ptr = is_array || type >= V4L2_CTRL_COMPOUND_TYPES || ctrl->is_string;
2007 ctrl->is_int = !ctrl->is_ptr && type != V4L2_CTRL_TYPE_INTEGER64;
2008 ctrl->is_array = is_array;
2009 ctrl->elems = elems;
2010 ctrl->nr_of_dims = nr_of_dims;
2011 if (nr_of_dims)
2012 memcpy(ctrl->dims, dims, nr_of_dims * sizeof(dims[0]));
2013 ctrl->elem_size = elem_size;
2014 if (type == V4L2_CTRL_TYPE_MENU)
2015 ctrl->qmenu = qmenu;
2016 else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2017 ctrl->qmenu_int = qmenu_int;
2018 ctrl->priv = priv;
2019 ctrl->cur.val = ctrl->val = def;
2020 data = &ctrl[1];
2021
2022 if (!ctrl->is_int) {
2023 ctrl->p_new.p = data;
2024 ctrl->p_cur.p = data + tot_ctrl_size;
2025 } else {
2026 ctrl->p_new.p = &ctrl->val;
2027 ctrl->p_cur.p = &ctrl->cur.val;
2028 }
2029 for (idx = 0; idx < elems; idx++) {
2030 ctrl->type_ops->init(ctrl, idx, ctrl->p_cur);
2031 ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
2032 }
2033
2034 if (handler_new_ref(hdl, ctrl)) {
2035 kfree(ctrl);
2036 return NULL;
2037 }
2038 mutex_lock(hdl->lock);
2039 list_add_tail(&ctrl->node, &hdl->ctrls);
2040 mutex_unlock(hdl->lock);
2041 return ctrl;
2042}
2043
2044struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
2045 const struct v4l2_ctrl_config *cfg, void *priv)
2046{
2047 bool is_menu;
2048 struct v4l2_ctrl *ctrl;
2049 const char *name = cfg->name;
2050 const char * const *qmenu = cfg->qmenu;
2051 const s64 *qmenu_int = cfg->qmenu_int;
2052 enum v4l2_ctrl_type type = cfg->type;
2053 u32 flags = cfg->flags;
2054 s64 min = cfg->min;
2055 s64 max = cfg->max;
2056 u64 step = cfg->step;
2057 s64 def = cfg->def;
2058
2059 if (name == NULL)
2060 v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step,
2061 &def, &flags);
2062
2063 is_menu = (cfg->type == V4L2_CTRL_TYPE_MENU ||
2064 cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU);
2065 if (is_menu)
2066 WARN_ON(step);
2067 else
2068 WARN_ON(cfg->menu_skip_mask);
2069 if (cfg->type == V4L2_CTRL_TYPE_MENU && qmenu == NULL)
2070 qmenu = v4l2_ctrl_get_menu(cfg->id);
2071 else if (cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU &&
2072 qmenu_int == NULL) {
2073 handler_set_err(hdl, -EINVAL);
2074 return NULL;
2075 }
2076
2077 ctrl = v4l2_ctrl_new(hdl, cfg->ops, cfg->type_ops, cfg->id, name,
2078 type, min, max,
2079 is_menu ? cfg->menu_skip_mask : step, def,
2080 cfg->dims, cfg->elem_size,
2081 flags, qmenu, qmenu_int, priv);
2082 if (ctrl)
2083 ctrl->is_private = cfg->is_private;
2084 return ctrl;
2085}
2086EXPORT_SYMBOL(v4l2_ctrl_new_custom);
2087
2088
2089struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
2090 const struct v4l2_ctrl_ops *ops,
2091 u32 id, s64 min, s64 max, u64 step, s64 def)
2092{
2093 const char *name;
2094 enum v4l2_ctrl_type type;
2095 u32 flags;
2096
2097 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2098 if (type == V4L2_CTRL_TYPE_MENU ||
2099 type == V4L2_CTRL_TYPE_INTEGER_MENU ||
2100 type >= V4L2_CTRL_COMPOUND_TYPES) {
2101 handler_set_err(hdl, -EINVAL);
2102 return NULL;
2103 }
2104 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2105 min, max, step, def, NULL, 0,
2106 flags, NULL, NULL, NULL);
2107}
2108EXPORT_SYMBOL(v4l2_ctrl_new_std);
2109
2110
2111struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
2112 const struct v4l2_ctrl_ops *ops,
2113 u32 id, u8 _max, u64 mask, u8 _def)
2114{
2115 const char * const *qmenu = NULL;
2116 const s64 *qmenu_int = NULL;
2117 unsigned int qmenu_int_len = 0;
2118 const char *name;
2119 enum v4l2_ctrl_type type;
2120 s64 min;
2121 s64 max = _max;
2122 s64 def = _def;
2123 u64 step;
2124 u32 flags;
2125
2126 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2127
2128 if (type == V4L2_CTRL_TYPE_MENU)
2129 qmenu = v4l2_ctrl_get_menu(id);
2130 else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2131 qmenu_int = v4l2_ctrl_get_int_menu(id, &qmenu_int_len);
2132
2133 if ((!qmenu && !qmenu_int) || (qmenu_int && max > qmenu_int_len)) {
2134 handler_set_err(hdl, -EINVAL);
2135 return NULL;
2136 }
2137 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2138 0, max, mask, def, NULL, 0,
2139 flags, qmenu, qmenu_int, NULL);
2140}
2141EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
2142
2143
2144struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl,
2145 const struct v4l2_ctrl_ops *ops, u32 id, u8 _max,
2146 u64 mask, u8 _def, const char * const *qmenu)
2147{
2148 enum v4l2_ctrl_type type;
2149 const char *name;
2150 u32 flags;
2151 u64 step;
2152 s64 min;
2153 s64 max = _max;
2154 s64 def = _def;
2155
2156
2157
2158
2159 if (v4l2_ctrl_get_menu(id)) {
2160 handler_set_err(hdl, -EINVAL);
2161 return NULL;
2162 }
2163
2164 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2165 if (type != V4L2_CTRL_TYPE_MENU || qmenu == NULL) {
2166 handler_set_err(hdl, -EINVAL);
2167 return NULL;
2168 }
2169 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2170 0, max, mask, def, NULL, 0,
2171 flags, qmenu, NULL, NULL);
2172
2173}
2174EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
2175
2176
2177struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
2178 const struct v4l2_ctrl_ops *ops,
2179 u32 id, u8 _max, u8 _def, const s64 *qmenu_int)
2180{
2181 const char *name;
2182 enum v4l2_ctrl_type type;
2183 s64 min;
2184 u64 step;
2185 s64 max = _max;
2186 s64 def = _def;
2187 u32 flags;
2188
2189 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2190 if (type != V4L2_CTRL_TYPE_INTEGER_MENU) {
2191 handler_set_err(hdl, -EINVAL);
2192 return NULL;
2193 }
2194 return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2195 0, max, 0, def, NULL, 0,
2196 flags, NULL, qmenu_int, NULL);
2197}
2198EXPORT_SYMBOL(v4l2_ctrl_new_int_menu);
2199
2200
2201struct v4l2_ctrl *v4l2_ctrl_add_ctrl(struct v4l2_ctrl_handler *hdl,
2202 struct v4l2_ctrl *ctrl)
2203{
2204 if (hdl == NULL || hdl->error)
2205 return NULL;
2206 if (ctrl == NULL) {
2207 handler_set_err(hdl, -EINVAL);
2208 return NULL;
2209 }
2210 if (ctrl->handler == hdl)
2211 return ctrl;
2212 return handler_new_ref(hdl, ctrl) ? NULL : ctrl;
2213}
2214EXPORT_SYMBOL(v4l2_ctrl_add_ctrl);
2215
2216
2217int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
2218 struct v4l2_ctrl_handler *add,
2219 bool (*filter)(const struct v4l2_ctrl *ctrl))
2220{
2221 struct v4l2_ctrl_ref *ref;
2222 int ret = 0;
2223
2224
2225 if (!hdl || !add || hdl == add)
2226 return 0;
2227 if (hdl->error)
2228 return hdl->error;
2229 mutex_lock(add->lock);
2230 list_for_each_entry(ref, &add->ctrl_refs, node) {
2231 struct v4l2_ctrl *ctrl = ref->ctrl;
2232
2233
2234 if (ctrl->is_private)
2235 continue;
2236
2237 if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2238 continue;
2239
2240 if (filter && !filter(ctrl))
2241 continue;
2242 ret = handler_new_ref(hdl, ctrl);
2243 if (ret)
2244 break;
2245 }
2246 mutex_unlock(add->lock);
2247 return ret;
2248}
2249EXPORT_SYMBOL(v4l2_ctrl_add_handler);
2250
2251bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl)
2252{
2253 if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_TX)
2254 return true;
2255 if (V4L2_CTRL_ID2CLASS(ctrl->id) == V4L2_CTRL_CLASS_FM_RX)
2256 return true;
2257 switch (ctrl->id) {
2258 case V4L2_CID_AUDIO_MUTE:
2259 case V4L2_CID_AUDIO_VOLUME:
2260 case V4L2_CID_AUDIO_BALANCE:
2261 case V4L2_CID_AUDIO_BASS:
2262 case V4L2_CID_AUDIO_TREBLE:
2263 case V4L2_CID_AUDIO_LOUDNESS:
2264 return true;
2265 default:
2266 break;
2267 }
2268 return false;
2269}
2270EXPORT_SYMBOL(v4l2_ctrl_radio_filter);
2271
2272
2273void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls)
2274{
2275 bool has_volatiles = false;
2276 int i;
2277
2278
2279 if (WARN_ON(ncontrols == 0 || controls[0] == NULL))
2280 return;
2281
2282 for (i = 0; i < ncontrols; i++) {
2283 if (controls[i]) {
2284 controls[i]->cluster = controls;
2285 controls[i]->ncontrols = ncontrols;
2286 if (controls[i]->flags & V4L2_CTRL_FLAG_VOLATILE)
2287 has_volatiles = true;
2288 }
2289 }
2290 controls[0]->has_volatiles = has_volatiles;
2291}
2292EXPORT_SYMBOL(v4l2_ctrl_cluster);
2293
2294void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
2295 u8 manual_val, bool set_volatile)
2296{
2297 struct v4l2_ctrl *master = controls[0];
2298 u32 flag = 0;
2299 int i;
2300
2301 v4l2_ctrl_cluster(ncontrols, controls);
2302 WARN_ON(ncontrols <= 1);
2303 WARN_ON(manual_val < master->minimum || manual_val > master->maximum);
2304 WARN_ON(set_volatile && !has_op(master, g_volatile_ctrl));
2305 master->is_auto = true;
2306 master->has_volatiles = set_volatile;
2307 master->manual_mode_value = manual_val;
2308 master->flags |= V4L2_CTRL_FLAG_UPDATE;
2309
2310 if (!is_cur_manual(master))
2311 flag = V4L2_CTRL_FLAG_INACTIVE |
2312 (set_volatile ? V4L2_CTRL_FLAG_VOLATILE : 0);
2313
2314 for (i = 1; i < ncontrols; i++)
2315 if (controls[i])
2316 controls[i]->flags |= flag;
2317}
2318EXPORT_SYMBOL(v4l2_ctrl_auto_cluster);
2319
2320
2321void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
2322{
2323
2324 bool inactive = !active;
2325 bool old;
2326
2327 if (ctrl == NULL)
2328 return;
2329
2330 if (inactive)
2331
2332 old = test_and_set_bit(4, &ctrl->flags);
2333 else
2334
2335 old = test_and_clear_bit(4, &ctrl->flags);
2336 if (old != inactive)
2337 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2338}
2339EXPORT_SYMBOL(v4l2_ctrl_activate);
2340
2341
2342
2343
2344
2345
2346
2347void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
2348{
2349 bool old;
2350
2351 if (ctrl == NULL)
2352 return;
2353
2354 v4l2_ctrl_lock(ctrl);
2355 if (grabbed)
2356
2357 old = test_and_set_bit(1, &ctrl->flags);
2358 else
2359
2360 old = test_and_clear_bit(1, &ctrl->flags);
2361 if (old != grabbed)
2362 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2363 v4l2_ctrl_unlock(ctrl);
2364}
2365EXPORT_SYMBOL(v4l2_ctrl_grab);
2366
2367
2368static void log_ctrl(const struct v4l2_ctrl *ctrl,
2369 const char *prefix, const char *colon)
2370{
2371 if (ctrl->flags & (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_WRITE_ONLY))
2372 return;
2373 if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2374 return;
2375
2376 pr_info("%s%s%s: ", prefix, colon, ctrl->name);
2377
2378 ctrl->type_ops->log(ctrl);
2379
2380 if (ctrl->flags & (V4L2_CTRL_FLAG_INACTIVE |
2381 V4L2_CTRL_FLAG_GRABBED |
2382 V4L2_CTRL_FLAG_VOLATILE)) {
2383 if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
2384 pr_cont(" inactive");
2385 if (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)
2386 pr_cont(" grabbed");
2387 if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE)
2388 pr_cont(" volatile");
2389 }
2390 pr_cont("\n");
2391}
2392
2393
2394void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
2395 const char *prefix)
2396{
2397 struct v4l2_ctrl *ctrl;
2398 const char *colon = "";
2399 int len;
2400
2401 if (hdl == NULL)
2402 return;
2403 if (prefix == NULL)
2404 prefix = "";
2405 len = strlen(prefix);
2406 if (len && prefix[len - 1] != ' ')
2407 colon = ": ";
2408 mutex_lock(hdl->lock);
2409 list_for_each_entry(ctrl, &hdl->ctrls, node)
2410 if (!(ctrl->flags & V4L2_CTRL_FLAG_DISABLED))
2411 log_ctrl(ctrl, prefix, colon);
2412 mutex_unlock(hdl->lock);
2413}
2414EXPORT_SYMBOL(v4l2_ctrl_handler_log_status);
2415
2416int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd)
2417{
2418 v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name);
2419 return 0;
2420}
2421EXPORT_SYMBOL(v4l2_ctrl_subdev_log_status);
2422
2423
2424int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2425{
2426 struct v4l2_ctrl *ctrl;
2427 int ret = 0;
2428
2429 if (hdl == NULL)
2430 return 0;
2431 mutex_lock(hdl->lock);
2432 list_for_each_entry(ctrl, &hdl->ctrls, node)
2433 ctrl->done = false;
2434
2435 list_for_each_entry(ctrl, &hdl->ctrls, node) {
2436 struct v4l2_ctrl *master = ctrl->cluster[0];
2437 int i;
2438
2439
2440
2441 if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
2442 (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
2443 continue;
2444
2445 for (i = 0; i < master->ncontrols; i++) {
2446 if (master->cluster[i]) {
2447 cur_to_new(master->cluster[i]);
2448 master->cluster[i]->is_new = 1;
2449 master->cluster[i]->done = true;
2450 }
2451 }
2452 ret = call_op(master, s_ctrl);
2453 if (ret)
2454 break;
2455 }
2456 mutex_unlock(hdl->lock);
2457 return ret;
2458}
2459EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
2460
2461
2462int v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_query_ext_ctrl *qc)
2463{
2464 const unsigned next_flags = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
2465 u32 id = qc->id & V4L2_CTRL_ID_MASK;
2466 struct v4l2_ctrl_ref *ref;
2467 struct v4l2_ctrl *ctrl;
2468
2469 if (hdl == NULL)
2470 return -EINVAL;
2471
2472 mutex_lock(hdl->lock);
2473
2474
2475 ref = find_ref(hdl, id);
2476
2477 if ((qc->id & next_flags) && !list_empty(&hdl->ctrl_refs)) {
2478 bool is_compound;
2479
2480 unsigned mask = 1;
2481 bool match = false;
2482
2483 if ((qc->id & next_flags) == V4L2_CTRL_FLAG_NEXT_COMPOUND) {
2484
2485 match = true;
2486 } else if ((qc->id & next_flags) == next_flags) {
2487
2488 mask = 0;
2489 }
2490
2491
2492
2493
2494 if (id >= node2id(hdl->ctrl_refs.prev)) {
2495 ref = NULL;
2496 } else if (ref) {
2497
2498
2499 list_for_each_entry_continue(ref, &hdl->ctrl_refs, node) {
2500 is_compound =
2501 ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
2502 if (id < ref->ctrl->id &&
2503 (is_compound & mask) == match)
2504 break;
2505 }
2506 if (&ref->node == &hdl->ctrl_refs)
2507 ref = NULL;
2508 } else {
2509
2510
2511
2512
2513 list_for_each_entry(ref, &hdl->ctrl_refs, node) {
2514 is_compound =
2515 ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
2516 if (id < ref->ctrl->id &&
2517 (is_compound & mask) == match)
2518 break;
2519 }
2520 if (&ref->node == &hdl->ctrl_refs)
2521 ref = NULL;
2522 }
2523 }
2524 mutex_unlock(hdl->lock);
2525
2526 if (!ref)
2527 return -EINVAL;
2528
2529 ctrl = ref->ctrl;
2530 memset(qc, 0, sizeof(*qc));
2531 if (id >= V4L2_CID_PRIVATE_BASE)
2532 qc->id = id;
2533 else
2534 qc->id = ctrl->id;
2535 strlcpy(qc->name, ctrl->name, sizeof(qc->name));
2536 qc->flags = ctrl->flags;
2537 qc->type = ctrl->type;
2538 if (ctrl->is_ptr)
2539 qc->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
2540 qc->elem_size = ctrl->elem_size;
2541 qc->elems = ctrl->elems;
2542 qc->nr_of_dims = ctrl->nr_of_dims;
2543 memcpy(qc->dims, ctrl->dims, qc->nr_of_dims * sizeof(qc->dims[0]));
2544 qc->minimum = ctrl->minimum;
2545 qc->maximum = ctrl->maximum;
2546 qc->default_value = ctrl->default_value;
2547 if (ctrl->type == V4L2_CTRL_TYPE_MENU
2548 || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
2549 qc->step = 1;
2550 else
2551 qc->step = ctrl->step;
2552 return 0;
2553}
2554EXPORT_SYMBOL(v4l2_query_ext_ctrl);
2555
2556
2557int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc)
2558{
2559 struct v4l2_query_ext_ctrl qec = { qc->id };
2560 int rc;
2561
2562 rc = v4l2_query_ext_ctrl(hdl, &qec);
2563 if (rc)
2564 return rc;
2565
2566 qc->id = qec.id;
2567 qc->type = qec.type;
2568 qc->flags = qec.flags;
2569 strlcpy(qc->name, qec.name, sizeof(qc->name));
2570 switch (qc->type) {
2571 case V4L2_CTRL_TYPE_INTEGER:
2572 case V4L2_CTRL_TYPE_BOOLEAN:
2573 case V4L2_CTRL_TYPE_MENU:
2574 case V4L2_CTRL_TYPE_INTEGER_MENU:
2575 case V4L2_CTRL_TYPE_STRING:
2576 case V4L2_CTRL_TYPE_BITMASK:
2577 qc->minimum = qec.minimum;
2578 qc->maximum = qec.maximum;
2579 qc->step = qec.step;
2580 qc->default_value = qec.default_value;
2581 break;
2582 default:
2583 qc->minimum = 0;
2584 qc->maximum = 0;
2585 qc->step = 0;
2586 qc->default_value = 0;
2587 break;
2588 }
2589 return 0;
2590}
2591EXPORT_SYMBOL(v4l2_queryctrl);
2592
2593int v4l2_subdev_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
2594{
2595 if (qc->id & (V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND))
2596 return -EINVAL;
2597 return v4l2_queryctrl(sd->ctrl_handler, qc);
2598}
2599EXPORT_SYMBOL(v4l2_subdev_queryctrl);
2600
2601
2602int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm)
2603{
2604 struct v4l2_ctrl *ctrl;
2605 u32 i = qm->index;
2606
2607 ctrl = v4l2_ctrl_find(hdl, qm->id);
2608 if (!ctrl)
2609 return -EINVAL;
2610
2611 qm->reserved = 0;
2612
2613 switch (ctrl->type) {
2614 case V4L2_CTRL_TYPE_MENU:
2615 if (ctrl->qmenu == NULL)
2616 return -EINVAL;
2617 break;
2618 case V4L2_CTRL_TYPE_INTEGER_MENU:
2619 if (ctrl->qmenu_int == NULL)
2620 return -EINVAL;
2621 break;
2622 default:
2623 return -EINVAL;
2624 }
2625
2626 if (i < ctrl->minimum || i > ctrl->maximum)
2627 return -EINVAL;
2628
2629
2630 if (ctrl->menu_skip_mask & (1 << i))
2631 return -EINVAL;
2632
2633 if (ctrl->type == V4L2_CTRL_TYPE_MENU) {
2634 if (ctrl->qmenu[i] == NULL || ctrl->qmenu[i][0] == '\0')
2635 return -EINVAL;
2636 strlcpy(qm->name, ctrl->qmenu[i], sizeof(qm->name));
2637 } else {
2638 qm->value = ctrl->qmenu_int[i];
2639 }
2640 return 0;
2641}
2642EXPORT_SYMBOL(v4l2_querymenu);
2643
2644int v4l2_subdev_querymenu(struct v4l2_subdev *sd, struct v4l2_querymenu *qm)
2645{
2646 return v4l2_querymenu(sd->ctrl_handler, qm);
2647}
2648EXPORT_SYMBOL(v4l2_subdev_querymenu);
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
2694 struct v4l2_ext_controls *cs,
2695 struct v4l2_ctrl_helper *helpers,
2696 bool get)
2697{
2698 struct v4l2_ctrl_helper *h;
2699 bool have_clusters = false;
2700 u32 i;
2701
2702 for (i = 0, h = helpers; i < cs->count; i++, h++) {
2703 struct v4l2_ext_control *c = &cs->controls[i];
2704 struct v4l2_ctrl_ref *ref;
2705 struct v4l2_ctrl *ctrl;
2706 u32 id = c->id & V4L2_CTRL_ID_MASK;
2707
2708 cs->error_idx = i;
2709
2710 if (cs->ctrl_class && V4L2_CTRL_ID2CLASS(id) != cs->ctrl_class)
2711 return -EINVAL;
2712
2713
2714
2715 if (id >= V4L2_CID_PRIVATE_BASE)
2716 return -EINVAL;
2717 ref = find_ref_lock(hdl, id);
2718 if (ref == NULL)
2719 return -EINVAL;
2720 ctrl = ref->ctrl;
2721 if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED)
2722 return -EINVAL;
2723
2724 if (ctrl->cluster[0]->ncontrols > 1)
2725 have_clusters = true;
2726 if (ctrl->cluster[0] != ctrl)
2727 ref = find_ref_lock(hdl, ctrl->cluster[0]->id);
2728 if (ctrl->is_ptr && !ctrl->is_string) {
2729 unsigned tot_size = ctrl->elems * ctrl->elem_size;
2730
2731 if (c->size < tot_size) {
2732 if (get) {
2733 c->size = tot_size;
2734 return -ENOSPC;
2735 }
2736 return -EFAULT;
2737 }
2738 c->size = tot_size;
2739 }
2740
2741 h->mref = ref;
2742 h->ctrl = ctrl;
2743
2744
2745
2746 h->next = 0;
2747 }
2748
2749
2750
2751 if (!have_clusters)
2752 return 0;
2753
2754
2755
2756
2757
2758 mutex_lock(hdl->lock);
2759
2760
2761 for (i = 0; i < cs->count; i++)
2762 helpers[i].mref->helper = NULL;
2763 for (i = 0, h = helpers; i < cs->count; i++, h++) {
2764 struct v4l2_ctrl_ref *mref = h->mref;
2765
2766
2767
2768 if (mref->helper) {
2769
2770
2771
2772 mref->helper->next = i;
2773
2774
2775 h->mref = NULL;
2776 }
2777
2778 mref->helper = h;
2779 }
2780 mutex_unlock(hdl->lock);
2781 return 0;
2782}
2783
2784
2785
2786
2787static int class_check(struct v4l2_ctrl_handler *hdl, u32 ctrl_class)
2788{
2789 if (ctrl_class == 0)
2790 return list_empty(&hdl->ctrl_refs) ? -EINVAL : 0;
2791 return find_ref_lock(hdl, ctrl_class | 1) ? 0 : -EINVAL;
2792}
2793
2794
2795
2796
2797int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs)
2798{
2799 struct v4l2_ctrl_helper helper[4];
2800 struct v4l2_ctrl_helper *helpers = helper;
2801 int ret;
2802 int i, j;
2803
2804 cs->error_idx = cs->count;
2805 cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
2806
2807 if (hdl == NULL)
2808 return -EINVAL;
2809
2810 if (cs->count == 0)
2811 return class_check(hdl, cs->ctrl_class);
2812
2813 if (cs->count > ARRAY_SIZE(helper)) {
2814 helpers = kmalloc_array(cs->count, sizeof(helper[0]),
2815 GFP_KERNEL);
2816 if (helpers == NULL)
2817 return -ENOMEM;
2818 }
2819
2820 ret = prepare_ext_ctrls(hdl, cs, helpers, true);
2821 cs->error_idx = cs->count;
2822
2823 for (i = 0; !ret && i < cs->count; i++)
2824 if (helpers[i].ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
2825 ret = -EACCES;
2826
2827 for (i = 0; !ret && i < cs->count; i++) {
2828 int (*ctrl_to_user)(struct v4l2_ext_control *c,
2829 struct v4l2_ctrl *ctrl) = cur_to_user;
2830 struct v4l2_ctrl *master;
2831
2832 if (helpers[i].mref == NULL)
2833 continue;
2834
2835 master = helpers[i].mref->ctrl;
2836 cs->error_idx = i;
2837
2838 v4l2_ctrl_lock(master);
2839
2840
2841 if ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
2842 (master->has_volatiles && !is_cur_manual(master))) {
2843 for (j = 0; j < master->ncontrols; j++)
2844 cur_to_new(master->cluster[j]);
2845 ret = call_op(master, g_volatile_ctrl);
2846 ctrl_to_user = new_to_user;
2847 }
2848
2849
2850
2851 if (!ret) {
2852 u32 idx = i;
2853
2854 do {
2855 ret = ctrl_to_user(cs->controls + idx,
2856 helpers[idx].ctrl);
2857 idx = helpers[idx].next;
2858 } while (!ret && idx);
2859 }
2860 v4l2_ctrl_unlock(master);
2861 }
2862
2863 if (cs->count > ARRAY_SIZE(helper))
2864 kfree(helpers);
2865 return ret;
2866}
2867EXPORT_SYMBOL(v4l2_g_ext_ctrls);
2868
2869int v4l2_subdev_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
2870{
2871 return v4l2_g_ext_ctrls(sd->ctrl_handler, cs);
2872}
2873EXPORT_SYMBOL(v4l2_subdev_g_ext_ctrls);
2874
2875
2876static int get_ctrl(struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
2877{
2878 struct v4l2_ctrl *master = ctrl->cluster[0];
2879 int ret = 0;
2880 int i;
2881
2882
2883
2884
2885
2886 if (!ctrl->is_int)
2887 return -EINVAL;
2888
2889 if (ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
2890 return -EACCES;
2891
2892 v4l2_ctrl_lock(master);
2893
2894 if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
2895 for (i = 0; i < master->ncontrols; i++)
2896 cur_to_new(master->cluster[i]);
2897 ret = call_op(master, g_volatile_ctrl);
2898 new_to_user(c, ctrl);
2899 } else {
2900 cur_to_user(c, ctrl);
2901 }
2902 v4l2_ctrl_unlock(master);
2903 return ret;
2904}
2905
2906int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
2907{
2908 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
2909 struct v4l2_ext_control c;
2910 int ret;
2911
2912 if (ctrl == NULL || !ctrl->is_int)
2913 return -EINVAL;
2914 ret = get_ctrl(ctrl, &c);
2915 control->value = c.value;
2916 return ret;
2917}
2918EXPORT_SYMBOL(v4l2_g_ctrl);
2919
2920int v4l2_subdev_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *control)
2921{
2922 return v4l2_g_ctrl(sd->ctrl_handler, control);
2923}
2924EXPORT_SYMBOL(v4l2_subdev_g_ctrl);
2925
2926s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
2927{
2928 struct v4l2_ext_control c;
2929
2930
2931 WARN_ON(!ctrl->is_int);
2932 c.value = 0;
2933 get_ctrl(ctrl, &c);
2934 return c.value;
2935}
2936EXPORT_SYMBOL(v4l2_ctrl_g_ctrl);
2937
2938s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl)
2939{
2940 struct v4l2_ext_control c;
2941
2942
2943 WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
2944 c.value = 0;
2945 get_ctrl(ctrl, &c);
2946 return c.value;
2947}
2948EXPORT_SYMBOL(v4l2_ctrl_g_ctrl_int64);
2949
2950
2951
2952
2953
2954static int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
2955 bool set, u32 ch_flags)
2956{
2957 bool update_flag;
2958 int ret;
2959 int i;
2960
2961
2962
2963
2964
2965 for (i = 0; i < master->ncontrols; i++) {
2966 struct v4l2_ctrl *ctrl = master->cluster[i];
2967
2968 if (ctrl == NULL)
2969 continue;
2970
2971 if (!ctrl->is_new) {
2972 cur_to_new(ctrl);
2973 continue;
2974 }
2975
2976
2977 if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
2978 return -EBUSY;
2979 }
2980
2981 ret = call_op(master, try_ctrl);
2982
2983
2984 if (ret || !set || !cluster_changed(master))
2985 return ret;
2986 ret = call_op(master, s_ctrl);
2987 if (ret)
2988 return ret;
2989
2990
2991 update_flag = is_cur_manual(master) != is_new_manual(master);
2992 for (i = 0; i < master->ncontrols; i++)
2993 new_to_cur(fh, master->cluster[i], ch_flags |
2994 ((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
2995 return 0;
2996}
2997
2998
2999static int validate_ctrls(struct v4l2_ext_controls *cs,
3000 struct v4l2_ctrl_helper *helpers, bool set)
3001{
3002 unsigned i;
3003 int ret = 0;
3004
3005 cs->error_idx = cs->count;
3006 for (i = 0; i < cs->count; i++) {
3007 struct v4l2_ctrl *ctrl = helpers[i].ctrl;
3008 union v4l2_ctrl_ptr p_new;
3009
3010 cs->error_idx = i;
3011
3012 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
3013 return -EACCES;
3014
3015
3016
3017
3018
3019
3020 if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
3021 return -EBUSY;
3022
3023
3024
3025
3026 if (ctrl->is_ptr)
3027 continue;
3028 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
3029 p_new.p_s64 = &cs->controls[i].value64;
3030 else
3031 p_new.p_s32 = &cs->controls[i].value;
3032 ret = validate_new(ctrl, p_new);
3033 if (ret)
3034 return ret;
3035 }
3036 return 0;
3037}
3038
3039
3040
3041static void update_from_auto_cluster(struct v4l2_ctrl *master)
3042{
3043 int i;
3044
3045 for (i = 0; i < master->ncontrols; i++)
3046 cur_to_new(master->cluster[i]);
3047 if (!call_op(master, g_volatile_ctrl))
3048 for (i = 1; i < master->ncontrols; i++)
3049 if (master->cluster[i])
3050 master->cluster[i]->is_new = 1;
3051}
3052
3053
3054static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
3055 struct v4l2_ext_controls *cs,
3056 bool set)
3057{
3058 struct v4l2_ctrl_helper helper[4];
3059 struct v4l2_ctrl_helper *helpers = helper;
3060 unsigned i, j;
3061 int ret;
3062
3063 cs->error_idx = cs->count;
3064 cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
3065
3066 if (hdl == NULL)
3067 return -EINVAL;
3068
3069 if (cs->count == 0)
3070 return class_check(hdl, cs->ctrl_class);
3071
3072 if (cs->count > ARRAY_SIZE(helper)) {
3073 helpers = kmalloc_array(cs->count, sizeof(helper[0]),
3074 GFP_KERNEL);
3075 if (!helpers)
3076 return -ENOMEM;
3077 }
3078 ret = prepare_ext_ctrls(hdl, cs, helpers, false);
3079 if (!ret)
3080 ret = validate_ctrls(cs, helpers, set);
3081 if (ret && set)
3082 cs->error_idx = cs->count;
3083 for (i = 0; !ret && i < cs->count; i++) {
3084 struct v4l2_ctrl *master;
3085 u32 idx = i;
3086
3087 if (helpers[i].mref == NULL)
3088 continue;
3089
3090 cs->error_idx = i;
3091 master = helpers[i].mref->ctrl;
3092 v4l2_ctrl_lock(master);
3093
3094
3095 for (j = 0; j < master->ncontrols; j++)
3096 if (master->cluster[j])
3097 master->cluster[j]->is_new = 0;
3098
3099
3100
3101
3102
3103
3104
3105 if (master->is_auto && master->has_volatiles &&
3106 !is_cur_manual(master)) {
3107
3108 s32 new_auto_val = master->manual_mode_value + 1;
3109 u32 tmp_idx = idx;
3110
3111 do {
3112
3113
3114 if (helpers[tmp_idx].ctrl == master)
3115 new_auto_val = cs->controls[tmp_idx].value;
3116 tmp_idx = helpers[tmp_idx].next;
3117 } while (tmp_idx);
3118
3119
3120 if (new_auto_val == master->manual_mode_value)
3121 update_from_auto_cluster(master);
3122 }
3123
3124
3125
3126 do {
3127 struct v4l2_ctrl *ctrl = helpers[idx].ctrl;
3128
3129 ret = user_to_new(cs->controls + idx, ctrl);
3130 if (!ret && ctrl->is_ptr)
3131 ret = validate_new(ctrl, ctrl->p_new);
3132 idx = helpers[idx].next;
3133 } while (!ret && idx);
3134
3135 if (!ret)
3136 ret = try_or_set_cluster(fh, master, set, 0);
3137
3138
3139 if (!ret) {
3140 idx = i;
3141 do {
3142 ret = new_to_user(cs->controls + idx,
3143 helpers[idx].ctrl);
3144 idx = helpers[idx].next;
3145 } while (!ret && idx);
3146 }
3147 v4l2_ctrl_unlock(master);
3148 }
3149
3150 if (cs->count > ARRAY_SIZE(helper))
3151 kfree(helpers);
3152 return ret;
3153}
3154
3155int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs)
3156{
3157 return try_set_ext_ctrls(NULL, hdl, cs, false);
3158}
3159EXPORT_SYMBOL(v4l2_try_ext_ctrls);
3160
3161int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
3162 struct v4l2_ext_controls *cs)
3163{
3164 return try_set_ext_ctrls(fh, hdl, cs, true);
3165}
3166EXPORT_SYMBOL(v4l2_s_ext_ctrls);
3167
3168int v4l2_subdev_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
3169{
3170 return try_set_ext_ctrls(NULL, sd->ctrl_handler, cs, false);
3171}
3172EXPORT_SYMBOL(v4l2_subdev_try_ext_ctrls);
3173
3174int v4l2_subdev_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
3175{
3176 return try_set_ext_ctrls(NULL, sd->ctrl_handler, cs, true);
3177}
3178EXPORT_SYMBOL(v4l2_subdev_s_ext_ctrls);
3179
3180
3181static int set_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
3182{
3183 struct v4l2_ctrl *master = ctrl->cluster[0];
3184 int ret;
3185 int i;
3186
3187
3188 for (i = 0; i < master->ncontrols; i++)
3189 if (master->cluster[i])
3190 master->cluster[i]->is_new = 0;
3191
3192 ret = validate_new(ctrl, ctrl->p_new);
3193 if (ret)
3194 return ret;
3195
3196
3197
3198
3199 if (master->is_auto && master->has_volatiles && ctrl == master &&
3200 !is_cur_manual(master) && ctrl->val == master->manual_mode_value)
3201 update_from_auto_cluster(master);
3202
3203 ctrl->is_new = 1;
3204 return try_or_set_cluster(fh, master, true, ch_flags);
3205}
3206
3207
3208static int set_ctrl_lock(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
3209 struct v4l2_ext_control *c)
3210{
3211 int ret;
3212
3213 v4l2_ctrl_lock(ctrl);
3214 user_to_new(c, ctrl);
3215 ret = set_ctrl(fh, ctrl, 0);
3216 if (!ret)
3217 cur_to_user(c, ctrl);
3218 v4l2_ctrl_unlock(ctrl);
3219 return ret;
3220}
3221
3222int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
3223 struct v4l2_control *control)
3224{
3225 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
3226 struct v4l2_ext_control c = { control->id };
3227 int ret;
3228
3229 if (ctrl == NULL || !ctrl->is_int)
3230 return -EINVAL;
3231
3232 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
3233 return -EACCES;
3234
3235 c.value = control->value;
3236 ret = set_ctrl_lock(fh, ctrl, &c);
3237 control->value = c.value;
3238 return ret;
3239}
3240EXPORT_SYMBOL(v4l2_s_ctrl);
3241
3242int v4l2_subdev_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *control)
3243{
3244 return v4l2_s_ctrl(NULL, sd->ctrl_handler, control);
3245}
3246EXPORT_SYMBOL(v4l2_subdev_s_ctrl);
3247
3248int __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
3249{
3250 lockdep_assert_held(ctrl->handler->lock);
3251
3252
3253 WARN_ON(!ctrl->is_int);
3254 ctrl->val = val;
3255 return set_ctrl(NULL, ctrl, 0);
3256}
3257EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl);
3258
3259int __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val)
3260{
3261 lockdep_assert_held(ctrl->handler->lock);
3262
3263
3264 WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
3265 *ctrl->p_new.p_s64 = val;
3266 return set_ctrl(NULL, ctrl, 0);
3267}
3268EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_int64);
3269
3270int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
3271{
3272 lockdep_assert_held(ctrl->handler->lock);
3273
3274
3275 WARN_ON(ctrl->type != V4L2_CTRL_TYPE_STRING);
3276 strlcpy(ctrl->p_new.p_char, s, ctrl->maximum + 1);
3277 return set_ctrl(NULL, ctrl, 0);
3278}
3279EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
3280
3281void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv)
3282{
3283 if (ctrl == NULL)
3284 return;
3285 if (notify == NULL) {
3286 ctrl->call_notify = 0;
3287 return;
3288 }
3289 if (WARN_ON(ctrl->handler->notify && ctrl->handler->notify != notify))
3290 return;
3291 ctrl->handler->notify = notify;
3292 ctrl->handler->notify_priv = priv;
3293 ctrl->call_notify = 1;
3294}
3295EXPORT_SYMBOL(v4l2_ctrl_notify);
3296
3297int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
3298 s64 min, s64 max, u64 step, s64 def)
3299{
3300 bool changed;
3301 int ret;
3302
3303 lockdep_assert_held(ctrl->handler->lock);
3304
3305 switch (ctrl->type) {
3306 case V4L2_CTRL_TYPE_INTEGER:
3307 case V4L2_CTRL_TYPE_INTEGER64:
3308 case V4L2_CTRL_TYPE_BOOLEAN:
3309 case V4L2_CTRL_TYPE_MENU:
3310 case V4L2_CTRL_TYPE_INTEGER_MENU:
3311 case V4L2_CTRL_TYPE_BITMASK:
3312 case V4L2_CTRL_TYPE_U8:
3313 case V4L2_CTRL_TYPE_U16:
3314 case V4L2_CTRL_TYPE_U32:
3315 if (ctrl->is_array)
3316 return -EINVAL;
3317 ret = check_range(ctrl->type, min, max, step, def);
3318 if (ret)
3319 return ret;
3320 break;
3321 default:
3322 return -EINVAL;
3323 }
3324 ctrl->minimum = min;
3325 ctrl->maximum = max;
3326 ctrl->step = step;
3327 ctrl->default_value = def;
3328 cur_to_new(ctrl);
3329 if (validate_new(ctrl, ctrl->p_new)) {
3330 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
3331 *ctrl->p_new.p_s64 = def;
3332 else
3333 *ctrl->p_new.p_s32 = def;
3334 }
3335
3336 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
3337 changed = *ctrl->p_new.p_s64 != *ctrl->p_cur.p_s64;
3338 else
3339 changed = *ctrl->p_new.p_s32 != *ctrl->p_cur.p_s32;
3340 if (changed)
3341 ret = set_ctrl(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
3342 else
3343 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
3344 return ret;
3345}
3346EXPORT_SYMBOL(__v4l2_ctrl_modify_range);
3347
3348static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev, unsigned elems)
3349{
3350 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
3351
3352 if (ctrl == NULL)
3353 return -EINVAL;
3354
3355 v4l2_ctrl_lock(ctrl);
3356 list_add_tail(&sev->node, &ctrl->ev_subs);
3357 if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
3358 (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL)) {
3359 struct v4l2_event ev;
3360 u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
3361
3362 if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
3363 changes |= V4L2_EVENT_CTRL_CH_VALUE;
3364 fill_event(&ev, ctrl, changes);
3365
3366
3367 sev->elems = elems;
3368 v4l2_event_queue_fh(sev->fh, &ev);
3369 }
3370 v4l2_ctrl_unlock(ctrl);
3371 return 0;
3372}
3373
3374static void v4l2_ctrl_del_event(struct v4l2_subscribed_event *sev)
3375{
3376 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
3377
3378 v4l2_ctrl_lock(ctrl);
3379 list_del(&sev->node);
3380 v4l2_ctrl_unlock(ctrl);
3381}
3382
3383void v4l2_ctrl_replace(struct v4l2_event *old, const struct v4l2_event *new)
3384{
3385 u32 old_changes = old->u.ctrl.changes;
3386
3387 old->u.ctrl = new->u.ctrl;
3388 old->u.ctrl.changes |= old_changes;
3389}
3390EXPORT_SYMBOL(v4l2_ctrl_replace);
3391
3392void v4l2_ctrl_merge(const struct v4l2_event *old, struct v4l2_event *new)
3393{
3394 new->u.ctrl.changes |= old->u.ctrl.changes;
3395}
3396EXPORT_SYMBOL(v4l2_ctrl_merge);
3397
3398const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops = {
3399 .add = v4l2_ctrl_add_event,
3400 .del = v4l2_ctrl_del_event,
3401 .replace = v4l2_ctrl_replace,
3402 .merge = v4l2_ctrl_merge,
3403};
3404EXPORT_SYMBOL(v4l2_ctrl_sub_ev_ops);
3405
3406int v4l2_ctrl_log_status(struct file *file, void *fh)
3407{
3408 struct video_device *vfd = video_devdata(file);
3409 struct v4l2_fh *vfh = file->private_data;
3410
3411 if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) && vfd->v4l2_dev)
3412 v4l2_ctrl_handler_log_status(vfh->ctrl_handler,
3413 vfd->v4l2_dev->name);
3414 return 0;
3415}
3416EXPORT_SYMBOL(v4l2_ctrl_log_status);
3417
3418int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
3419 const struct v4l2_event_subscription *sub)
3420{
3421 if (sub->type == V4L2_EVENT_CTRL)
3422 return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
3423 return -EINVAL;
3424}
3425EXPORT_SYMBOL(v4l2_ctrl_subscribe_event);
3426
3427int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
3428 struct v4l2_event_subscription *sub)
3429{
3430 if (!sd->ctrl_handler)
3431 return -EINVAL;
3432 return v4l2_ctrl_subscribe_event(fh, sub);
3433}
3434EXPORT_SYMBOL(v4l2_ctrl_subdev_subscribe_event);
3435
3436unsigned int v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait)
3437{
3438 struct v4l2_fh *fh = file->private_data;
3439
3440 if (v4l2_event_pending(fh))
3441 return POLLPRI;
3442 poll_wait(file, &fh->wait, wait);
3443 return 0;
3444}
3445EXPORT_SYMBOL(v4l2_ctrl_poll);
3446