blob: 127a2313e3d08d2f513a40f8a1537efb2f82f4d7 [file] [log] [blame]
Hans Verkuil09965172010-08-01 14:32:42 -03001/*
2 V4L2 controls framework implementation.
3
4 Copyright (C) 2010 Hans Verkuil <hverkuil@xs4all.nl>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#include <linux/ctype.h>
Randy Dunlap2b801632010-08-09 14:56:35 -030022#include <linux/slab.h>
Paul Gortmaker35a24632011-08-01 15:26:38 -040023#include <linux/export.h>
Hans Verkuil09965172010-08-01 14:32:42 -030024#include <media/v4l2-ioctl.h>
25#include <media/v4l2-device.h>
26#include <media/v4l2-ctrls.h>
Hans Verkuil6e239392011-06-07 11:13:44 -030027#include <media/v4l2-event.h>
Hans Verkuil09965172010-08-01 14:32:42 -030028#include <media/v4l2-dev.h>
29
Hans Verkuilddac5c12011-06-10 05:43:34 -030030#define has_op(master, op) \
31 (master->ops && master->ops->op)
Hans Verkuil54c911e2011-05-25 06:04:58 -030032#define call_op(master, op) \
Hans Verkuilddac5c12011-06-10 05:43:34 -030033 (has_op(master, op) ? master->ops->op(master) : 0)
Hans Verkuil54c911e2011-05-25 06:04:58 -030034
Hans Verkuil09965172010-08-01 14:32:42 -030035/* Internal temporary helper struct, one for each v4l2_ext_control */
Hans Verkuileb5b16e2011-06-14 10:04:06 -030036struct v4l2_ctrl_helper {
37 /* Pointer to the control reference of the master control */
38 struct v4l2_ctrl_ref *mref;
Hans Verkuil09965172010-08-01 14:32:42 -030039 /* The control corresponding to the v4l2_ext_control ID field. */
40 struct v4l2_ctrl *ctrl;
Hans Verkuileb5b16e2011-06-14 10:04:06 -030041 /* v4l2_ext_control index of the next control belonging to the
42 same cluster, or 0 if there isn't any. */
43 u32 next;
Hans Verkuil09965172010-08-01 14:32:42 -030044};
45
Hans Verkuil72d877c2011-06-10 05:44:36 -030046/* Small helper function to determine if the autocluster is set to manual
Hans Verkuil88365102011-08-26 07:35:14 -030047 mode. */
Hans Verkuil72d877c2011-06-10 05:44:36 -030048static 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/* Same as above, but this checks the against the new value instead of the
54 current value. */
55static bool is_new_manual(const struct v4l2_ctrl *master)
56{
57 return master->is_auto && master->val == master->manual_mode_value;
58}
59
Hans Verkuil09965172010-08-01 14:32:42 -030060/* Returns NULL or a character pointer array containing the menu for
61 the given control ID. The pointer array ends with a NULL pointer.
62 An empty string signifies a menu entry that is invalid. This allows
63 drivers to disable certain options if it is not supported. */
Hans Verkuil513521e2010-12-29 14:25:52 -030064const char * const *v4l2_ctrl_get_menu(u32 id)
Hans Verkuil09965172010-08-01 14:32:42 -030065{
Hans Verkuil513521e2010-12-29 14:25:52 -030066 static const char * const mpeg_audio_sampling_freq[] = {
Hans Verkuil09965172010-08-01 14:32:42 -030067 "44.1 kHz",
68 "48 kHz",
69 "32 kHz",
70 NULL
71 };
Hans Verkuil513521e2010-12-29 14:25:52 -030072 static const char * const mpeg_audio_encoding[] = {
Hans Verkuil09965172010-08-01 14:32:42 -030073 "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 };
Hans Verkuil513521e2010-12-29 14:25:52 -030080 static const char * const mpeg_audio_l1_bitrate[] = {
Hans Verkuil09965172010-08-01 14:32:42 -030081 "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 };
Hans Verkuil513521e2010-12-29 14:25:52 -030097 static const char * const mpeg_audio_l2_bitrate[] = {
Hans Verkuil09965172010-08-01 14:32:42 -030098 "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 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300114 static const char * const mpeg_audio_l3_bitrate[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300115 "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 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300131 static const char * const mpeg_audio_ac3_bitrate[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300132 "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 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300153 static const char * const mpeg_audio_mode[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300154 "Stereo",
155 "Joint Stereo",
156 "Dual",
157 "Mono",
158 NULL
159 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300160 static const char * const mpeg_audio_mode_extension[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300161 "Bound 4",
162 "Bound 8",
163 "Bound 12",
164 "Bound 16",
165 NULL
166 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300167 static const char * const mpeg_audio_emphasis[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300168 "No Emphasis",
169 "50/15 us",
170 "CCITT J17",
171 NULL
172 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300173 static const char * const mpeg_audio_crc[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300174 "No CRC",
175 "16-bit CRC",
176 NULL
177 };
Hans Verkuil24c19a22011-12-15 10:46:16 -0300178 static const char * const mpeg_audio_dec_playback[] = {
179 "Auto",
180 "Stereo",
181 "Left",
182 "Right",
183 "Mono",
184 "Swapped Stereo",
185 NULL
186 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300187 static const char * const mpeg_video_encoding[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300188 "MPEG-1",
189 "MPEG-2",
190 "MPEG-4 AVC",
191 NULL
192 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300193 static const char * const mpeg_video_aspect[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300194 "1x1",
195 "4x3",
196 "16x9",
197 "2.21x1",
198 NULL
199 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300200 static const char * const mpeg_video_bitrate_mode[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300201 "Variable Bitrate",
202 "Constant Bitrate",
203 NULL
204 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300205 static const char * const mpeg_stream_type[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300206 "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 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300214 static const char * const mpeg_stream_vbi_fmt[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300215 "No VBI",
Kamil Debski064f5092011-06-14 10:46:22 -0300216 "Private Packet, IVTV Format",
Hans Verkuil09965172010-08-01 14:32:42 -0300217 NULL
218 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300219 static const char * const camera_power_line_frequency[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300220 "Disabled",
221 "50 Hz",
222 "60 Hz",
Sylwester Nawrockid26a6632011-09-04 19:08:54 -0300223 "Auto",
Hans Verkuil09965172010-08-01 14:32:42 -0300224 NULL
225 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300226 static const char * const camera_exposure_auto[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300227 "Auto Mode",
228 "Manual Mode",
229 "Shutter Priority Mode",
230 "Aperture Priority Mode",
231 NULL
232 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300233 static const char * const colorfx[] = {
Hans Verkuil09965172010-08-01 14:32:42 -0300234 "None",
235 "Black & White",
236 "Sepia",
237 "Negative",
238 "Emboss",
239 "Sketch",
Kamil Debski064f5092011-06-14 10:46:22 -0300240 "Sky Blue",
241 "Grass Green",
242 "Skin Whiten",
Hans Verkuil09965172010-08-01 14:32:42 -0300243 "Vivid",
244 NULL
245 };
Hans Verkuil513521e2010-12-29 14:25:52 -0300246 static const char * const tune_preemphasis[] = {
Kamil Debski064f5092011-06-14 10:46:22 -0300247 "No Preemphasis",
Hans Verkuilf769c262012-03-02 04:20:19 -0300248 "50 Microseconds",
249 "75 Microseconds",
Hans Verkuil09965172010-08-01 14:32:42 -0300250 NULL,
251 };
Kamil Debski064f5092011-06-14 10:46:22 -0300252 static const char * const header_mode[] = {
253 "Separate Buffer",
254 "Joined With 1st Frame",
Deva Ramasubramanian05c648e2012-12-05 18:03:25 -0800255 "Joined With I-Frames",
Kamil Debski064f5092011-06-14 10:46:22 -0300256 NULL,
257 };
258 static const char * const multi_slice[] = {
259 "Single",
260 "Max Macroblocks",
261 "Max Bytes",
Ashray Kulkarni70e05eb2013-01-14 17:16:34 -0800262 "GOB",
Kamil Debski064f5092011-06-14 10:46:22 -0300263 NULL,
264 };
265 static const char * const entropy_mode[] = {
266 "CAVLC",
267 "CABAC",
268 NULL,
269 };
270 static const char * const mpeg_h264_level[] = {
271 "1",
272 "1b",
273 "1.1",
274 "1.2",
275 "1.3",
276 "2",
277 "2.1",
278 "2.2",
279 "3",
280 "3.1",
281 "3.2",
282 "4",
283 "4.1",
284 "4.2",
285 "5",
286 "5.1",
Rajeshwar Kurapaty20eca992013-10-15 18:17:06 +0530287 "5.2",
Kamil Debski064f5092011-06-14 10:46:22 -0300288 NULL,
289 };
290 static const char * const h264_loop_filter[] = {
291 "Enabled",
292 "Disabled",
293 "Disabled at Slice Boundary",
294 NULL,
295 };
296 static const char * const h264_profile[] = {
297 "Baseline",
298 "Constrained Baseline",
299 "Main",
300 "Extended",
301 "High",
302 "High 10",
303 "High 422",
304 "High 444 Predictive",
305 "High 10 Intra",
306 "High 422 Intra",
307 "High 444 Intra",
308 "CAVLC 444 Intra",
309 "Scalable Baseline",
310 "Scalable High",
311 "Scalable High Intra",
312 "Multiview High",
Jorge Solano Altamiranofab79de2013-11-20 17:11:41 -0800313 "Constrained High",
Kamil Debski064f5092011-06-14 10:46:22 -0300314 NULL,
315 };
316 static const char * const vui_sar_idc[] = {
317 "Unspecified",
318 "1:1",
319 "12:11",
320 "10:11",
321 "16:11",
322 "40:33",
323 "24:11",
324 "20:11",
325 "32:11",
326 "80:33",
327 "18:11",
328 "15:11",
329 "64:33",
330 "160:99",
331 "4:3",
332 "3:2",
333 "2:1",
334 "Extended SAR",
335 NULL,
336 };
337 static const char * const mpeg_mpeg4_level[] = {
338 "0",
339 "0b",
340 "1",
341 "2",
342 "3",
343 "3b",
344 "4",
345 "5",
346 NULL,
347 };
348 static const char * const mpeg4_profile[] = {
349 "Simple",
Hans Verkuilf769c262012-03-02 04:20:19 -0300350 "Advanced Simple",
Kamil Debski064f5092011-06-14 10:46:22 -0300351 "Core",
352 "Simple Scalable",
353 "Advanced Coding Efficency",
354 NULL,
355 };
356
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300357 static const char * const flash_led_mode[] = {
358 "Off",
359 "Flash",
360 "Torch",
361 NULL,
362 };
363 static const char * const flash_strobe_source[] = {
364 "Software",
365 "External",
366 NULL,
367 };
Hans Verkuil09965172010-08-01 14:32:42 -0300368
Sylwester Nawrockic7361ae2012-01-20 15:37:44 -0300369 static const char * const jpeg_chroma_subsampling[] = {
370 "4:4:4",
371 "4:2:2",
372 "4:2:0",
373 "4:1:1",
374 "4:1:0",
375 "Gray",
376 NULL,
377 };
Ashray Kulkarni6d2877c2012-04-03 18:50:18 -0700378 static const char *const mpeg_video_intra_refresh_mode[] = {
379 "No Intra Refresh",
380 "AIR MBS",
381 "AIR REF",
382 "CIR MBS",
383 NULL
384 };
Sylwester Nawrockic7361ae2012-01-20 15:37:44 -0300385
Hans Verkuil09965172010-08-01 14:32:42 -0300386 switch (id) {
387 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
388 return mpeg_audio_sampling_freq;
389 case V4L2_CID_MPEG_AUDIO_ENCODING:
390 return mpeg_audio_encoding;
391 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
392 return mpeg_audio_l1_bitrate;
393 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
394 return mpeg_audio_l2_bitrate;
395 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
396 return mpeg_audio_l3_bitrate;
397 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
398 return mpeg_audio_ac3_bitrate;
399 case V4L2_CID_MPEG_AUDIO_MODE:
400 return mpeg_audio_mode;
401 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
402 return mpeg_audio_mode_extension;
403 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
404 return mpeg_audio_emphasis;
405 case V4L2_CID_MPEG_AUDIO_CRC:
406 return mpeg_audio_crc;
Hans Verkuil24c19a22011-12-15 10:46:16 -0300407 case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
408 case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
409 return mpeg_audio_dec_playback;
Hans Verkuil09965172010-08-01 14:32:42 -0300410 case V4L2_CID_MPEG_VIDEO_ENCODING:
411 return mpeg_video_encoding;
412 case V4L2_CID_MPEG_VIDEO_ASPECT:
413 return mpeg_video_aspect;
414 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
415 return mpeg_video_bitrate_mode;
416 case V4L2_CID_MPEG_STREAM_TYPE:
417 return mpeg_stream_type;
418 case V4L2_CID_MPEG_STREAM_VBI_FMT:
419 return mpeg_stream_vbi_fmt;
420 case V4L2_CID_POWER_LINE_FREQUENCY:
421 return camera_power_line_frequency;
422 case V4L2_CID_EXPOSURE_AUTO:
423 return camera_exposure_auto;
424 case V4L2_CID_COLORFX:
425 return colorfx;
426 case V4L2_CID_TUNE_PREEMPHASIS:
427 return tune_preemphasis;
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300428 case V4L2_CID_FLASH_LED_MODE:
429 return flash_led_mode;
430 case V4L2_CID_FLASH_STROBE_SOURCE:
431 return flash_strobe_source;
Kamil Debski064f5092011-06-14 10:46:22 -0300432 case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
433 return header_mode;
434 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
435 return multi_slice;
436 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
437 return entropy_mode;
438 case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
439 return mpeg_h264_level;
440 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
441 return h264_loop_filter;
442 case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
443 return h264_profile;
444 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
445 return vui_sar_idc;
446 case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
447 return mpeg_mpeg4_level;
448 case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
449 return mpeg4_profile;
Sylwester Nawrockic7361ae2012-01-20 15:37:44 -0300450 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
451 return jpeg_chroma_subsampling;
Ashray Kulkarni6d2877c2012-04-03 18:50:18 -0700452 case V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE:
453 return mpeg_video_intra_refresh_mode;
Hans Verkuil09965172010-08-01 14:32:42 -0300454 default:
455 return NULL;
456 }
457}
458EXPORT_SYMBOL(v4l2_ctrl_get_menu);
459
460/* Return the control name. */
461const char *v4l2_ctrl_get_name(u32 id)
462{
463 switch (id) {
464 /* USER controls */
Hans Verkuil6c8d6112010-04-25 19:21:00 -0300465 /* Keep the order of the 'case's the same as in videodev2.h! */
Mauro Carvalho Chehab6dd5aff2010-08-06 09:57:02 -0300466 case V4L2_CID_USER_CLASS: return "User Controls";
467 case V4L2_CID_BRIGHTNESS: return "Brightness";
468 case V4L2_CID_CONTRAST: return "Contrast";
469 case V4L2_CID_SATURATION: return "Saturation";
470 case V4L2_CID_HUE: return "Hue";
471 case V4L2_CID_AUDIO_VOLUME: return "Volume";
472 case V4L2_CID_AUDIO_BALANCE: return "Balance";
473 case V4L2_CID_AUDIO_BASS: return "Bass";
474 case V4L2_CID_AUDIO_TREBLE: return "Treble";
475 case V4L2_CID_AUDIO_MUTE: return "Mute";
476 case V4L2_CID_AUDIO_LOUDNESS: return "Loudness";
Hans Verkuil09965172010-08-01 14:32:42 -0300477 case V4L2_CID_BLACK_LEVEL: return "Black Level";
478 case V4L2_CID_AUTO_WHITE_BALANCE: return "White Balance, Automatic";
479 case V4L2_CID_DO_WHITE_BALANCE: return "Do White Balance";
480 case V4L2_CID_RED_BALANCE: return "Red Balance";
481 case V4L2_CID_BLUE_BALANCE: return "Blue Balance";
482 case V4L2_CID_GAMMA: return "Gamma";
483 case V4L2_CID_EXPOSURE: return "Exposure";
484 case V4L2_CID_AUTOGAIN: return "Gain, Automatic";
485 case V4L2_CID_GAIN: return "Gain";
486 case V4L2_CID_HFLIP: return "Horizontal Flip";
487 case V4L2_CID_VFLIP: return "Vertical Flip";
488 case V4L2_CID_HCENTER: return "Horizontal Center";
489 case V4L2_CID_VCENTER: return "Vertical Center";
490 case V4L2_CID_POWER_LINE_FREQUENCY: return "Power Line Frequency";
491 case V4L2_CID_HUE_AUTO: return "Hue, Automatic";
492 case V4L2_CID_WHITE_BALANCE_TEMPERATURE: return "White Balance Temperature";
493 case V4L2_CID_SHARPNESS: return "Sharpness";
494 case V4L2_CID_BACKLIGHT_COMPENSATION: return "Backlight Compensation";
495 case V4L2_CID_CHROMA_AGC: return "Chroma AGC";
Hans Verkuil09965172010-08-01 14:32:42 -0300496 case V4L2_CID_COLOR_KILLER: return "Color Killer";
497 case V4L2_CID_COLORFX: return "Color Effects";
498 case V4L2_CID_AUTOBRIGHTNESS: return "Brightness, Automatic";
499 case V4L2_CID_BAND_STOP_FILTER: return "Band-Stop Filter";
500 case V4L2_CID_ROTATE: return "Rotate";
501 case V4L2_CID_BG_COLOR: return "Background Color";
Hans Verkuil6c8d6112010-04-25 19:21:00 -0300502 case V4L2_CID_CHROMA_GAIN: return "Chroma Gain";
Jean-François Moine008d35f2010-09-13 07:04:49 -0300503 case V4L2_CID_ILLUMINATORS_1: return "Illuminator 1";
504 case V4L2_CID_ILLUMINATORS_2: return "Illuminator 2";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300505 case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: return "Min Number of Capture Buffers";
506 case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT: return "Min Number of Output Buffers";
Sylwester Nawrockicc1d3272011-11-14 08:48:18 -0300507 case V4L2_CID_ALPHA_COMPONENT: return "Alpha Component";
Hans Verkuil09965172010-08-01 14:32:42 -0300508
509 /* MPEG controls */
Hans Verkuil6c8d6112010-04-25 19:21:00 -0300510 /* Keep the order of the 'case's the same as in videodev2.h! */
Mauro Carvalho Chehab6dd5aff2010-08-06 09:57:02 -0300511 case V4L2_CID_MPEG_CLASS: return "MPEG Encoder Controls";
512 case V4L2_CID_MPEG_STREAM_TYPE: return "Stream Type";
513 case V4L2_CID_MPEG_STREAM_PID_PMT: return "Stream PMT Program ID";
514 case V4L2_CID_MPEG_STREAM_PID_AUDIO: return "Stream Audio Program ID";
515 case V4L2_CID_MPEG_STREAM_PID_VIDEO: return "Stream Video Program ID";
516 case V4L2_CID_MPEG_STREAM_PID_PCR: return "Stream PCR Program ID";
Hans Verkuil6c8d6112010-04-25 19:21:00 -0300517 case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: return "Stream PES Audio ID";
518 case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: return "Stream PES Video ID";
519 case V4L2_CID_MPEG_STREAM_VBI_FMT: return "Stream VBI Format";
Hans Verkuil09965172010-08-01 14:32:42 -0300520 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: return "Audio Sampling Frequency";
Mauro Carvalho Chehab6dd5aff2010-08-06 09:57:02 -0300521 case V4L2_CID_MPEG_AUDIO_ENCODING: return "Audio Encoding";
522 case V4L2_CID_MPEG_AUDIO_L1_BITRATE: return "Audio Layer I Bitrate";
523 case V4L2_CID_MPEG_AUDIO_L2_BITRATE: return "Audio Layer II Bitrate";
524 case V4L2_CID_MPEG_AUDIO_L3_BITRATE: return "Audio Layer III Bitrate";
525 case V4L2_CID_MPEG_AUDIO_MODE: return "Audio Stereo Mode";
Hans Verkuil09965172010-08-01 14:32:42 -0300526 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: return "Audio Stereo Mode Extension";
Mauro Carvalho Chehab6dd5aff2010-08-06 09:57:02 -0300527 case V4L2_CID_MPEG_AUDIO_EMPHASIS: return "Audio Emphasis";
528 case V4L2_CID_MPEG_AUDIO_CRC: return "Audio CRC";
529 case V4L2_CID_MPEG_AUDIO_MUTE: return "Audio Mute";
530 case V4L2_CID_MPEG_AUDIO_AAC_BITRATE: return "Audio AAC Bitrate";
531 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE: return "Audio AC-3 Bitrate";
Hans Verkuil24c19a22011-12-15 10:46:16 -0300532 case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK: return "Audio Playback";
533 case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK: return "Audio Multilingual Playback";
Mauro Carvalho Chehab6dd5aff2010-08-06 09:57:02 -0300534 case V4L2_CID_MPEG_VIDEO_ENCODING: return "Video Encoding";
535 case V4L2_CID_MPEG_VIDEO_ASPECT: return "Video Aspect";
536 case V4L2_CID_MPEG_VIDEO_B_FRAMES: return "Video B Frames";
537 case V4L2_CID_MPEG_VIDEO_GOP_SIZE: return "Video GOP Size";
538 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: return "Video GOP Closure";
539 case V4L2_CID_MPEG_VIDEO_PULLDOWN: return "Video Pulldown";
540 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: return "Video Bitrate Mode";
541 case V4L2_CID_MPEG_VIDEO_BITRATE: return "Video Bitrate";
542 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: return "Video Peak Bitrate";
Hans Verkuil09965172010-08-01 14:32:42 -0300543 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: return "Video Temporal Decimation";
Mauro Carvalho Chehab6dd5aff2010-08-06 09:57:02 -0300544 case V4L2_CID_MPEG_VIDEO_MUTE: return "Video Mute";
Hans Verkuil09965172010-08-01 14:32:42 -0300545 case V4L2_CID_MPEG_VIDEO_MUTE_YUV: return "Video Mute YUV";
Kamil Debski064f5092011-06-14 10:46:22 -0300546 case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE: return "Decoder Slice Interface";
547 case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER: return "MPEG4 Loop Filter Enable";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300548 case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB: return "Number of Intra Refresh MBs";
Kamil Debski064f5092011-06-14 10:46:22 -0300549 case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE: return "Frame Level Rate Control Enable";
550 case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE: return "H264 MB Level Rate Control";
551 case V4L2_CID_MPEG_VIDEO_HEADER_MODE: return "Sequence Header Mode";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300552 case V4L2_CID_MPEG_VIDEO_MAX_REF_PIC: return "Max Number of Reference Pics";
Kamil Debski064f5092011-06-14 10:46:22 -0300553 case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP: return "H263 I-Frame QP Value";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300554 case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP: return "H263 P-Frame QP Value";
555 case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP: return "H263 B-Frame QP Value";
Kamil Debski064f5092011-06-14 10:46:22 -0300556 case V4L2_CID_MPEG_VIDEO_H263_MIN_QP: return "H263 Minimum QP Value";
557 case V4L2_CID_MPEG_VIDEO_H263_MAX_QP: return "H263 Maximum QP Value";
558 case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: return "H264 I-Frame QP Value";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300559 case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: return "H264 P-Frame QP Value";
560 case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: return "H264 B-Frame QP Value";
Kamil Debski064f5092011-06-14 10:46:22 -0300561 case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: return "H264 Maximum QP Value";
562 case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: return "H264 Minimum QP Value";
563 case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM: return "H264 8x8 Transform Enable";
564 case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE: return "H264 CPB Buffer Size";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300565 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: return "H264 Entropy Mode";
566 case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: return "H264 I-Frame Period";
Kamil Debski064f5092011-06-14 10:46:22 -0300567 case V4L2_CID_MPEG_VIDEO_H264_LEVEL: return "H264 Level";
568 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA: return "H264 Loop Filter Alpha Offset";
569 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA: return "H264 Loop Filter Beta Offset";
570 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE: return "H264 Loop Filter Mode";
571 case V4L2_CID_MPEG_VIDEO_H264_PROFILE: return "H264 Profile";
572 case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT: return "Vertical Size of SAR";
573 case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH: return "Horizontal Size of SAR";
574 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE: return "Aspect Ratio VUI Enable";
575 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC: return "VUI Aspect Ratio IDC";
576 case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300577 case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P-Frame QP Value";
578 case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B-Frame QP Value";
Kamil Debski064f5092011-06-14 10:46:22 -0300579 case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP: return "MPEG4 Minimum QP Value";
580 case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP: return "MPEG4 Maximum QP Value";
581 case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: return "MPEG4 Level";
582 case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: return "MPEG4 Profile";
583 case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL: return "Quarter Pixel Search Enable";
Ashray Kulkarnic7ef2552012-09-18 17:51:08 -0700584 case V4L2_CID_QCOM_VIDEO_SYNC_FRAME_SEQ_HDR:
585 return "CodecConfig with sync frame";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300586 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES: return "Maximum Bytes in a Slice";
587 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB: return "Number of MBs in a Slice";
588 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: return "Slice Partitioning Method";
Kamil Debski064f5092011-06-14 10:46:22 -0300589 case V4L2_CID_MPEG_VIDEO_VBV_SIZE: return "VBV Buffer Size";
Hans Verkuil24c19a22011-12-15 10:46:16 -0300590 case V4L2_CID_MPEG_VIDEO_DEC_PTS: return "Video Decoder PTS";
591 case V4L2_CID_MPEG_VIDEO_DEC_FRAME: return "Video Decoder Frame Count";
Ashray Kulkarni6d2877c2012-04-03 18:50:18 -0700592 case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION: return "Rotation";
593 case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL: return "Rate Control";
594 case V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL: return "CABAC Model";
595 case V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE:
596 return "Intra Refresh Mode";
597 case V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS: return "Intra Refresh AIR MBS";
598 case V4L2_CID_MPEG_VIDC_VIDEO_AIR_REF: return "Intra Refresh AIR REF";
599 case V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS: return "Intra Refresh CIR MBS";
Jorge Solano Altamiranofe8ec452013-07-26 00:23:47 -0700600 case V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL:
601 return "VP8 Profile Level";
Praneeth Paladugubf74bb12013-09-24 22:19:55 -0700602 case V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE:
603 return "Deinterlace for encoder";
Hans Verkuil09965172010-08-01 14:32:42 -0300604
605 /* CAMERA controls */
Hans Verkuil6c8d6112010-04-25 19:21:00 -0300606 /* Keep the order of the 'case's the same as in videodev2.h! */
Hans Verkuil09965172010-08-01 14:32:42 -0300607 case V4L2_CID_CAMERA_CLASS: return "Camera Controls";
608 case V4L2_CID_EXPOSURE_AUTO: return "Auto Exposure";
609 case V4L2_CID_EXPOSURE_ABSOLUTE: return "Exposure Time, Absolute";
610 case V4L2_CID_EXPOSURE_AUTO_PRIORITY: return "Exposure, Dynamic Framerate";
611 case V4L2_CID_PAN_RELATIVE: return "Pan, Relative";
612 case V4L2_CID_TILT_RELATIVE: return "Tilt, Relative";
613 case V4L2_CID_PAN_RESET: return "Pan, Reset";
614 case V4L2_CID_TILT_RESET: return "Tilt, Reset";
615 case V4L2_CID_PAN_ABSOLUTE: return "Pan, Absolute";
616 case V4L2_CID_TILT_ABSOLUTE: return "Tilt, Absolute";
617 case V4L2_CID_FOCUS_ABSOLUTE: return "Focus, Absolute";
618 case V4L2_CID_FOCUS_RELATIVE: return "Focus, Relative";
619 case V4L2_CID_FOCUS_AUTO: return "Focus, Automatic";
Hans Verkuil09965172010-08-01 14:32:42 -0300620 case V4L2_CID_ZOOM_ABSOLUTE: return "Zoom, Absolute";
621 case V4L2_CID_ZOOM_RELATIVE: return "Zoom, Relative";
622 case V4L2_CID_ZOOM_CONTINUOUS: return "Zoom, Continuous";
623 case V4L2_CID_PRIVACY: return "Privacy";
Hans Verkuil6c8d6112010-04-25 19:21:00 -0300624 case V4L2_CID_IRIS_ABSOLUTE: return "Iris, Absolute";
625 case V4L2_CID_IRIS_RELATIVE: return "Iris, Relative";
Hans Verkuil09965172010-08-01 14:32:42 -0300626
627 /* FM Radio Modulator control */
Hans Verkuil6c8d6112010-04-25 19:21:00 -0300628 /* Keep the order of the 'case's the same as in videodev2.h! */
Hans Verkuil09965172010-08-01 14:32:42 -0300629 case V4L2_CID_FM_TX_CLASS: return "FM Radio Modulator Controls";
630 case V4L2_CID_RDS_TX_DEVIATION: return "RDS Signal Deviation";
631 case V4L2_CID_RDS_TX_PI: return "RDS Program ID";
632 case V4L2_CID_RDS_TX_PTY: return "RDS Program Type";
633 case V4L2_CID_RDS_TX_PS_NAME: return "RDS PS Name";
634 case V4L2_CID_RDS_TX_RADIO_TEXT: return "RDS Radio Text";
635 case V4L2_CID_AUDIO_LIMITER_ENABLED: return "Audio Limiter Feature Enabled";
636 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME: return "Audio Limiter Release Time";
637 case V4L2_CID_AUDIO_LIMITER_DEVIATION: return "Audio Limiter Deviation";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300638 case V4L2_CID_AUDIO_COMPRESSION_ENABLED: return "Audio Compression Enabled";
Hans Verkuil09965172010-08-01 14:32:42 -0300639 case V4L2_CID_AUDIO_COMPRESSION_GAIN: return "Audio Compression Gain";
640 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD: return "Audio Compression Threshold";
641 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME: return "Audio Compression Attack Time";
642 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME: return "Audio Compression Release Time";
643 case V4L2_CID_PILOT_TONE_ENABLED: return "Pilot Tone Feature Enabled";
644 case V4L2_CID_PILOT_TONE_DEVIATION: return "Pilot Tone Deviation";
645 case V4L2_CID_PILOT_TONE_FREQUENCY: return "Pilot Tone Frequency";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300646 case V4L2_CID_TUNE_PREEMPHASIS: return "Pre-Emphasis";
Hans Verkuil09965172010-08-01 14:32:42 -0300647 case V4L2_CID_TUNE_POWER_LEVEL: return "Tune Power Level";
648 case V4L2_CID_TUNE_ANTENNA_CAPACITOR: return "Tune Antenna Capacitor";
649
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300650 /* Flash controls */
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300651 case V4L2_CID_FLASH_CLASS: return "Flash Controls";
652 case V4L2_CID_FLASH_LED_MODE: return "LED Mode";
653 case V4L2_CID_FLASH_STROBE_SOURCE: return "Strobe Source";
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300654 case V4L2_CID_FLASH_STROBE: return "Strobe";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300655 case V4L2_CID_FLASH_STROBE_STOP: return "Stop Strobe";
656 case V4L2_CID_FLASH_STROBE_STATUS: return "Strobe Status";
657 case V4L2_CID_FLASH_TIMEOUT: return "Strobe Timeout";
658 case V4L2_CID_FLASH_INTENSITY: return "Intensity, Flash Mode";
659 case V4L2_CID_FLASH_TORCH_INTENSITY: return "Intensity, Torch Mode";
660 case V4L2_CID_FLASH_INDICATOR_INTENSITY: return "Intensity, Indicator";
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300661 case V4L2_CID_FLASH_FAULT: return "Faults";
662 case V4L2_CID_FLASH_CHARGE: return "Charge";
Hans Verkuilf08aacf2012-01-16 12:27:15 -0300663 case V4L2_CID_FLASH_READY: return "Ready to Strobe";
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300664
Sylwester Nawrockic7361ae2012-01-20 15:37:44 -0300665 /* JPEG encoder controls */
666 /* Keep the order of the 'case's the same as in videodev2.h! */
667 case V4L2_CID_JPEG_CLASS: return "JPEG Compression Controls";
668 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING: return "Chroma Subsampling";
669 case V4L2_CID_JPEG_RESTART_INTERVAL: return "Restart Interval";
670 case V4L2_CID_JPEG_COMPRESSION_QUALITY: return "Compression Quality";
671 case V4L2_CID_JPEG_ACTIVE_MARKER: return "Active Markers";
672
Hans Verkuil09965172010-08-01 14:32:42 -0300673 default:
674 return NULL;
675 }
676}
677EXPORT_SYMBOL(v4l2_ctrl_get_name);
678
679void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
680 s32 *min, s32 *max, s32 *step, s32 *def, u32 *flags)
681{
682 *name = v4l2_ctrl_get_name(id);
683 *flags = 0;
684
685 switch (id) {
686 case V4L2_CID_AUDIO_MUTE:
687 case V4L2_CID_AUDIO_LOUDNESS:
688 case V4L2_CID_AUTO_WHITE_BALANCE:
689 case V4L2_CID_AUTOGAIN:
690 case V4L2_CID_HFLIP:
691 case V4L2_CID_VFLIP:
692 case V4L2_CID_HUE_AUTO:
693 case V4L2_CID_CHROMA_AGC:
694 case V4L2_CID_COLOR_KILLER:
695 case V4L2_CID_MPEG_AUDIO_MUTE:
696 case V4L2_CID_MPEG_VIDEO_MUTE:
697 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
698 case V4L2_CID_MPEG_VIDEO_PULLDOWN:
699 case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
700 case V4L2_CID_FOCUS_AUTO:
701 case V4L2_CID_PRIVACY:
702 case V4L2_CID_AUDIO_LIMITER_ENABLED:
703 case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
704 case V4L2_CID_PILOT_TONE_ENABLED:
Jean-François Moine008d35f2010-09-13 07:04:49 -0300705 case V4L2_CID_ILLUMINATORS_1:
706 case V4L2_CID_ILLUMINATORS_2:
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300707 case V4L2_CID_FLASH_STROBE_STATUS:
708 case V4L2_CID_FLASH_CHARGE:
709 case V4L2_CID_FLASH_READY:
Kamil Debski064f5092011-06-14 10:46:22 -0300710 case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
711 case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
712 case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
713 case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
714 case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
715 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:
716 case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:
Hans Verkuil09965172010-08-01 14:32:42 -0300717 *type = V4L2_CTRL_TYPE_BOOLEAN;
718 *min = 0;
719 *max = *step = 1;
720 break;
721 case V4L2_CID_PAN_RESET:
722 case V4L2_CID_TILT_RESET:
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300723 case V4L2_CID_FLASH_STROBE:
724 case V4L2_CID_FLASH_STROBE_STOP:
Hans Verkuil09965172010-08-01 14:32:42 -0300725 *type = V4L2_CTRL_TYPE_BUTTON;
726 *flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
727 *min = *max = *step = *def = 0;
728 break;
729 case V4L2_CID_POWER_LINE_FREQUENCY:
730 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
731 case V4L2_CID_MPEG_AUDIO_ENCODING:
732 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
733 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
734 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
735 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
736 case V4L2_CID_MPEG_AUDIO_MODE:
737 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
738 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
739 case V4L2_CID_MPEG_AUDIO_CRC:
Hans Verkuil24c19a22011-12-15 10:46:16 -0300740 case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
741 case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
Hans Verkuil09965172010-08-01 14:32:42 -0300742 case V4L2_CID_MPEG_VIDEO_ENCODING:
743 case V4L2_CID_MPEG_VIDEO_ASPECT:
744 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
745 case V4L2_CID_MPEG_STREAM_TYPE:
746 case V4L2_CID_MPEG_STREAM_VBI_FMT:
747 case V4L2_CID_EXPOSURE_AUTO:
748 case V4L2_CID_COLORFX:
749 case V4L2_CID_TUNE_PREEMPHASIS:
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300750 case V4L2_CID_FLASH_LED_MODE:
751 case V4L2_CID_FLASH_STROBE_SOURCE:
Kamil Debski064f5092011-06-14 10:46:22 -0300752 case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
753 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
754 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
755 case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
756 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
757 case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
758 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
759 case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
760 case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
Sylwester Nawrockic7361ae2012-01-20 15:37:44 -0300761 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
Ashray Kulkarni6d2877c2012-04-03 18:50:18 -0700762 case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION:
763 case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL:
764 case V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL:
Hans Verkuil09965172010-08-01 14:32:42 -0300765 *type = V4L2_CTRL_TYPE_MENU;
766 break;
767 case V4L2_CID_RDS_TX_PS_NAME:
768 case V4L2_CID_RDS_TX_RADIO_TEXT:
769 *type = V4L2_CTRL_TYPE_STRING;
770 break;
771 case V4L2_CID_USER_CLASS:
772 case V4L2_CID_CAMERA_CLASS:
773 case V4L2_CID_MPEG_CLASS:
774 case V4L2_CID_FM_TX_CLASS:
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300775 case V4L2_CID_FLASH_CLASS:
Sylwester Nawrockic7361ae2012-01-20 15:37:44 -0300776 case V4L2_CID_JPEG_CLASS:
Hans Verkuil09965172010-08-01 14:32:42 -0300777 *type = V4L2_CTRL_TYPE_CTRL_CLASS;
778 /* You can neither read not write these */
779 *flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY;
780 *min = *max = *step = *def = 0;
781 break;
782 case V4L2_CID_BG_COLOR:
Ashray Kulkarni6d2877c2012-04-03 18:50:18 -0700783 case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
784 case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
785 case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:
786 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:
787 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:
788 *type = V4L2_CTRL_TYPE_INTEGER;
Hans Verkuil09965172010-08-01 14:32:42 -0300789 *step = 1;
790 *min = 0;
791 /* Max is calculated as RGB888 that is 2^24 */
792 *max = 0xFFFFFF;
793 break;
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300794 case V4L2_CID_FLASH_FAULT:
Sylwester Nawrockic7361ae2012-01-20 15:37:44 -0300795 case V4L2_CID_JPEG_ACTIVE_MARKER:
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300796 *type = V4L2_CTRL_TYPE_BITMASK;
797 break;
Kamil Debski064f5092011-06-14 10:46:22 -0300798 case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
799 case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
800 *type = V4L2_CTRL_TYPE_INTEGER;
801 *flags |= V4L2_CTRL_FLAG_READ_ONLY;
802 break;
Hans Verkuil24c19a22011-12-15 10:46:16 -0300803 case V4L2_CID_MPEG_VIDEO_DEC_FRAME:
804 case V4L2_CID_MPEG_VIDEO_DEC_PTS:
805 *type = V4L2_CTRL_TYPE_INTEGER64;
806 *flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_VOLATILE;
807 break;
Ashray Kulkarnic7ef2552012-09-18 17:51:08 -0700808 case V4L2_CID_QCOM_VIDEO_SYNC_FRAME_SEQ_HDR:
809 *type = V4L2_CTRL_TYPE_BOOLEAN;
810 *min = 0;
811 *max = *step = 1;
812 break;
Praneeth Paladugubf74bb12013-09-24 22:19:55 -0700813 case V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE:
814 *type = V4L2_CTRL_TYPE_BOOLEAN;
815 *min = 0;
816 *max = *step = 1;
817 break;
Praneeth Paladugu725fc792013-08-27 18:44:45 -0700818 case V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE:
819 *type = V4L2_CTRL_TYPE_BOOLEAN;
820 *min = 0;
821 *max = *step = 1;
822 break;
Hans Verkuil09965172010-08-01 14:32:42 -0300823 default:
824 *type = V4L2_CTRL_TYPE_INTEGER;
825 break;
826 }
827 switch (id) {
828 case V4L2_CID_MPEG_AUDIO_ENCODING:
829 case V4L2_CID_MPEG_AUDIO_MODE:
830 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
831 case V4L2_CID_MPEG_VIDEO_B_FRAMES:
832 case V4L2_CID_MPEG_STREAM_TYPE:
833 *flags |= V4L2_CTRL_FLAG_UPDATE;
834 break;
835 case V4L2_CID_AUDIO_VOLUME:
836 case V4L2_CID_AUDIO_BALANCE:
837 case V4L2_CID_AUDIO_BASS:
838 case V4L2_CID_AUDIO_TREBLE:
839 case V4L2_CID_BRIGHTNESS:
840 case V4L2_CID_CONTRAST:
841 case V4L2_CID_SATURATION:
842 case V4L2_CID_HUE:
843 case V4L2_CID_RED_BALANCE:
844 case V4L2_CID_BLUE_BALANCE:
845 case V4L2_CID_GAMMA:
846 case V4L2_CID_SHARPNESS:
847 case V4L2_CID_CHROMA_GAIN:
848 case V4L2_CID_RDS_TX_DEVIATION:
849 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
850 case V4L2_CID_AUDIO_LIMITER_DEVIATION:
851 case V4L2_CID_AUDIO_COMPRESSION_GAIN:
852 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
853 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
854 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
855 case V4L2_CID_PILOT_TONE_DEVIATION:
856 case V4L2_CID_PILOT_TONE_FREQUENCY:
857 case V4L2_CID_TUNE_POWER_LEVEL:
858 case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
859 *flags |= V4L2_CTRL_FLAG_SLIDER;
860 break;
861 case V4L2_CID_PAN_RELATIVE:
862 case V4L2_CID_TILT_RELATIVE:
863 case V4L2_CID_FOCUS_RELATIVE:
864 case V4L2_CID_IRIS_RELATIVE:
865 case V4L2_CID_ZOOM_RELATIVE:
866 *flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
867 break;
Sakari Ailus0b159ac2011-03-21 12:52:51 -0300868 case V4L2_CID_FLASH_STROBE_STATUS:
869 case V4L2_CID_FLASH_READY:
870 *flags |= V4L2_CTRL_FLAG_READ_ONLY;
871 break;
Hans Verkuil09965172010-08-01 14:32:42 -0300872 }
873}
874EXPORT_SYMBOL(v4l2_ctrl_fill);
875
876/* Helper function to determine whether the control type is compatible with
877 VIDIOC_G/S_CTRL. */
878static bool type_is_int(const struct v4l2_ctrl *ctrl)
879{
880 switch (ctrl->type) {
881 case V4L2_CTRL_TYPE_INTEGER64:
882 case V4L2_CTRL_TYPE_STRING:
883 /* Nope, these need v4l2_ext_control */
884 return false;
885 default:
886 return true;
887 }
888}
889
Hans Verkuil6e239392011-06-07 11:13:44 -0300890static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes)
891{
892 memset(ev->reserved, 0, sizeof(ev->reserved));
893 ev->type = V4L2_EVENT_CTRL;
894 ev->id = ctrl->id;
895 ev->u.ctrl.changes = changes;
896 ev->u.ctrl.type = ctrl->type;
897 ev->u.ctrl.flags = ctrl->flags;
898 if (ctrl->type == V4L2_CTRL_TYPE_STRING)
899 ev->u.ctrl.value64 = 0;
900 else
901 ev->u.ctrl.value64 = ctrl->cur.val64;
902 ev->u.ctrl.minimum = ctrl->minimum;
903 ev->u.ctrl.maximum = ctrl->maximum;
904 if (ctrl->type == V4L2_CTRL_TYPE_MENU)
905 ev->u.ctrl.step = 1;
906 else
907 ev->u.ctrl.step = ctrl->step;
908 ev->u.ctrl.default_value = ctrl->default_value;
909}
910
911static void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
912{
913 struct v4l2_event ev;
Hans Verkuil77068d32011-06-13 18:55:58 -0300914 struct v4l2_subscribed_event *sev;
Hans Verkuil6e239392011-06-07 11:13:44 -0300915
Hans Verkuil77068d32011-06-13 18:55:58 -0300916 if (list_empty(&ctrl->ev_subs))
Hans Verkuil3f66f0e2011-06-20 11:56:24 -0300917 return;
Hans Verkuil6e239392011-06-07 11:13:44 -0300918 fill_event(&ev, ctrl, changes);
919
Hans Verkuil77068d32011-06-13 18:55:58 -0300920 list_for_each_entry(sev, &ctrl->ev_subs, node)
Hans de Goedee3e72f32011-10-26 05:52:47 -0300921 if (sev->fh != fh ||
922 (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
Hans Verkuil77068d32011-06-13 18:55:58 -0300923 v4l2_event_queue_fh(sev->fh, &ev);
Hans Verkuil6e239392011-06-07 11:13:44 -0300924}
925
Hans Verkuil09965172010-08-01 14:32:42 -0300926/* Helper function: copy the current control value back to the caller */
927static int cur_to_user(struct v4l2_ext_control *c,
928 struct v4l2_ctrl *ctrl)
929{
930 u32 len;
931
932 switch (ctrl->type) {
933 case V4L2_CTRL_TYPE_STRING:
934 len = strlen(ctrl->cur.string);
935 if (c->size < len + 1) {
936 c->size = len + 1;
937 return -ENOSPC;
938 }
939 return copy_to_user(c->string, ctrl->cur.string,
940 len + 1) ? -EFAULT : 0;
941 case V4L2_CTRL_TYPE_INTEGER64:
942 c->value64 = ctrl->cur.val64;
943 break;
944 default:
945 c->value = ctrl->cur.val;
946 break;
947 }
948 return 0;
949}
950
951/* Helper function: copy the caller-provider value as the new control value */
952static int user_to_new(struct v4l2_ext_control *c,
953 struct v4l2_ctrl *ctrl)
954{
955 int ret;
956 u32 size;
957
Hans Verkuil2a863792011-01-11 14:45:03 -0300958 ctrl->is_new = 1;
Hans Verkuil09965172010-08-01 14:32:42 -0300959 switch (ctrl->type) {
960 case V4L2_CTRL_TYPE_INTEGER64:
961 ctrl->val64 = c->value64;
962 break;
963 case V4L2_CTRL_TYPE_STRING:
964 size = c->size;
965 if (size == 0)
966 return -ERANGE;
967 if (size > ctrl->maximum + 1)
968 size = ctrl->maximum + 1;
969 ret = copy_from_user(ctrl->string, c->string, size);
970 if (!ret) {
971 char last = ctrl->string[size - 1];
972
973 ctrl->string[size - 1] = 0;
974 /* If the string was longer than ctrl->maximum,
975 then return an error. */
976 if (strlen(ctrl->string) == ctrl->maximum && last)
977 return -ERANGE;
978 }
979 return ret ? -EFAULT : 0;
980 default:
981 ctrl->val = c->value;
982 break;
983 }
984 return 0;
985}
986
987/* Helper function: copy the new control value back to the caller */
988static int new_to_user(struct v4l2_ext_control *c,
989 struct v4l2_ctrl *ctrl)
990{
991 u32 len;
992
993 switch (ctrl->type) {
994 case V4L2_CTRL_TYPE_STRING:
995 len = strlen(ctrl->string);
996 if (c->size < len + 1) {
997 c->size = ctrl->maximum + 1;
998 return -ENOSPC;
999 }
1000 return copy_to_user(c->string, ctrl->string,
1001 len + 1) ? -EFAULT : 0;
1002 case V4L2_CTRL_TYPE_INTEGER64:
1003 c->value64 = ctrl->val64;
1004 break;
1005 default:
1006 c->value = ctrl->val;
1007 break;
1008 }
1009 return 0;
1010}
1011
1012/* Copy the new value to the current value. */
Hans Verkuilab892ba2011-06-07 06:47:18 -03001013static void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
1014 bool update_inactive)
Hans Verkuil09965172010-08-01 14:32:42 -03001015{
Hans Verkuil6e239392011-06-07 11:13:44 -03001016 bool changed = false;
1017
Hans Verkuil09965172010-08-01 14:32:42 -03001018 if (ctrl == NULL)
1019 return;
1020 switch (ctrl->type) {
Hans Verkuil6e239392011-06-07 11:13:44 -03001021 case V4L2_CTRL_TYPE_BUTTON:
1022 changed = true;
1023 break;
Hans Verkuil09965172010-08-01 14:32:42 -03001024 case V4L2_CTRL_TYPE_STRING:
1025 /* strings are always 0-terminated */
Hans Verkuil6e239392011-06-07 11:13:44 -03001026 changed = strcmp(ctrl->string, ctrl->cur.string);
Hans Verkuil09965172010-08-01 14:32:42 -03001027 strcpy(ctrl->cur.string, ctrl->string);
1028 break;
1029 case V4L2_CTRL_TYPE_INTEGER64:
Hans Verkuil6e239392011-06-07 11:13:44 -03001030 changed = ctrl->val64 != ctrl->cur.val64;
Hans Verkuil09965172010-08-01 14:32:42 -03001031 ctrl->cur.val64 = ctrl->val64;
1032 break;
1033 default:
Hans Verkuil6e239392011-06-07 11:13:44 -03001034 changed = ctrl->val != ctrl->cur.val;
Hans Verkuil09965172010-08-01 14:32:42 -03001035 ctrl->cur.val = ctrl->val;
1036 break;
1037 }
Hans Verkuil72d877c2011-06-10 05:44:36 -03001038 if (update_inactive) {
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001039 /* Note: update_inactive can only be true for auto clusters. */
1040 ctrl->flags &=
1041 ~(V4L2_CTRL_FLAG_INACTIVE | V4L2_CTRL_FLAG_VOLATILE);
1042 if (!is_cur_manual(ctrl->cluster[0])) {
Hans Verkuil72d877c2011-06-10 05:44:36 -03001043 ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001044 if (ctrl->cluster[0]->has_volatiles)
1045 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
1046 }
Hans de Goede1249a3a2011-10-31 11:16:44 -03001047 fh = NULL;
Hans Verkuil72d877c2011-06-10 05:44:36 -03001048 }
Hans Verkuil639884a2011-07-05 07:09:26 -03001049 if (changed || update_inactive) {
1050 /* If a control was changed that was not one of the controls
1051 modified by the application, then send the event to all. */
1052 if (!ctrl->is_new)
1053 fh = NULL;
Hans Verkuil6e239392011-06-07 11:13:44 -03001054 send_event(fh, ctrl,
1055 (changed ? V4L2_EVENT_CTRL_CH_VALUE : 0) |
1056 (update_inactive ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
Hans Verkuil639884a2011-07-05 07:09:26 -03001057 }
Hans Verkuil09965172010-08-01 14:32:42 -03001058}
1059
1060/* Copy the current value to the new value */
1061static void cur_to_new(struct v4l2_ctrl *ctrl)
1062{
1063 if (ctrl == NULL)
1064 return;
1065 switch (ctrl->type) {
1066 case V4L2_CTRL_TYPE_STRING:
1067 /* strings are always 0-terminated */
1068 strcpy(ctrl->string, ctrl->cur.string);
1069 break;
1070 case V4L2_CTRL_TYPE_INTEGER64:
1071 ctrl->val64 = ctrl->cur.val64;
1072 break;
1073 default:
1074 ctrl->val = ctrl->cur.val;
1075 break;
1076 }
1077}
1078
1079/* Return non-zero if one or more of the controls in the cluster has a new
1080 value that differs from the current value. */
1081static int cluster_changed(struct v4l2_ctrl *master)
1082{
1083 int diff = 0;
1084 int i;
1085
1086 for (i = 0; !diff && i < master->ncontrols; i++) {
1087 struct v4l2_ctrl *ctrl = master->cluster[i];
1088
1089 if (ctrl == NULL)
1090 continue;
1091 switch (ctrl->type) {
1092 case V4L2_CTRL_TYPE_BUTTON:
1093 /* Button controls are always 'different' */
1094 return 1;
1095 case V4L2_CTRL_TYPE_STRING:
1096 /* strings are always 0-terminated */
1097 diff = strcmp(ctrl->string, ctrl->cur.string);
1098 break;
1099 case V4L2_CTRL_TYPE_INTEGER64:
1100 diff = ctrl->val64 != ctrl->cur.val64;
1101 break;
1102 default:
1103 diff = ctrl->val != ctrl->cur.val;
1104 break;
1105 }
1106 }
1107 return diff;
1108}
1109
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001110/* Validate integer-type control */
1111static int validate_new_int(const struct v4l2_ctrl *ctrl, s32 *pval)
Hans Verkuil09965172010-08-01 14:32:42 -03001112{
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001113 s32 val = *pval;
Hans Verkuil09965172010-08-01 14:32:42 -03001114 u32 offset;
Hans Verkuil09965172010-08-01 14:32:42 -03001115
1116 switch (ctrl->type) {
1117 case V4L2_CTRL_TYPE_INTEGER:
1118 /* Round towards the closest legal value */
1119 val += ctrl->step / 2;
1120 if (val < ctrl->minimum)
1121 val = ctrl->minimum;
1122 if (val > ctrl->maximum)
1123 val = ctrl->maximum;
1124 offset = val - ctrl->minimum;
1125 offset = ctrl->step * (offset / ctrl->step);
1126 val = ctrl->minimum + offset;
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001127 *pval = val;
Hans Verkuil09965172010-08-01 14:32:42 -03001128 return 0;
1129
1130 case V4L2_CTRL_TYPE_BOOLEAN:
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001131 *pval = !!val;
Hans Verkuil09965172010-08-01 14:32:42 -03001132 return 0;
1133
1134 case V4L2_CTRL_TYPE_MENU:
1135 if (val < ctrl->minimum || val > ctrl->maximum)
1136 return -ERANGE;
1137 if (ctrl->qmenu[val][0] == '\0' ||
1138 (ctrl->menu_skip_mask & (1 << val)))
1139 return -EINVAL;
1140 return 0;
1141
Hans Verkuilfa4d7092011-05-23 04:07:05 -03001142 case V4L2_CTRL_TYPE_BITMASK:
1143 *pval &= ctrl->maximum;
1144 return 0;
1145
Hans Verkuil09965172010-08-01 14:32:42 -03001146 case V4L2_CTRL_TYPE_BUTTON:
1147 case V4L2_CTRL_TYPE_CTRL_CLASS:
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001148 *pval = 0;
Hans Verkuil09965172010-08-01 14:32:42 -03001149 return 0;
1150
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001151 default:
1152 return -EINVAL;
1153 }
1154}
1155
1156/* Validate a new control */
1157static int validate_new(const struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
1158{
1159 char *s = c->string;
1160 size_t len;
1161
1162 switch (ctrl->type) {
1163 case V4L2_CTRL_TYPE_INTEGER:
1164 case V4L2_CTRL_TYPE_BOOLEAN:
1165 case V4L2_CTRL_TYPE_MENU:
Hans Verkuilfa4d7092011-05-23 04:07:05 -03001166 case V4L2_CTRL_TYPE_BITMASK:
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001167 case V4L2_CTRL_TYPE_BUTTON:
1168 case V4L2_CTRL_TYPE_CTRL_CLASS:
1169 return validate_new_int(ctrl, &c->value);
1170
Hans Verkuil09965172010-08-01 14:32:42 -03001171 case V4L2_CTRL_TYPE_INTEGER64:
1172 return 0;
1173
1174 case V4L2_CTRL_TYPE_STRING:
1175 len = strlen(s);
1176 if (len < ctrl->minimum)
1177 return -ERANGE;
1178 if ((len - ctrl->minimum) % ctrl->step)
1179 return -ERANGE;
1180 return 0;
1181
1182 default:
1183 return -EINVAL;
1184 }
1185}
1186
1187static inline u32 node2id(struct list_head *node)
1188{
1189 return list_entry(node, struct v4l2_ctrl_ref, node)->ctrl->id;
1190}
1191
1192/* Set the handler's error code if it wasn't set earlier already */
1193static inline int handler_set_err(struct v4l2_ctrl_handler *hdl, int err)
1194{
1195 if (hdl->error == 0)
1196 hdl->error = err;
1197 return err;
1198}
1199
1200/* Initialize the handler */
1201int v4l2_ctrl_handler_init(struct v4l2_ctrl_handler *hdl,
1202 unsigned nr_of_controls_hint)
1203{
1204 mutex_init(&hdl->lock);
1205 INIT_LIST_HEAD(&hdl->ctrls);
1206 INIT_LIST_HEAD(&hdl->ctrl_refs);
1207 hdl->nr_of_buckets = 1 + nr_of_controls_hint / 8;
Thomas Meyer9884d7b2011-11-29 17:08:00 -03001208 hdl->buckets = kcalloc(hdl->nr_of_buckets, sizeof(hdl->buckets[0]),
1209 GFP_KERNEL);
Hans Verkuil09965172010-08-01 14:32:42 -03001210 hdl->error = hdl->buckets ? 0 : -ENOMEM;
1211 return hdl->error;
1212}
1213EXPORT_SYMBOL(v4l2_ctrl_handler_init);
1214
1215/* Free all controls and control refs */
1216void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
1217{
1218 struct v4l2_ctrl_ref *ref, *next_ref;
1219 struct v4l2_ctrl *ctrl, *next_ctrl;
Hans Verkuil77068d32011-06-13 18:55:58 -03001220 struct v4l2_subscribed_event *sev, *next_sev;
Hans Verkuil09965172010-08-01 14:32:42 -03001221
1222 if (hdl == NULL || hdl->buckets == NULL)
1223 return;
1224
1225 mutex_lock(&hdl->lock);
1226 /* Free all nodes */
1227 list_for_each_entry_safe(ref, next_ref, &hdl->ctrl_refs, node) {
1228 list_del(&ref->node);
1229 kfree(ref);
1230 }
1231 /* Free all controls owned by the handler */
1232 list_for_each_entry_safe(ctrl, next_ctrl, &hdl->ctrls, node) {
1233 list_del(&ctrl->node);
Hans Verkuil77068d32011-06-13 18:55:58 -03001234 list_for_each_entry_safe(sev, next_sev, &ctrl->ev_subs, node)
1235 list_del(&sev->node);
Hans Verkuil09965172010-08-01 14:32:42 -03001236 kfree(ctrl);
1237 }
1238 kfree(hdl->buckets);
1239 hdl->buckets = NULL;
1240 hdl->cached = NULL;
1241 hdl->error = 0;
1242 mutex_unlock(&hdl->lock);
1243}
1244EXPORT_SYMBOL(v4l2_ctrl_handler_free);
1245
1246/* For backwards compatibility: V4L2_CID_PRIVATE_BASE should no longer
1247 be used except in G_CTRL, S_CTRL, QUERYCTRL and QUERYMENU when dealing
1248 with applications that do not use the NEXT_CTRL flag.
1249
1250 We just find the n-th private user control. It's O(N), but that should not
1251 be an issue in this particular case. */
1252static struct v4l2_ctrl_ref *find_private_ref(
1253 struct v4l2_ctrl_handler *hdl, u32 id)
1254{
1255 struct v4l2_ctrl_ref *ref;
1256
1257 id -= V4L2_CID_PRIVATE_BASE;
1258 list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1259 /* Search for private user controls that are compatible with
1260 VIDIOC_G/S_CTRL. */
1261 if (V4L2_CTRL_ID2CLASS(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
1262 V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
1263 if (!type_is_int(ref->ctrl))
1264 continue;
1265 if (id == 0)
1266 return ref;
1267 id--;
1268 }
1269 }
1270 return NULL;
1271}
1272
1273/* Find a control with the given ID. */
1274static struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
1275{
1276 struct v4l2_ctrl_ref *ref;
1277 int bucket;
1278
1279 id &= V4L2_CTRL_ID_MASK;
1280
1281 /* Old-style private controls need special handling */
1282 if (id >= V4L2_CID_PRIVATE_BASE)
1283 return find_private_ref(hdl, id);
1284 bucket = id % hdl->nr_of_buckets;
1285
1286 /* Simple optimization: cache the last control found */
1287 if (hdl->cached && hdl->cached->ctrl->id == id)
1288 return hdl->cached;
1289
1290 /* Not in cache, search the hash */
1291 ref = hdl->buckets ? hdl->buckets[bucket] : NULL;
1292 while (ref && ref->ctrl->id != id)
1293 ref = ref->next;
1294
1295 if (ref)
1296 hdl->cached = ref; /* cache it! */
1297 return ref;
1298}
1299
1300/* Find a control with the given ID. Take the handler's lock first. */
1301static struct v4l2_ctrl_ref *find_ref_lock(
1302 struct v4l2_ctrl_handler *hdl, u32 id)
1303{
1304 struct v4l2_ctrl_ref *ref = NULL;
1305
1306 if (hdl) {
1307 mutex_lock(&hdl->lock);
1308 ref = find_ref(hdl, id);
1309 mutex_unlock(&hdl->lock);
1310 }
1311 return ref;
1312}
1313
1314/* Find a control with the given ID. */
1315struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
1316{
1317 struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
1318
1319 return ref ? ref->ctrl : NULL;
1320}
1321EXPORT_SYMBOL(v4l2_ctrl_find);
1322
1323/* Allocate a new v4l2_ctrl_ref and hook it into the handler. */
1324static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
1325 struct v4l2_ctrl *ctrl)
1326{
1327 struct v4l2_ctrl_ref *ref;
1328 struct v4l2_ctrl_ref *new_ref;
1329 u32 id = ctrl->id;
1330 u32 class_ctrl = V4L2_CTRL_ID2CLASS(id) | 1;
1331 int bucket = id % hdl->nr_of_buckets; /* which bucket to use */
1332
1333 /* Automatically add the control class if it is not yet present. */
1334 if (id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)
1335 if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))
1336 return hdl->error;
1337
1338 if (hdl->error)
1339 return hdl->error;
1340
1341 new_ref = kzalloc(sizeof(*new_ref), GFP_KERNEL);
1342 if (!new_ref)
1343 return handler_set_err(hdl, -ENOMEM);
1344 new_ref->ctrl = ctrl;
1345 if (ctrl->handler == hdl) {
1346 /* By default each control starts in a cluster of its own.
1347 new_ref->ctrl is basically a cluster array with one
1348 element, so that's perfect to use as the cluster pointer.
1349 But only do this for the handler that owns the control. */
1350 ctrl->cluster = &new_ref->ctrl;
1351 ctrl->ncontrols = 1;
1352 }
1353
1354 INIT_LIST_HEAD(&new_ref->node);
1355
1356 mutex_lock(&hdl->lock);
1357
1358 /* Add immediately at the end of the list if the list is empty, or if
1359 the last element in the list has a lower ID.
1360 This ensures that when elements are added in ascending order the
1361 insertion is an O(1) operation. */
1362 if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
1363 list_add_tail(&new_ref->node, &hdl->ctrl_refs);
1364 goto insert_in_hash;
1365 }
1366
1367 /* Find insert position in sorted list */
1368 list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1369 if (ref->ctrl->id < id)
1370 continue;
1371 /* Don't add duplicates */
1372 if (ref->ctrl->id == id) {
1373 kfree(new_ref);
1374 goto unlock;
1375 }
1376 list_add(&new_ref->node, ref->node.prev);
1377 break;
1378 }
1379
1380insert_in_hash:
1381 /* Insert the control node in the hash */
1382 new_ref->next = hdl->buckets[bucket];
1383 hdl->buckets[bucket] = new_ref;
1384
1385unlock:
1386 mutex_unlock(&hdl->lock);
1387 return 0;
1388}
1389
1390/* Add a new control */
1391static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
1392 const struct v4l2_ctrl_ops *ops,
1393 u32 id, const char *name, enum v4l2_ctrl_type type,
1394 s32 min, s32 max, u32 step, s32 def,
Hans Verkuil513521e2010-12-29 14:25:52 -03001395 u32 flags, const char * const *qmenu, void *priv)
Hans Verkuil09965172010-08-01 14:32:42 -03001396{
1397 struct v4l2_ctrl *ctrl;
1398 unsigned sz_extra = 0;
1399
1400 if (hdl->error)
1401 return NULL;
1402
1403 /* Sanity checks */
1404 if (id == 0 || name == NULL || id >= V4L2_CID_PRIVATE_BASE ||
Hans Verkuil09965172010-08-01 14:32:42 -03001405 (type == V4L2_CTRL_TYPE_INTEGER && step == 0) ||
Hans Verkuilfa4d7092011-05-23 04:07:05 -03001406 (type == V4L2_CTRL_TYPE_BITMASK && max == 0) ||
Hans Verkuil09965172010-08-01 14:32:42 -03001407 (type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
1408 (type == V4L2_CTRL_TYPE_STRING && max == 0)) {
1409 handler_set_err(hdl, -ERANGE);
1410 return NULL;
1411 }
Hans Verkuilfa4d7092011-05-23 04:07:05 -03001412 if (type != V4L2_CTRL_TYPE_BITMASK && max < min) {
1413 handler_set_err(hdl, -ERANGE);
1414 return NULL;
1415 }
Hans Verkuil02ac0482010-12-29 14:27:05 -03001416 if ((type == V4L2_CTRL_TYPE_INTEGER ||
1417 type == V4L2_CTRL_TYPE_MENU ||
1418 type == V4L2_CTRL_TYPE_BOOLEAN) &&
1419 (def < min || def > max)) {
1420 handler_set_err(hdl, -ERANGE);
1421 return NULL;
1422 }
Hans Verkuilfa4d7092011-05-23 04:07:05 -03001423 if (type == V4L2_CTRL_TYPE_BITMASK && ((def & ~max) || min || step)) {
1424 handler_set_err(hdl, -ERANGE);
1425 return NULL;
1426 }
Hans Verkuil09965172010-08-01 14:32:42 -03001427
1428 if (type == V4L2_CTRL_TYPE_BUTTON)
1429 flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
1430 else if (type == V4L2_CTRL_TYPE_CTRL_CLASS)
1431 flags |= V4L2_CTRL_FLAG_READ_ONLY;
1432 else if (type == V4L2_CTRL_TYPE_STRING)
1433 sz_extra += 2 * (max + 1);
1434
1435 ctrl = kzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
1436 if (ctrl == NULL) {
1437 handler_set_err(hdl, -ENOMEM);
1438 return NULL;
1439 }
1440
1441 INIT_LIST_HEAD(&ctrl->node);
Hans Verkuil77068d32011-06-13 18:55:58 -03001442 INIT_LIST_HEAD(&ctrl->ev_subs);
Hans Verkuil09965172010-08-01 14:32:42 -03001443 ctrl->handler = hdl;
1444 ctrl->ops = ops;
1445 ctrl->id = id;
1446 ctrl->name = name;
1447 ctrl->type = type;
1448 ctrl->flags = flags;
1449 ctrl->minimum = min;
1450 ctrl->maximum = max;
1451 ctrl->step = step;
1452 ctrl->qmenu = qmenu;
1453 ctrl->priv = priv;
1454 ctrl->cur.val = ctrl->val = ctrl->default_value = def;
1455
1456 if (ctrl->type == V4L2_CTRL_TYPE_STRING) {
1457 ctrl->cur.string = (char *)&ctrl[1] + sz_extra - (max + 1);
1458 ctrl->string = (char *)&ctrl[1] + sz_extra - 2 * (max + 1);
1459 if (ctrl->minimum)
1460 memset(ctrl->cur.string, ' ', ctrl->minimum);
1461 }
1462 if (handler_new_ref(hdl, ctrl)) {
1463 kfree(ctrl);
1464 return NULL;
1465 }
1466 mutex_lock(&hdl->lock);
1467 list_add_tail(&ctrl->node, &hdl->ctrls);
1468 mutex_unlock(&hdl->lock);
1469 return ctrl;
1470}
1471
1472struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
1473 const struct v4l2_ctrl_config *cfg, void *priv)
1474{
1475 bool is_menu;
1476 struct v4l2_ctrl *ctrl;
1477 const char *name = cfg->name;
Hans Verkuil513521e2010-12-29 14:25:52 -03001478 const char * const *qmenu = cfg->qmenu;
Hans Verkuil09965172010-08-01 14:32:42 -03001479 enum v4l2_ctrl_type type = cfg->type;
1480 u32 flags = cfg->flags;
1481 s32 min = cfg->min;
1482 s32 max = cfg->max;
1483 u32 step = cfg->step;
1484 s32 def = cfg->def;
1485
1486 if (name == NULL)
1487 v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step,
1488 &def, &flags);
1489
1490 is_menu = (cfg->type == V4L2_CTRL_TYPE_MENU);
1491 if (is_menu)
1492 WARN_ON(step);
1493 else
1494 WARN_ON(cfg->menu_skip_mask);
1495 if (is_menu && qmenu == NULL)
1496 qmenu = v4l2_ctrl_get_menu(cfg->id);
1497
1498 ctrl = v4l2_ctrl_new(hdl, cfg->ops, cfg->id, name,
1499 type, min, max,
1500 is_menu ? cfg->menu_skip_mask : step,
1501 def, flags, qmenu, priv);
Hans Verkuil88365102011-08-26 07:35:14 -03001502 if (ctrl)
Hans Verkuil09965172010-08-01 14:32:42 -03001503 ctrl->is_private = cfg->is_private;
Hans Verkuil09965172010-08-01 14:32:42 -03001504 return ctrl;
1505}
1506EXPORT_SYMBOL(v4l2_ctrl_new_custom);
1507
1508/* Helper function for standard non-menu controls */
1509struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
1510 const struct v4l2_ctrl_ops *ops,
1511 u32 id, s32 min, s32 max, u32 step, s32 def)
1512{
1513 const char *name;
1514 enum v4l2_ctrl_type type;
1515 u32 flags;
1516
1517 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1518 if (type == V4L2_CTRL_TYPE_MENU) {
1519 handler_set_err(hdl, -EINVAL);
1520 return NULL;
1521 }
1522 return v4l2_ctrl_new(hdl, ops, id, name, type,
1523 min, max, step, def, flags, NULL, NULL);
1524}
1525EXPORT_SYMBOL(v4l2_ctrl_new_std);
1526
1527/* Helper function for standard menu controls */
1528struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
1529 const struct v4l2_ctrl_ops *ops,
1530 u32 id, s32 max, s32 mask, s32 def)
1531{
Hans Verkuil513521e2010-12-29 14:25:52 -03001532 const char * const *qmenu = v4l2_ctrl_get_menu(id);
Hans Verkuil09965172010-08-01 14:32:42 -03001533 const char *name;
1534 enum v4l2_ctrl_type type;
1535 s32 min;
1536 s32 step;
1537 u32 flags;
1538
1539 v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1540 if (type != V4L2_CTRL_TYPE_MENU) {
1541 handler_set_err(hdl, -EINVAL);
1542 return NULL;
1543 }
1544 return v4l2_ctrl_new(hdl, ops, id, name, type,
1545 0, max, mask, def, flags, qmenu, NULL);
1546}
1547EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
1548
1549/* Add a control from another handler to this handler */
1550struct v4l2_ctrl *v4l2_ctrl_add_ctrl(struct v4l2_ctrl_handler *hdl,
1551 struct v4l2_ctrl *ctrl)
1552{
1553 if (hdl == NULL || hdl->error)
1554 return NULL;
1555 if (ctrl == NULL) {
1556 handler_set_err(hdl, -EINVAL);
1557 return NULL;
1558 }
1559 if (ctrl->handler == hdl)
1560 return ctrl;
1561 return handler_new_ref(hdl, ctrl) ? NULL : ctrl;
1562}
1563EXPORT_SYMBOL(v4l2_ctrl_add_ctrl);
1564
1565/* Add the controls from another handler to our own. */
1566int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
1567 struct v4l2_ctrl_handler *add)
1568{
Hans Verkuil072e6602012-03-02 12:41:25 -03001569 struct v4l2_ctrl_ref *ref;
Hans Verkuil09965172010-08-01 14:32:42 -03001570 int ret = 0;
1571
1572 /* Do nothing if either handler is NULL or if they are the same */
1573 if (!hdl || !add || hdl == add)
1574 return 0;
1575 if (hdl->error)
1576 return hdl->error;
1577 mutex_lock(&add->lock);
Hans Verkuil072e6602012-03-02 12:41:25 -03001578 list_for_each_entry(ref, &add->ctrl_refs, node) {
1579 struct v4l2_ctrl *ctrl = ref->ctrl;
1580
Hans Verkuil09965172010-08-01 14:32:42 -03001581 /* Skip handler-private controls. */
1582 if (ctrl->is_private)
1583 continue;
Hans Verkuil6e239392011-06-07 11:13:44 -03001584 /* And control classes */
1585 if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
1586 continue;
Hans Verkuil09965172010-08-01 14:32:42 -03001587 ret = handler_new_ref(hdl, ctrl);
1588 if (ret)
1589 break;
1590 }
1591 mutex_unlock(&add->lock);
1592 return ret;
1593}
1594EXPORT_SYMBOL(v4l2_ctrl_add_handler);
1595
1596/* Cluster controls */
1597void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls)
1598{
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001599 bool has_volatiles = false;
Hans Verkuil09965172010-08-01 14:32:42 -03001600 int i;
1601
1602 /* The first control is the master control and it must not be NULL */
Hans Verkuil72d877c2011-06-10 05:44:36 -03001603 BUG_ON(ncontrols == 0 || controls[0] == NULL);
Hans Verkuil09965172010-08-01 14:32:42 -03001604
1605 for (i = 0; i < ncontrols; i++) {
1606 if (controls[i]) {
1607 controls[i]->cluster = controls;
1608 controls[i]->ncontrols = ncontrols;
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001609 if (controls[i]->flags & V4L2_CTRL_FLAG_VOLATILE)
1610 has_volatiles = true;
Hans Verkuil09965172010-08-01 14:32:42 -03001611 }
1612 }
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001613 controls[0]->has_volatiles = has_volatiles;
Hans Verkuil09965172010-08-01 14:32:42 -03001614}
1615EXPORT_SYMBOL(v4l2_ctrl_cluster);
1616
Hans Verkuil72d877c2011-06-10 05:44:36 -03001617void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
1618 u8 manual_val, bool set_volatile)
1619{
1620 struct v4l2_ctrl *master = controls[0];
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001621 u32 flag = 0;
Hans Verkuil72d877c2011-06-10 05:44:36 -03001622 int i;
1623
1624 v4l2_ctrl_cluster(ncontrols, controls);
1625 WARN_ON(ncontrols <= 1);
Hans Verkuil82a7c042011-06-28 10:43:13 -03001626 WARN_ON(manual_val < master->minimum || manual_val > master->maximum);
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001627 WARN_ON(set_volatile && !has_op(master, g_volatile_ctrl));
Hans Verkuil72d877c2011-06-10 05:44:36 -03001628 master->is_auto = true;
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001629 master->has_volatiles = set_volatile;
Hans Verkuil72d877c2011-06-10 05:44:36 -03001630 master->manual_mode_value = manual_val;
1631 master->flags |= V4L2_CTRL_FLAG_UPDATE;
Hans Verkuil5626b8c2011-08-26 07:53:53 -03001632
1633 if (!is_cur_manual(master))
1634 flag = V4L2_CTRL_FLAG_INACTIVE |
1635 (set_volatile ? V4L2_CTRL_FLAG_VOLATILE : 0);
Hans Verkuil72d877c2011-06-10 05:44:36 -03001636
1637 for (i = 1; i < ncontrols; i++)
Hans Verkuil88365102011-08-26 07:35:14 -03001638 if (controls[i])
Hans Verkuil72d877c2011-06-10 05:44:36 -03001639 controls[i]->flags |= flag;
Hans Verkuil72d877c2011-06-10 05:44:36 -03001640}
1641EXPORT_SYMBOL(v4l2_ctrl_auto_cluster);
1642
Hans Verkuil09965172010-08-01 14:32:42 -03001643/* Activate/deactivate a control. */
1644void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
1645{
Hans Verkuil6e239392011-06-07 11:13:44 -03001646 /* invert since the actual flag is called 'inactive' */
1647 bool inactive = !active;
1648 bool old;
1649
Hans Verkuil09965172010-08-01 14:32:42 -03001650 if (ctrl == NULL)
1651 return;
1652
Hans Verkuil6e239392011-06-07 11:13:44 -03001653 if (inactive)
Hans Verkuil09965172010-08-01 14:32:42 -03001654 /* set V4L2_CTRL_FLAG_INACTIVE */
Hans Verkuil6e239392011-06-07 11:13:44 -03001655 old = test_and_set_bit(4, &ctrl->flags);
Hans Verkuil09965172010-08-01 14:32:42 -03001656 else
1657 /* clear V4L2_CTRL_FLAG_INACTIVE */
Hans Verkuil6e239392011-06-07 11:13:44 -03001658 old = test_and_clear_bit(4, &ctrl->flags);
1659 if (old != inactive)
1660 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
Hans Verkuil09965172010-08-01 14:32:42 -03001661}
1662EXPORT_SYMBOL(v4l2_ctrl_activate);
1663
1664/* Grab/ungrab a control.
1665 Typically used when streaming starts and you want to grab controls,
1666 preventing the user from changing them.
1667
1668 Just call this and the framework will block any attempts to change
1669 these controls. */
1670void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
1671{
Hans Verkuil6e239392011-06-07 11:13:44 -03001672 bool old;
1673
Hans Verkuil09965172010-08-01 14:32:42 -03001674 if (ctrl == NULL)
1675 return;
1676
Hans Verkuil6e239392011-06-07 11:13:44 -03001677 v4l2_ctrl_lock(ctrl);
Hans Verkuil09965172010-08-01 14:32:42 -03001678 if (grabbed)
1679 /* set V4L2_CTRL_FLAG_GRABBED */
Hans Verkuil6e239392011-06-07 11:13:44 -03001680 old = test_and_set_bit(1, &ctrl->flags);
Hans Verkuil09965172010-08-01 14:32:42 -03001681 else
1682 /* clear V4L2_CTRL_FLAG_GRABBED */
Hans Verkuil6e239392011-06-07 11:13:44 -03001683 old = test_and_clear_bit(1, &ctrl->flags);
1684 if (old != grabbed)
1685 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
1686 v4l2_ctrl_unlock(ctrl);
Hans Verkuil09965172010-08-01 14:32:42 -03001687}
1688EXPORT_SYMBOL(v4l2_ctrl_grab);
1689
1690/* Log the control name and value */
1691static void log_ctrl(const struct v4l2_ctrl *ctrl,
1692 const char *prefix, const char *colon)
1693{
Hans Verkuil09965172010-08-01 14:32:42 -03001694 if (ctrl->flags & (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_WRITE_ONLY))
1695 return;
1696 if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
1697 return;
1698
1699 printk(KERN_INFO "%s%s%s: ", prefix, colon, ctrl->name);
1700
1701 switch (ctrl->type) {
1702 case V4L2_CTRL_TYPE_INTEGER:
1703 printk(KERN_CONT "%d", ctrl->cur.val);
1704 break;
1705 case V4L2_CTRL_TYPE_BOOLEAN:
1706 printk(KERN_CONT "%s", ctrl->cur.val ? "true" : "false");
1707 break;
1708 case V4L2_CTRL_TYPE_MENU:
1709 printk(KERN_CONT "%s", ctrl->qmenu[ctrl->cur.val]);
1710 break;
Hans Verkuilfa4d7092011-05-23 04:07:05 -03001711 case V4L2_CTRL_TYPE_BITMASK:
1712 printk(KERN_CONT "0x%08x", ctrl->cur.val);
1713 break;
Hans Verkuil09965172010-08-01 14:32:42 -03001714 case V4L2_CTRL_TYPE_INTEGER64:
1715 printk(KERN_CONT "%lld", ctrl->cur.val64);
1716 break;
1717 case V4L2_CTRL_TYPE_STRING:
1718 printk(KERN_CONT "%s", ctrl->cur.string);
1719 break;
1720 default:
1721 printk(KERN_CONT "unknown type %d", ctrl->type);
1722 break;
1723 }
Hans Verkuil88365102011-08-26 07:35:14 -03001724 if (ctrl->flags & (V4L2_CTRL_FLAG_INACTIVE |
1725 V4L2_CTRL_FLAG_GRABBED |
1726 V4L2_CTRL_FLAG_VOLATILE)) {
1727 if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
1728 printk(KERN_CONT " inactive");
1729 if (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)
1730 printk(KERN_CONT " grabbed");
1731 if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE)
1732 printk(KERN_CONT " volatile");
1733 }
1734 printk(KERN_CONT "\n");
Hans Verkuil09965172010-08-01 14:32:42 -03001735}
1736
1737/* Log all controls owned by the handler */
1738void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
1739 const char *prefix)
1740{
1741 struct v4l2_ctrl *ctrl;
1742 const char *colon = "";
1743 int len;
1744
1745 if (hdl == NULL)
1746 return;
1747 if (prefix == NULL)
1748 prefix = "";
1749 len = strlen(prefix);
1750 if (len && prefix[len - 1] != ' ')
1751 colon = ": ";
1752 mutex_lock(&hdl->lock);
1753 list_for_each_entry(ctrl, &hdl->ctrls, node)
1754 if (!(ctrl->flags & V4L2_CTRL_FLAG_DISABLED))
1755 log_ctrl(ctrl, prefix, colon);
1756 mutex_unlock(&hdl->lock);
1757}
1758EXPORT_SYMBOL(v4l2_ctrl_handler_log_status);
1759
1760/* Call s_ctrl for all controls owned by the handler */
1761int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
1762{
1763 struct v4l2_ctrl *ctrl;
1764 int ret = 0;
1765
1766 if (hdl == NULL)
1767 return 0;
1768 mutex_lock(&hdl->lock);
1769 list_for_each_entry(ctrl, &hdl->ctrls, node)
1770 ctrl->done = false;
1771
1772 list_for_each_entry(ctrl, &hdl->ctrls, node) {
1773 struct v4l2_ctrl *master = ctrl->cluster[0];
1774 int i;
1775
1776 /* Skip if this control was already handled by a cluster. */
Hans Verkuil71c6c4c2011-06-14 11:01:52 -03001777 /* Skip button controls and read-only controls. */
1778 if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
1779 (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
Hans Verkuil09965172010-08-01 14:32:42 -03001780 continue;
1781
Hans Verkuil2a863792011-01-11 14:45:03 -03001782 for (i = 0; i < master->ncontrols; i++) {
1783 if (master->cluster[i]) {
1784 cur_to_new(master->cluster[i]);
1785 master->cluster[i]->is_new = 1;
Hans Verkuil71c6c4c2011-06-14 11:01:52 -03001786 master->cluster[i]->done = true;
Hans Verkuil2a863792011-01-11 14:45:03 -03001787 }
1788 }
Hans Verkuil54c911e2011-05-25 06:04:58 -03001789 ret = call_op(master, s_ctrl);
Hans Verkuil09965172010-08-01 14:32:42 -03001790 if (ret)
1791 break;
Hans Verkuil09965172010-08-01 14:32:42 -03001792 }
1793 mutex_unlock(&hdl->lock);
1794 return ret;
1795}
1796EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
1797
1798/* Implement VIDIOC_QUERYCTRL */
1799int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc)
1800{
1801 u32 id = qc->id & V4L2_CTRL_ID_MASK;
1802 struct v4l2_ctrl_ref *ref;
1803 struct v4l2_ctrl *ctrl;
1804
1805 if (hdl == NULL)
1806 return -EINVAL;
1807
1808 mutex_lock(&hdl->lock);
1809
1810 /* Try to find it */
1811 ref = find_ref(hdl, id);
1812
1813 if ((qc->id & V4L2_CTRL_FLAG_NEXT_CTRL) && !list_empty(&hdl->ctrl_refs)) {
1814 /* Find the next control with ID > qc->id */
1815
1816 /* Did we reach the end of the control list? */
1817 if (id >= node2id(hdl->ctrl_refs.prev)) {
1818 ref = NULL; /* Yes, so there is no next control */
1819 } else if (ref) {
1820 /* We found a control with the given ID, so just get
1821 the next one in the list. */
1822 ref = list_entry(ref->node.next, typeof(*ref), node);
1823 } else {
1824 /* No control with the given ID exists, so start
1825 searching for the next largest ID. We know there
1826 is one, otherwise the first 'if' above would have
1827 been true. */
1828 list_for_each_entry(ref, &hdl->ctrl_refs, node)
1829 if (id < ref->ctrl->id)
1830 break;
1831 }
1832 }
1833 mutex_unlock(&hdl->lock);
1834 if (!ref)
1835 return -EINVAL;
1836
1837 ctrl = ref->ctrl;
1838 memset(qc, 0, sizeof(*qc));
Hans Verkuil829fb2d2011-01-16 11:21:40 -03001839 if (id >= V4L2_CID_PRIVATE_BASE)
1840 qc->id = id;
1841 else
1842 qc->id = ctrl->id;
Hans Verkuil09965172010-08-01 14:32:42 -03001843 strlcpy(qc->name, ctrl->name, sizeof(qc->name));
1844 qc->minimum = ctrl->minimum;
1845 qc->maximum = ctrl->maximum;
1846 qc->default_value = ctrl->default_value;
Laurent Pincharteac9aa02010-12-07 08:57:25 -03001847 if (ctrl->type == V4L2_CTRL_TYPE_MENU)
Hans Verkuil09965172010-08-01 14:32:42 -03001848 qc->step = 1;
1849 else
1850 qc->step = ctrl->step;
1851 qc->flags = ctrl->flags;
1852 qc->type = ctrl->type;
1853 return 0;
1854}
1855EXPORT_SYMBOL(v4l2_queryctrl);
1856
1857int v4l2_subdev_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
1858{
Hans Verkuil87a0c942011-02-22 12:31:07 -03001859 if (qc->id & V4L2_CTRL_FLAG_NEXT_CTRL)
1860 return -EINVAL;
Hans Verkuil09965172010-08-01 14:32:42 -03001861 return v4l2_queryctrl(sd->ctrl_handler, qc);
1862}
1863EXPORT_SYMBOL(v4l2_subdev_queryctrl);
1864
1865/* Implement VIDIOC_QUERYMENU */
1866int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm)
1867{
1868 struct v4l2_ctrl *ctrl;
1869 u32 i = qm->index;
1870
1871 ctrl = v4l2_ctrl_find(hdl, qm->id);
1872 if (!ctrl)
1873 return -EINVAL;
1874
1875 qm->reserved = 0;
1876 /* Sanity checks */
1877 if (ctrl->qmenu == NULL ||
1878 i < ctrl->minimum || i > ctrl->maximum)
1879 return -EINVAL;
1880 /* Use mask to see if this menu item should be skipped */
1881 if (ctrl->menu_skip_mask & (1 << i))
1882 return -EINVAL;
1883 /* Empty menu items should also be skipped */
1884 if (ctrl->qmenu[i] == NULL || ctrl->qmenu[i][0] == '\0')
1885 return -EINVAL;
1886 strlcpy(qm->name, ctrl->qmenu[i], sizeof(qm->name));
1887 return 0;
1888}
1889EXPORT_SYMBOL(v4l2_querymenu);
1890
1891int v4l2_subdev_querymenu(struct v4l2_subdev *sd, struct v4l2_querymenu *qm)
1892{
1893 return v4l2_querymenu(sd->ctrl_handler, qm);
1894}
1895EXPORT_SYMBOL(v4l2_subdev_querymenu);
1896
1897
1898
1899/* Some general notes on the atomic requirements of VIDIOC_G/TRY/S_EXT_CTRLS:
1900
1901 It is not a fully atomic operation, just best-effort only. After all, if
1902 multiple controls have to be set through multiple i2c writes (for example)
1903 then some initial writes may succeed while others fail. Thus leaving the
1904 system in an inconsistent state. The question is how much effort you are
1905 willing to spend on trying to make something atomic that really isn't.
1906
1907 From the point of view of an application the main requirement is that
1908 when you call VIDIOC_S_EXT_CTRLS and some values are invalid then an
1909 error should be returned without actually affecting any controls.
1910
1911 If all the values are correct, then it is acceptable to just give up
1912 in case of low-level errors.
1913
1914 It is important though that the application can tell when only a partial
1915 configuration was done. The way we do that is through the error_idx field
1916 of struct v4l2_ext_controls: if that is equal to the count field then no
1917 controls were affected. Otherwise all controls before that index were
1918 successful in performing their 'get' or 'set' operation, the control at
1919 the given index failed, and you don't know what happened with the controls
1920 after the failed one. Since if they were part of a control cluster they
1921 could have been successfully processed (if a cluster member was encountered
1922 at index < error_idx), they could have failed (if a cluster member was at
1923 error_idx), or they may not have been processed yet (if the first cluster
1924 member appeared after error_idx).
1925
1926 It is all fairly theoretical, though. In practice all you can do is to
1927 bail out. If error_idx == count, then it is an application bug. If
1928 error_idx < count then it is only an application bug if the error code was
1929 EBUSY. That usually means that something started streaming just when you
1930 tried to set the controls. In all other cases it is a driver/hardware
1931 problem and all you can do is to retry or bail out.
1932
1933 Note that these rules do not apply to VIDIOC_TRY_EXT_CTRLS: since that
1934 never modifies controls the error_idx is just set to whatever control
1935 has an invalid value.
1936 */
1937
1938/* Prepare for the extended g/s/try functions.
1939 Find the controls in the control array and do some basic checks. */
1940static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
1941 struct v4l2_ext_controls *cs,
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001942 struct v4l2_ctrl_helper *helpers)
Hans Verkuil09965172010-08-01 14:32:42 -03001943{
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001944 struct v4l2_ctrl_helper *h;
1945 bool have_clusters = false;
Hans Verkuil09965172010-08-01 14:32:42 -03001946 u32 i;
1947
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001948 for (i = 0, h = helpers; i < cs->count; i++, h++) {
Hans Verkuil09965172010-08-01 14:32:42 -03001949 struct v4l2_ext_control *c = &cs->controls[i];
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001950 struct v4l2_ctrl_ref *ref;
Hans Verkuil09965172010-08-01 14:32:42 -03001951 struct v4l2_ctrl *ctrl;
1952 u32 id = c->id & V4L2_CTRL_ID_MASK;
1953
Hans Verkuil37cd3b72011-06-07 04:40:04 -03001954 cs->error_idx = i;
Hans Verkuil09965172010-08-01 14:32:42 -03001955
1956 if (cs->ctrl_class && V4L2_CTRL_ID2CLASS(id) != cs->ctrl_class)
1957 return -EINVAL;
1958
1959 /* Old-style private controls are not allowed for
1960 extended controls */
1961 if (id >= V4L2_CID_PRIVATE_BASE)
1962 return -EINVAL;
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001963 ref = find_ref_lock(hdl, id);
1964 if (ref == NULL)
Hans Verkuil09965172010-08-01 14:32:42 -03001965 return -EINVAL;
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001966 ctrl = ref->ctrl;
Hans Verkuil09965172010-08-01 14:32:42 -03001967 if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED)
1968 return -EINVAL;
1969
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001970 if (ctrl->cluster[0]->ncontrols > 1)
1971 have_clusters = true;
1972 if (ctrl->cluster[0] != ctrl)
1973 ref = find_ref_lock(hdl, ctrl->cluster[0]->id);
1974 /* Store the ref to the master control of the cluster */
1975 h->mref = ref;
1976 h->ctrl = ctrl;
1977 /* Initially set next to 0, meaning that there is no other
1978 control in this helper array belonging to the same
1979 cluster */
1980 h->next = 0;
Hans Verkuil09965172010-08-01 14:32:42 -03001981 }
Hans Verkuileb5b16e2011-06-14 10:04:06 -03001982
1983 /* We are done if there were no controls that belong to a multi-
1984 control cluster. */
1985 if (!have_clusters)
1986 return 0;
1987
1988 /* The code below figures out in O(n) time which controls in the list
1989 belong to the same cluster. */
1990
1991 /* This has to be done with the handler lock taken. */
1992 mutex_lock(&hdl->lock);
1993
1994 /* First zero the helper field in the master control references */
1995 for (i = 0; i < cs->count; i++)
1996 helpers[i].mref->helper = 0;
1997 for (i = 0, h = helpers; i < cs->count; i++, h++) {
1998 struct v4l2_ctrl_ref *mref = h->mref;
1999
2000 /* If the mref->helper is set, then it points to an earlier
2001 helper that belongs to the same cluster. */
2002 if (mref->helper) {
2003 /* Set the next field of mref->helper to the current
2004 index: this means that that earlier helper now
2005 points to the next helper in the same cluster. */
2006 mref->helper->next = i;
2007 /* mref should be set only for the first helper in the
2008 cluster, clear the others. */
2009 h->mref = NULL;
2010 }
2011 /* Point the mref helper to the current helper struct. */
2012 mref->helper = h;
2013 }
2014 mutex_unlock(&hdl->lock);
Hans Verkuil09965172010-08-01 14:32:42 -03002015 return 0;
2016}
2017
Hans Verkuil09965172010-08-01 14:32:42 -03002018/* Handles the corner case where cs->count == 0. It checks whether the
2019 specified control class exists. If that class ID is 0, then it checks
2020 whether there are any controls at all. */
2021static int class_check(struct v4l2_ctrl_handler *hdl, u32 ctrl_class)
2022{
2023 if (ctrl_class == 0)
2024 return list_empty(&hdl->ctrl_refs) ? -EINVAL : 0;
2025 return find_ref_lock(hdl, ctrl_class | 1) ? 0 : -EINVAL;
2026}
2027
2028
2029
2030/* Get extended controls. Allocates the helpers array if needed. */
2031int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs)
2032{
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002033 struct v4l2_ctrl_helper helper[4];
2034 struct v4l2_ctrl_helper *helpers = helper;
Hans Verkuil09965172010-08-01 14:32:42 -03002035 int ret;
Hans Verkuilddac5c12011-06-10 05:43:34 -03002036 int i, j;
Hans Verkuil09965172010-08-01 14:32:42 -03002037
2038 cs->error_idx = cs->count;
2039 cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
2040
2041 if (hdl == NULL)
2042 return -EINVAL;
2043
2044 if (cs->count == 0)
2045 return class_check(hdl, cs->ctrl_class);
2046
2047 if (cs->count > ARRAY_SIZE(helper)) {
2048 helpers = kmalloc(sizeof(helper[0]) * cs->count, GFP_KERNEL);
2049 if (helpers == NULL)
2050 return -ENOMEM;
2051 }
2052
Hans Verkuil37cd3b72011-06-07 04:40:04 -03002053 ret = prepare_ext_ctrls(hdl, cs, helpers);
2054 cs->error_idx = cs->count;
Hans Verkuil09965172010-08-01 14:32:42 -03002055
2056 for (i = 0; !ret && i < cs->count; i++)
2057 if (helpers[i].ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
2058 ret = -EACCES;
2059
2060 for (i = 0; !ret && i < cs->count; i++) {
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002061 int (*ctrl_to_user)(struct v4l2_ext_control *c,
2062 struct v4l2_ctrl *ctrl) = cur_to_user;
2063 struct v4l2_ctrl *master;
Hans Verkuil09965172010-08-01 14:32:42 -03002064
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002065 if (helpers[i].mref == NULL)
Hans Verkuil09965172010-08-01 14:32:42 -03002066 continue;
2067
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002068 master = helpers[i].mref->ctrl;
Hans Verkuil09965172010-08-01 14:32:42 -03002069 cs->error_idx = i;
2070
2071 v4l2_ctrl_lock(master);
Hans Verkuilddac5c12011-06-10 05:43:34 -03002072
2073 /* g_volatile_ctrl will update the new control values */
Hans Verkuil5626b8c2011-08-26 07:53:53 -03002074 if ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
2075 (master->has_volatiles && !is_cur_manual(master))) {
Hans Verkuilddac5c12011-06-10 05:43:34 -03002076 for (j = 0; j < master->ncontrols; j++)
2077 cur_to_new(master->cluster[j]);
Hans Verkuil54c911e2011-05-25 06:04:58 -03002078 ret = call_op(master, g_volatile_ctrl);
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002079 ctrl_to_user = new_to_user;
Hans Verkuilddac5c12011-06-10 05:43:34 -03002080 }
2081 /* If OK, then copy the current (for non-volatile controls)
2082 or the new (for volatile controls) control values to the
2083 caller */
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002084 if (!ret) {
2085 u32 idx = i;
2086
2087 do {
2088 ret = ctrl_to_user(cs->controls + idx,
2089 helpers[idx].ctrl);
2090 idx = helpers[idx].next;
2091 } while (!ret && idx);
2092 }
Hans Verkuil09965172010-08-01 14:32:42 -03002093 v4l2_ctrl_unlock(master);
Hans Verkuil09965172010-08-01 14:32:42 -03002094 }
2095
2096 if (cs->count > ARRAY_SIZE(helper))
2097 kfree(helpers);
2098 return ret;
2099}
2100EXPORT_SYMBOL(v4l2_g_ext_ctrls);
2101
2102int v4l2_subdev_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
2103{
2104 return v4l2_g_ext_ctrls(sd->ctrl_handler, cs);
2105}
2106EXPORT_SYMBOL(v4l2_subdev_g_ext_ctrls);
2107
2108/* Helper function to get a single control */
2109static int get_ctrl(struct v4l2_ctrl *ctrl, s32 *val)
2110{
2111 struct v4l2_ctrl *master = ctrl->cluster[0];
2112 int ret = 0;
Hans Verkuilddac5c12011-06-10 05:43:34 -03002113 int i;
Hans Verkuil09965172010-08-01 14:32:42 -03002114
2115 if (ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
2116 return -EACCES;
2117
2118 v4l2_ctrl_lock(master);
2119 /* g_volatile_ctrl will update the current control values */
Hans Verkuil5626b8c2011-08-26 07:53:53 -03002120 if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
Hans Verkuilddac5c12011-06-10 05:43:34 -03002121 for (i = 0; i < master->ncontrols; i++)
2122 cur_to_new(master->cluster[i]);
Hans Verkuil54c911e2011-05-25 06:04:58 -03002123 ret = call_op(master, g_volatile_ctrl);
Hans Verkuilddac5c12011-06-10 05:43:34 -03002124 *val = ctrl->val;
2125 } else {
2126 *val = ctrl->cur.val;
2127 }
Hans Verkuil09965172010-08-01 14:32:42 -03002128 v4l2_ctrl_unlock(master);
2129 return ret;
2130}
2131
2132int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
2133{
2134 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
2135
2136 if (ctrl == NULL || !type_is_int(ctrl))
2137 return -EINVAL;
2138 return get_ctrl(ctrl, &control->value);
2139}
2140EXPORT_SYMBOL(v4l2_g_ctrl);
2141
2142int v4l2_subdev_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *control)
2143{
2144 return v4l2_g_ctrl(sd->ctrl_handler, control);
2145}
2146EXPORT_SYMBOL(v4l2_subdev_g_ctrl);
2147
2148s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
2149{
2150 s32 val = 0;
2151
2152 /* It's a driver bug if this happens. */
2153 WARN_ON(!type_is_int(ctrl));
2154 get_ctrl(ctrl, &val);
2155 return val;
2156}
2157EXPORT_SYMBOL(v4l2_ctrl_g_ctrl);
2158
2159
2160/* Core function that calls try/s_ctrl and ensures that the new value is
2161 copied to the current value on a set.
2162 Must be called with ctrl->handler->lock held. */
Hans Verkuile6402582011-06-14 10:56:42 -03002163static int try_or_set_cluster(struct v4l2_fh *fh,
2164 struct v4l2_ctrl *master, bool set)
Hans Verkuil09965172010-08-01 14:32:42 -03002165{
Hans Verkuil72d877c2011-06-10 05:44:36 -03002166 bool update_flag;
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002167 int ret;
Hans Verkuil09965172010-08-01 14:32:42 -03002168 int i;
2169
2170 /* Go through the cluster and either validate the new value or
2171 (if no new value was set), copy the current value to the new
2172 value, ensuring a consistent view for the control ops when
2173 called. */
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002174 for (i = 0; i < master->ncontrols; i++) {
Hans Verkuil09965172010-08-01 14:32:42 -03002175 struct v4l2_ctrl *ctrl = master->cluster[i];
2176
2177 if (ctrl == NULL)
2178 continue;
2179
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002180 if (!ctrl->is_new) {
2181 cur_to_new(ctrl);
Hans Verkuil09965172010-08-01 14:32:42 -03002182 continue;
2183 }
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002184 /* Check again: it may have changed since the
2185 previous check in try_or_set_ext_ctrls(). */
2186 if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
2187 return -EBUSY;
Hans Verkuil09965172010-08-01 14:32:42 -03002188 }
2189
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002190 ret = call_op(master, try_ctrl);
Hans Verkuil09965172010-08-01 14:32:42 -03002191
2192 /* Don't set if there is no change */
Hans Verkuil72d877c2011-06-10 05:44:36 -03002193 if (ret || !set || !cluster_changed(master))
2194 return ret;
2195 ret = call_op(master, s_ctrl);
Hans Verkuil72d877c2011-06-10 05:44:36 -03002196 if (ret)
2197 return ret;
2198
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002199 /* If OK, then make the new values permanent. */
Hans Verkuil72d877c2011-06-10 05:44:36 -03002200 update_flag = is_cur_manual(master) != is_new_manual(master);
2201 for (i = 0; i < master->ncontrols; i++)
Hans Verkuilab892ba2011-06-07 06:47:18 -03002202 new_to_cur(fh, master->cluster[i], update_flag && i > 0);
Hans Verkuil72d877c2011-06-10 05:44:36 -03002203 return 0;
Hans Verkuil09965172010-08-01 14:32:42 -03002204}
2205
Hans Verkuile6402582011-06-14 10:56:42 -03002206/* Validate controls. */
2207static int validate_ctrls(struct v4l2_ext_controls *cs,
2208 struct v4l2_ctrl_helper *helpers, bool set)
Hans Verkuil09965172010-08-01 14:32:42 -03002209{
Hans Verkuile6402582011-06-14 10:56:42 -03002210 unsigned i;
Hans Verkuil09965172010-08-01 14:32:42 -03002211 int ret = 0;
2212
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002213 cs->error_idx = cs->count;
Hans Verkuil09965172010-08-01 14:32:42 -03002214 for (i = 0; i < cs->count; i++) {
2215 struct v4l2_ctrl *ctrl = helpers[i].ctrl;
2216
Hans Verkuile6402582011-06-14 10:56:42 -03002217 cs->error_idx = i;
Hans Verkuil09965172010-08-01 14:32:42 -03002218
2219 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
2220 return -EACCES;
2221 /* This test is also done in try_set_control_cluster() which
2222 is called in atomic context, so that has the final say,
2223 but it makes sense to do an up-front check as well. Once
2224 an error occurs in try_set_control_cluster() some other
2225 controls may have been set already and we want to do a
2226 best-effort to avoid that. */
2227 if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
2228 return -EBUSY;
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002229 ret = validate_new(ctrl, &cs->controls[i]);
2230 if (ret)
2231 return ret;
Hans Verkuil09965172010-08-01 14:32:42 -03002232 }
Hans Verkuile6402582011-06-14 10:56:42 -03002233 return 0;
2234}
Hans Verkuil09965172010-08-01 14:32:42 -03002235
Hans Verkuil5626b8c2011-08-26 07:53:53 -03002236/* Obtain the current volatile values of an autocluster and mark them
2237 as new. */
2238static void update_from_auto_cluster(struct v4l2_ctrl *master)
2239{
2240 int i;
2241
2242 for (i = 0; i < master->ncontrols; i++)
2243 cur_to_new(master->cluster[i]);
2244 if (!call_op(master, g_volatile_ctrl))
2245 for (i = 1; i < master->ncontrols; i++)
2246 if (master->cluster[i])
2247 master->cluster[i]->is_new = 1;
2248}
2249
Hans Verkuile6402582011-06-14 10:56:42 -03002250/* Try or try-and-set controls */
2251static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
2252 struct v4l2_ext_controls *cs,
2253 bool set)
2254{
2255 struct v4l2_ctrl_helper helper[4];
2256 struct v4l2_ctrl_helper *helpers = helper;
2257 unsigned i, j;
2258 int ret;
2259
2260 cs->error_idx = cs->count;
2261 cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
2262
2263 if (hdl == NULL)
2264 return -EINVAL;
2265
2266 if (cs->count == 0)
2267 return class_check(hdl, cs->ctrl_class);
2268
2269 if (cs->count > ARRAY_SIZE(helper)) {
2270 helpers = kmalloc(sizeof(helper[0]) * cs->count, GFP_KERNEL);
2271 if (!helpers)
2272 return -ENOMEM;
2273 }
2274 ret = prepare_ext_ctrls(hdl, cs, helpers);
2275 if (!ret)
2276 ret = validate_ctrls(cs, helpers, set);
2277 if (ret && set)
2278 cs->error_idx = cs->count;
Hans Verkuil09965172010-08-01 14:32:42 -03002279 for (i = 0; !ret && i < cs->count; i++) {
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002280 struct v4l2_ctrl *master;
2281 u32 idx = i;
Hans Verkuil09965172010-08-01 14:32:42 -03002282
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002283 if (helpers[i].mref == NULL)
Hans Verkuil09965172010-08-01 14:32:42 -03002284 continue;
2285
Hans Verkuil37cd3b72011-06-07 04:40:04 -03002286 cs->error_idx = i;
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002287 master = helpers[i].mref->ctrl;
2288 v4l2_ctrl_lock(master);
Hans Verkuil09965172010-08-01 14:32:42 -03002289
Hans Verkuil2a863792011-01-11 14:45:03 -03002290 /* Reset the 'is_new' flags of the cluster */
Hans Verkuil09965172010-08-01 14:32:42 -03002291 for (j = 0; j < master->ncontrols; j++)
2292 if (master->cluster[j])
Hans Verkuil2a863792011-01-11 14:45:03 -03002293 master->cluster[j]->is_new = 0;
Hans Verkuil09965172010-08-01 14:32:42 -03002294
Hans Verkuil5626b8c2011-08-26 07:53:53 -03002295 /* For volatile autoclusters that are currently in auto mode
2296 we need to discover if it will be set to manual mode.
2297 If so, then we have to copy the current volatile values
2298 first since those will become the new manual values (which
2299 may be overwritten by explicit new values from this set
2300 of controls). */
2301 if (master->is_auto && master->has_volatiles &&
2302 !is_cur_manual(master)) {
2303 /* Pick an initial non-manual value */
2304 s32 new_auto_val = master->manual_mode_value + 1;
2305 u32 tmp_idx = idx;
2306
2307 do {
2308 /* Check if the auto control is part of the
2309 list, and remember the new value. */
2310 if (helpers[tmp_idx].ctrl == master)
2311 new_auto_val = cs->controls[tmp_idx].value;
2312 tmp_idx = helpers[tmp_idx].next;
2313 } while (tmp_idx);
2314 /* If the new value == the manual value, then copy
2315 the current volatile values. */
2316 if (new_auto_val == master->manual_mode_value)
2317 update_from_auto_cluster(master);
2318 }
2319
Hans Verkuil09965172010-08-01 14:32:42 -03002320 /* Copy the new caller-supplied control values.
Hans Verkuil2a863792011-01-11 14:45:03 -03002321 user_to_new() sets 'is_new' to 1. */
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002322 do {
2323 ret = user_to_new(cs->controls + idx, helpers[idx].ctrl);
2324 idx = helpers[idx].next;
2325 } while (!ret && idx);
Hans Verkuil09965172010-08-01 14:32:42 -03002326
2327 if (!ret)
Hans Verkuile6402582011-06-14 10:56:42 -03002328 ret = try_or_set_cluster(fh, master, set);
Hans Verkuil09965172010-08-01 14:32:42 -03002329
2330 /* Copy the new values back to userspace. */
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002331 if (!ret) {
2332 idx = i;
2333 do {
Hans Verkuiladf41b92011-07-05 06:56:37 -03002334 ret = new_to_user(cs->controls + idx,
Hans Verkuile6402582011-06-14 10:56:42 -03002335 helpers[idx].ctrl);
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002336 idx = helpers[idx].next;
2337 } while (!ret && idx);
2338 }
2339 v4l2_ctrl_unlock(master);
Hans Verkuil09965172010-08-01 14:32:42 -03002340 }
Hans Verkuil09965172010-08-01 14:32:42 -03002341
Hans Verkuil09965172010-08-01 14:32:42 -03002342 if (cs->count > ARRAY_SIZE(helper))
2343 kfree(helpers);
2344 return ret;
2345}
2346
2347int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs)
2348{
Hans Verkuilab892ba2011-06-07 06:47:18 -03002349 return try_set_ext_ctrls(NULL, hdl, cs, false);
Hans Verkuil09965172010-08-01 14:32:42 -03002350}
2351EXPORT_SYMBOL(v4l2_try_ext_ctrls);
2352
Hans Verkuilab892ba2011-06-07 06:47:18 -03002353int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
2354 struct v4l2_ext_controls *cs)
Hans Verkuil09965172010-08-01 14:32:42 -03002355{
Hans Verkuilab892ba2011-06-07 06:47:18 -03002356 return try_set_ext_ctrls(fh, hdl, cs, true);
Hans Verkuil09965172010-08-01 14:32:42 -03002357}
2358EXPORT_SYMBOL(v4l2_s_ext_ctrls);
2359
2360int v4l2_subdev_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
2361{
Hans Verkuilab892ba2011-06-07 06:47:18 -03002362 return try_set_ext_ctrls(NULL, sd->ctrl_handler, cs, false);
Hans Verkuil09965172010-08-01 14:32:42 -03002363}
2364EXPORT_SYMBOL(v4l2_subdev_try_ext_ctrls);
2365
2366int v4l2_subdev_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
2367{
Hans Verkuilab892ba2011-06-07 06:47:18 -03002368 return try_set_ext_ctrls(NULL, sd->ctrl_handler, cs, true);
Hans Verkuil09965172010-08-01 14:32:42 -03002369}
2370EXPORT_SYMBOL(v4l2_subdev_s_ext_ctrls);
2371
2372/* Helper function for VIDIOC_S_CTRL compatibility */
Hans Verkuilab892ba2011-06-07 06:47:18 -03002373static int set_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, s32 *val)
Hans Verkuil09965172010-08-01 14:32:42 -03002374{
2375 struct v4l2_ctrl *master = ctrl->cluster[0];
2376 int ret;
2377 int i;
2378
Hans Verkuileb5b16e2011-06-14 10:04:06 -03002379 ret = validate_new_int(ctrl, val);
2380 if (ret)
2381 return ret;
2382
Hans Verkuil09965172010-08-01 14:32:42 -03002383 v4l2_ctrl_lock(ctrl);
2384
Hans Verkuil2a863792011-01-11 14:45:03 -03002385 /* Reset the 'is_new' flags of the cluster */
Hans Verkuil09965172010-08-01 14:32:42 -03002386 for (i = 0; i < master->ncontrols; i++)
2387 if (master->cluster[i])
Hans Verkuil2a863792011-01-11 14:45:03 -03002388 master->cluster[i]->is_new = 0;
Hans Verkuil09965172010-08-01 14:32:42 -03002389
Hans Verkuil5626b8c2011-08-26 07:53:53 -03002390 /* For autoclusters with volatiles that are switched from auto to
2391 manual mode we have to update the current volatile values since
2392 those will become the initial manual values after such a switch. */
2393 if (master->is_auto && master->has_volatiles && ctrl == master &&
2394 !is_cur_manual(master) && *val == master->manual_mode_value)
2395 update_from_auto_cluster(master);
Hans Verkuil09965172010-08-01 14:32:42 -03002396 ctrl->val = *val;
Hans Verkuil2a863792011-01-11 14:45:03 -03002397 ctrl->is_new = 1;
Hans Verkuile6402582011-06-14 10:56:42 -03002398 ret = try_or_set_cluster(fh, master, true);
Hans Verkuil09965172010-08-01 14:32:42 -03002399 *val = ctrl->cur.val;
2400 v4l2_ctrl_unlock(ctrl);
2401 return ret;
2402}
2403
Hans Verkuilab892ba2011-06-07 06:47:18 -03002404int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
2405 struct v4l2_control *control)
Hans Verkuil09965172010-08-01 14:32:42 -03002406{
2407 struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
2408
2409 if (ctrl == NULL || !type_is_int(ctrl))
2410 return -EINVAL;
2411
Hans Verkuil7ebbc392011-06-07 04:50:31 -03002412 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
2413 return -EACCES;
2414
Hans Verkuilab892ba2011-06-07 06:47:18 -03002415 return set_ctrl(fh, ctrl, &control->value);
Hans Verkuil09965172010-08-01 14:32:42 -03002416}
2417EXPORT_SYMBOL(v4l2_s_ctrl);
2418
2419int v4l2_subdev_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *control)
2420{
Hans Verkuilab892ba2011-06-07 06:47:18 -03002421 return v4l2_s_ctrl(NULL, sd->ctrl_handler, control);
Hans Verkuil09965172010-08-01 14:32:42 -03002422}
2423EXPORT_SYMBOL(v4l2_subdev_s_ctrl);
2424
2425int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
2426{
2427 /* It's a driver bug if this happens. */
2428 WARN_ON(!type_is_int(ctrl));
Hans Verkuilab892ba2011-06-07 06:47:18 -03002429 return set_ctrl(NULL, ctrl, &val);
Hans Verkuil09965172010-08-01 14:32:42 -03002430}
2431EXPORT_SYMBOL(v4l2_ctrl_s_ctrl);
Hans Verkuil6e239392011-06-07 11:13:44 -03002432
Hans Verkuil77068d32011-06-13 18:55:58 -03002433void v4l2_ctrl_add_event(struct v4l2_ctrl *ctrl,
2434 struct v4l2_subscribed_event *sev)
Hans Verkuil6e239392011-06-07 11:13:44 -03002435{
Hans Verkuil6e239392011-06-07 11:13:44 -03002436 v4l2_ctrl_lock(ctrl);
Hans Verkuil77068d32011-06-13 18:55:58 -03002437 list_add_tail(&sev->node, &ctrl->ev_subs);
Hans Verkuil6e239392011-06-07 11:13:44 -03002438 if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
Hans Verkuil77068d32011-06-13 18:55:58 -03002439 (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL)) {
Hans Verkuil6e239392011-06-07 11:13:44 -03002440 struct v4l2_event ev;
Hans Verkuilc12fcfd2011-06-14 02:42:45 -03002441 u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
Hans Verkuil6e239392011-06-07 11:13:44 -03002442
Hans Verkuilc12fcfd2011-06-14 02:42:45 -03002443 if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
2444 changes |= V4L2_EVENT_CTRL_CH_VALUE;
2445 fill_event(&ev, ctrl, changes);
Hans Verkuil77068d32011-06-13 18:55:58 -03002446 v4l2_event_queue_fh(sev->fh, &ev);
Hans Verkuil6e239392011-06-07 11:13:44 -03002447 }
2448 v4l2_ctrl_unlock(ctrl);
2449}
Hans Verkuil77068d32011-06-13 18:55:58 -03002450EXPORT_SYMBOL(v4l2_ctrl_add_event);
Hans Verkuil6e239392011-06-07 11:13:44 -03002451
Hans Verkuil77068d32011-06-13 18:55:58 -03002452void v4l2_ctrl_del_event(struct v4l2_ctrl *ctrl,
2453 struct v4l2_subscribed_event *sev)
Hans Verkuil6e239392011-06-07 11:13:44 -03002454{
Hans Verkuil6e239392011-06-07 11:13:44 -03002455 v4l2_ctrl_lock(ctrl);
Hans Verkuil77068d32011-06-13 18:55:58 -03002456 list_del(&sev->node);
Hans Verkuil6e239392011-06-07 11:13:44 -03002457 v4l2_ctrl_unlock(ctrl);
2458}
Hans Verkuil77068d32011-06-13 18:55:58 -03002459EXPORT_SYMBOL(v4l2_ctrl_del_event);
Hans Verkuile2ecb252012-02-02 08:20:53 -03002460
2461int v4l2_ctrl_log_status(struct file *file, void *fh)
2462{
2463 struct video_device *vfd = video_devdata(file);
2464 struct v4l2_fh *vfh = file->private_data;
2465
2466 if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) && vfd->v4l2_dev)
2467 v4l2_ctrl_handler_log_status(vfh->ctrl_handler,
2468 vfd->v4l2_dev->name);
2469 return 0;
2470}
2471EXPORT_SYMBOL(v4l2_ctrl_log_status);
Hans Verkuila26243b2012-01-27 16:18:42 -03002472
2473int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
2474 struct v4l2_event_subscription *sub)
2475{
2476 if (sub->type == V4L2_EVENT_CTRL)
2477 return v4l2_event_subscribe(fh, sub, 0);
2478 return -EINVAL;
2479}
2480EXPORT_SYMBOL(v4l2_ctrl_subscribe_event);
2481
2482unsigned int v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait)
2483{
2484 struct v4l2_fh *fh = file->private_data;
2485
2486 if (v4l2_event_pending(fh))
2487 return POLLPRI;
2488 poll_wait(file, &fh->wait, wait);
2489 return 0;
2490}
2491EXPORT_SYMBOL(v4l2_ctrl_poll);