2 * Broadcom BM2835 V4L2 driver
4 * Copyright © 2013 Raspberry Pi (Trading) Ltd.
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
10 * Authors: Vincent Sanders <vincent.sanders@collabora.co.uk>
11 * Dave Stevenson <dsteve@broadcom.com>
12 * Simon Mellor <simellor@broadcom.com>
13 * Luke Diamand <luked@broadcom.com>
16 #include <linux/errno.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/slab.h>
20 #include <media/videobuf2-vmalloc.h>
21 #include <media/v4l2-device.h>
22 #include <media/v4l2-ioctl.h>
23 #include <media/v4l2-ctrls.h>
24 #include <media/v4l2-fh.h>
25 #include <media/v4l2-event.h>
26 #include <media/v4l2-common.h>
28 #include "mmal-common.h"
29 #include "mmal-vchiq.h"
30 #include "mmal-parameters.h"
31 #include "bcm2835-camera.h"
33 /* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -4.0 to +4.0.
34 * MMAL values are in 1/6th increments so the MMAL range is -24 to +24.
35 * V4L2 docs say value "is expressed in terms of EV, drivers should interpret
36 * the values as 0.001 EV units, where the value 1000 stands for +1 EV."
37 * V4L2 is limited to a max of 32 values in a menu, so count in 1/3rds from
40 static const s64 ev_bias_qmenu[] = {
52 /* Supported ISO values (*1000)
55 static const s64 iso_qmenu[] = {
56 0, 100000, 200000, 400000, 800000,
58 static const uint32_t iso_values[] = {
59 0, 100, 200, 400, 800,
62 static const s64 mains_freq_qmenu[] = {
63 V4L2_CID_POWER_LINE_FREQUENCY_DISABLED,
64 V4L2_CID_POWER_LINE_FREQUENCY_50HZ,
65 V4L2_CID_POWER_LINE_FREQUENCY_60HZ,
66 V4L2_CID_POWER_LINE_FREQUENCY_AUTO
69 /* Supported video encode modes */
70 static const s64 bitrate_mode_qmenu[] = {
71 (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
72 (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
75 enum bm2835_mmal_ctrl_type {
76 MMAL_CONTROL_TYPE_STD,
77 MMAL_CONTROL_TYPE_STD_MENU,
78 MMAL_CONTROL_TYPE_INT_MENU,
79 MMAL_CONTROL_TYPE_CLUSTER, /* special cluster entry */
82 struct bm2835_mmal_v4l2_ctrl;
84 typedef int(bm2835_mmal_v4l2_ctrl_cb)(
85 struct bm2835_mmal_dev *dev,
86 struct v4l2_ctrl *ctrl,
87 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl);
89 struct bm2835_mmal_v4l2_ctrl {
90 u32 id; /* v4l2 control identifier */
91 enum bm2835_mmal_ctrl_type type;
92 /* control minimum value or
93 * mask for MMAL_CONTROL_TYPE_STD_MENU
96 s32 max; /* maximum value of control */
97 s32 def; /* default value of control */
98 s32 step; /* step size of the control */
99 const s64 *imenu; /* integer menu array */
100 u32 mmal_id; /* mmal parameter id */
101 bm2835_mmal_v4l2_ctrl_cb *setter;
105 struct v4l2_to_mmal_effects_setting {
109 s32 col_fx_fixed_cbcr;
112 u32 num_effect_params;
113 u32 effect_params[MMAL_MAX_IMAGEFX_PARAMETERS];
116 static const struct v4l2_to_mmal_effects_setting
117 v4l2_to_mmal_effects_values[] = {
118 { V4L2_COLORFX_NONE, MMAL_PARAM_IMAGEFX_NONE,
119 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
120 { V4L2_COLORFX_BW, MMAL_PARAM_IMAGEFX_NONE,
121 1, 0, 128, 128, 0, {0, 0, 0, 0, 0} },
122 { V4L2_COLORFX_SEPIA, MMAL_PARAM_IMAGEFX_NONE,
123 1, 0, 87, 151, 0, {0, 0, 0, 0, 0} },
124 { V4L2_COLORFX_NEGATIVE, MMAL_PARAM_IMAGEFX_NEGATIVE,
125 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
126 { V4L2_COLORFX_EMBOSS, MMAL_PARAM_IMAGEFX_EMBOSS,
127 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
128 { V4L2_COLORFX_SKETCH, MMAL_PARAM_IMAGEFX_SKETCH,
129 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
130 { V4L2_COLORFX_SKY_BLUE, MMAL_PARAM_IMAGEFX_PASTEL,
131 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
132 { V4L2_COLORFX_GRASS_GREEN, MMAL_PARAM_IMAGEFX_WATERCOLOUR,
133 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
134 { V4L2_COLORFX_SKIN_WHITEN, MMAL_PARAM_IMAGEFX_WASHEDOUT,
135 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
136 { V4L2_COLORFX_VIVID, MMAL_PARAM_IMAGEFX_SATURATION,
137 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
138 { V4L2_COLORFX_AQUA, MMAL_PARAM_IMAGEFX_NONE,
139 1, 0, 171, 121, 0, {0, 0, 0, 0, 0} },
140 { V4L2_COLORFX_ART_FREEZE, MMAL_PARAM_IMAGEFX_HATCH,
141 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
142 { V4L2_COLORFX_SILHOUETTE, MMAL_PARAM_IMAGEFX_FILM,
143 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
144 { V4L2_COLORFX_SOLARIZATION, MMAL_PARAM_IMAGEFX_SOLARIZE,
145 0, 0, 0, 0, 5, {1, 128, 160, 160, 48} },
146 { V4L2_COLORFX_ANTIQUE, MMAL_PARAM_IMAGEFX_COLOURBALANCE,
147 0, 0, 0, 0, 3, {108, 274, 238, 0, 0} },
148 { V4L2_COLORFX_SET_CBCR, MMAL_PARAM_IMAGEFX_NONE,
149 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} }
152 struct v4l2_mmal_scene_config {
153 enum v4l2_scene_mode v4l2_scene;
154 enum mmal_parameter_exposuremode exposure_mode;
155 enum mmal_parameter_exposuremeteringmode metering_mode;
158 static const struct v4l2_mmal_scene_config scene_configs[] = {
159 /* V4L2_SCENE_MODE_NONE automatically added */
161 V4L2_SCENE_MODE_NIGHT,
162 MMAL_PARAM_EXPOSUREMODE_NIGHT,
163 MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
166 V4L2_SCENE_MODE_SPORTS,
167 MMAL_PARAM_EXPOSUREMODE_SPORTS,
168 MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
172 /* control handlers*/
174 static int ctrl_set_rational(struct bm2835_mmal_dev *dev,
175 struct v4l2_ctrl *ctrl,
176 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
178 struct mmal_parameter_rational rational_value;
179 struct vchiq_mmal_port *control;
181 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
183 rational_value.num = ctrl->val;
184 rational_value.den = 100;
186 return vchiq_mmal_port_parameter_set(dev->instance, control,
189 sizeof(rational_value));
192 static int ctrl_set_value(struct bm2835_mmal_dev *dev,
193 struct v4l2_ctrl *ctrl,
194 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
197 struct vchiq_mmal_port *control;
199 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
201 u32_value = ctrl->val;
203 return vchiq_mmal_port_parameter_set(dev->instance, control,
205 &u32_value, sizeof(u32_value));
208 static int ctrl_set_iso(struct bm2835_mmal_dev *dev,
209 struct v4l2_ctrl *ctrl,
210 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
213 struct vchiq_mmal_port *control;
215 if (ctrl->val > mmal_ctrl->max || ctrl->val < mmal_ctrl->min)
218 if (ctrl->id == V4L2_CID_ISO_SENSITIVITY)
219 dev->iso = iso_values[ctrl->val];
220 else if (ctrl->id == V4L2_CID_ISO_SENSITIVITY_AUTO)
221 dev->manual_iso_enabled =
222 (ctrl->val == V4L2_ISO_SENSITIVITY_MANUAL);
224 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
226 if (dev->manual_iso_enabled)
227 u32_value = dev->iso;
231 return vchiq_mmal_port_parameter_set(dev->instance, control,
233 &u32_value, sizeof(u32_value));
236 static int ctrl_set_value_ev(struct bm2835_mmal_dev *dev,
237 struct v4l2_ctrl *ctrl,
238 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
241 struct vchiq_mmal_port *control;
243 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
245 s32_value = (ctrl->val - 12) * 2; /* Convert from index to 1/6ths */
247 return vchiq_mmal_port_parameter_set(dev->instance, control,
249 &s32_value, sizeof(s32_value));
252 static int ctrl_set_rotate(struct bm2835_mmal_dev *dev,
253 struct v4l2_ctrl *ctrl,
254 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
258 struct vchiq_mmal_component *camera;
260 camera = dev->component[MMAL_COMPONENT_CAMERA];
262 u32_value = ((ctrl->val % 360) / 90) * 90;
264 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0],
266 &u32_value, sizeof(u32_value));
270 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1],
272 &u32_value, sizeof(u32_value));
276 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2],
278 &u32_value, sizeof(u32_value));
283 static int ctrl_set_flip(struct bm2835_mmal_dev *dev,
284 struct v4l2_ctrl *ctrl,
285 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
289 struct vchiq_mmal_component *camera;
291 if (ctrl->id == V4L2_CID_HFLIP)
292 dev->hflip = ctrl->val;
294 dev->vflip = ctrl->val;
296 camera = dev->component[MMAL_COMPONENT_CAMERA];
298 if (dev->hflip && dev->vflip)
299 u32_value = MMAL_PARAM_MIRROR_BOTH;
301 u32_value = MMAL_PARAM_MIRROR_HORIZONTAL;
303 u32_value = MMAL_PARAM_MIRROR_VERTICAL;
305 u32_value = MMAL_PARAM_MIRROR_NONE;
307 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0],
309 &u32_value, sizeof(u32_value));
313 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1],
315 &u32_value, sizeof(u32_value));
319 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2],
321 &u32_value, sizeof(u32_value));
326 static int ctrl_set_exposure(struct bm2835_mmal_dev *dev,
327 struct v4l2_ctrl *ctrl,
328 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
330 enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode_user;
331 u32 shutter_speed = 0;
332 struct vchiq_mmal_port *control;
335 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
337 if (mmal_ctrl->mmal_id == MMAL_PARAMETER_SHUTTER_SPEED) {
338 /* V4L2 is in 100usec increments.
341 dev->manual_shutter_speed = ctrl->val * 100;
342 } else if (mmal_ctrl->mmal_id == MMAL_PARAMETER_EXPOSURE_MODE) {
344 case V4L2_EXPOSURE_AUTO:
345 exp_mode = MMAL_PARAM_EXPOSUREMODE_AUTO;
348 case V4L2_EXPOSURE_MANUAL:
349 exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF;
352 dev->exposure_mode_user = exp_mode;
353 dev->exposure_mode_v4l2_user = ctrl->val;
354 } else if (mmal_ctrl->id == V4L2_CID_EXPOSURE_AUTO_PRIORITY) {
355 dev->exp_auto_priority = ctrl->val;
358 if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
359 if (exp_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
360 shutter_speed = dev->manual_shutter_speed;
362 ret = vchiq_mmal_port_parameter_set(dev->instance,
364 MMAL_PARAMETER_SHUTTER_SPEED,
366 sizeof(shutter_speed));
367 ret += vchiq_mmal_port_parameter_set(dev->instance,
369 MMAL_PARAMETER_EXPOSURE_MODE,
372 dev->exposure_mode_active = exp_mode;
374 /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should
375 * always apply irrespective of scene mode.
377 ret += set_framerate_params(dev);
382 static int ctrl_set_metering_mode(struct bm2835_mmal_dev *dev,
383 struct v4l2_ctrl *ctrl,
384 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
387 case V4L2_EXPOSURE_METERING_AVERAGE:
388 dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
391 case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED:
392 dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
395 case V4L2_EXPOSURE_METERING_SPOT:
396 dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
399 /* todo matrix weighting not added to Linux API till 3.9
400 * case V4L2_EXPOSURE_METERING_MATRIX:
401 * dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
406 if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
407 struct vchiq_mmal_port *control;
408 u32 u32_value = dev->metering_mode;
410 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
412 return vchiq_mmal_port_parameter_set(dev->instance, control,
414 &u32_value, sizeof(u32_value));
419 static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev *dev,
420 struct v4l2_ctrl *ctrl,
421 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
424 struct vchiq_mmal_port *control;
426 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
429 case V4L2_CID_POWER_LINE_FREQUENCY_DISABLED:
430 u32_value = MMAL_PARAM_FLICKERAVOID_OFF;
432 case V4L2_CID_POWER_LINE_FREQUENCY_50HZ:
433 u32_value = MMAL_PARAM_FLICKERAVOID_50HZ;
435 case V4L2_CID_POWER_LINE_FREQUENCY_60HZ:
436 u32_value = MMAL_PARAM_FLICKERAVOID_60HZ;
438 case V4L2_CID_POWER_LINE_FREQUENCY_AUTO:
439 u32_value = MMAL_PARAM_FLICKERAVOID_AUTO;
443 return vchiq_mmal_port_parameter_set(dev->instance, control,
445 &u32_value, sizeof(u32_value));
448 static int ctrl_set_awb_mode(struct bm2835_mmal_dev *dev,
449 struct v4l2_ctrl *ctrl,
450 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
453 struct vchiq_mmal_port *control;
455 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
458 case V4L2_WHITE_BALANCE_MANUAL:
459 u32_value = MMAL_PARAM_AWBMODE_OFF;
462 case V4L2_WHITE_BALANCE_AUTO:
463 u32_value = MMAL_PARAM_AWBMODE_AUTO;
466 case V4L2_WHITE_BALANCE_INCANDESCENT:
467 u32_value = MMAL_PARAM_AWBMODE_INCANDESCENT;
470 case V4L2_WHITE_BALANCE_FLUORESCENT:
471 u32_value = MMAL_PARAM_AWBMODE_FLUORESCENT;
474 case V4L2_WHITE_BALANCE_FLUORESCENT_H:
475 u32_value = MMAL_PARAM_AWBMODE_TUNGSTEN;
478 case V4L2_WHITE_BALANCE_HORIZON:
479 u32_value = MMAL_PARAM_AWBMODE_HORIZON;
482 case V4L2_WHITE_BALANCE_DAYLIGHT:
483 u32_value = MMAL_PARAM_AWBMODE_SUNLIGHT;
486 case V4L2_WHITE_BALANCE_FLASH:
487 u32_value = MMAL_PARAM_AWBMODE_FLASH;
490 case V4L2_WHITE_BALANCE_CLOUDY:
491 u32_value = MMAL_PARAM_AWBMODE_CLOUDY;
494 case V4L2_WHITE_BALANCE_SHADE:
495 u32_value = MMAL_PARAM_AWBMODE_SHADE;
499 return vchiq_mmal_port_parameter_set(dev->instance, control,
501 &u32_value, sizeof(u32_value));
504 static int ctrl_set_awb_gains(struct bm2835_mmal_dev *dev,
505 struct v4l2_ctrl *ctrl,
506 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
508 struct vchiq_mmal_port *control;
509 struct mmal_parameter_awbgains gains;
511 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
513 if (ctrl->id == V4L2_CID_RED_BALANCE)
514 dev->red_gain = ctrl->val;
515 else if (ctrl->id == V4L2_CID_BLUE_BALANCE)
516 dev->blue_gain = ctrl->val;
518 gains.r_gain.num = dev->red_gain;
519 gains.b_gain.num = dev->blue_gain;
520 gains.r_gain.den = gains.b_gain.den = 1000;
522 return vchiq_mmal_port_parameter_set(dev->instance, control,
524 &gains, sizeof(gains));
527 static int ctrl_set_image_effect(struct bm2835_mmal_dev *dev,
528 struct v4l2_ctrl *ctrl,
529 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
533 struct vchiq_mmal_port *control;
534 struct mmal_parameter_imagefx_parameters imagefx;
536 for (i = 0; i < ARRAY_SIZE(v4l2_to_mmal_effects_values); i++) {
537 if (ctrl->val == v4l2_to_mmal_effects_values[i].v4l2_effect) {
539 v4l2_to_mmal_effects_values[i].mmal_effect;
540 imagefx.num_effect_params =
541 v4l2_to_mmal_effects_values[i].num_effect_params;
543 if (imagefx.num_effect_params > MMAL_MAX_IMAGEFX_PARAMETERS)
544 imagefx.num_effect_params = MMAL_MAX_IMAGEFX_PARAMETERS;
546 for (j = 0; j < imagefx.num_effect_params; j++)
547 imagefx.effect_parameter[j] =
548 v4l2_to_mmal_effects_values[i].effect_params[j];
550 dev->colourfx.enable =
551 v4l2_to_mmal_effects_values[i].col_fx_enable;
552 if (!v4l2_to_mmal_effects_values[i].col_fx_fixed_cbcr) {
554 v4l2_to_mmal_effects_values[i].u;
556 v4l2_to_mmal_effects_values[i].v;
559 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
561 ret = vchiq_mmal_port_parameter_set(
562 dev->instance, control,
563 MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,
564 &imagefx, sizeof(imagefx));
568 ret = vchiq_mmal_port_parameter_set(
569 dev->instance, control,
570 MMAL_PARAMETER_COLOUR_EFFECT,
571 &dev->colourfx, sizeof(dev->colourfx));
576 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
577 "mmal_ctrl:%p ctrl id:0x%x ctrl val:%d imagefx:0x%x color_effect:%s u:%d v:%d ret %d(%d)\n",
578 mmal_ctrl, ctrl->id, ctrl->val, imagefx.effect,
579 dev->colourfx.enable ? "true" : "false",
580 dev->colourfx.u, dev->colourfx.v,
581 ret, (ret == 0 ? 0 : -EINVAL));
582 return (ret == 0 ? 0 : -EINVAL);
585 static int ctrl_set_colfx(struct bm2835_mmal_dev *dev,
586 struct v4l2_ctrl *ctrl,
587 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
590 struct vchiq_mmal_port *control;
592 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
594 dev->colourfx.enable = (ctrl->val & 0xff00) >> 8;
595 dev->colourfx.enable = ctrl->val & 0xff;
597 ret = vchiq_mmal_port_parameter_set(dev->instance, control,
598 MMAL_PARAMETER_COLOUR_EFFECT,
600 sizeof(dev->colourfx));
602 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
603 "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
604 __func__, mmal_ctrl, ctrl->id, ctrl->val, ret,
605 (ret == 0 ? 0 : -EINVAL));
606 return (ret == 0 ? 0 : -EINVAL);
609 static int ctrl_set_bitrate(struct bm2835_mmal_dev *dev,
610 struct v4l2_ctrl *ctrl,
611 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
614 struct vchiq_mmal_port *encoder_out;
616 dev->capture.encode_bitrate = ctrl->val;
618 encoder_out = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
620 ret = vchiq_mmal_port_parameter_set(dev->instance, encoder_out,
622 &ctrl->val, sizeof(ctrl->val));
627 static int ctrl_set_bitrate_mode(struct bm2835_mmal_dev *dev,
628 struct v4l2_ctrl *ctrl,
629 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
632 struct vchiq_mmal_port *encoder_out;
634 encoder_out = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
636 dev->capture.encode_bitrate_mode = ctrl->val;
639 case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
640 bitrate_mode = MMAL_VIDEO_RATECONTROL_VARIABLE;
642 case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
643 bitrate_mode = MMAL_VIDEO_RATECONTROL_CONSTANT;
647 vchiq_mmal_port_parameter_set(dev->instance, encoder_out,
650 sizeof(bitrate_mode));
654 static int ctrl_set_image_encode_output(struct bm2835_mmal_dev *dev,
655 struct v4l2_ctrl *ctrl,
656 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
659 struct vchiq_mmal_port *jpeg_out;
661 jpeg_out = &dev->component[MMAL_COMPONENT_IMAGE_ENCODE]->output[0];
663 u32_value = ctrl->val;
665 return vchiq_mmal_port_parameter_set(dev->instance, jpeg_out,
667 &u32_value, sizeof(u32_value));
670 static int ctrl_set_video_encode_param_output(struct bm2835_mmal_dev *dev,
671 struct v4l2_ctrl *ctrl,
672 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
675 struct vchiq_mmal_port *vid_enc_ctl;
677 vid_enc_ctl = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
679 u32_value = ctrl->val;
681 return vchiq_mmal_port_parameter_set(dev->instance, vid_enc_ctl,
683 &u32_value, sizeof(u32_value));
686 static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev *dev,
687 struct v4l2_ctrl *ctrl,
688 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
690 struct mmal_parameter_video_profile param;
693 if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_PROFILE) {
695 case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
696 case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
697 case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
698 case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
699 dev->capture.enc_profile = ctrl->val;
705 } else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_LEVEL) {
707 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
708 case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
709 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
710 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
711 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
712 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
713 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
714 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
715 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
716 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
717 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
718 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
719 dev->capture.enc_level = ctrl->val;
728 switch (dev->capture.enc_profile) {
729 case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
730 param.profile = MMAL_VIDEO_PROFILE_H264_BASELINE;
732 case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
734 MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE;
736 case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
737 param.profile = MMAL_VIDEO_PROFILE_H264_MAIN;
739 case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
740 param.profile = MMAL_VIDEO_PROFILE_H264_HIGH;
743 /* Should never get here */
747 switch (dev->capture.enc_level) {
748 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
749 param.level = MMAL_VIDEO_LEVEL_H264_1;
751 case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
752 param.level = MMAL_VIDEO_LEVEL_H264_1b;
754 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
755 param.level = MMAL_VIDEO_LEVEL_H264_11;
757 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
758 param.level = MMAL_VIDEO_LEVEL_H264_12;
760 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
761 param.level = MMAL_VIDEO_LEVEL_H264_13;
763 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
764 param.level = MMAL_VIDEO_LEVEL_H264_2;
766 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
767 param.level = MMAL_VIDEO_LEVEL_H264_21;
769 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
770 param.level = MMAL_VIDEO_LEVEL_H264_22;
772 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
773 param.level = MMAL_VIDEO_LEVEL_H264_3;
775 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
776 param.level = MMAL_VIDEO_LEVEL_H264_31;
778 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
779 param.level = MMAL_VIDEO_LEVEL_H264_32;
781 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
782 param.level = MMAL_VIDEO_LEVEL_H264_4;
785 /* Should never get here */
789 ret = vchiq_mmal_port_parameter_set(dev->instance,
790 &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0],
792 ¶m, sizeof(param));
797 static int ctrl_set_scene_mode(struct bm2835_mmal_dev *dev,
798 struct v4l2_ctrl *ctrl,
799 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
803 struct vchiq_mmal_port *control;
805 v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
806 "scene mode selected %d, was %d\n", ctrl->val,
808 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
810 if (ctrl->val == dev->scene_mode)
813 if (ctrl->val == V4L2_SCENE_MODE_NONE) {
814 /* Restore all user selections */
815 dev->scene_mode = V4L2_SCENE_MODE_NONE;
817 if (dev->exposure_mode_user == MMAL_PARAM_EXPOSUREMODE_OFF)
818 shutter_speed = dev->manual_shutter_speed;
822 v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
823 "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
824 __func__, shutter_speed, dev->exposure_mode_user,
826 ret = vchiq_mmal_port_parameter_set(dev->instance,
828 MMAL_PARAMETER_SHUTTER_SPEED,
830 sizeof(shutter_speed));
831 ret += vchiq_mmal_port_parameter_set(dev->instance,
833 MMAL_PARAMETER_EXPOSURE_MODE,
834 &dev->exposure_mode_user,
836 dev->exposure_mode_active = dev->exposure_mode_user;
837 ret += vchiq_mmal_port_parameter_set(dev->instance,
839 MMAL_PARAMETER_EXP_METERING_MODE,
842 ret += set_framerate_params(dev);
844 /* Set up scene mode */
846 const struct v4l2_mmal_scene_config *scene = NULL;
848 enum mmal_parameter_exposuremode exposure_mode;
849 enum mmal_parameter_exposuremeteringmode metering_mode;
851 for (i = 0; i < ARRAY_SIZE(scene_configs); i++) {
852 if (scene_configs[i].v4l2_scene ==
854 scene = &scene_configs[i];
860 if (i >= ARRAY_SIZE(scene_configs))
863 /* Set all the values */
864 dev->scene_mode = ctrl->val;
866 if (scene->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
867 shutter_speed = dev->manual_shutter_speed;
870 exposure_mode = scene->exposure_mode;
871 metering_mode = scene->metering_mode;
873 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
874 "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
875 __func__, shutter_speed, exposure_mode, metering_mode);
877 ret = vchiq_mmal_port_parameter_set(dev->instance, control,
878 MMAL_PARAMETER_SHUTTER_SPEED,
880 sizeof(shutter_speed));
881 ret += vchiq_mmal_port_parameter_set(dev->instance, control,
882 MMAL_PARAMETER_EXPOSURE_MODE,
885 dev->exposure_mode_active = exposure_mode;
886 ret += vchiq_mmal_port_parameter_set(dev->instance, control,
887 MMAL_PARAMETER_EXPOSURE_MODE,
890 ret += vchiq_mmal_port_parameter_set(dev->instance, control,
891 MMAL_PARAMETER_EXP_METERING_MODE,
894 ret += set_framerate_params(dev);
897 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
898 "%s: Setting scene to %d, ret=%d\n",
899 __func__, ctrl->val, ret);
905 static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
907 struct bm2835_mmal_dev *dev =
908 container_of(ctrl->handler, struct bm2835_mmal_dev,
910 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl = ctrl->priv;
913 if (!mmal_ctrl || mmal_ctrl->id != ctrl->id || !mmal_ctrl->setter) {
914 pr_warn("mmal_ctrl:%p ctrl id:%d\n", mmal_ctrl, ctrl->id);
918 ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
920 pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n",
921 ctrl->id, mmal_ctrl->mmal_id, ret);
922 if (mmal_ctrl->ignore_errors)
927 static const struct v4l2_ctrl_ops bm2835_mmal_ctrl_ops = {
928 .s_ctrl = bm2835_mmal_s_ctrl,
931 static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
933 V4L2_CID_SATURATION, MMAL_CONTROL_TYPE_STD,
934 -100, 100, 0, 1, NULL,
935 MMAL_PARAMETER_SATURATION,
940 V4L2_CID_SHARPNESS, MMAL_CONTROL_TYPE_STD,
941 -100, 100, 0, 1, NULL,
942 MMAL_PARAMETER_SHARPNESS,
947 V4L2_CID_CONTRAST, MMAL_CONTROL_TYPE_STD,
948 -100, 100, 0, 1, NULL,
949 MMAL_PARAMETER_CONTRAST,
954 V4L2_CID_BRIGHTNESS, MMAL_CONTROL_TYPE_STD,
956 MMAL_PARAMETER_BRIGHTNESS,
961 V4L2_CID_ISO_SENSITIVITY, MMAL_CONTROL_TYPE_INT_MENU,
962 0, ARRAY_SIZE(iso_qmenu) - 1, 0, 1, iso_qmenu,
968 V4L2_CID_ISO_SENSITIVITY_AUTO, MMAL_CONTROL_TYPE_STD_MENU,
969 0, 1, V4L2_ISO_SENSITIVITY_AUTO, 1, NULL,
975 V4L2_CID_IMAGE_STABILIZATION, MMAL_CONTROL_TYPE_STD,
977 MMAL_PARAMETER_VIDEO_STABILISATION,
982 * 0, MMAL_CONTROL_TYPE_CLUSTER, 3, 1, 0, NULL, 0, NULL
986 V4L2_CID_EXPOSURE_AUTO, MMAL_CONTROL_TYPE_STD_MENU,
987 ~0x03, 3, V4L2_EXPOSURE_AUTO, 0, NULL,
988 MMAL_PARAMETER_EXPOSURE_MODE,
992 /* todo this needs mixing in with set exposure
994 * V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
998 V4L2_CID_EXPOSURE_ABSOLUTE, MMAL_CONTROL_TYPE_STD,
999 /* Units of 100usecs */
1000 1, 1 * 1000 * 10, 100 * 10, 1, NULL,
1001 MMAL_PARAMETER_SHUTTER_SPEED,
1006 V4L2_CID_AUTO_EXPOSURE_BIAS, MMAL_CONTROL_TYPE_INT_MENU,
1007 0, ARRAY_SIZE(ev_bias_qmenu) - 1,
1008 (ARRAY_SIZE(ev_bias_qmenu) + 1) / 2 - 1, 0, ev_bias_qmenu,
1009 MMAL_PARAMETER_EXPOSURE_COMP,
1014 V4L2_CID_EXPOSURE_AUTO_PRIORITY, MMAL_CONTROL_TYPE_STD,
1017 0, /* Dummy MMAL ID as it gets mapped into FPS range*/
1022 V4L2_CID_EXPOSURE_METERING,
1023 MMAL_CONTROL_TYPE_STD_MENU,
1024 ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE, 0, NULL,
1025 MMAL_PARAMETER_EXP_METERING_MODE,
1026 &ctrl_set_metering_mode,
1030 V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
1031 MMAL_CONTROL_TYPE_STD_MENU,
1032 ~0x3ff, 9, V4L2_WHITE_BALANCE_AUTO, 0, NULL,
1033 MMAL_PARAMETER_AWB_MODE,
1038 V4L2_CID_RED_BALANCE, MMAL_CONTROL_TYPE_STD,
1039 1, 7999, 1000, 1, NULL,
1040 MMAL_PARAMETER_CUSTOM_AWB_GAINS,
1041 &ctrl_set_awb_gains,
1045 V4L2_CID_BLUE_BALANCE, MMAL_CONTROL_TYPE_STD,
1046 1, 7999, 1000, 1, NULL,
1047 MMAL_PARAMETER_CUSTOM_AWB_GAINS,
1048 &ctrl_set_awb_gains,
1052 V4L2_CID_COLORFX, MMAL_CONTROL_TYPE_STD_MENU,
1053 0, 15, V4L2_COLORFX_NONE, 0, NULL,
1054 MMAL_PARAMETER_IMAGE_EFFECT,
1055 &ctrl_set_image_effect,
1059 V4L2_CID_COLORFX_CBCR, MMAL_CONTROL_TYPE_STD,
1060 0, 0xffff, 0x8080, 1, NULL,
1061 MMAL_PARAMETER_COLOUR_EFFECT,
1066 V4L2_CID_ROTATE, MMAL_CONTROL_TYPE_STD,
1067 0, 360, 0, 90, NULL,
1068 MMAL_PARAMETER_ROTATION,
1073 V4L2_CID_HFLIP, MMAL_CONTROL_TYPE_STD,
1075 MMAL_PARAMETER_MIRROR,
1080 V4L2_CID_VFLIP, MMAL_CONTROL_TYPE_STD,
1082 MMAL_PARAMETER_MIRROR,
1087 V4L2_CID_MPEG_VIDEO_BITRATE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
1088 0, ARRAY_SIZE(bitrate_mode_qmenu) - 1,
1089 0, 0, bitrate_mode_qmenu,
1090 MMAL_PARAMETER_RATECONTROL,
1091 &ctrl_set_bitrate_mode,
1095 V4L2_CID_MPEG_VIDEO_BITRATE, MMAL_CONTROL_TYPE_STD,
1096 25 * 1000, 25 * 1000 * 1000, 10 * 1000 * 1000, 25 * 1000, NULL,
1097 MMAL_PARAMETER_VIDEO_BIT_RATE,
1102 V4L2_CID_JPEG_COMPRESSION_QUALITY, MMAL_CONTROL_TYPE_STD,
1105 MMAL_PARAMETER_JPEG_Q_FACTOR,
1106 &ctrl_set_image_encode_output,
1110 V4L2_CID_POWER_LINE_FREQUENCY, MMAL_CONTROL_TYPE_STD_MENU,
1111 0, ARRAY_SIZE(mains_freq_qmenu) - 1,
1113 MMAL_PARAMETER_FLICKER_AVOID,
1114 &ctrl_set_flicker_avoidance,
1118 V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, MMAL_CONTROL_TYPE_STD,
1121 MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER,
1122 &ctrl_set_video_encode_param_output,
1123 true /* Errors ignored as requires latest firmware to work */
1126 V4L2_CID_MPEG_VIDEO_H264_PROFILE,
1127 MMAL_CONTROL_TYPE_STD_MENU,
1128 ~((1<<V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
1129 (1<<V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
1130 (1<<V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
1131 (1<<V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
1132 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
1133 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, 1, NULL,
1134 MMAL_PARAMETER_PROFILE,
1135 &ctrl_set_video_encode_profile_level,
1139 V4L2_CID_MPEG_VIDEO_H264_LEVEL, MMAL_CONTROL_TYPE_STD_MENU,
1140 ~((1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
1141 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
1142 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
1143 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
1144 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
1145 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
1146 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
1147 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
1148 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
1149 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
1150 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
1151 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_4_0)),
1152 V4L2_MPEG_VIDEO_H264_LEVEL_4_0,
1153 V4L2_MPEG_VIDEO_H264_LEVEL_4_0, 1, NULL,
1154 MMAL_PARAMETER_PROFILE,
1155 &ctrl_set_video_encode_profile_level,
1159 V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
1160 -1, /* Min is computed at runtime */
1161 V4L2_SCENE_MODE_TEXT,
1162 V4L2_SCENE_MODE_NONE, 1, NULL,
1163 MMAL_PARAMETER_PROFILE,
1164 &ctrl_set_scene_mode,
1168 V4L2_CID_MPEG_VIDEO_H264_I_PERIOD, MMAL_CONTROL_TYPE_STD,
1169 0, 0x7FFFFFFF, 60, 1, NULL,
1170 MMAL_PARAMETER_INTRAPERIOD,
1171 &ctrl_set_video_encode_param_output,
1176 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
1181 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1182 if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) {
1183 ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c],
1185 if (!v4l2_ctrls[c].ignore_errors && ret) {
1186 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
1187 "Failed when setting default values for ctrl %d\n",
1196 int set_framerate_params(struct bm2835_mmal_dev *dev)
1198 struct mmal_parameter_fps_range fps_range;
1201 if ((dev->exposure_mode_active != MMAL_PARAM_EXPOSUREMODE_OFF) &&
1202 (dev->exp_auto_priority)) {
1203 /* Variable FPS. Define min FPS as 1fps.
1204 * Max as max defined FPS.
1206 fps_range.fps_low.num = 1;
1207 fps_range.fps_low.den = 1;
1208 fps_range.fps_high.num = dev->capture.timeperframe.denominator;
1209 fps_range.fps_high.den = dev->capture.timeperframe.numerator;
1211 /* Fixed FPS - set min and max to be the same */
1212 fps_range.fps_low.num = fps_range.fps_high.num =
1213 dev->capture.timeperframe.denominator;
1214 fps_range.fps_low.den = fps_range.fps_high.den =
1215 dev->capture.timeperframe.numerator;
1218 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
1219 "Set fps range to %d/%d to %d/%d\n",
1220 fps_range.fps_low.num,
1221 fps_range.fps_low.den,
1222 fps_range.fps_high.num,
1223 fps_range.fps_high.den);
1225 ret = vchiq_mmal_port_parameter_set(dev->instance,
1226 &dev->component[MMAL_COMPONENT_CAMERA]->
1227 output[MMAL_CAMERA_PORT_PREVIEW],
1228 MMAL_PARAMETER_FPS_RANGE,
1229 &fps_range, sizeof(fps_range));
1230 ret += vchiq_mmal_port_parameter_set(dev->instance,
1231 &dev->component[MMAL_COMPONENT_CAMERA]->
1232 output[MMAL_CAMERA_PORT_VIDEO],
1233 MMAL_PARAMETER_FPS_RANGE,
1234 &fps_range, sizeof(fps_range));
1235 ret += vchiq_mmal_port_parameter_set(dev->instance,
1236 &dev->component[MMAL_COMPONENT_CAMERA]->
1237 output[MMAL_CAMERA_PORT_CAPTURE],
1238 MMAL_PARAMETER_FPS_RANGE,
1239 &fps_range, sizeof(fps_range));
1241 v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
1242 "Failed to set fps ret %d\n", ret);
1247 int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
1248 struct v4l2_ctrl_handler *hdl)
1251 const struct bm2835_mmal_v4l2_ctrl *ctrl;
1253 v4l2_ctrl_handler_init(hdl, V4L2_CTRL_COUNT);
1255 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1256 ctrl = &v4l2_ctrls[c];
1258 switch (ctrl->type) {
1259 case MMAL_CONTROL_TYPE_STD:
1260 dev->ctrls[c] = v4l2_ctrl_new_std(hdl,
1261 &bm2835_mmal_ctrl_ops, ctrl->id,
1262 ctrl->min, ctrl->max, ctrl->step, ctrl->def);
1265 case MMAL_CONTROL_TYPE_STD_MENU:
1267 int mask = ctrl->min;
1269 if (ctrl->id == V4L2_CID_SCENE_MODE) {
1270 /* Special handling to work out the mask
1271 * value based on the scene_configs array
1272 * at runtime. Reduces the chance of
1276 mask = 1 << V4L2_SCENE_MODE_NONE;
1278 i < ARRAY_SIZE(scene_configs);
1280 mask |= 1 << scene_configs[i].v4l2_scene;
1285 dev->ctrls[c] = v4l2_ctrl_new_std_menu(hdl,
1286 &bm2835_mmal_ctrl_ops, ctrl->id,
1287 ctrl->max, mask, ctrl->def);
1291 case MMAL_CONTROL_TYPE_INT_MENU:
1292 dev->ctrls[c] = v4l2_ctrl_new_int_menu(hdl,
1293 &bm2835_mmal_ctrl_ops, ctrl->id,
1294 ctrl->max, ctrl->def, ctrl->imenu);
1297 case MMAL_CONTROL_TYPE_CLUSTER:
1298 /* skip this entry when constructing controls */
1305 dev->ctrls[c]->priv = (void *)ctrl;
1309 pr_err("error adding control %d/%d id 0x%x\n", c,
1310 V4L2_CTRL_COUNT, ctrl->id);
1314 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1315 ctrl = &v4l2_ctrls[c];
1317 switch (ctrl->type) {
1318 case MMAL_CONTROL_TYPE_CLUSTER:
1319 v4l2_ctrl_auto_cluster(ctrl->min,
1325 case MMAL_CONTROL_TYPE_STD:
1326 case MMAL_CONTROL_TYPE_STD_MENU:
1327 case MMAL_CONTROL_TYPE_INT_MENU: