1 // SPDX-License-Identifier: GPL-2.0
3 * Broadcom BM2835 V4L2 driver
5 * Copyright © 2013 Raspberry Pi (Trading) Ltd.
7 * Authors: Vincent Sanders @ Collabora
8 * Dave Stevenson @ Broadcom
9 * (now dave.stevenson@raspberrypi.org)
10 * Simon Mellor @ Broadcom
11 * Luke Diamand @ Broadcom
14 #include <linux/errno.h>
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/slab.h>
18 #include <media/videobuf2-vmalloc.h>
19 #include <media/v4l2-device.h>
20 #include <media/v4l2-ioctl.h>
21 #include <media/v4l2-ctrls.h>
22 #include <media/v4l2-fh.h>
23 #include <media/v4l2-event.h>
24 #include <media/v4l2-common.h>
26 #include "mmal-common.h"
27 #include "mmal-vchiq.h"
28 #include "mmal-parameters.h"
29 #include "bcm2835-camera.h"
31 /* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -4.0 to +4.0.
32 * MMAL values are in 1/6th increments so the MMAL range is -24 to +24.
33 * V4L2 docs say value "is expressed in terms of EV, drivers should interpret
34 * the values as 0.001 EV units, where the value 1000 stands for +1 EV."
35 * V4L2 is limited to a max of 32 values in a menu, so count in 1/3rds from
38 static const s64 ev_bias_qmenu[] = {
50 /* Supported ISO values (*1000)
53 static const s64 iso_qmenu[] = {
54 0, 100000, 200000, 400000, 800000,
57 static const u32 iso_values[] = {
58 0, 100, 200, 400, 800,
61 enum bm2835_mmal_ctrl_type {
62 MMAL_CONTROL_TYPE_STD,
63 MMAL_CONTROL_TYPE_STD_MENU,
64 MMAL_CONTROL_TYPE_INT_MENU,
65 MMAL_CONTROL_TYPE_CLUSTER, /* special cluster entry */
68 struct bm2835_mmal_v4l2_ctrl;
70 typedef int(bm2835_mmal_v4l2_ctrl_cb)(
71 struct bm2835_mmal_dev *dev,
72 struct v4l2_ctrl *ctrl,
73 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl);
75 struct bm2835_mmal_v4l2_ctrl {
76 u32 id; /* v4l2 control identifier */
77 enum bm2835_mmal_ctrl_type type;
78 /* control minimum value or
79 * mask for MMAL_CONTROL_TYPE_STD_MENU
82 s64 max; /* maximum value of control */
83 s64 def; /* default value of control */
84 u64 step; /* step size of the control */
85 const s64 *imenu; /* integer menu array */
86 u32 mmal_id; /* mmal parameter id */
87 bm2835_mmal_v4l2_ctrl_cb *setter;
90 struct v4l2_to_mmal_effects_setting {
94 s32 col_fx_fixed_cbcr;
97 u32 num_effect_params;
98 u32 effect_params[MMAL_MAX_IMAGEFX_PARAMETERS];
101 static const struct v4l2_to_mmal_effects_setting
102 v4l2_to_mmal_effects_values[] = {
103 { V4L2_COLORFX_NONE, MMAL_PARAM_IMAGEFX_NONE,
104 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
105 { V4L2_COLORFX_BW, MMAL_PARAM_IMAGEFX_NONE,
106 1, 0, 128, 128, 0, {0, 0, 0, 0, 0} },
107 { V4L2_COLORFX_SEPIA, MMAL_PARAM_IMAGEFX_NONE,
108 1, 0, 87, 151, 0, {0, 0, 0, 0, 0} },
109 { V4L2_COLORFX_NEGATIVE, MMAL_PARAM_IMAGEFX_NEGATIVE,
110 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
111 { V4L2_COLORFX_EMBOSS, MMAL_PARAM_IMAGEFX_EMBOSS,
112 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
113 { V4L2_COLORFX_SKETCH, MMAL_PARAM_IMAGEFX_SKETCH,
114 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
115 { V4L2_COLORFX_SKY_BLUE, MMAL_PARAM_IMAGEFX_PASTEL,
116 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
117 { V4L2_COLORFX_GRASS_GREEN, MMAL_PARAM_IMAGEFX_WATERCOLOUR,
118 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
119 { V4L2_COLORFX_SKIN_WHITEN, MMAL_PARAM_IMAGEFX_WASHEDOUT,
120 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
121 { V4L2_COLORFX_VIVID, MMAL_PARAM_IMAGEFX_SATURATION,
122 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
123 { V4L2_COLORFX_AQUA, MMAL_PARAM_IMAGEFX_NONE,
124 1, 0, 171, 121, 0, {0, 0, 0, 0, 0} },
125 { V4L2_COLORFX_ART_FREEZE, MMAL_PARAM_IMAGEFX_HATCH,
126 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
127 { V4L2_COLORFX_SILHOUETTE, MMAL_PARAM_IMAGEFX_FILM,
128 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
129 { V4L2_COLORFX_SOLARIZATION, MMAL_PARAM_IMAGEFX_SOLARIZE,
130 0, 0, 0, 0, 5, {1, 128, 160, 160, 48} },
131 { V4L2_COLORFX_ANTIQUE, MMAL_PARAM_IMAGEFX_COLOURBALANCE,
132 0, 0, 0, 0, 3, {108, 274, 238, 0, 0} },
133 { V4L2_COLORFX_SET_CBCR, MMAL_PARAM_IMAGEFX_NONE,
134 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} }
137 struct v4l2_mmal_scene_config {
138 enum v4l2_scene_mode v4l2_scene;
139 enum mmal_parameter_exposuremode exposure_mode;
140 enum mmal_parameter_exposuremeteringmode metering_mode;
143 static const struct v4l2_mmal_scene_config scene_configs[] = {
144 /* V4L2_SCENE_MODE_NONE automatically added */
146 V4L2_SCENE_MODE_NIGHT,
147 MMAL_PARAM_EXPOSUREMODE_NIGHT,
148 MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
151 V4L2_SCENE_MODE_SPORTS,
152 MMAL_PARAM_EXPOSUREMODE_SPORTS,
153 MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
157 /* control handlers*/
159 static int ctrl_set_rational(struct bm2835_mmal_dev *dev,
160 struct v4l2_ctrl *ctrl,
161 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
163 struct mmal_parameter_rational rational_value;
164 struct vchiq_mmal_port *control;
166 control = &dev->component[COMP_CAMERA]->control;
168 rational_value.num = ctrl->val;
169 rational_value.den = 100;
171 return vchiq_mmal_port_parameter_set(dev->instance, control,
174 sizeof(rational_value));
177 static int ctrl_set_value(struct bm2835_mmal_dev *dev,
178 struct v4l2_ctrl *ctrl,
179 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
182 struct vchiq_mmal_port *control;
184 control = &dev->component[COMP_CAMERA]->control;
186 u32_value = ctrl->val;
188 return vchiq_mmal_port_parameter_set(dev->instance, control,
190 &u32_value, sizeof(u32_value));
193 static int ctrl_set_iso(struct bm2835_mmal_dev *dev,
194 struct v4l2_ctrl *ctrl,
195 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
198 struct vchiq_mmal_port *control;
200 if (ctrl->val > mmal_ctrl->max || ctrl->val < mmal_ctrl->min)
203 if (ctrl->id == V4L2_CID_ISO_SENSITIVITY)
204 dev->iso = iso_values[ctrl->val];
205 else if (ctrl->id == V4L2_CID_ISO_SENSITIVITY_AUTO)
206 dev->manual_iso_enabled =
207 (ctrl->val == V4L2_ISO_SENSITIVITY_MANUAL);
209 control = &dev->component[COMP_CAMERA]->control;
211 if (dev->manual_iso_enabled)
212 u32_value = dev->iso;
216 return vchiq_mmal_port_parameter_set(dev->instance, control,
218 &u32_value, sizeof(u32_value));
221 static int ctrl_set_value_ev(struct bm2835_mmal_dev *dev,
222 struct v4l2_ctrl *ctrl,
223 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
226 struct vchiq_mmal_port *control;
228 control = &dev->component[COMP_CAMERA]->control;
230 s32_value = (ctrl->val - 12) * 2; /* Convert from index to 1/6ths */
232 return vchiq_mmal_port_parameter_set(dev->instance, control,
234 &s32_value, sizeof(s32_value));
237 static int ctrl_set_rotate(struct bm2835_mmal_dev *dev,
238 struct v4l2_ctrl *ctrl,
239 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
243 struct vchiq_mmal_component *camera;
245 camera = dev->component[COMP_CAMERA];
247 u32_value = ((ctrl->val % 360) / 90) * 90;
249 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0],
251 &u32_value, sizeof(u32_value));
255 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1],
257 &u32_value, sizeof(u32_value));
261 return vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2],
263 &u32_value, sizeof(u32_value));
266 static int ctrl_set_flip(struct bm2835_mmal_dev *dev,
267 struct v4l2_ctrl *ctrl,
268 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
272 struct vchiq_mmal_component *camera;
274 if (ctrl->id == V4L2_CID_HFLIP)
275 dev->hflip = ctrl->val;
277 dev->vflip = ctrl->val;
279 camera = dev->component[COMP_CAMERA];
281 if (dev->hflip && dev->vflip)
282 u32_value = MMAL_PARAM_MIRROR_BOTH;
284 u32_value = MMAL_PARAM_MIRROR_HORIZONTAL;
286 u32_value = MMAL_PARAM_MIRROR_VERTICAL;
288 u32_value = MMAL_PARAM_MIRROR_NONE;
290 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0],
292 &u32_value, sizeof(u32_value));
296 ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1],
298 &u32_value, sizeof(u32_value));
302 return vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2],
304 &u32_value, sizeof(u32_value));
307 static int ctrl_set_exposure(struct bm2835_mmal_dev *dev,
308 struct v4l2_ctrl *ctrl,
309 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
311 enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode_user;
312 u32 shutter_speed = 0;
313 struct vchiq_mmal_port *control;
316 control = &dev->component[COMP_CAMERA]->control;
318 if (mmal_ctrl->mmal_id == MMAL_PARAMETER_SHUTTER_SPEED) {
319 /* V4L2 is in 100usec increments.
322 dev->manual_shutter_speed = ctrl->val * 100;
323 } else if (mmal_ctrl->mmal_id == MMAL_PARAMETER_EXPOSURE_MODE) {
325 case V4L2_EXPOSURE_AUTO:
326 exp_mode = MMAL_PARAM_EXPOSUREMODE_AUTO;
329 case V4L2_EXPOSURE_MANUAL:
330 exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF;
333 dev->exposure_mode_user = exp_mode;
334 dev->exposure_mode_v4l2_user = ctrl->val;
335 } else if (mmal_ctrl->id == V4L2_CID_EXPOSURE_AUTO_PRIORITY) {
336 dev->exp_auto_priority = ctrl->val;
339 if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
340 if (exp_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
341 shutter_speed = dev->manual_shutter_speed;
343 ret = vchiq_mmal_port_parameter_set(dev->instance,
345 MMAL_PARAMETER_SHUTTER_SPEED,
347 sizeof(shutter_speed));
348 ret += vchiq_mmal_port_parameter_set(dev->instance,
350 MMAL_PARAMETER_EXPOSURE_MODE,
353 dev->exposure_mode_active = exp_mode;
355 /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should
356 * always apply irrespective of scene mode.
358 ret += set_framerate_params(dev);
363 static int ctrl_set_metering_mode(struct bm2835_mmal_dev *dev,
364 struct v4l2_ctrl *ctrl,
365 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
368 case V4L2_EXPOSURE_METERING_AVERAGE:
369 dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
372 case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED:
373 dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
376 case V4L2_EXPOSURE_METERING_SPOT:
377 dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
380 case V4L2_EXPOSURE_METERING_MATRIX:
381 dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
385 if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
386 struct vchiq_mmal_port *control;
387 u32 u32_value = dev->metering_mode;
389 control = &dev->component[COMP_CAMERA]->control;
391 return vchiq_mmal_port_parameter_set(dev->instance, control,
393 &u32_value, sizeof(u32_value));
399 static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev *dev,
400 struct v4l2_ctrl *ctrl,
401 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
404 struct vchiq_mmal_port *control;
406 control = &dev->component[COMP_CAMERA]->control;
409 case V4L2_CID_POWER_LINE_FREQUENCY_DISABLED:
410 u32_value = MMAL_PARAM_FLICKERAVOID_OFF;
412 case V4L2_CID_POWER_LINE_FREQUENCY_50HZ:
413 u32_value = MMAL_PARAM_FLICKERAVOID_50HZ;
415 case V4L2_CID_POWER_LINE_FREQUENCY_60HZ:
416 u32_value = MMAL_PARAM_FLICKERAVOID_60HZ;
418 case V4L2_CID_POWER_LINE_FREQUENCY_AUTO:
419 u32_value = MMAL_PARAM_FLICKERAVOID_AUTO;
423 return vchiq_mmal_port_parameter_set(dev->instance, control,
425 &u32_value, sizeof(u32_value));
428 static int ctrl_set_awb_mode(struct bm2835_mmal_dev *dev,
429 struct v4l2_ctrl *ctrl,
430 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
433 struct vchiq_mmal_port *control;
435 control = &dev->component[COMP_CAMERA]->control;
438 case V4L2_WHITE_BALANCE_MANUAL:
439 u32_value = MMAL_PARAM_AWBMODE_OFF;
442 case V4L2_WHITE_BALANCE_AUTO:
443 u32_value = MMAL_PARAM_AWBMODE_AUTO;
446 case V4L2_WHITE_BALANCE_INCANDESCENT:
447 u32_value = MMAL_PARAM_AWBMODE_INCANDESCENT;
450 case V4L2_WHITE_BALANCE_FLUORESCENT:
451 u32_value = MMAL_PARAM_AWBMODE_FLUORESCENT;
454 case V4L2_WHITE_BALANCE_FLUORESCENT_H:
455 u32_value = MMAL_PARAM_AWBMODE_TUNGSTEN;
458 case V4L2_WHITE_BALANCE_HORIZON:
459 u32_value = MMAL_PARAM_AWBMODE_HORIZON;
462 case V4L2_WHITE_BALANCE_DAYLIGHT:
463 u32_value = MMAL_PARAM_AWBMODE_SUNLIGHT;
466 case V4L2_WHITE_BALANCE_FLASH:
467 u32_value = MMAL_PARAM_AWBMODE_FLASH;
470 case V4L2_WHITE_BALANCE_CLOUDY:
471 u32_value = MMAL_PARAM_AWBMODE_CLOUDY;
474 case V4L2_WHITE_BALANCE_SHADE:
475 u32_value = MMAL_PARAM_AWBMODE_SHADE;
479 return vchiq_mmal_port_parameter_set(dev->instance, control,
481 &u32_value, sizeof(u32_value));
484 static int ctrl_set_awb_gains(struct bm2835_mmal_dev *dev,
485 struct v4l2_ctrl *ctrl,
486 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
488 struct vchiq_mmal_port *control;
489 struct mmal_parameter_awbgains gains;
491 control = &dev->component[COMP_CAMERA]->control;
493 if (ctrl->id == V4L2_CID_RED_BALANCE)
494 dev->red_gain = ctrl->val;
495 else if (ctrl->id == V4L2_CID_BLUE_BALANCE)
496 dev->blue_gain = ctrl->val;
498 gains.r_gain.num = dev->red_gain;
499 gains.b_gain.num = dev->blue_gain;
500 gains.r_gain.den = gains.b_gain.den = 1000;
502 return vchiq_mmal_port_parameter_set(dev->instance, control,
504 &gains, sizeof(gains));
507 static int ctrl_set_image_effect(struct bm2835_mmal_dev *dev,
508 struct v4l2_ctrl *ctrl,
509 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
513 struct vchiq_mmal_port *control;
514 struct mmal_parameter_imagefx_parameters imagefx;
516 for (i = 0; i < ARRAY_SIZE(v4l2_to_mmal_effects_values); i++) {
517 if (ctrl->val == v4l2_to_mmal_effects_values[i].v4l2_effect) {
519 v4l2_to_mmal_effects_values[i].mmal_effect;
520 imagefx.num_effect_params =
521 v4l2_to_mmal_effects_values[i].num_effect_params;
523 if (imagefx.num_effect_params > MMAL_MAX_IMAGEFX_PARAMETERS)
524 imagefx.num_effect_params = MMAL_MAX_IMAGEFX_PARAMETERS;
526 for (j = 0; j < imagefx.num_effect_params; j++)
527 imagefx.effect_parameter[j] =
528 v4l2_to_mmal_effects_values[i].effect_params[j];
530 dev->colourfx.enable =
531 v4l2_to_mmal_effects_values[i].col_fx_enable;
532 if (!v4l2_to_mmal_effects_values[i].col_fx_fixed_cbcr) {
534 v4l2_to_mmal_effects_values[i].u;
536 v4l2_to_mmal_effects_values[i].v;
539 control = &dev->component[COMP_CAMERA]->control;
541 ret = vchiq_mmal_port_parameter_set(
542 dev->instance, control,
543 MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,
544 &imagefx, sizeof(imagefx));
548 ret = vchiq_mmal_port_parameter_set(
549 dev->instance, control,
550 MMAL_PARAMETER_COLOUR_EFFECT,
551 &dev->colourfx, sizeof(dev->colourfx));
556 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
557 "mmal_ctrl:%p ctrl id:0x%x ctrl val:%d imagefx:0x%x color_effect:%s u:%d v:%d ret %d(%d)\n",
558 mmal_ctrl, ctrl->id, ctrl->val, imagefx.effect,
559 dev->colourfx.enable ? "true" : "false",
560 dev->colourfx.u, dev->colourfx.v,
561 ret, (ret == 0 ? 0 : -EINVAL));
562 return (ret == 0 ? 0 : -EINVAL);
565 static int ctrl_set_colfx(struct bm2835_mmal_dev *dev,
566 struct v4l2_ctrl *ctrl,
567 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
570 struct vchiq_mmal_port *control;
572 control = &dev->component[COMP_CAMERA]->control;
574 dev->colourfx.u = (ctrl->val & 0xff00) >> 8;
575 dev->colourfx.v = ctrl->val & 0xff;
577 ret = vchiq_mmal_port_parameter_set(dev->instance, control,
578 MMAL_PARAMETER_COLOUR_EFFECT,
580 sizeof(dev->colourfx));
582 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
583 "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
584 __func__, mmal_ctrl, ctrl->id, ctrl->val, ret,
585 (ret == 0 ? 0 : -EINVAL));
586 return (ret == 0 ? 0 : -EINVAL);
589 static int ctrl_set_bitrate(struct bm2835_mmal_dev *dev,
590 struct v4l2_ctrl *ctrl,
591 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
594 struct vchiq_mmal_port *encoder_out;
596 dev->capture.encode_bitrate = ctrl->val;
598 encoder_out = &dev->component[COMP_VIDEO_ENCODE]->output[0];
600 ret = vchiq_mmal_port_parameter_set(dev->instance, encoder_out,
601 mmal_ctrl->mmal_id, &ctrl->val,
604 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
605 "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
606 __func__, mmal_ctrl, ctrl->id, ctrl->val, ret,
607 (ret == 0 ? 0 : -EINVAL));
610 * Older firmware versions (pre July 2019) have a bug in handling
611 * MMAL_PARAMETER_VIDEO_BIT_RATE that result in the call
612 * returning -MMAL_MSG_STATUS_EINVAL. So ignore errors from this call.
617 static int ctrl_set_bitrate_mode(struct bm2835_mmal_dev *dev,
618 struct v4l2_ctrl *ctrl,
619 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
622 struct vchiq_mmal_port *encoder_out;
624 encoder_out = &dev->component[COMP_VIDEO_ENCODE]->output[0];
626 dev->capture.encode_bitrate_mode = ctrl->val;
629 case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
630 bitrate_mode = MMAL_VIDEO_RATECONTROL_VARIABLE;
632 case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
633 bitrate_mode = MMAL_VIDEO_RATECONTROL_CONSTANT;
637 vchiq_mmal_port_parameter_set(dev->instance, encoder_out,
640 sizeof(bitrate_mode));
644 static int ctrl_set_image_encode_output(struct bm2835_mmal_dev *dev,
645 struct v4l2_ctrl *ctrl,
646 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
649 struct vchiq_mmal_port *jpeg_out;
651 jpeg_out = &dev->component[COMP_IMAGE_ENCODE]->output[0];
653 u32_value = ctrl->val;
655 return vchiq_mmal_port_parameter_set(dev->instance, jpeg_out,
657 &u32_value, sizeof(u32_value));
660 static int ctrl_set_video_encode_param_output(struct bm2835_mmal_dev *dev,
661 struct v4l2_ctrl *ctrl,
662 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
665 struct vchiq_mmal_port *vid_enc_ctl;
667 vid_enc_ctl = &dev->component[COMP_VIDEO_ENCODE]->output[0];
669 u32_value = ctrl->val;
671 return vchiq_mmal_port_parameter_set(dev->instance, vid_enc_ctl,
673 &u32_value, sizeof(u32_value));
676 static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev *dev,
677 struct v4l2_ctrl *ctrl,
678 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
680 struct mmal_parameter_video_profile param;
683 if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_PROFILE) {
685 case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
686 case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
687 case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
688 case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
689 dev->capture.enc_profile = ctrl->val;
695 } else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_LEVEL) {
697 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
698 case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
699 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
700 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
701 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
702 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
703 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
704 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
705 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
706 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
707 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
708 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
709 dev->capture.enc_level = ctrl->val;
718 switch (dev->capture.enc_profile) {
719 case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
720 param.profile = MMAL_VIDEO_PROFILE_H264_BASELINE;
722 case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
724 MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE;
726 case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
727 param.profile = MMAL_VIDEO_PROFILE_H264_MAIN;
729 case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
730 param.profile = MMAL_VIDEO_PROFILE_H264_HIGH;
733 /* Should never get here */
737 switch (dev->capture.enc_level) {
738 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
739 param.level = MMAL_VIDEO_LEVEL_H264_1;
741 case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
742 param.level = MMAL_VIDEO_LEVEL_H264_1b;
744 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
745 param.level = MMAL_VIDEO_LEVEL_H264_11;
747 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
748 param.level = MMAL_VIDEO_LEVEL_H264_12;
750 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
751 param.level = MMAL_VIDEO_LEVEL_H264_13;
753 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
754 param.level = MMAL_VIDEO_LEVEL_H264_2;
756 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
757 param.level = MMAL_VIDEO_LEVEL_H264_21;
759 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
760 param.level = MMAL_VIDEO_LEVEL_H264_22;
762 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
763 param.level = MMAL_VIDEO_LEVEL_H264_3;
765 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
766 param.level = MMAL_VIDEO_LEVEL_H264_31;
768 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
769 param.level = MMAL_VIDEO_LEVEL_H264_32;
771 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
772 param.level = MMAL_VIDEO_LEVEL_H264_4;
775 /* Should never get here */
779 ret = vchiq_mmal_port_parameter_set(dev->instance,
780 &dev->component[COMP_VIDEO_ENCODE]->output[0],
782 ¶m, sizeof(param));
787 static int ctrl_set_scene_mode(struct bm2835_mmal_dev *dev,
788 struct v4l2_ctrl *ctrl,
789 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
793 struct vchiq_mmal_port *control;
795 v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
796 "scene mode selected %d, was %d\n", ctrl->val,
798 control = &dev->component[COMP_CAMERA]->control;
800 if (ctrl->val == dev->scene_mode)
803 if (ctrl->val == V4L2_SCENE_MODE_NONE) {
804 /* Restore all user selections */
805 dev->scene_mode = V4L2_SCENE_MODE_NONE;
807 if (dev->exposure_mode_user == MMAL_PARAM_EXPOSUREMODE_OFF)
808 shutter_speed = dev->manual_shutter_speed;
812 v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
813 "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
814 __func__, shutter_speed, dev->exposure_mode_user,
816 ret = vchiq_mmal_port_parameter_set(dev->instance,
818 MMAL_PARAMETER_SHUTTER_SPEED,
820 sizeof(shutter_speed));
821 ret += vchiq_mmal_port_parameter_set(dev->instance,
823 MMAL_PARAMETER_EXPOSURE_MODE,
824 &dev->exposure_mode_user,
826 dev->exposure_mode_active = dev->exposure_mode_user;
827 ret += vchiq_mmal_port_parameter_set(dev->instance,
829 MMAL_PARAMETER_EXP_METERING_MODE,
832 ret += set_framerate_params(dev);
834 /* Set up scene mode */
836 const struct v4l2_mmal_scene_config *scene = NULL;
838 enum mmal_parameter_exposuremode exposure_mode;
839 enum mmal_parameter_exposuremeteringmode metering_mode;
841 for (i = 0; i < ARRAY_SIZE(scene_configs); i++) {
842 if (scene_configs[i].v4l2_scene ==
844 scene = &scene_configs[i];
850 if (i >= ARRAY_SIZE(scene_configs))
853 /* Set all the values */
854 dev->scene_mode = ctrl->val;
856 if (scene->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
857 shutter_speed = dev->manual_shutter_speed;
860 exposure_mode = scene->exposure_mode;
861 metering_mode = scene->metering_mode;
863 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
864 "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
865 __func__, shutter_speed, exposure_mode, metering_mode);
867 ret = vchiq_mmal_port_parameter_set(dev->instance, control,
868 MMAL_PARAMETER_SHUTTER_SPEED,
870 sizeof(shutter_speed));
871 ret += vchiq_mmal_port_parameter_set(dev->instance, control,
872 MMAL_PARAMETER_EXPOSURE_MODE,
875 dev->exposure_mode_active = exposure_mode;
876 ret += vchiq_mmal_port_parameter_set(dev->instance, control,
877 MMAL_PARAMETER_EXPOSURE_MODE,
880 ret += vchiq_mmal_port_parameter_set(dev->instance, control,
881 MMAL_PARAMETER_EXP_METERING_MODE,
884 ret += set_framerate_params(dev);
887 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
888 "%s: Setting scene to %d, ret=%d\n",
889 __func__, ctrl->val, ret);
895 static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
897 struct bm2835_mmal_dev *dev =
898 container_of(ctrl->handler, struct bm2835_mmal_dev,
900 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl = ctrl->priv;
903 if (!mmal_ctrl || mmal_ctrl->id != ctrl->id || !mmal_ctrl->setter) {
904 pr_warn("mmal_ctrl:%p ctrl id:%d\n", mmal_ctrl, ctrl->id);
908 ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
910 pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n",
911 ctrl->id, mmal_ctrl->mmal_id, ret);
915 static const struct v4l2_ctrl_ops bm2835_mmal_ctrl_ops = {
916 .s_ctrl = bm2835_mmal_s_ctrl,
919 static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
921 .id = V4L2_CID_SATURATION,
922 .type = MMAL_CONTROL_TYPE_STD,
928 .mmal_id = MMAL_PARAMETER_SATURATION,
929 .setter = ctrl_set_rational,
932 .id = V4L2_CID_SHARPNESS,
933 .type = MMAL_CONTROL_TYPE_STD,
939 .mmal_id = MMAL_PARAMETER_SHARPNESS,
940 .setter = ctrl_set_rational,
943 .id = V4L2_CID_CONTRAST,
944 .type = MMAL_CONTROL_TYPE_STD,
950 .mmal_id = MMAL_PARAMETER_CONTRAST,
951 .setter = ctrl_set_rational,
954 .id = V4L2_CID_BRIGHTNESS,
955 .type = MMAL_CONTROL_TYPE_STD,
961 .mmal_id = MMAL_PARAMETER_BRIGHTNESS,
962 .setter = ctrl_set_rational,
965 .id = V4L2_CID_ISO_SENSITIVITY,
966 .type = MMAL_CONTROL_TYPE_INT_MENU,
968 .max = ARRAY_SIZE(iso_qmenu) - 1,
972 .mmal_id = MMAL_PARAMETER_ISO,
973 .setter = ctrl_set_iso,
976 .id = V4L2_CID_ISO_SENSITIVITY_AUTO,
977 .type = MMAL_CONTROL_TYPE_STD_MENU,
979 .max = V4L2_ISO_SENSITIVITY_AUTO,
980 .def = V4L2_ISO_SENSITIVITY_AUTO,
983 .mmal_id = MMAL_PARAMETER_ISO,
984 .setter = ctrl_set_iso,
987 .id = V4L2_CID_IMAGE_STABILIZATION,
988 .type = MMAL_CONTROL_TYPE_STD,
994 .mmal_id = MMAL_PARAMETER_VIDEO_STABILISATION,
995 .setter = ctrl_set_value,
998 .id = V4L2_CID_EXPOSURE_AUTO,
999 .type = MMAL_CONTROL_TYPE_STD_MENU,
1001 .max = V4L2_EXPOSURE_APERTURE_PRIORITY,
1002 .def = V4L2_EXPOSURE_AUTO,
1005 .mmal_id = MMAL_PARAMETER_EXPOSURE_MODE,
1006 .setter = ctrl_set_exposure,
1009 .id = V4L2_CID_EXPOSURE_ABSOLUTE,
1010 .type = MMAL_CONTROL_TYPE_STD,
1011 /* Units of 100usecs */
1013 .max = 1 * 1000 * 10,
1017 .mmal_id = MMAL_PARAMETER_SHUTTER_SPEED,
1018 .setter = ctrl_set_exposure,
1021 .id = V4L2_CID_AUTO_EXPOSURE_BIAS,
1022 .type = MMAL_CONTROL_TYPE_INT_MENU,
1024 .max = ARRAY_SIZE(ev_bias_qmenu) - 1,
1025 .def = (ARRAY_SIZE(ev_bias_qmenu) + 1) / 2 - 1,
1027 .imenu = ev_bias_qmenu,
1028 .mmal_id = MMAL_PARAMETER_EXPOSURE_COMP,
1029 .setter = ctrl_set_value_ev,
1032 .id = V4L2_CID_EXPOSURE_AUTO_PRIORITY,
1033 .type = MMAL_CONTROL_TYPE_STD,
1039 /* Dummy MMAL ID as it gets mapped into FPS range */
1041 .setter = ctrl_set_exposure,
1044 .id = V4L2_CID_EXPOSURE_METERING,
1045 .type = MMAL_CONTROL_TYPE_STD_MENU,
1047 .max = V4L2_EXPOSURE_METERING_MATRIX,
1048 .def = V4L2_EXPOSURE_METERING_AVERAGE,
1051 .mmal_id = MMAL_PARAMETER_EXP_METERING_MODE,
1052 .setter = ctrl_set_metering_mode,
1055 .id = V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
1056 .type = MMAL_CONTROL_TYPE_STD_MENU,
1058 .max = V4L2_WHITE_BALANCE_SHADE,
1059 .def = V4L2_WHITE_BALANCE_AUTO,
1062 .mmal_id = MMAL_PARAMETER_AWB_MODE,
1063 .setter = ctrl_set_awb_mode,
1066 .id = V4L2_CID_RED_BALANCE,
1067 .type = MMAL_CONTROL_TYPE_STD,
1073 .mmal_id = MMAL_PARAMETER_CUSTOM_AWB_GAINS,
1074 .setter = ctrl_set_awb_gains,
1077 .id = V4L2_CID_BLUE_BALANCE,
1078 .type = MMAL_CONTROL_TYPE_STD,
1084 .mmal_id = MMAL_PARAMETER_CUSTOM_AWB_GAINS,
1085 .setter = ctrl_set_awb_gains,
1088 .id = V4L2_CID_COLORFX,
1089 .type = MMAL_CONTROL_TYPE_STD_MENU,
1091 .max = V4L2_COLORFX_SET_CBCR,
1092 .def = V4L2_COLORFX_NONE,
1095 .mmal_id = MMAL_PARAMETER_IMAGE_EFFECT,
1096 .setter = ctrl_set_image_effect,
1099 .id = V4L2_CID_COLORFX_CBCR,
1100 .type = MMAL_CONTROL_TYPE_STD,
1106 .mmal_id = MMAL_PARAMETER_COLOUR_EFFECT,
1107 .setter = ctrl_set_colfx,
1110 .id = V4L2_CID_ROTATE,
1111 .type = MMAL_CONTROL_TYPE_STD,
1117 .mmal_id = MMAL_PARAMETER_ROTATION,
1118 .setter = ctrl_set_rotate,
1121 .id = V4L2_CID_HFLIP,
1122 .type = MMAL_CONTROL_TYPE_STD,
1128 .mmal_id = MMAL_PARAMETER_MIRROR,
1129 .setter = ctrl_set_flip,
1132 .id = V4L2_CID_VFLIP,
1133 .type = MMAL_CONTROL_TYPE_STD,
1139 .mmal_id = MMAL_PARAMETER_MIRROR,
1140 .setter = ctrl_set_flip,
1143 .id = V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
1144 .type = MMAL_CONTROL_TYPE_STD_MENU,
1146 .max = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
1150 .mmal_id = MMAL_PARAMETER_RATECONTROL,
1151 .setter = ctrl_set_bitrate_mode,
1154 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
1155 .type = MMAL_CONTROL_TYPE_STD,
1157 .max = 25 * 1000 * 1000,
1158 .def = 10 * 1000 * 1000,
1161 .mmal_id = MMAL_PARAMETER_VIDEO_BIT_RATE,
1162 .setter = ctrl_set_bitrate,
1165 .id = V4L2_CID_JPEG_COMPRESSION_QUALITY,
1166 .type = MMAL_CONTROL_TYPE_STD,
1172 .mmal_id = MMAL_PARAMETER_JPEG_Q_FACTOR,
1173 .setter = ctrl_set_image_encode_output,
1176 .id = V4L2_CID_POWER_LINE_FREQUENCY,
1177 .type = MMAL_CONTROL_TYPE_STD_MENU,
1179 .max = V4L2_CID_POWER_LINE_FREQUENCY_AUTO,
1183 .mmal_id = MMAL_PARAMETER_FLICKER_AVOID,
1184 .setter = ctrl_set_flicker_avoidance,
1187 .id = V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER,
1188 .type = MMAL_CONTROL_TYPE_STD,
1194 .mmal_id = MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER,
1195 .setter = ctrl_set_video_encode_param_output,
1198 .id = V4L2_CID_MPEG_VIDEO_H264_PROFILE,
1199 .type = MMAL_CONTROL_TYPE_STD_MENU,
1200 .min = ~(BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
1201 BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
1202 BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
1203 BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
1204 .max = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
1205 .def = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
1208 .mmal_id = MMAL_PARAMETER_PROFILE,
1209 .setter = ctrl_set_video_encode_profile_level,
1212 .id = V4L2_CID_MPEG_VIDEO_H264_LEVEL,
1213 .type = MMAL_CONTROL_TYPE_STD_MENU,
1214 .min = ~(BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
1215 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
1216 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
1217 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
1218 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
1219 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
1220 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
1221 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
1222 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
1223 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
1224 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
1225 BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0)),
1226 .max = V4L2_MPEG_VIDEO_H264_LEVEL_4_0,
1227 .def = V4L2_MPEG_VIDEO_H264_LEVEL_4_0,
1230 .mmal_id = MMAL_PARAMETER_PROFILE,
1231 .setter = ctrl_set_video_encode_profile_level,
1234 .id = V4L2_CID_SCENE_MODE,
1235 .type = MMAL_CONTROL_TYPE_STD_MENU,
1236 /* mask is computed at runtime */
1238 .max = V4L2_SCENE_MODE_TEXT,
1239 .def = V4L2_SCENE_MODE_NONE,
1242 .mmal_id = MMAL_PARAMETER_PROFILE,
1243 .setter = ctrl_set_scene_mode,
1246 .id = V4L2_CID_MPEG_VIDEO_H264_I_PERIOD,
1247 .type = MMAL_CONTROL_TYPE_STD,
1253 .mmal_id = MMAL_PARAMETER_INTRAPERIOD,
1254 .setter = ctrl_set_video_encode_param_output,
1258 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
1263 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1264 if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) {
1265 ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c],
1268 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
1269 "Failed when setting default values for ctrl %d\n",
1278 int set_framerate_params(struct bm2835_mmal_dev *dev)
1280 struct mmal_parameter_fps_range fps_range;
1283 if ((dev->exposure_mode_active != MMAL_PARAM_EXPOSUREMODE_OFF) &&
1284 (dev->exp_auto_priority)) {
1285 /* Variable FPS. Define min FPS as 1fps.
1286 * Max as max defined FPS.
1288 fps_range.fps_low.num = 1;
1289 fps_range.fps_low.den = 1;
1290 fps_range.fps_high.num = dev->capture.timeperframe.denominator;
1291 fps_range.fps_high.den = dev->capture.timeperframe.numerator;
1293 /* Fixed FPS - set min and max to be the same */
1294 fps_range.fps_low.num = fps_range.fps_high.num =
1295 dev->capture.timeperframe.denominator;
1296 fps_range.fps_low.den = fps_range.fps_high.den =
1297 dev->capture.timeperframe.numerator;
1300 v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
1301 "Set fps range to %d/%d to %d/%d\n",
1302 fps_range.fps_low.num,
1303 fps_range.fps_low.den,
1304 fps_range.fps_high.num,
1305 fps_range.fps_high.den);
1307 ret = vchiq_mmal_port_parameter_set(dev->instance,
1308 &dev->component[COMP_CAMERA]->output[CAM_PORT_PREVIEW],
1309 MMAL_PARAMETER_FPS_RANGE,
1310 &fps_range, sizeof(fps_range));
1311 ret += vchiq_mmal_port_parameter_set(dev->instance,
1312 &dev->component[COMP_CAMERA]->output[CAM_PORT_VIDEO],
1313 MMAL_PARAMETER_FPS_RANGE,
1314 &fps_range, sizeof(fps_range));
1315 ret += vchiq_mmal_port_parameter_set(dev->instance,
1316 &dev->component[COMP_CAMERA]->output[CAM_PORT_CAPTURE],
1317 MMAL_PARAMETER_FPS_RANGE,
1318 &fps_range, sizeof(fps_range));
1320 v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
1321 "Failed to set fps ret %d\n", ret);
1326 int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
1327 struct v4l2_ctrl_handler *hdl)
1330 const struct bm2835_mmal_v4l2_ctrl *ctrl;
1332 v4l2_ctrl_handler_init(hdl, V4L2_CTRL_COUNT);
1334 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1335 ctrl = &v4l2_ctrls[c];
1337 switch (ctrl->type) {
1338 case MMAL_CONTROL_TYPE_STD:
1340 v4l2_ctrl_new_std(hdl,
1341 &bm2835_mmal_ctrl_ops,
1342 ctrl->id, ctrl->min,
1343 ctrl->max, ctrl->step,
1347 case MMAL_CONTROL_TYPE_STD_MENU:
1349 u64 mask = ctrl->min;
1351 if (ctrl->id == V4L2_CID_SCENE_MODE) {
1352 /* Special handling to work out the mask
1353 * value based on the scene_configs array
1354 * at runtime. Reduces the chance of
1359 mask = BIT(V4L2_SCENE_MODE_NONE);
1361 i < ARRAY_SIZE(scene_configs);
1363 mask |= BIT(scene_configs[i].v4l2_scene);
1369 v4l2_ctrl_new_std_menu(hdl,
1370 &bm2835_mmal_ctrl_ops,
1371 ctrl->id, ctrl->max,
1376 case MMAL_CONTROL_TYPE_INT_MENU:
1378 v4l2_ctrl_new_int_menu(hdl,
1379 &bm2835_mmal_ctrl_ops,
1380 ctrl->id, ctrl->max,
1381 ctrl->def, ctrl->imenu);
1384 case MMAL_CONTROL_TYPE_CLUSTER:
1385 /* skip this entry when constructing controls */
1392 dev->ctrls[c]->priv = (void *)ctrl;
1396 pr_err("error adding control %d/%d id 0x%x\n", c,
1397 V4L2_CTRL_COUNT, ctrl->id);
1401 for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1402 ctrl = &v4l2_ctrls[c];
1404 switch (ctrl->type) {
1405 case MMAL_CONTROL_TYPE_CLUSTER:
1406 v4l2_ctrl_auto_cluster(ctrl->min,
1412 case MMAL_CONTROL_TYPE_STD:
1413 case MMAL_CONTROL_TYPE_STD_MENU:
1414 case MMAL_CONTROL_TYPE_INT_MENU: