2 V4L2 controls framework implementation.
4 Copyright (C) 2010 Hans Verkuil <hverkuil@xs4all.nl>
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.
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.
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
21 #include <linux/ctype.h>
22 #include <linux/slab.h>
23 #include <media/v4l2-ioctl.h>
24 #include <media/v4l2-device.h>
25 #include <media/v4l2-ctrls.h>
26 #include <media/v4l2-dev.h>
28 #define has_op(master, op) \
29 (master->ops && master->ops->op)
30 #define call_op(master, op) \
31 (has_op(master, op) ? master->ops->op(master) : 0)
33 /* Internal temporary helper struct, one for each v4l2_ext_control */
35 /* The control corresponding to the v4l2_ext_control ID field. */
36 struct v4l2_ctrl
*ctrl
;
37 /* Used internally to mark whether this control was already
42 /* Small helper function to determine if the autocluster is set to manual
43 mode. In that case the is_volatile flag should be ignored. */
44 static bool is_cur_manual(const struct v4l2_ctrl
*master
)
46 return master
->is_auto
&& master
->cur
.val
== master
->manual_mode_value
;
49 /* Same as above, but this checks the against the new value instead of the
51 static bool is_new_manual(const struct v4l2_ctrl
*master
)
53 return master
->is_auto
&& master
->val
== master
->manual_mode_value
;
56 /* Returns NULL or a character pointer array containing the menu for
57 the given control ID. The pointer array ends with a NULL pointer.
58 An empty string signifies a menu entry that is invalid. This allows
59 drivers to disable certain options if it is not supported. */
60 const char * const *v4l2_ctrl_get_menu(u32 id
)
62 static const char * const mpeg_audio_sampling_freq
[] = {
68 static const char * const mpeg_audio_encoding
[] = {
76 static const char * const mpeg_audio_l1_bitrate
[] = {
93 static const char * const mpeg_audio_l2_bitrate
[] = {
110 static const char * const mpeg_audio_l3_bitrate
[] = {
127 static const char * const mpeg_audio_ac3_bitrate
[] = {
149 static const char * const mpeg_audio_mode
[] = {
156 static const char * const mpeg_audio_mode_extension
[] = {
163 static const char * const mpeg_audio_emphasis
[] = {
169 static const char * const mpeg_audio_crc
[] = {
174 static const char * const mpeg_video_encoding
[] = {
180 static const char * const mpeg_video_aspect
[] = {
187 static const char * const mpeg_video_bitrate_mode
[] = {
192 static const char * const mpeg_stream_type
[] = {
193 "MPEG-2 Program Stream",
194 "MPEG-2 Transport Stream",
195 "MPEG-1 System Stream",
196 "MPEG-2 DVD-compatible Stream",
197 "MPEG-1 VCD-compatible Stream",
198 "MPEG-2 SVCD-compatible Stream",
201 static const char * const mpeg_stream_vbi_fmt
[] = {
203 "Private packet, IVTV format",
206 static const char * const camera_power_line_frequency
[] = {
212 static const char * const camera_exposure_auto
[] = {
215 "Shutter Priority Mode",
216 "Aperture Priority Mode",
219 static const char * const colorfx
[] = {
232 static const char * const tune_preemphasis
[] = {
240 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
:
241 return mpeg_audio_sampling_freq
;
242 case V4L2_CID_MPEG_AUDIO_ENCODING
:
243 return mpeg_audio_encoding
;
244 case V4L2_CID_MPEG_AUDIO_L1_BITRATE
:
245 return mpeg_audio_l1_bitrate
;
246 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
:
247 return mpeg_audio_l2_bitrate
;
248 case V4L2_CID_MPEG_AUDIO_L3_BITRATE
:
249 return mpeg_audio_l3_bitrate
;
250 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
251 return mpeg_audio_ac3_bitrate
;
252 case V4L2_CID_MPEG_AUDIO_MODE
:
253 return mpeg_audio_mode
;
254 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION
:
255 return mpeg_audio_mode_extension
;
256 case V4L2_CID_MPEG_AUDIO_EMPHASIS
:
257 return mpeg_audio_emphasis
;
258 case V4L2_CID_MPEG_AUDIO_CRC
:
259 return mpeg_audio_crc
;
260 case V4L2_CID_MPEG_VIDEO_ENCODING
:
261 return mpeg_video_encoding
;
262 case V4L2_CID_MPEG_VIDEO_ASPECT
:
263 return mpeg_video_aspect
;
264 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
265 return mpeg_video_bitrate_mode
;
266 case V4L2_CID_MPEG_STREAM_TYPE
:
267 return mpeg_stream_type
;
268 case V4L2_CID_MPEG_STREAM_VBI_FMT
:
269 return mpeg_stream_vbi_fmt
;
270 case V4L2_CID_POWER_LINE_FREQUENCY
:
271 return camera_power_line_frequency
;
272 case V4L2_CID_EXPOSURE_AUTO
:
273 return camera_exposure_auto
;
274 case V4L2_CID_COLORFX
:
276 case V4L2_CID_TUNE_PREEMPHASIS
:
277 return tune_preemphasis
;
282 EXPORT_SYMBOL(v4l2_ctrl_get_menu
);
284 /* Return the control name. */
285 const char *v4l2_ctrl_get_name(u32 id
)
289 /* Keep the order of the 'case's the same as in videodev2.h! */
290 case V4L2_CID_USER_CLASS
: return "User Controls";
291 case V4L2_CID_BRIGHTNESS
: return "Brightness";
292 case V4L2_CID_CONTRAST
: return "Contrast";
293 case V4L2_CID_SATURATION
: return "Saturation";
294 case V4L2_CID_HUE
: return "Hue";
295 case V4L2_CID_AUDIO_VOLUME
: return "Volume";
296 case V4L2_CID_AUDIO_BALANCE
: return "Balance";
297 case V4L2_CID_AUDIO_BASS
: return "Bass";
298 case V4L2_CID_AUDIO_TREBLE
: return "Treble";
299 case V4L2_CID_AUDIO_MUTE
: return "Mute";
300 case V4L2_CID_AUDIO_LOUDNESS
: return "Loudness";
301 case V4L2_CID_BLACK_LEVEL
: return "Black Level";
302 case V4L2_CID_AUTO_WHITE_BALANCE
: return "White Balance, Automatic";
303 case V4L2_CID_DO_WHITE_BALANCE
: return "Do White Balance";
304 case V4L2_CID_RED_BALANCE
: return "Red Balance";
305 case V4L2_CID_BLUE_BALANCE
: return "Blue Balance";
306 case V4L2_CID_GAMMA
: return "Gamma";
307 case V4L2_CID_EXPOSURE
: return "Exposure";
308 case V4L2_CID_AUTOGAIN
: return "Gain, Automatic";
309 case V4L2_CID_GAIN
: return "Gain";
310 case V4L2_CID_HFLIP
: return "Horizontal Flip";
311 case V4L2_CID_VFLIP
: return "Vertical Flip";
312 case V4L2_CID_HCENTER
: return "Horizontal Center";
313 case V4L2_CID_VCENTER
: return "Vertical Center";
314 case V4L2_CID_POWER_LINE_FREQUENCY
: return "Power Line Frequency";
315 case V4L2_CID_HUE_AUTO
: return "Hue, Automatic";
316 case V4L2_CID_WHITE_BALANCE_TEMPERATURE
: return "White Balance Temperature";
317 case V4L2_CID_SHARPNESS
: return "Sharpness";
318 case V4L2_CID_BACKLIGHT_COMPENSATION
: return "Backlight Compensation";
319 case V4L2_CID_CHROMA_AGC
: return "Chroma AGC";
320 case V4L2_CID_COLOR_KILLER
: return "Color Killer";
321 case V4L2_CID_COLORFX
: return "Color Effects";
322 case V4L2_CID_AUTOBRIGHTNESS
: return "Brightness, Automatic";
323 case V4L2_CID_BAND_STOP_FILTER
: return "Band-Stop Filter";
324 case V4L2_CID_ROTATE
: return "Rotate";
325 case V4L2_CID_BG_COLOR
: return "Background Color";
326 case V4L2_CID_CHROMA_GAIN
: return "Chroma Gain";
327 case V4L2_CID_ILLUMINATORS_1
: return "Illuminator 1";
328 case V4L2_CID_ILLUMINATORS_2
: return "Illuminator 2";
331 /* Keep the order of the 'case's the same as in videodev2.h! */
332 case V4L2_CID_MPEG_CLASS
: return "MPEG Encoder Controls";
333 case V4L2_CID_MPEG_STREAM_TYPE
: return "Stream Type";
334 case V4L2_CID_MPEG_STREAM_PID_PMT
: return "Stream PMT Program ID";
335 case V4L2_CID_MPEG_STREAM_PID_AUDIO
: return "Stream Audio Program ID";
336 case V4L2_CID_MPEG_STREAM_PID_VIDEO
: return "Stream Video Program ID";
337 case V4L2_CID_MPEG_STREAM_PID_PCR
: return "Stream PCR Program ID";
338 case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO
: return "Stream PES Audio ID";
339 case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO
: return "Stream PES Video ID";
340 case V4L2_CID_MPEG_STREAM_VBI_FMT
: return "Stream VBI Format";
341 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
: return "Audio Sampling Frequency";
342 case V4L2_CID_MPEG_AUDIO_ENCODING
: return "Audio Encoding";
343 case V4L2_CID_MPEG_AUDIO_L1_BITRATE
: return "Audio Layer I Bitrate";
344 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
: return "Audio Layer II Bitrate";
345 case V4L2_CID_MPEG_AUDIO_L3_BITRATE
: return "Audio Layer III Bitrate";
346 case V4L2_CID_MPEG_AUDIO_MODE
: return "Audio Stereo Mode";
347 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION
: return "Audio Stereo Mode Extension";
348 case V4L2_CID_MPEG_AUDIO_EMPHASIS
: return "Audio Emphasis";
349 case V4L2_CID_MPEG_AUDIO_CRC
: return "Audio CRC";
350 case V4L2_CID_MPEG_AUDIO_MUTE
: return "Audio Mute";
351 case V4L2_CID_MPEG_AUDIO_AAC_BITRATE
: return "Audio AAC Bitrate";
352 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
: return "Audio AC-3 Bitrate";
353 case V4L2_CID_MPEG_VIDEO_ENCODING
: return "Video Encoding";
354 case V4L2_CID_MPEG_VIDEO_ASPECT
: return "Video Aspect";
355 case V4L2_CID_MPEG_VIDEO_B_FRAMES
: return "Video B Frames";
356 case V4L2_CID_MPEG_VIDEO_GOP_SIZE
: return "Video GOP Size";
357 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE
: return "Video GOP Closure";
358 case V4L2_CID_MPEG_VIDEO_PULLDOWN
: return "Video Pulldown";
359 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
: return "Video Bitrate Mode";
360 case V4L2_CID_MPEG_VIDEO_BITRATE
: return "Video Bitrate";
361 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK
: return "Video Peak Bitrate";
362 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION
: return "Video Temporal Decimation";
363 case V4L2_CID_MPEG_VIDEO_MUTE
: return "Video Mute";
364 case V4L2_CID_MPEG_VIDEO_MUTE_YUV
: return "Video Mute YUV";
366 /* CAMERA controls */
367 /* Keep the order of the 'case's the same as in videodev2.h! */
368 case V4L2_CID_CAMERA_CLASS
: return "Camera Controls";
369 case V4L2_CID_EXPOSURE_AUTO
: return "Auto Exposure";
370 case V4L2_CID_EXPOSURE_ABSOLUTE
: return "Exposure Time, Absolute";
371 case V4L2_CID_EXPOSURE_AUTO_PRIORITY
: return "Exposure, Dynamic Framerate";
372 case V4L2_CID_PAN_RELATIVE
: return "Pan, Relative";
373 case V4L2_CID_TILT_RELATIVE
: return "Tilt, Relative";
374 case V4L2_CID_PAN_RESET
: return "Pan, Reset";
375 case V4L2_CID_TILT_RESET
: return "Tilt, Reset";
376 case V4L2_CID_PAN_ABSOLUTE
: return "Pan, Absolute";
377 case V4L2_CID_TILT_ABSOLUTE
: return "Tilt, Absolute";
378 case V4L2_CID_FOCUS_ABSOLUTE
: return "Focus, Absolute";
379 case V4L2_CID_FOCUS_RELATIVE
: return "Focus, Relative";
380 case V4L2_CID_FOCUS_AUTO
: return "Focus, Automatic";
381 case V4L2_CID_ZOOM_ABSOLUTE
: return "Zoom, Absolute";
382 case V4L2_CID_ZOOM_RELATIVE
: return "Zoom, Relative";
383 case V4L2_CID_ZOOM_CONTINUOUS
: return "Zoom, Continuous";
384 case V4L2_CID_PRIVACY
: return "Privacy";
385 case V4L2_CID_IRIS_ABSOLUTE
: return "Iris, Absolute";
386 case V4L2_CID_IRIS_RELATIVE
: return "Iris, Relative";
388 /* FM Radio Modulator control */
389 /* Keep the order of the 'case's the same as in videodev2.h! */
390 case V4L2_CID_FM_TX_CLASS
: return "FM Radio Modulator Controls";
391 case V4L2_CID_RDS_TX_DEVIATION
: return "RDS Signal Deviation";
392 case V4L2_CID_RDS_TX_PI
: return "RDS Program ID";
393 case V4L2_CID_RDS_TX_PTY
: return "RDS Program Type";
394 case V4L2_CID_RDS_TX_PS_NAME
: return "RDS PS Name";
395 case V4L2_CID_RDS_TX_RADIO_TEXT
: return "RDS Radio Text";
396 case V4L2_CID_AUDIO_LIMITER_ENABLED
: return "Audio Limiter Feature Enabled";
397 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME
: return "Audio Limiter Release Time";
398 case V4L2_CID_AUDIO_LIMITER_DEVIATION
: return "Audio Limiter Deviation";
399 case V4L2_CID_AUDIO_COMPRESSION_ENABLED
: return "Audio Compression Feature Enabled";
400 case V4L2_CID_AUDIO_COMPRESSION_GAIN
: return "Audio Compression Gain";
401 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD
: return "Audio Compression Threshold";
402 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME
: return "Audio Compression Attack Time";
403 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME
: return "Audio Compression Release Time";
404 case V4L2_CID_PILOT_TONE_ENABLED
: return "Pilot Tone Feature Enabled";
405 case V4L2_CID_PILOT_TONE_DEVIATION
: return "Pilot Tone Deviation";
406 case V4L2_CID_PILOT_TONE_FREQUENCY
: return "Pilot Tone Frequency";
407 case V4L2_CID_TUNE_PREEMPHASIS
: return "Pre-emphasis settings";
408 case V4L2_CID_TUNE_POWER_LEVEL
: return "Tune Power Level";
409 case V4L2_CID_TUNE_ANTENNA_CAPACITOR
: return "Tune Antenna Capacitor";
415 EXPORT_SYMBOL(v4l2_ctrl_get_name
);
417 void v4l2_ctrl_fill(u32 id
, const char **name
, enum v4l2_ctrl_type
*type
,
418 s32
*min
, s32
*max
, s32
*step
, s32
*def
, u32
*flags
)
420 *name
= v4l2_ctrl_get_name(id
);
424 case V4L2_CID_AUDIO_MUTE
:
425 case V4L2_CID_AUDIO_LOUDNESS
:
426 case V4L2_CID_AUTO_WHITE_BALANCE
:
427 case V4L2_CID_AUTOGAIN
:
430 case V4L2_CID_HUE_AUTO
:
431 case V4L2_CID_CHROMA_AGC
:
432 case V4L2_CID_COLOR_KILLER
:
433 case V4L2_CID_MPEG_AUDIO_MUTE
:
434 case V4L2_CID_MPEG_VIDEO_MUTE
:
435 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE
:
436 case V4L2_CID_MPEG_VIDEO_PULLDOWN
:
437 case V4L2_CID_EXPOSURE_AUTO_PRIORITY
:
438 case V4L2_CID_FOCUS_AUTO
:
439 case V4L2_CID_PRIVACY
:
440 case V4L2_CID_AUDIO_LIMITER_ENABLED
:
441 case V4L2_CID_AUDIO_COMPRESSION_ENABLED
:
442 case V4L2_CID_PILOT_TONE_ENABLED
:
443 case V4L2_CID_ILLUMINATORS_1
:
444 case V4L2_CID_ILLUMINATORS_2
:
445 *type
= V4L2_CTRL_TYPE_BOOLEAN
;
449 case V4L2_CID_PAN_RESET
:
450 case V4L2_CID_TILT_RESET
:
451 *type
= V4L2_CTRL_TYPE_BUTTON
;
452 *flags
|= V4L2_CTRL_FLAG_WRITE_ONLY
;
453 *min
= *max
= *step
= *def
= 0;
455 case V4L2_CID_POWER_LINE_FREQUENCY
:
456 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
:
457 case V4L2_CID_MPEG_AUDIO_ENCODING
:
458 case V4L2_CID_MPEG_AUDIO_L1_BITRATE
:
459 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
:
460 case V4L2_CID_MPEG_AUDIO_L3_BITRATE
:
461 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
462 case V4L2_CID_MPEG_AUDIO_MODE
:
463 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION
:
464 case V4L2_CID_MPEG_AUDIO_EMPHASIS
:
465 case V4L2_CID_MPEG_AUDIO_CRC
:
466 case V4L2_CID_MPEG_VIDEO_ENCODING
:
467 case V4L2_CID_MPEG_VIDEO_ASPECT
:
468 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
469 case V4L2_CID_MPEG_STREAM_TYPE
:
470 case V4L2_CID_MPEG_STREAM_VBI_FMT
:
471 case V4L2_CID_EXPOSURE_AUTO
:
472 case V4L2_CID_COLORFX
:
473 case V4L2_CID_TUNE_PREEMPHASIS
:
474 *type
= V4L2_CTRL_TYPE_MENU
;
476 case V4L2_CID_RDS_TX_PS_NAME
:
477 case V4L2_CID_RDS_TX_RADIO_TEXT
:
478 *type
= V4L2_CTRL_TYPE_STRING
;
480 case V4L2_CID_USER_CLASS
:
481 case V4L2_CID_CAMERA_CLASS
:
482 case V4L2_CID_MPEG_CLASS
:
483 case V4L2_CID_FM_TX_CLASS
:
484 *type
= V4L2_CTRL_TYPE_CTRL_CLASS
;
485 /* You can neither read not write these */
486 *flags
|= V4L2_CTRL_FLAG_READ_ONLY
| V4L2_CTRL_FLAG_WRITE_ONLY
;
487 *min
= *max
= *step
= *def
= 0;
489 case V4L2_CID_BG_COLOR
:
490 *type
= V4L2_CTRL_TYPE_INTEGER
;
493 /* Max is calculated as RGB888 that is 2^24 */
497 *type
= V4L2_CTRL_TYPE_INTEGER
;
501 case V4L2_CID_MPEG_AUDIO_ENCODING
:
502 case V4L2_CID_MPEG_AUDIO_MODE
:
503 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
504 case V4L2_CID_MPEG_VIDEO_B_FRAMES
:
505 case V4L2_CID_MPEG_STREAM_TYPE
:
506 *flags
|= V4L2_CTRL_FLAG_UPDATE
;
508 case V4L2_CID_AUDIO_VOLUME
:
509 case V4L2_CID_AUDIO_BALANCE
:
510 case V4L2_CID_AUDIO_BASS
:
511 case V4L2_CID_AUDIO_TREBLE
:
512 case V4L2_CID_BRIGHTNESS
:
513 case V4L2_CID_CONTRAST
:
514 case V4L2_CID_SATURATION
:
516 case V4L2_CID_RED_BALANCE
:
517 case V4L2_CID_BLUE_BALANCE
:
519 case V4L2_CID_SHARPNESS
:
520 case V4L2_CID_CHROMA_GAIN
:
521 case V4L2_CID_RDS_TX_DEVIATION
:
522 case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME
:
523 case V4L2_CID_AUDIO_LIMITER_DEVIATION
:
524 case V4L2_CID_AUDIO_COMPRESSION_GAIN
:
525 case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD
:
526 case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME
:
527 case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME
:
528 case V4L2_CID_PILOT_TONE_DEVIATION
:
529 case V4L2_CID_PILOT_TONE_FREQUENCY
:
530 case V4L2_CID_TUNE_POWER_LEVEL
:
531 case V4L2_CID_TUNE_ANTENNA_CAPACITOR
:
532 *flags
|= V4L2_CTRL_FLAG_SLIDER
;
534 case V4L2_CID_PAN_RELATIVE
:
535 case V4L2_CID_TILT_RELATIVE
:
536 case V4L2_CID_FOCUS_RELATIVE
:
537 case V4L2_CID_IRIS_RELATIVE
:
538 case V4L2_CID_ZOOM_RELATIVE
:
539 *flags
|= V4L2_CTRL_FLAG_WRITE_ONLY
;
543 EXPORT_SYMBOL(v4l2_ctrl_fill
);
545 /* Helper function to determine whether the control type is compatible with
547 static bool type_is_int(const struct v4l2_ctrl
*ctrl
)
549 switch (ctrl
->type
) {
550 case V4L2_CTRL_TYPE_INTEGER64
:
551 case V4L2_CTRL_TYPE_STRING
:
552 /* Nope, these need v4l2_ext_control */
559 /* Helper function: copy the current control value back to the caller */
560 static int cur_to_user(struct v4l2_ext_control
*c
,
561 struct v4l2_ctrl
*ctrl
)
565 switch (ctrl
->type
) {
566 case V4L2_CTRL_TYPE_STRING
:
567 len
= strlen(ctrl
->cur
.string
);
568 if (c
->size
< len
+ 1) {
572 return copy_to_user(c
->string
, ctrl
->cur
.string
,
573 len
+ 1) ? -EFAULT
: 0;
574 case V4L2_CTRL_TYPE_INTEGER64
:
575 c
->value64
= ctrl
->cur
.val64
;
578 c
->value
= ctrl
->cur
.val
;
584 /* Helper function: copy the caller-provider value as the new control value */
585 static int user_to_new(struct v4l2_ext_control
*c
,
586 struct v4l2_ctrl
*ctrl
)
592 switch (ctrl
->type
) {
593 case V4L2_CTRL_TYPE_INTEGER64
:
594 ctrl
->val64
= c
->value64
;
596 case V4L2_CTRL_TYPE_STRING
:
600 if (size
> ctrl
->maximum
+ 1)
601 size
= ctrl
->maximum
+ 1;
602 ret
= copy_from_user(ctrl
->string
, c
->string
, size
);
604 char last
= ctrl
->string
[size
- 1];
606 ctrl
->string
[size
- 1] = 0;
607 /* If the string was longer than ctrl->maximum,
608 then return an error. */
609 if (strlen(ctrl
->string
) == ctrl
->maximum
&& last
)
612 return ret
? -EFAULT
: 0;
614 ctrl
->val
= c
->value
;
620 /* Helper function: copy the new control value back to the caller */
621 static int new_to_user(struct v4l2_ext_control
*c
,
622 struct v4l2_ctrl
*ctrl
)
626 switch (ctrl
->type
) {
627 case V4L2_CTRL_TYPE_STRING
:
628 len
= strlen(ctrl
->string
);
629 if (c
->size
< len
+ 1) {
630 c
->size
= ctrl
->maximum
+ 1;
633 return copy_to_user(c
->string
, ctrl
->string
,
634 len
+ 1) ? -EFAULT
: 0;
635 case V4L2_CTRL_TYPE_INTEGER64
:
636 c
->value64
= ctrl
->val64
;
639 c
->value
= ctrl
->val
;
645 static int ctrl_to_user(struct v4l2_ext_control
*c
,
646 struct v4l2_ctrl
*ctrl
)
648 if (ctrl
->is_volatile
)
649 return new_to_user(c
, ctrl
);
650 return cur_to_user(c
, ctrl
);
653 static int ctrl_is_volatile(struct v4l2_ext_control
*c
,
654 struct v4l2_ctrl
*ctrl
)
656 return ctrl
->is_volatile
;
659 /* Copy the new value to the current value. */
660 static void new_to_cur(struct v4l2_ctrl
*ctrl
, bool update_inactive
)
664 switch (ctrl
->type
) {
665 case V4L2_CTRL_TYPE_STRING
:
666 /* strings are always 0-terminated */
667 strcpy(ctrl
->cur
.string
, ctrl
->string
);
669 case V4L2_CTRL_TYPE_INTEGER64
:
670 ctrl
->cur
.val64
= ctrl
->val64
;
673 ctrl
->cur
.val
= ctrl
->val
;
676 if (update_inactive
) {
677 ctrl
->flags
&= ~V4L2_CTRL_FLAG_INACTIVE
;
678 if (!is_cur_manual(ctrl
->cluster
[0]))
679 ctrl
->flags
|= V4L2_CTRL_FLAG_INACTIVE
;
683 /* Copy the current value to the new value */
684 static void cur_to_new(struct v4l2_ctrl
*ctrl
)
688 switch (ctrl
->type
) {
689 case V4L2_CTRL_TYPE_STRING
:
690 /* strings are always 0-terminated */
691 strcpy(ctrl
->string
, ctrl
->cur
.string
);
693 case V4L2_CTRL_TYPE_INTEGER64
:
694 ctrl
->val64
= ctrl
->cur
.val64
;
697 ctrl
->val
= ctrl
->cur
.val
;
702 /* Return non-zero if one or more of the controls in the cluster has a new
703 value that differs from the current value. */
704 static int cluster_changed(struct v4l2_ctrl
*master
)
709 for (i
= 0; !diff
&& i
< master
->ncontrols
; i
++) {
710 struct v4l2_ctrl
*ctrl
= master
->cluster
[i
];
714 switch (ctrl
->type
) {
715 case V4L2_CTRL_TYPE_BUTTON
:
716 /* Button controls are always 'different' */
718 case V4L2_CTRL_TYPE_STRING
:
719 /* strings are always 0-terminated */
720 diff
= strcmp(ctrl
->string
, ctrl
->cur
.string
);
722 case V4L2_CTRL_TYPE_INTEGER64
:
723 diff
= ctrl
->val64
!= ctrl
->cur
.val64
;
726 diff
= ctrl
->val
!= ctrl
->cur
.val
;
733 /* Validate a new control */
734 static int validate_new(struct v4l2_ctrl
*ctrl
)
737 char *s
= ctrl
->string
;
741 switch (ctrl
->type
) {
742 case V4L2_CTRL_TYPE_INTEGER
:
743 /* Round towards the closest legal value */
744 val
+= ctrl
->step
/ 2;
745 if (val
< ctrl
->minimum
)
747 if (val
> ctrl
->maximum
)
749 offset
= val
- ctrl
->minimum
;
750 offset
= ctrl
->step
* (offset
/ ctrl
->step
);
751 val
= ctrl
->minimum
+ offset
;
755 case V4L2_CTRL_TYPE_BOOLEAN
:
756 ctrl
->val
= !!ctrl
->val
;
759 case V4L2_CTRL_TYPE_MENU
:
760 if (val
< ctrl
->minimum
|| val
> ctrl
->maximum
)
762 if (ctrl
->qmenu
[val
][0] == '\0' ||
763 (ctrl
->menu_skip_mask
& (1 << val
)))
767 case V4L2_CTRL_TYPE_BUTTON
:
768 case V4L2_CTRL_TYPE_CTRL_CLASS
:
772 case V4L2_CTRL_TYPE_INTEGER64
:
775 case V4L2_CTRL_TYPE_STRING
:
777 if (len
< ctrl
->minimum
)
779 if ((len
- ctrl
->minimum
) % ctrl
->step
)
788 static inline u32
node2id(struct list_head
*node
)
790 return list_entry(node
, struct v4l2_ctrl_ref
, node
)->ctrl
->id
;
793 /* Set the handler's error code if it wasn't set earlier already */
794 static inline int handler_set_err(struct v4l2_ctrl_handler
*hdl
, int err
)
801 /* Initialize the handler */
802 int v4l2_ctrl_handler_init(struct v4l2_ctrl_handler
*hdl
,
803 unsigned nr_of_controls_hint
)
805 mutex_init(&hdl
->lock
);
806 INIT_LIST_HEAD(&hdl
->ctrls
);
807 INIT_LIST_HEAD(&hdl
->ctrl_refs
);
808 hdl
->nr_of_buckets
= 1 + nr_of_controls_hint
/ 8;
809 hdl
->buckets
= kzalloc(sizeof(hdl
->buckets
[0]) * hdl
->nr_of_buckets
,
811 hdl
->error
= hdl
->buckets
? 0 : -ENOMEM
;
814 EXPORT_SYMBOL(v4l2_ctrl_handler_init
);
816 /* Free all controls and control refs */
817 void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler
*hdl
)
819 struct v4l2_ctrl_ref
*ref
, *next_ref
;
820 struct v4l2_ctrl
*ctrl
, *next_ctrl
;
822 if (hdl
== NULL
|| hdl
->buckets
== NULL
)
825 mutex_lock(&hdl
->lock
);
827 list_for_each_entry_safe(ref
, next_ref
, &hdl
->ctrl_refs
, node
) {
828 list_del(&ref
->node
);
831 /* Free all controls owned by the handler */
832 list_for_each_entry_safe(ctrl
, next_ctrl
, &hdl
->ctrls
, node
) {
833 list_del(&ctrl
->node
);
840 mutex_unlock(&hdl
->lock
);
842 EXPORT_SYMBOL(v4l2_ctrl_handler_free
);
844 /* For backwards compatibility: V4L2_CID_PRIVATE_BASE should no longer
845 be used except in G_CTRL, S_CTRL, QUERYCTRL and QUERYMENU when dealing
846 with applications that do not use the NEXT_CTRL flag.
848 We just find the n-th private user control. It's O(N), but that should not
849 be an issue in this particular case. */
850 static struct v4l2_ctrl_ref
*find_private_ref(
851 struct v4l2_ctrl_handler
*hdl
, u32 id
)
853 struct v4l2_ctrl_ref
*ref
;
855 id
-= V4L2_CID_PRIVATE_BASE
;
856 list_for_each_entry(ref
, &hdl
->ctrl_refs
, node
) {
857 /* Search for private user controls that are compatible with
859 if (V4L2_CTRL_ID2CLASS(ref
->ctrl
->id
) == V4L2_CTRL_CLASS_USER
&&
860 V4L2_CTRL_DRIVER_PRIV(ref
->ctrl
->id
)) {
861 if (!type_is_int(ref
->ctrl
))
871 /* Find a control with the given ID. */
872 static struct v4l2_ctrl_ref
*find_ref(struct v4l2_ctrl_handler
*hdl
, u32 id
)
874 struct v4l2_ctrl_ref
*ref
;
877 id
&= V4L2_CTRL_ID_MASK
;
879 /* Old-style private controls need special handling */
880 if (id
>= V4L2_CID_PRIVATE_BASE
)
881 return find_private_ref(hdl
, id
);
882 bucket
= id
% hdl
->nr_of_buckets
;
884 /* Simple optimization: cache the last control found */
885 if (hdl
->cached
&& hdl
->cached
->ctrl
->id
== id
)
888 /* Not in cache, search the hash */
889 ref
= hdl
->buckets
? hdl
->buckets
[bucket
] : NULL
;
890 while (ref
&& ref
->ctrl
->id
!= id
)
894 hdl
->cached
= ref
; /* cache it! */
898 /* Find a control with the given ID. Take the handler's lock first. */
899 static struct v4l2_ctrl_ref
*find_ref_lock(
900 struct v4l2_ctrl_handler
*hdl
, u32 id
)
902 struct v4l2_ctrl_ref
*ref
= NULL
;
905 mutex_lock(&hdl
->lock
);
906 ref
= find_ref(hdl
, id
);
907 mutex_unlock(&hdl
->lock
);
912 /* Find a control with the given ID. */
913 struct v4l2_ctrl
*v4l2_ctrl_find(struct v4l2_ctrl_handler
*hdl
, u32 id
)
915 struct v4l2_ctrl_ref
*ref
= find_ref_lock(hdl
, id
);
917 return ref
? ref
->ctrl
: NULL
;
919 EXPORT_SYMBOL(v4l2_ctrl_find
);
921 /* Allocate a new v4l2_ctrl_ref and hook it into the handler. */
922 static int handler_new_ref(struct v4l2_ctrl_handler
*hdl
,
923 struct v4l2_ctrl
*ctrl
)
925 struct v4l2_ctrl_ref
*ref
;
926 struct v4l2_ctrl_ref
*new_ref
;
928 u32 class_ctrl
= V4L2_CTRL_ID2CLASS(id
) | 1;
929 int bucket
= id
% hdl
->nr_of_buckets
; /* which bucket to use */
931 /* Automatically add the control class if it is not yet present. */
932 if (id
!= class_ctrl
&& find_ref_lock(hdl
, class_ctrl
) == NULL
)
933 if (!v4l2_ctrl_new_std(hdl
, NULL
, class_ctrl
, 0, 0, 0, 0))
939 new_ref
= kzalloc(sizeof(*new_ref
), GFP_KERNEL
);
941 return handler_set_err(hdl
, -ENOMEM
);
942 new_ref
->ctrl
= ctrl
;
943 if (ctrl
->handler
== hdl
) {
944 /* By default each control starts in a cluster of its own.
945 new_ref->ctrl is basically a cluster array with one
946 element, so that's perfect to use as the cluster pointer.
947 But only do this for the handler that owns the control. */
948 ctrl
->cluster
= &new_ref
->ctrl
;
952 INIT_LIST_HEAD(&new_ref
->node
);
954 mutex_lock(&hdl
->lock
);
956 /* Add immediately at the end of the list if the list is empty, or if
957 the last element in the list has a lower ID.
958 This ensures that when elements are added in ascending order the
959 insertion is an O(1) operation. */
960 if (list_empty(&hdl
->ctrl_refs
) || id
> node2id(hdl
->ctrl_refs
.prev
)) {
961 list_add_tail(&new_ref
->node
, &hdl
->ctrl_refs
);
965 /* Find insert position in sorted list */
966 list_for_each_entry(ref
, &hdl
->ctrl_refs
, node
) {
967 if (ref
->ctrl
->id
< id
)
969 /* Don't add duplicates */
970 if (ref
->ctrl
->id
== id
) {
974 list_add(&new_ref
->node
, ref
->node
.prev
);
979 /* Insert the control node in the hash */
980 new_ref
->next
= hdl
->buckets
[bucket
];
981 hdl
->buckets
[bucket
] = new_ref
;
984 mutex_unlock(&hdl
->lock
);
988 /* Add a new control */
989 static struct v4l2_ctrl
*v4l2_ctrl_new(struct v4l2_ctrl_handler
*hdl
,
990 const struct v4l2_ctrl_ops
*ops
,
991 u32 id
, const char *name
, enum v4l2_ctrl_type type
,
992 s32 min
, s32 max
, u32 step
, s32 def
,
993 u32 flags
, const char * const *qmenu
, void *priv
)
995 struct v4l2_ctrl
*ctrl
;
996 unsigned sz_extra
= 0;
1002 if (id
== 0 || name
== NULL
|| id
>= V4L2_CID_PRIVATE_BASE
||
1004 (type
== V4L2_CTRL_TYPE_INTEGER
&& step
== 0) ||
1005 (type
== V4L2_CTRL_TYPE_MENU
&& qmenu
== NULL
) ||
1006 (type
== V4L2_CTRL_TYPE_STRING
&& max
== 0)) {
1007 handler_set_err(hdl
, -ERANGE
);
1010 if ((type
== V4L2_CTRL_TYPE_INTEGER
||
1011 type
== V4L2_CTRL_TYPE_MENU
||
1012 type
== V4L2_CTRL_TYPE_BOOLEAN
) &&
1013 (def
< min
|| def
> max
)) {
1014 handler_set_err(hdl
, -ERANGE
);
1018 if (type
== V4L2_CTRL_TYPE_BUTTON
)
1019 flags
|= V4L2_CTRL_FLAG_WRITE_ONLY
;
1020 else if (type
== V4L2_CTRL_TYPE_CTRL_CLASS
)
1021 flags
|= V4L2_CTRL_FLAG_READ_ONLY
;
1022 else if (type
== V4L2_CTRL_TYPE_STRING
)
1023 sz_extra
+= 2 * (max
+ 1);
1025 ctrl
= kzalloc(sizeof(*ctrl
) + sz_extra
, GFP_KERNEL
);
1027 handler_set_err(hdl
, -ENOMEM
);
1031 INIT_LIST_HEAD(&ctrl
->node
);
1032 ctrl
->handler
= hdl
;
1037 ctrl
->flags
= flags
;
1038 ctrl
->minimum
= min
;
1039 ctrl
->maximum
= max
;
1041 ctrl
->qmenu
= qmenu
;
1043 ctrl
->cur
.val
= ctrl
->val
= ctrl
->default_value
= def
;
1045 if (ctrl
->type
== V4L2_CTRL_TYPE_STRING
) {
1046 ctrl
->cur
.string
= (char *)&ctrl
[1] + sz_extra
- (max
+ 1);
1047 ctrl
->string
= (char *)&ctrl
[1] + sz_extra
- 2 * (max
+ 1);
1049 memset(ctrl
->cur
.string
, ' ', ctrl
->minimum
);
1051 if (handler_new_ref(hdl
, ctrl
)) {
1055 mutex_lock(&hdl
->lock
);
1056 list_add_tail(&ctrl
->node
, &hdl
->ctrls
);
1057 mutex_unlock(&hdl
->lock
);
1061 struct v4l2_ctrl
*v4l2_ctrl_new_custom(struct v4l2_ctrl_handler
*hdl
,
1062 const struct v4l2_ctrl_config
*cfg
, void *priv
)
1065 struct v4l2_ctrl
*ctrl
;
1066 const char *name
= cfg
->name
;
1067 const char * const *qmenu
= cfg
->qmenu
;
1068 enum v4l2_ctrl_type type
= cfg
->type
;
1069 u32 flags
= cfg
->flags
;
1072 u32 step
= cfg
->step
;
1076 v4l2_ctrl_fill(cfg
->id
, &name
, &type
, &min
, &max
, &step
,
1079 is_menu
= (cfg
->type
== V4L2_CTRL_TYPE_MENU
);
1083 WARN_ON(cfg
->menu_skip_mask
);
1084 if (is_menu
&& qmenu
== NULL
)
1085 qmenu
= v4l2_ctrl_get_menu(cfg
->id
);
1087 ctrl
= v4l2_ctrl_new(hdl
, cfg
->ops
, cfg
->id
, name
,
1089 is_menu
? cfg
->menu_skip_mask
: step
,
1090 def
, flags
, qmenu
, priv
);
1092 ctrl
->is_private
= cfg
->is_private
;
1093 ctrl
->is_volatile
= cfg
->is_volatile
;
1097 EXPORT_SYMBOL(v4l2_ctrl_new_custom
);
1099 /* Helper function for standard non-menu controls */
1100 struct v4l2_ctrl
*v4l2_ctrl_new_std(struct v4l2_ctrl_handler
*hdl
,
1101 const struct v4l2_ctrl_ops
*ops
,
1102 u32 id
, s32 min
, s32 max
, u32 step
, s32 def
)
1105 enum v4l2_ctrl_type type
;
1108 v4l2_ctrl_fill(id
, &name
, &type
, &min
, &max
, &step
, &def
, &flags
);
1109 if (type
== V4L2_CTRL_TYPE_MENU
) {
1110 handler_set_err(hdl
, -EINVAL
);
1113 return v4l2_ctrl_new(hdl
, ops
, id
, name
, type
,
1114 min
, max
, step
, def
, flags
, NULL
, NULL
);
1116 EXPORT_SYMBOL(v4l2_ctrl_new_std
);
1118 /* Helper function for standard menu controls */
1119 struct v4l2_ctrl
*v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler
*hdl
,
1120 const struct v4l2_ctrl_ops
*ops
,
1121 u32 id
, s32 max
, s32 mask
, s32 def
)
1123 const char * const *qmenu
= v4l2_ctrl_get_menu(id
);
1125 enum v4l2_ctrl_type type
;
1130 v4l2_ctrl_fill(id
, &name
, &type
, &min
, &max
, &step
, &def
, &flags
);
1131 if (type
!= V4L2_CTRL_TYPE_MENU
) {
1132 handler_set_err(hdl
, -EINVAL
);
1135 return v4l2_ctrl_new(hdl
, ops
, id
, name
, type
,
1136 0, max
, mask
, def
, flags
, qmenu
, NULL
);
1138 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu
);
1140 /* Add a control from another handler to this handler */
1141 struct v4l2_ctrl
*v4l2_ctrl_add_ctrl(struct v4l2_ctrl_handler
*hdl
,
1142 struct v4l2_ctrl
*ctrl
)
1144 if (hdl
== NULL
|| hdl
->error
)
1147 handler_set_err(hdl
, -EINVAL
);
1150 if (ctrl
->handler
== hdl
)
1152 return handler_new_ref(hdl
, ctrl
) ? NULL
: ctrl
;
1154 EXPORT_SYMBOL(v4l2_ctrl_add_ctrl
);
1156 /* Add the controls from another handler to our own. */
1157 int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler
*hdl
,
1158 struct v4l2_ctrl_handler
*add
)
1160 struct v4l2_ctrl
*ctrl
;
1163 /* Do nothing if either handler is NULL or if they are the same */
1164 if (!hdl
|| !add
|| hdl
== add
)
1168 mutex_lock(&add
->lock
);
1169 list_for_each_entry(ctrl
, &add
->ctrls
, node
) {
1170 /* Skip handler-private controls. */
1171 if (ctrl
->is_private
)
1173 ret
= handler_new_ref(hdl
, ctrl
);
1177 mutex_unlock(&add
->lock
);
1180 EXPORT_SYMBOL(v4l2_ctrl_add_handler
);
1182 /* Cluster controls */
1183 void v4l2_ctrl_cluster(unsigned ncontrols
, struct v4l2_ctrl
**controls
)
1187 /* The first control is the master control and it must not be NULL */
1188 BUG_ON(ncontrols
== 0 || controls
[0] == NULL
);
1190 for (i
= 0; i
< ncontrols
; i
++) {
1192 controls
[i
]->cluster
= controls
;
1193 controls
[i
]->ncontrols
= ncontrols
;
1197 EXPORT_SYMBOL(v4l2_ctrl_cluster
);
1199 void v4l2_ctrl_auto_cluster(unsigned ncontrols
, struct v4l2_ctrl
**controls
,
1200 u8 manual_val
, bool set_volatile
)
1202 struct v4l2_ctrl
*master
= controls
[0];
1206 v4l2_ctrl_cluster(ncontrols
, controls
);
1207 WARN_ON(ncontrols
<= 1);
1208 master
->is_auto
= true;
1209 master
->manual_mode_value
= manual_val
;
1210 master
->flags
|= V4L2_CTRL_FLAG_UPDATE
;
1211 flag
= is_cur_manual(master
) ? 0 : V4L2_CTRL_FLAG_INACTIVE
;
1213 for (i
= 1; i
< ncontrols
; i
++)
1215 controls
[i
]->is_volatile
= set_volatile
;
1216 controls
[i
]->flags
|= flag
;
1219 EXPORT_SYMBOL(v4l2_ctrl_auto_cluster
);
1221 /* Activate/deactivate a control. */
1222 void v4l2_ctrl_activate(struct v4l2_ctrl
*ctrl
, bool active
)
1228 /* set V4L2_CTRL_FLAG_INACTIVE */
1229 set_bit(4, &ctrl
->flags
);
1231 /* clear V4L2_CTRL_FLAG_INACTIVE */
1232 clear_bit(4, &ctrl
->flags
);
1234 EXPORT_SYMBOL(v4l2_ctrl_activate
);
1236 /* Grab/ungrab a control.
1237 Typically used when streaming starts and you want to grab controls,
1238 preventing the user from changing them.
1240 Just call this and the framework will block any attempts to change
1242 void v4l2_ctrl_grab(struct v4l2_ctrl
*ctrl
, bool grabbed
)
1248 /* set V4L2_CTRL_FLAG_GRABBED */
1249 set_bit(1, &ctrl
->flags
);
1251 /* clear V4L2_CTRL_FLAG_GRABBED */
1252 clear_bit(1, &ctrl
->flags
);
1254 EXPORT_SYMBOL(v4l2_ctrl_grab
);
1256 /* Log the control name and value */
1257 static void log_ctrl(const struct v4l2_ctrl
*ctrl
,
1258 const char *prefix
, const char *colon
)
1260 int fl_inact
= ctrl
->flags
& V4L2_CTRL_FLAG_INACTIVE
;
1261 int fl_grabbed
= ctrl
->flags
& V4L2_CTRL_FLAG_GRABBED
;
1263 if (ctrl
->flags
& (V4L2_CTRL_FLAG_DISABLED
| V4L2_CTRL_FLAG_WRITE_ONLY
))
1265 if (ctrl
->type
== V4L2_CTRL_TYPE_CTRL_CLASS
)
1268 printk(KERN_INFO
"%s%s%s: ", prefix
, colon
, ctrl
->name
);
1270 switch (ctrl
->type
) {
1271 case V4L2_CTRL_TYPE_INTEGER
:
1272 printk(KERN_CONT
"%d", ctrl
->cur
.val
);
1274 case V4L2_CTRL_TYPE_BOOLEAN
:
1275 printk(KERN_CONT
"%s", ctrl
->cur
.val
? "true" : "false");
1277 case V4L2_CTRL_TYPE_MENU
:
1278 printk(KERN_CONT
"%s", ctrl
->qmenu
[ctrl
->cur
.val
]);
1280 case V4L2_CTRL_TYPE_INTEGER64
:
1281 printk(KERN_CONT
"%lld", ctrl
->cur
.val64
);
1283 case V4L2_CTRL_TYPE_STRING
:
1284 printk(KERN_CONT
"%s", ctrl
->cur
.string
);
1287 printk(KERN_CONT
"unknown type %d", ctrl
->type
);
1290 if (fl_inact
&& fl_grabbed
)
1291 printk(KERN_CONT
" (inactive, grabbed)\n");
1293 printk(KERN_CONT
" (inactive)\n");
1294 else if (fl_grabbed
)
1295 printk(KERN_CONT
" (grabbed)\n");
1297 printk(KERN_CONT
"\n");
1300 /* Log all controls owned by the handler */
1301 void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler
*hdl
,
1304 struct v4l2_ctrl
*ctrl
;
1305 const char *colon
= "";
1312 len
= strlen(prefix
);
1313 if (len
&& prefix
[len
- 1] != ' ')
1315 mutex_lock(&hdl
->lock
);
1316 list_for_each_entry(ctrl
, &hdl
->ctrls
, node
)
1317 if (!(ctrl
->flags
& V4L2_CTRL_FLAG_DISABLED
))
1318 log_ctrl(ctrl
, prefix
, colon
);
1319 mutex_unlock(&hdl
->lock
);
1321 EXPORT_SYMBOL(v4l2_ctrl_handler_log_status
);
1323 /* Call s_ctrl for all controls owned by the handler */
1324 int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler
*hdl
)
1326 struct v4l2_ctrl
*ctrl
;
1331 mutex_lock(&hdl
->lock
);
1332 list_for_each_entry(ctrl
, &hdl
->ctrls
, node
)
1335 list_for_each_entry(ctrl
, &hdl
->ctrls
, node
) {
1336 struct v4l2_ctrl
*master
= ctrl
->cluster
[0];
1339 /* Skip if this control was already handled by a cluster. */
1343 for (i
= 0; i
< master
->ncontrols
; i
++) {
1344 if (master
->cluster
[i
]) {
1345 cur_to_new(master
->cluster
[i
]);
1346 master
->cluster
[i
]->is_new
= 1;
1350 /* Skip button controls and read-only controls. */
1351 if (ctrl
->type
== V4L2_CTRL_TYPE_BUTTON
||
1352 (ctrl
->flags
& V4L2_CTRL_FLAG_READ_ONLY
))
1354 ret
= call_op(master
, s_ctrl
);
1357 for (i
= 0; i
< master
->ncontrols
; i
++)
1358 if (master
->cluster
[i
])
1359 master
->cluster
[i
]->done
= true;
1361 mutex_unlock(&hdl
->lock
);
1364 EXPORT_SYMBOL(v4l2_ctrl_handler_setup
);
1366 /* Implement VIDIOC_QUERYCTRL */
1367 int v4l2_queryctrl(struct v4l2_ctrl_handler
*hdl
, struct v4l2_queryctrl
*qc
)
1369 u32 id
= qc
->id
& V4L2_CTRL_ID_MASK
;
1370 struct v4l2_ctrl_ref
*ref
;
1371 struct v4l2_ctrl
*ctrl
;
1376 mutex_lock(&hdl
->lock
);
1378 /* Try to find it */
1379 ref
= find_ref(hdl
, id
);
1381 if ((qc
->id
& V4L2_CTRL_FLAG_NEXT_CTRL
) && !list_empty(&hdl
->ctrl_refs
)) {
1382 /* Find the next control with ID > qc->id */
1384 /* Did we reach the end of the control list? */
1385 if (id
>= node2id(hdl
->ctrl_refs
.prev
)) {
1386 ref
= NULL
; /* Yes, so there is no next control */
1388 /* We found a control with the given ID, so just get
1389 the next one in the list. */
1390 ref
= list_entry(ref
->node
.next
, typeof(*ref
), node
);
1392 /* No control with the given ID exists, so start
1393 searching for the next largest ID. We know there
1394 is one, otherwise the first 'if' above would have
1396 list_for_each_entry(ref
, &hdl
->ctrl_refs
, node
)
1397 if (id
< ref
->ctrl
->id
)
1401 mutex_unlock(&hdl
->lock
);
1406 memset(qc
, 0, sizeof(*qc
));
1407 if (id
>= V4L2_CID_PRIVATE_BASE
)
1411 strlcpy(qc
->name
, ctrl
->name
, sizeof(qc
->name
));
1412 qc
->minimum
= ctrl
->minimum
;
1413 qc
->maximum
= ctrl
->maximum
;
1414 qc
->default_value
= ctrl
->default_value
;
1415 if (ctrl
->type
== V4L2_CTRL_TYPE_MENU
)
1418 qc
->step
= ctrl
->step
;
1419 qc
->flags
= ctrl
->flags
;
1420 qc
->type
= ctrl
->type
;
1423 EXPORT_SYMBOL(v4l2_queryctrl
);
1425 int v4l2_subdev_queryctrl(struct v4l2_subdev
*sd
, struct v4l2_queryctrl
*qc
)
1427 if (qc
->id
& V4L2_CTRL_FLAG_NEXT_CTRL
)
1429 return v4l2_queryctrl(sd
->ctrl_handler
, qc
);
1431 EXPORT_SYMBOL(v4l2_subdev_queryctrl
);
1433 /* Implement VIDIOC_QUERYMENU */
1434 int v4l2_querymenu(struct v4l2_ctrl_handler
*hdl
, struct v4l2_querymenu
*qm
)
1436 struct v4l2_ctrl
*ctrl
;
1439 ctrl
= v4l2_ctrl_find(hdl
, qm
->id
);
1445 if (ctrl
->qmenu
== NULL
||
1446 i
< ctrl
->minimum
|| i
> ctrl
->maximum
)
1448 /* Use mask to see if this menu item should be skipped */
1449 if (ctrl
->menu_skip_mask
& (1 << i
))
1451 /* Empty menu items should also be skipped */
1452 if (ctrl
->qmenu
[i
] == NULL
|| ctrl
->qmenu
[i
][0] == '\0')
1454 strlcpy(qm
->name
, ctrl
->qmenu
[i
], sizeof(qm
->name
));
1457 EXPORT_SYMBOL(v4l2_querymenu
);
1459 int v4l2_subdev_querymenu(struct v4l2_subdev
*sd
, struct v4l2_querymenu
*qm
)
1461 return v4l2_querymenu(sd
->ctrl_handler
, qm
);
1463 EXPORT_SYMBOL(v4l2_subdev_querymenu
);
1467 /* Some general notes on the atomic requirements of VIDIOC_G/TRY/S_EXT_CTRLS:
1469 It is not a fully atomic operation, just best-effort only. After all, if
1470 multiple controls have to be set through multiple i2c writes (for example)
1471 then some initial writes may succeed while others fail. Thus leaving the
1472 system in an inconsistent state. The question is how much effort you are
1473 willing to spend on trying to make something atomic that really isn't.
1475 From the point of view of an application the main requirement is that
1476 when you call VIDIOC_S_EXT_CTRLS and some values are invalid then an
1477 error should be returned without actually affecting any controls.
1479 If all the values are correct, then it is acceptable to just give up
1480 in case of low-level errors.
1482 It is important though that the application can tell when only a partial
1483 configuration was done. The way we do that is through the error_idx field
1484 of struct v4l2_ext_controls: if that is equal to the count field then no
1485 controls were affected. Otherwise all controls before that index were
1486 successful in performing their 'get' or 'set' operation, the control at
1487 the given index failed, and you don't know what happened with the controls
1488 after the failed one. Since if they were part of a control cluster they
1489 could have been successfully processed (if a cluster member was encountered
1490 at index < error_idx), they could have failed (if a cluster member was at
1491 error_idx), or they may not have been processed yet (if the first cluster
1492 member appeared after error_idx).
1494 It is all fairly theoretical, though. In practice all you can do is to
1495 bail out. If error_idx == count, then it is an application bug. If
1496 error_idx < count then it is only an application bug if the error code was
1497 EBUSY. That usually means that something started streaming just when you
1498 tried to set the controls. In all other cases it is a driver/hardware
1499 problem and all you can do is to retry or bail out.
1501 Note that these rules do not apply to VIDIOC_TRY_EXT_CTRLS: since that
1502 never modifies controls the error_idx is just set to whatever control
1503 has an invalid value.
1506 /* Prepare for the extended g/s/try functions.
1507 Find the controls in the control array and do some basic checks. */
1508 static int prepare_ext_ctrls(struct v4l2_ctrl_handler
*hdl
,
1509 struct v4l2_ext_controls
*cs
,
1510 struct ctrl_helper
*helpers
)
1514 for (i
= 0; i
< cs
->count
; i
++) {
1515 struct v4l2_ext_control
*c
= &cs
->controls
[i
];
1516 struct v4l2_ctrl
*ctrl
;
1517 u32 id
= c
->id
& V4L2_CTRL_ID_MASK
;
1521 if (cs
->ctrl_class
&& V4L2_CTRL_ID2CLASS(id
) != cs
->ctrl_class
)
1524 /* Old-style private controls are not allowed for
1525 extended controls */
1526 if (id
>= V4L2_CID_PRIVATE_BASE
)
1528 ctrl
= v4l2_ctrl_find(hdl
, id
);
1531 if (ctrl
->flags
& V4L2_CTRL_FLAG_DISABLED
)
1534 helpers
[i
].ctrl
= ctrl
;
1535 helpers
[i
].handled
= false;
1540 typedef int (*cluster_func
)(struct v4l2_ext_control
*c
,
1541 struct v4l2_ctrl
*ctrl
);
1543 /* Walk over all controls in v4l2_ext_controls belonging to the same cluster
1544 and call the provided function. */
1545 static int cluster_walk(unsigned from
,
1546 struct v4l2_ext_controls
*cs
,
1547 struct ctrl_helper
*helpers
,
1550 struct v4l2_ctrl
**cluster
= helpers
[from
].ctrl
->cluster
;
1554 /* Find any controls from the same cluster and call the function */
1555 for (i
= from
; !ret
&& i
< cs
->count
; i
++) {
1556 struct v4l2_ctrl
*ctrl
= helpers
[i
].ctrl
;
1558 if (!helpers
[i
].handled
&& ctrl
->cluster
== cluster
)
1559 ret
= f(&cs
->controls
[i
], ctrl
);
1564 static void cluster_done(unsigned from
,
1565 struct v4l2_ext_controls
*cs
,
1566 struct ctrl_helper
*helpers
)
1568 struct v4l2_ctrl
**cluster
= helpers
[from
].ctrl
->cluster
;
1571 /* Find any controls from the same cluster and mark them as handled */
1572 for (i
= from
; i
< cs
->count
; i
++)
1573 if (helpers
[i
].ctrl
->cluster
== cluster
)
1574 helpers
[i
].handled
= true;
1577 /* Handles the corner case where cs->count == 0. It checks whether the
1578 specified control class exists. If that class ID is 0, then it checks
1579 whether there are any controls at all. */
1580 static int class_check(struct v4l2_ctrl_handler
*hdl
, u32 ctrl_class
)
1582 if (ctrl_class
== 0)
1583 return list_empty(&hdl
->ctrl_refs
) ? -EINVAL
: 0;
1584 return find_ref_lock(hdl
, ctrl_class
| 1) ? 0 : -EINVAL
;
1589 /* Get extended controls. Allocates the helpers array if needed. */
1590 int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler
*hdl
, struct v4l2_ext_controls
*cs
)
1592 struct ctrl_helper helper
[4];
1593 struct ctrl_helper
*helpers
= helper
;
1597 cs
->error_idx
= cs
->count
;
1598 cs
->ctrl_class
= V4L2_CTRL_ID2CLASS(cs
->ctrl_class
);
1604 return class_check(hdl
, cs
->ctrl_class
);
1606 if (cs
->count
> ARRAY_SIZE(helper
)) {
1607 helpers
= kmalloc(sizeof(helper
[0]) * cs
->count
, GFP_KERNEL
);
1608 if (helpers
== NULL
)
1612 ret
= prepare_ext_ctrls(hdl
, cs
, helpers
);
1613 cs
->error_idx
= cs
->count
;
1615 for (i
= 0; !ret
&& i
< cs
->count
; i
++)
1616 if (helpers
[i
].ctrl
->flags
& V4L2_CTRL_FLAG_WRITE_ONLY
)
1619 for (i
= 0; !ret
&& i
< cs
->count
; i
++) {
1620 struct v4l2_ctrl
*ctrl
= helpers
[i
].ctrl
;
1621 struct v4l2_ctrl
*master
= ctrl
->cluster
[0];
1624 if (helpers
[i
].handled
)
1629 /* Any volatile controls requested from this cluster? */
1630 has_volatiles
= ctrl
->is_volatile
;
1631 if (!has_volatiles
&& has_op(master
, g_volatile_ctrl
) &&
1632 master
->ncontrols
> 1)
1633 has_volatiles
= cluster_walk(i
, cs
, helpers
,
1636 v4l2_ctrl_lock(master
);
1638 /* g_volatile_ctrl will update the new control values */
1639 if (has_volatiles
&& !is_cur_manual(master
)) {
1640 for (j
= 0; j
< master
->ncontrols
; j
++)
1641 cur_to_new(master
->cluster
[j
]);
1642 ret
= call_op(master
, g_volatile_ctrl
);
1644 /* If OK, then copy the current (for non-volatile controls)
1645 or the new (for volatile controls) control values to the
1648 ret
= cluster_walk(i
, cs
, helpers
, ctrl_to_user
);
1649 v4l2_ctrl_unlock(master
);
1650 cluster_done(i
, cs
, helpers
);
1653 if (cs
->count
> ARRAY_SIZE(helper
))
1657 EXPORT_SYMBOL(v4l2_g_ext_ctrls
);
1659 int v4l2_subdev_g_ext_ctrls(struct v4l2_subdev
*sd
, struct v4l2_ext_controls
*cs
)
1661 return v4l2_g_ext_ctrls(sd
->ctrl_handler
, cs
);
1663 EXPORT_SYMBOL(v4l2_subdev_g_ext_ctrls
);
1665 /* Helper function to get a single control */
1666 static int get_ctrl(struct v4l2_ctrl
*ctrl
, s32
*val
)
1668 struct v4l2_ctrl
*master
= ctrl
->cluster
[0];
1672 if (ctrl
->flags
& V4L2_CTRL_FLAG_WRITE_ONLY
)
1675 v4l2_ctrl_lock(master
);
1676 /* g_volatile_ctrl will update the current control values */
1677 if (ctrl
->is_volatile
&& !is_cur_manual(master
)) {
1678 for (i
= 0; i
< master
->ncontrols
; i
++)
1679 cur_to_new(master
->cluster
[i
]);
1680 ret
= call_op(master
, g_volatile_ctrl
);
1683 *val
= ctrl
->cur
.val
;
1685 v4l2_ctrl_unlock(master
);
1689 int v4l2_g_ctrl(struct v4l2_ctrl_handler
*hdl
, struct v4l2_control
*control
)
1691 struct v4l2_ctrl
*ctrl
= v4l2_ctrl_find(hdl
, control
->id
);
1693 if (ctrl
== NULL
|| !type_is_int(ctrl
))
1695 return get_ctrl(ctrl
, &control
->value
);
1697 EXPORT_SYMBOL(v4l2_g_ctrl
);
1699 int v4l2_subdev_g_ctrl(struct v4l2_subdev
*sd
, struct v4l2_control
*control
)
1701 return v4l2_g_ctrl(sd
->ctrl_handler
, control
);
1703 EXPORT_SYMBOL(v4l2_subdev_g_ctrl
);
1705 s32
v4l2_ctrl_g_ctrl(struct v4l2_ctrl
*ctrl
)
1709 /* It's a driver bug if this happens. */
1710 WARN_ON(!type_is_int(ctrl
));
1711 get_ctrl(ctrl
, &val
);
1714 EXPORT_SYMBOL(v4l2_ctrl_g_ctrl
);
1717 /* Core function that calls try/s_ctrl and ensures that the new value is
1718 copied to the current value on a set.
1719 Must be called with ctrl->handler->lock held. */
1720 static int try_or_set_control_cluster(struct v4l2_ctrl
*master
, bool set
)
1727 /* Go through the cluster and either validate the new value or
1728 (if no new value was set), copy the current value to the new
1729 value, ensuring a consistent view for the control ops when
1731 for (i
= 0; !ret
&& i
< master
->ncontrols
; i
++) {
1732 struct v4l2_ctrl
*ctrl
= master
->cluster
[i
];
1738 /* Double check this: it may have changed since the
1739 last check in try_or_set_ext_ctrls(). */
1740 if (set
&& (ctrl
->flags
& V4L2_CTRL_FLAG_GRABBED
))
1743 /* Validate if required */
1745 ret
= validate_new(ctrl
);
1748 /* No new value was set, so copy the current and force
1749 a call to try_ctrl later, since the values for the cluster
1750 may now have changed and the end result might be invalid. */
1755 /* For larger clusters you have to call try_ctrl again to
1756 verify that the controls are still valid after the
1757 'cur_to_new' above. */
1759 ret
= call_op(master
, try_ctrl
);
1761 /* Don't set if there is no change */
1762 if (ret
|| !set
|| !cluster_changed(master
))
1764 ret
= call_op(master
, s_ctrl
);
1765 /* If OK, then make the new values permanent. */
1769 update_flag
= is_cur_manual(master
) != is_new_manual(master
);
1770 for (i
= 0; i
< master
->ncontrols
; i
++)
1771 new_to_cur(master
->cluster
[i
], update_flag
&& i
> 0);
1775 /* Try or set controls. */
1776 static int try_or_set_ext_ctrls(struct v4l2_ctrl_handler
*hdl
,
1777 struct v4l2_ext_controls
*cs
,
1778 struct ctrl_helper
*helpers
,
1784 for (i
= 0; i
< cs
->count
; i
++) {
1785 struct v4l2_ctrl
*ctrl
= helpers
[i
].ctrl
;
1789 if (ctrl
->flags
& V4L2_CTRL_FLAG_READ_ONLY
)
1791 /* This test is also done in try_set_control_cluster() which
1792 is called in atomic context, so that has the final say,
1793 but it makes sense to do an up-front check as well. Once
1794 an error occurs in try_set_control_cluster() some other
1795 controls may have been set already and we want to do a
1796 best-effort to avoid that. */
1797 if (set
&& (ctrl
->flags
& V4L2_CTRL_FLAG_GRABBED
))
1801 for (i
= 0; !ret
&& i
< cs
->count
; i
++) {
1802 struct v4l2_ctrl
*ctrl
= helpers
[i
].ctrl
;
1803 struct v4l2_ctrl
*master
= ctrl
->cluster
[0];
1805 if (helpers
[i
].handled
)
1809 v4l2_ctrl_lock(ctrl
);
1811 /* Reset the 'is_new' flags of the cluster */
1812 for (j
= 0; j
< master
->ncontrols
; j
++)
1813 if (master
->cluster
[j
])
1814 master
->cluster
[j
]->is_new
= 0;
1816 /* Copy the new caller-supplied control values.
1817 user_to_new() sets 'is_new' to 1. */
1818 ret
= cluster_walk(i
, cs
, helpers
, user_to_new
);
1821 ret
= try_or_set_control_cluster(master
, set
);
1823 /* Copy the new values back to userspace. */
1825 ret
= cluster_walk(i
, cs
, helpers
, new_to_user
);
1827 v4l2_ctrl_unlock(ctrl
);
1828 cluster_done(i
, cs
, helpers
);
1833 /* Try or try-and-set controls */
1834 static int try_set_ext_ctrls(struct v4l2_ctrl_handler
*hdl
,
1835 struct v4l2_ext_controls
*cs
,
1838 struct ctrl_helper helper
[4];
1839 struct ctrl_helper
*helpers
= helper
;
1843 cs
->error_idx
= cs
->count
;
1844 cs
->ctrl_class
= V4L2_CTRL_ID2CLASS(cs
->ctrl_class
);
1850 return class_check(hdl
, cs
->ctrl_class
);
1852 if (cs
->count
> ARRAY_SIZE(helper
)) {
1853 helpers
= kmalloc(sizeof(helper
[0]) * cs
->count
, GFP_KERNEL
);
1857 ret
= prepare_ext_ctrls(hdl
, cs
, helpers
);
1859 /* First 'try' all controls and abort on error */
1861 ret
= try_or_set_ext_ctrls(hdl
, cs
, helpers
, false);
1862 /* If this is a 'set' operation and the initial 'try' failed,
1863 then set error_idx to count to tell the application that no
1864 controls changed value yet. */
1866 cs
->error_idx
= cs
->count
;
1868 /* Reset 'handled' state */
1869 for (i
= 0; i
< cs
->count
; i
++)
1870 helpers
[i
].handled
= false;
1871 ret
= try_or_set_ext_ctrls(hdl
, cs
, helpers
, true);
1874 if (cs
->count
> ARRAY_SIZE(helper
))
1879 int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler
*hdl
, struct v4l2_ext_controls
*cs
)
1881 return try_set_ext_ctrls(hdl
, cs
, false);
1883 EXPORT_SYMBOL(v4l2_try_ext_ctrls
);
1885 int v4l2_s_ext_ctrls(struct v4l2_ctrl_handler
*hdl
, struct v4l2_ext_controls
*cs
)
1887 return try_set_ext_ctrls(hdl
, cs
, true);
1889 EXPORT_SYMBOL(v4l2_s_ext_ctrls
);
1891 int v4l2_subdev_try_ext_ctrls(struct v4l2_subdev
*sd
, struct v4l2_ext_controls
*cs
)
1893 return try_set_ext_ctrls(sd
->ctrl_handler
, cs
, false);
1895 EXPORT_SYMBOL(v4l2_subdev_try_ext_ctrls
);
1897 int v4l2_subdev_s_ext_ctrls(struct v4l2_subdev
*sd
, struct v4l2_ext_controls
*cs
)
1899 return try_set_ext_ctrls(sd
->ctrl_handler
, cs
, true);
1901 EXPORT_SYMBOL(v4l2_subdev_s_ext_ctrls
);
1903 /* Helper function for VIDIOC_S_CTRL compatibility */
1904 static int set_ctrl(struct v4l2_ctrl
*ctrl
, s32
*val
)
1906 struct v4l2_ctrl
*master
= ctrl
->cluster
[0];
1910 v4l2_ctrl_lock(ctrl
);
1912 /* Reset the 'is_new' flags of the cluster */
1913 for (i
= 0; i
< master
->ncontrols
; i
++)
1914 if (master
->cluster
[i
])
1915 master
->cluster
[i
]->is_new
= 0;
1919 ret
= try_or_set_control_cluster(master
, false);
1921 ret
= try_or_set_control_cluster(master
, true);
1922 *val
= ctrl
->cur
.val
;
1923 v4l2_ctrl_unlock(ctrl
);
1927 int v4l2_s_ctrl(struct v4l2_ctrl_handler
*hdl
, struct v4l2_control
*control
)
1929 struct v4l2_ctrl
*ctrl
= v4l2_ctrl_find(hdl
, control
->id
);
1931 if (ctrl
== NULL
|| !type_is_int(ctrl
))
1934 if (ctrl
->flags
& V4L2_CTRL_FLAG_READ_ONLY
)
1937 return set_ctrl(ctrl
, &control
->value
);
1939 EXPORT_SYMBOL(v4l2_s_ctrl
);
1941 int v4l2_subdev_s_ctrl(struct v4l2_subdev
*sd
, struct v4l2_control
*control
)
1943 return v4l2_s_ctrl(sd
->ctrl_handler
, control
);
1945 EXPORT_SYMBOL(v4l2_subdev_s_ctrl
);
1947 int v4l2_ctrl_s_ctrl(struct v4l2_ctrl
*ctrl
, s32 val
)
1949 /* It's a driver bug if this happens. */
1950 WARN_ON(!type_is_int(ctrl
));
1951 return set_ctrl(ctrl
, &val
);
1953 EXPORT_SYMBOL(v4l2_ctrl_s_ctrl
);