1 /*
2  * Broadcom BM2835 V4L2 driver
3  *
4  * Copyright © 2013 Raspberry Pi (Trading) Ltd.
5  *
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
8  * for more details.
9  *
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>
14  */
15 
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>
27 
28 #include "mmal-common.h"
29 #include "mmal-vchiq.h"
30 #include "mmal-parameters.h"
31 #include "bcm2835-camera.h"
32 
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
38  * -4 to +4
39  */
40 static const s64 ev_bias_qmenu[] = {
41 	-4000, -3667, -3333,
42 	-3000, -2667, -2333,
43 	-2000, -1667, -1333,
44 	-1000,  -667,  -333,
45 	    0,   333,   667,
46 	 1000,  1333,  1667,
47 	 2000,  2333,  2667,
48 	 3000,  3333,  3667,
49 	 4000
50 };
51 
52 /* Supported ISO values (*1000)
53  * ISOO = auto ISO
54  */
55 static const s64 iso_qmenu[] = {
56 	0, 100000, 200000, 400000, 800000,
57 };
58 static const uint32_t iso_values[] = {
59 	0, 100, 200, 400, 800,
60 };
61 
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
67 };
68 
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,
73 };
74 
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 */
80 };
81 
82 struct bm2835_mmal_v4l2_ctrl;
83 
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);
88 
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
94 	 */
95 	s32 min;
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;
102 	bool ignore_errors;
103 };
104 
105 struct v4l2_to_mmal_effects_setting {
106 	u32 v4l2_effect;
107 	u32 mmal_effect;
108 	s32 col_fx_enable;
109 	s32 col_fx_fixed_cbcr;
110 	u32 u;
111 	u32 v;
112 	u32 num_effect_params;
113 	u32 effect_params[MMAL_MAX_IMAGEFX_PARAMETERS];
114 };
115 
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} }
150 };
151 
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;
156 };
157 
158 static const struct v4l2_mmal_scene_config scene_configs[] = {
159 	/* V4L2_SCENE_MODE_NONE automatically added */
160 	{
161 		V4L2_SCENE_MODE_NIGHT,
162 		MMAL_PARAM_EXPOSUREMODE_NIGHT,
163 		MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
164 	},
165 	{
166 		V4L2_SCENE_MODE_SPORTS,
167 		MMAL_PARAM_EXPOSUREMODE_SPORTS,
168 		MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
169 	},
170 };
171 
172 /* control handlers*/
173 
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)
177 {
178 	struct mmal_parameter_rational rational_value;
179 	struct vchiq_mmal_port *control;
180 
181 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
182 
183 	rational_value.num = ctrl->val;
184 	rational_value.den = 100;
185 
186 	return vchiq_mmal_port_parameter_set(dev->instance, control,
187 					     mmal_ctrl->mmal_id,
188 					     &rational_value,
189 					     sizeof(rational_value));
190 }
191 
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)
195 {
196 	u32 u32_value;
197 	struct vchiq_mmal_port *control;
198 
199 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
200 
201 	u32_value = ctrl->val;
202 
203 	return vchiq_mmal_port_parameter_set(dev->instance, control,
204 					     mmal_ctrl->mmal_id,
205 					     &u32_value, sizeof(u32_value));
206 }
207 
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)
211 {
212 	u32 u32_value;
213 	struct vchiq_mmal_port *control;
214 
215 	if (ctrl->val > mmal_ctrl->max || ctrl->val < mmal_ctrl->min)
216 		return 1;
217 
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);
223 
224 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
225 
226 	if (dev->manual_iso_enabled)
227 		u32_value = dev->iso;
228 	else
229 		u32_value = 0;
230 
231 	return vchiq_mmal_port_parameter_set(dev->instance, control,
232 					     MMAL_PARAMETER_ISO,
233 					     &u32_value, sizeof(u32_value));
234 }
235 
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)
239 {
240 	s32 s32_value;
241 	struct vchiq_mmal_port *control;
242 
243 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
244 
245 	s32_value = (ctrl->val - 12) * 2;	/* Convert from index to 1/6ths */
246 
247 	return vchiq_mmal_port_parameter_set(dev->instance, control,
248 					     mmal_ctrl->mmal_id,
249 					     &s32_value, sizeof(s32_value));
250 }
251 
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)
255 {
256 	int ret;
257 	u32 u32_value;
258 	struct vchiq_mmal_component *camera;
259 
260 	camera = dev->component[MMAL_COMPONENT_CAMERA];
261 
262 	u32_value = ((ctrl->val % 360) / 90) * 90;
263 
264 	ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0],
265 					    mmal_ctrl->mmal_id,
266 					    &u32_value, sizeof(u32_value));
267 	if (ret < 0)
268 		return ret;
269 
270 	ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1],
271 					    mmal_ctrl->mmal_id,
272 					    &u32_value, sizeof(u32_value));
273 	if (ret < 0)
274 		return ret;
275 
276 	ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2],
277 					    mmal_ctrl->mmal_id,
278 					    &u32_value, sizeof(u32_value));
279 
280 	return ret;
281 }
282 
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)
286 {
287 	int ret;
288 	u32 u32_value;
289 	struct vchiq_mmal_component *camera;
290 
291 	if (ctrl->id == V4L2_CID_HFLIP)
292 		dev->hflip = ctrl->val;
293 	else
294 		dev->vflip = ctrl->val;
295 
296 	camera = dev->component[MMAL_COMPONENT_CAMERA];
297 
298 	if (dev->hflip && dev->vflip)
299 		u32_value = MMAL_PARAM_MIRROR_BOTH;
300 	else if (dev->hflip)
301 		u32_value = MMAL_PARAM_MIRROR_HORIZONTAL;
302 	else if (dev->vflip)
303 		u32_value = MMAL_PARAM_MIRROR_VERTICAL;
304 	else
305 		u32_value = MMAL_PARAM_MIRROR_NONE;
306 
307 	ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0],
308 					    mmal_ctrl->mmal_id,
309 					    &u32_value, sizeof(u32_value));
310 	if (ret < 0)
311 		return ret;
312 
313 	ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1],
314 					    mmal_ctrl->mmal_id,
315 					    &u32_value, sizeof(u32_value));
316 	if (ret < 0)
317 		return ret;
318 
319 	ret = vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2],
320 					    mmal_ctrl->mmal_id,
321 					    &u32_value, sizeof(u32_value));
322 
323 	return ret;
324 }
325 
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)
329 {
330 	enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode_user;
331 	u32 shutter_speed = 0;
332 	struct vchiq_mmal_port *control;
333 	int ret = 0;
334 
335 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
336 
337 	if (mmal_ctrl->mmal_id == MMAL_PARAMETER_SHUTTER_SPEED)	{
338 		/* V4L2 is in 100usec increments.
339 		 * MMAL is 1usec.
340 		 */
341 		dev->manual_shutter_speed = ctrl->val * 100;
342 	} else if (mmal_ctrl->mmal_id == MMAL_PARAMETER_EXPOSURE_MODE) {
343 		switch (ctrl->val) {
344 		case V4L2_EXPOSURE_AUTO:
345 			exp_mode = MMAL_PARAM_EXPOSUREMODE_AUTO;
346 			break;
347 
348 		case V4L2_EXPOSURE_MANUAL:
349 			exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF;
350 			break;
351 		}
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;
356 	}
357 
358 	if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
359 		if (exp_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
360 			shutter_speed = dev->manual_shutter_speed;
361 
362 		ret = vchiq_mmal_port_parameter_set(dev->instance,
363 						    control,
364 						    MMAL_PARAMETER_SHUTTER_SPEED,
365 						    &shutter_speed,
366 						    sizeof(shutter_speed));
367 		ret += vchiq_mmal_port_parameter_set(dev->instance,
368 						     control,
369 						     MMAL_PARAMETER_EXPOSURE_MODE,
370 						     &exp_mode,
371 						     sizeof(u32));
372 		dev->exposure_mode_active = exp_mode;
373 	}
374 	/* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should
375 	 * always apply irrespective of scene mode.
376 	 */
377 	ret += set_framerate_params(dev);
378 
379 	return ret;
380 }
381 
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)
385 {
386 	switch (ctrl->val) {
387 	case V4L2_EXPOSURE_METERING_AVERAGE:
388 		dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
389 		break;
390 
391 	case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED:
392 		dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
393 		break;
394 
395 	case V4L2_EXPOSURE_METERING_SPOT:
396 		dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
397 		break;
398 
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;
402 	 *	break;
403 	 */
404 	}
405 
406 	if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
407 		struct vchiq_mmal_port *control;
408 		u32 u32_value = dev->metering_mode;
409 
410 		control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
411 
412 		return vchiq_mmal_port_parameter_set(dev->instance, control,
413 					     mmal_ctrl->mmal_id,
414 					     &u32_value, sizeof(u32_value));
415 	} else
416 		return 0;
417 }
418 
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)
422 {
423 	u32 u32_value;
424 	struct vchiq_mmal_port *control;
425 
426 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
427 
428 	switch (ctrl->val) {
429 	case V4L2_CID_POWER_LINE_FREQUENCY_DISABLED:
430 		u32_value = MMAL_PARAM_FLICKERAVOID_OFF;
431 		break;
432 	case V4L2_CID_POWER_LINE_FREQUENCY_50HZ:
433 		u32_value = MMAL_PARAM_FLICKERAVOID_50HZ;
434 		break;
435 	case V4L2_CID_POWER_LINE_FREQUENCY_60HZ:
436 		u32_value = MMAL_PARAM_FLICKERAVOID_60HZ;
437 		break;
438 	case V4L2_CID_POWER_LINE_FREQUENCY_AUTO:
439 		u32_value = MMAL_PARAM_FLICKERAVOID_AUTO;
440 		break;
441 	}
442 
443 	return vchiq_mmal_port_parameter_set(dev->instance, control,
444 					     mmal_ctrl->mmal_id,
445 					     &u32_value, sizeof(u32_value));
446 }
447 
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)
451 {
452 	u32 u32_value;
453 	struct vchiq_mmal_port *control;
454 
455 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
456 
457 	switch (ctrl->val) {
458 	case V4L2_WHITE_BALANCE_MANUAL:
459 		u32_value = MMAL_PARAM_AWBMODE_OFF;
460 		break;
461 
462 	case V4L2_WHITE_BALANCE_AUTO:
463 		u32_value = MMAL_PARAM_AWBMODE_AUTO;
464 		break;
465 
466 	case V4L2_WHITE_BALANCE_INCANDESCENT:
467 		u32_value = MMAL_PARAM_AWBMODE_INCANDESCENT;
468 		break;
469 
470 	case V4L2_WHITE_BALANCE_FLUORESCENT:
471 		u32_value = MMAL_PARAM_AWBMODE_FLUORESCENT;
472 		break;
473 
474 	case V4L2_WHITE_BALANCE_FLUORESCENT_H:
475 		u32_value = MMAL_PARAM_AWBMODE_TUNGSTEN;
476 		break;
477 
478 	case V4L2_WHITE_BALANCE_HORIZON:
479 		u32_value = MMAL_PARAM_AWBMODE_HORIZON;
480 		break;
481 
482 	case V4L2_WHITE_BALANCE_DAYLIGHT:
483 		u32_value = MMAL_PARAM_AWBMODE_SUNLIGHT;
484 		break;
485 
486 	case V4L2_WHITE_BALANCE_FLASH:
487 		u32_value = MMAL_PARAM_AWBMODE_FLASH;
488 		break;
489 
490 	case V4L2_WHITE_BALANCE_CLOUDY:
491 		u32_value = MMAL_PARAM_AWBMODE_CLOUDY;
492 		break;
493 
494 	case V4L2_WHITE_BALANCE_SHADE:
495 		u32_value = MMAL_PARAM_AWBMODE_SHADE;
496 		break;
497 	}
498 
499 	return vchiq_mmal_port_parameter_set(dev->instance, control,
500 					     mmal_ctrl->mmal_id,
501 					     &u32_value, sizeof(u32_value));
502 }
503 
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)
507 {
508 	struct vchiq_mmal_port *control;
509 	struct mmal_parameter_awbgains gains;
510 
511 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
512 
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;
517 
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;
521 
522 	return vchiq_mmal_port_parameter_set(dev->instance, control,
523 					     mmal_ctrl->mmal_id,
524 					     &gains, sizeof(gains));
525 }
526 
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)
530 {
531 	int ret = -EINVAL;
532 	int i, j;
533 	struct vchiq_mmal_port *control;
534 	struct mmal_parameter_imagefx_parameters imagefx;
535 
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) {
538 			imagefx.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;
542 
543 			if (imagefx.num_effect_params > MMAL_MAX_IMAGEFX_PARAMETERS)
544 				imagefx.num_effect_params = MMAL_MAX_IMAGEFX_PARAMETERS;
545 
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];
549 
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) {
553 				dev->colourfx.u =
554 					v4l2_to_mmal_effects_values[i].u;
555 				dev->colourfx.v =
556 					v4l2_to_mmal_effects_values[i].v;
557 			}
558 
559 			control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
560 
561 			ret = vchiq_mmal_port_parameter_set(
562 					dev->instance, control,
563 					MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,
564 					&imagefx, sizeof(imagefx));
565 			if (ret)
566 				goto exit;
567 
568 			ret = vchiq_mmal_port_parameter_set(
569 					dev->instance, control,
570 					MMAL_PARAMETER_COLOUR_EFFECT,
571 					&dev->colourfx, sizeof(dev->colourfx));
572 		}
573 	}
574 
575 exit:
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);
583 }
584 
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)
588 {
589 	int ret = -EINVAL;
590 	struct vchiq_mmal_port *control;
591 
592 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
593 
594 	dev->colourfx.enable = (ctrl->val & 0xff00) >> 8;
595 	dev->colourfx.enable = ctrl->val & 0xff;
596 
597 	ret = vchiq_mmal_port_parameter_set(dev->instance, control,
598 					    MMAL_PARAMETER_COLOUR_EFFECT,
599 					    &dev->colourfx,
600 					    sizeof(dev->colourfx));
601 
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);
607 }
608 
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)
612 {
613 	int ret;
614 	struct vchiq_mmal_port *encoder_out;
615 
616 	dev->capture.encode_bitrate = ctrl->val;
617 
618 	encoder_out = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
619 
620 	ret = vchiq_mmal_port_parameter_set(dev->instance, encoder_out,
621 					    mmal_ctrl->mmal_id,
622 					    &ctrl->val, sizeof(ctrl->val));
623 	ret = 0;
624 	return ret;
625 }
626 
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)
630 {
631 	u32 bitrate_mode;
632 	struct vchiq_mmal_port *encoder_out;
633 
634 	encoder_out = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
635 
636 	dev->capture.encode_bitrate_mode = ctrl->val;
637 	switch (ctrl->val) {
638 	default:
639 	case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
640 		bitrate_mode = MMAL_VIDEO_RATECONTROL_VARIABLE;
641 		break;
642 	case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
643 		bitrate_mode = MMAL_VIDEO_RATECONTROL_CONSTANT;
644 		break;
645 	}
646 
647 	vchiq_mmal_port_parameter_set(dev->instance, encoder_out,
648 				      mmal_ctrl->mmal_id,
649 					     &bitrate_mode,
650 					     sizeof(bitrate_mode));
651 	return 0;
652 }
653 
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)
657 {
658 	u32 u32_value;
659 	struct vchiq_mmal_port *jpeg_out;
660 
661 	jpeg_out = &dev->component[MMAL_COMPONENT_IMAGE_ENCODE]->output[0];
662 
663 	u32_value = ctrl->val;
664 
665 	return vchiq_mmal_port_parameter_set(dev->instance, jpeg_out,
666 					     mmal_ctrl->mmal_id,
667 					     &u32_value, sizeof(u32_value));
668 }
669 
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)
673 {
674 	u32 u32_value;
675 	struct vchiq_mmal_port *vid_enc_ctl;
676 
677 	vid_enc_ctl = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0];
678 
679 	u32_value = ctrl->val;
680 
681 	return vchiq_mmal_port_parameter_set(dev->instance, vid_enc_ctl,
682 					     mmal_ctrl->mmal_id,
683 					     &u32_value, sizeof(u32_value));
684 }
685 
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)
689 {
690 	struct mmal_parameter_video_profile param;
691 	int ret = 0;
692 
693 	if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_PROFILE) {
694 		switch (ctrl->val) {
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;
700 			break;
701 		default:
702 			ret = -EINVAL;
703 			break;
704 		}
705 	} else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_LEVEL) {
706 		switch (ctrl->val) {
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;
720 			break;
721 		default:
722 			ret = -EINVAL;
723 			break;
724 		}
725 	}
726 
727 	if (!ret) {
728 		switch (dev->capture.enc_profile) {
729 		case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
730 			param.profile = MMAL_VIDEO_PROFILE_H264_BASELINE;
731 			break;
732 		case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
733 			param.profile =
734 				MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE;
735 			break;
736 		case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
737 			param.profile = MMAL_VIDEO_PROFILE_H264_MAIN;
738 			break;
739 		case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
740 			param.profile = MMAL_VIDEO_PROFILE_H264_HIGH;
741 			break;
742 		default:
743 			/* Should never get here */
744 			break;
745 		}
746 
747 		switch (dev->capture.enc_level) {
748 		case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
749 			param.level = MMAL_VIDEO_LEVEL_H264_1;
750 			break;
751 		case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
752 			param.level = MMAL_VIDEO_LEVEL_H264_1b;
753 			break;
754 		case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
755 			param.level = MMAL_VIDEO_LEVEL_H264_11;
756 			break;
757 		case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
758 			param.level = MMAL_VIDEO_LEVEL_H264_12;
759 			break;
760 		case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
761 			param.level = MMAL_VIDEO_LEVEL_H264_13;
762 			break;
763 		case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
764 			param.level = MMAL_VIDEO_LEVEL_H264_2;
765 			break;
766 		case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
767 			param.level = MMAL_VIDEO_LEVEL_H264_21;
768 			break;
769 		case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
770 			param.level = MMAL_VIDEO_LEVEL_H264_22;
771 			break;
772 		case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
773 			param.level = MMAL_VIDEO_LEVEL_H264_3;
774 			break;
775 		case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
776 			param.level = MMAL_VIDEO_LEVEL_H264_31;
777 			break;
778 		case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
779 			param.level = MMAL_VIDEO_LEVEL_H264_32;
780 			break;
781 		case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
782 			param.level = MMAL_VIDEO_LEVEL_H264_4;
783 			break;
784 		default:
785 			/* Should never get here */
786 			break;
787 		}
788 
789 		ret = vchiq_mmal_port_parameter_set(dev->instance,
790 						    &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0],
791 			mmal_ctrl->mmal_id,
792 			&param, sizeof(param));
793 	}
794 	return ret;
795 }
796 
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)
800 {
801 	int ret = 0;
802 	int shutter_speed;
803 	struct vchiq_mmal_port *control;
804 
805 	v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
806 		 "scene mode selected %d, was %d\n", ctrl->val,
807 		 dev->scene_mode);
808 	control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
809 
810 	if (ctrl->val == dev->scene_mode)
811 		return 0;
812 
813 	if (ctrl->val == V4L2_SCENE_MODE_NONE) {
814 		/* Restore all user selections */
815 		dev->scene_mode = V4L2_SCENE_MODE_NONE;
816 
817 		if (dev->exposure_mode_user == MMAL_PARAM_EXPOSUREMODE_OFF)
818 			shutter_speed = dev->manual_shutter_speed;
819 		else
820 			shutter_speed = 0;
821 
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,
825 			 dev->metering_mode);
826 		ret = vchiq_mmal_port_parameter_set(dev->instance,
827 						    control,
828 						    MMAL_PARAMETER_SHUTTER_SPEED,
829 						    &shutter_speed,
830 						    sizeof(shutter_speed));
831 		ret += vchiq_mmal_port_parameter_set(dev->instance,
832 						     control,
833 						     MMAL_PARAMETER_EXPOSURE_MODE,
834 						     &dev->exposure_mode_user,
835 						     sizeof(u32));
836 		dev->exposure_mode_active = dev->exposure_mode_user;
837 		ret += vchiq_mmal_port_parameter_set(dev->instance,
838 						     control,
839 						     MMAL_PARAMETER_EXP_METERING_MODE,
840 						     &dev->metering_mode,
841 						     sizeof(u32));
842 		ret += set_framerate_params(dev);
843 	} else {
844 		/* Set up scene mode */
845 		int i;
846 		const struct v4l2_mmal_scene_config *scene = NULL;
847 		int shutter_speed;
848 		enum mmal_parameter_exposuremode exposure_mode;
849 		enum mmal_parameter_exposuremeteringmode metering_mode;
850 
851 		for (i = 0; i < ARRAY_SIZE(scene_configs); i++) {
852 			if (scene_configs[i].v4l2_scene ==
853 				ctrl->val) {
854 				scene = &scene_configs[i];
855 				break;
856 			}
857 		}
858 		if (!scene)
859 			return -EINVAL;
860 		if (i >= ARRAY_SIZE(scene_configs))
861 			return -EINVAL;
862 
863 		/* Set all the values */
864 		dev->scene_mode = ctrl->val;
865 
866 		if (scene->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
867 			shutter_speed = dev->manual_shutter_speed;
868 		else
869 			shutter_speed = 0;
870 		exposure_mode = scene->exposure_mode;
871 		metering_mode = scene->metering_mode;
872 
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);
876 
877 		ret = vchiq_mmal_port_parameter_set(dev->instance, control,
878 						    MMAL_PARAMETER_SHUTTER_SPEED,
879 						    &shutter_speed,
880 						    sizeof(shutter_speed));
881 		ret += vchiq_mmal_port_parameter_set(dev->instance, control,
882 						     MMAL_PARAMETER_EXPOSURE_MODE,
883 						     &exposure_mode,
884 						     sizeof(u32));
885 		dev->exposure_mode_active = exposure_mode;
886 		ret += vchiq_mmal_port_parameter_set(dev->instance, control,
887 						     MMAL_PARAMETER_EXPOSURE_MODE,
888 						     &exposure_mode,
889 						     sizeof(u32));
890 		ret += vchiq_mmal_port_parameter_set(dev->instance, control,
891 						     MMAL_PARAMETER_EXP_METERING_MODE,
892 						     &metering_mode,
893 						     sizeof(u32));
894 		ret += set_framerate_params(dev);
895 	}
896 	if (ret) {
897 		v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
898 			 "%s: Setting scene to %d, ret=%d\n",
899 			 __func__, ctrl->val, ret);
900 		ret = -EINVAL;
901 	}
902 	return 0;
903 }
904 
905 static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
906 {
907 	struct bm2835_mmal_dev *dev =
908 		container_of(ctrl->handler, struct bm2835_mmal_dev,
909 			     ctrl_handler);
910 	const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl = ctrl->priv;
911 	int ret;
912 
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);
915 		return -EINVAL;
916 	}
917 
918 	ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl);
919 	if (ret)
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)
923 		ret = 0;
924 	return ret;
925 }
926 
927 static const struct v4l2_ctrl_ops bm2835_mmal_ctrl_ops = {
928 	.s_ctrl = bm2835_mmal_s_ctrl,
929 };
930 
931 static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
932 	{
933 		V4L2_CID_SATURATION, MMAL_CONTROL_TYPE_STD,
934 		-100, 100, 0, 1, NULL,
935 		MMAL_PARAMETER_SATURATION,
936 		&ctrl_set_rational,
937 		false
938 	},
939 	{
940 		V4L2_CID_SHARPNESS, MMAL_CONTROL_TYPE_STD,
941 		-100, 100, 0, 1, NULL,
942 		MMAL_PARAMETER_SHARPNESS,
943 		&ctrl_set_rational,
944 		false
945 	},
946 	{
947 		V4L2_CID_CONTRAST, MMAL_CONTROL_TYPE_STD,
948 		-100, 100, 0, 1, NULL,
949 		MMAL_PARAMETER_CONTRAST,
950 		&ctrl_set_rational,
951 		false
952 	},
953 	{
954 		V4L2_CID_BRIGHTNESS, MMAL_CONTROL_TYPE_STD,
955 		0, 100, 50, 1, NULL,
956 		MMAL_PARAMETER_BRIGHTNESS,
957 		&ctrl_set_rational,
958 		false
959 	},
960 	{
961 		V4L2_CID_ISO_SENSITIVITY, MMAL_CONTROL_TYPE_INT_MENU,
962 		0, ARRAY_SIZE(iso_qmenu) - 1, 0, 1, iso_qmenu,
963 		MMAL_PARAMETER_ISO,
964 		&ctrl_set_iso,
965 		false
966 	},
967 	{
968 		V4L2_CID_ISO_SENSITIVITY_AUTO, MMAL_CONTROL_TYPE_STD_MENU,
969 		0, 1, V4L2_ISO_SENSITIVITY_AUTO, 1, NULL,
970 		MMAL_PARAMETER_ISO,
971 		&ctrl_set_iso,
972 		false
973 	},
974 	{
975 		V4L2_CID_IMAGE_STABILIZATION, MMAL_CONTROL_TYPE_STD,
976 		0, 1, 0, 1, NULL,
977 		MMAL_PARAMETER_VIDEO_STABILISATION,
978 		&ctrl_set_value,
979 		false
980 	},
981 /*	{
982  *		0, MMAL_CONTROL_TYPE_CLUSTER, 3, 1, 0, NULL, 0, NULL
983  *	},
984  */
985 	{
986 		V4L2_CID_EXPOSURE_AUTO, MMAL_CONTROL_TYPE_STD_MENU,
987 		~0x03, 3, V4L2_EXPOSURE_AUTO, 0, NULL,
988 		MMAL_PARAMETER_EXPOSURE_MODE,
989 		&ctrl_set_exposure,
990 		false
991 	},
992 /* todo this needs mixing in with set exposure
993  *	{
994  *		V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
995  *	},
996  */
997 	{
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,
1002 		&ctrl_set_exposure,
1003 		false
1004 	},
1005 	{
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,
1010 		&ctrl_set_value_ev,
1011 		false
1012 	},
1013 	{
1014 		V4L2_CID_EXPOSURE_AUTO_PRIORITY, MMAL_CONTROL_TYPE_STD,
1015 		0, 1,
1016 		0, 1, NULL,
1017 		0,	/* Dummy MMAL ID as it gets mapped into FPS range*/
1018 		&ctrl_set_exposure,
1019 		false
1020 	},
1021 	{
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,
1027 		false
1028 	},
1029 	{
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,
1034 		&ctrl_set_awb_mode,
1035 		false
1036 	},
1037 	{
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,
1042 		false
1043 	},
1044 	{
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,
1049 		false
1050 	},
1051 	{
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,
1056 		false
1057 	},
1058 	{
1059 		V4L2_CID_COLORFX_CBCR, MMAL_CONTROL_TYPE_STD,
1060 		0, 0xffff, 0x8080, 1, NULL,
1061 		MMAL_PARAMETER_COLOUR_EFFECT,
1062 		&ctrl_set_colfx,
1063 		false
1064 	},
1065 	{
1066 		V4L2_CID_ROTATE, MMAL_CONTROL_TYPE_STD,
1067 		0, 360, 0, 90, NULL,
1068 		MMAL_PARAMETER_ROTATION,
1069 		&ctrl_set_rotate,
1070 		false
1071 	},
1072 	{
1073 		V4L2_CID_HFLIP, MMAL_CONTROL_TYPE_STD,
1074 		0, 1, 0, 1, NULL,
1075 		MMAL_PARAMETER_MIRROR,
1076 		&ctrl_set_flip,
1077 		false
1078 	},
1079 	{
1080 		V4L2_CID_VFLIP, MMAL_CONTROL_TYPE_STD,
1081 		0, 1, 0, 1, NULL,
1082 		MMAL_PARAMETER_MIRROR,
1083 		&ctrl_set_flip,
1084 		false
1085 	},
1086 	{
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,
1092 		false
1093 	},
1094 	{
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,
1098 		&ctrl_set_bitrate,
1099 		false
1100 	},
1101 	{
1102 		V4L2_CID_JPEG_COMPRESSION_QUALITY, MMAL_CONTROL_TYPE_STD,
1103 		1, 100,
1104 		30, 1, NULL,
1105 		MMAL_PARAMETER_JPEG_Q_FACTOR,
1106 		&ctrl_set_image_encode_output,
1107 		false
1108 	},
1109 	{
1110 		V4L2_CID_POWER_LINE_FREQUENCY, MMAL_CONTROL_TYPE_STD_MENU,
1111 		0, ARRAY_SIZE(mains_freq_qmenu) - 1,
1112 		1, 1, NULL,
1113 		MMAL_PARAMETER_FLICKER_AVOID,
1114 		&ctrl_set_flicker_avoidance,
1115 		false
1116 	},
1117 	{
1118 		V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, MMAL_CONTROL_TYPE_STD,
1119 		0, 1,
1120 		0, 1, NULL,
1121 		MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER,
1122 		&ctrl_set_video_encode_param_output,
1123 		true	/* Errors ignored as requires latest firmware to work */
1124 	},
1125 	{
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,
1136 		false
1137 	},
1138 	{
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,
1156 		false
1157 	},
1158 	{
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,
1165 		false
1166 	},
1167 	{
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,
1172 		false
1173 	},
1174 };
1175 
1176 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
1177 {
1178 	int c;
1179 	int ret = 0;
1180 
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],
1184 						   &v4l2_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",
1188 					 c);
1189 				break;
1190 			}
1191 		}
1192 	}
1193 	return ret;
1194 }
1195 
1196 int set_framerate_params(struct bm2835_mmal_dev *dev)
1197 {
1198 	struct mmal_parameter_fps_range fps_range;
1199 	int ret;
1200 
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.
1205 		 */
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;
1210 	} else {
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;
1216 	}
1217 
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);
1224 
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));
1240 	if (ret)
1241 		v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
1242 			 "Failed to set fps ret %d\n", ret);
1243 
1244 	return ret;
1245 }
1246 
1247 int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
1248 			      struct v4l2_ctrl_handler *hdl)
1249 {
1250 	int c;
1251 	const struct bm2835_mmal_v4l2_ctrl *ctrl;
1252 
1253 	v4l2_ctrl_handler_init(hdl, V4L2_CTRL_COUNT);
1254 
1255 	for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1256 		ctrl = &v4l2_ctrls[c];
1257 
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);
1263 			break;
1264 
1265 		case MMAL_CONTROL_TYPE_STD_MENU:
1266 		{
1267 			int mask = ctrl->min;
1268 
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
1273 				 * mismatches.
1274 				 */
1275 				int i;
1276 				mask = 1 << V4L2_SCENE_MODE_NONE;
1277 				for (i = 0;
1278 				     i < ARRAY_SIZE(scene_configs);
1279 				     i++) {
1280 					mask |= 1 << scene_configs[i].v4l2_scene;
1281 				}
1282 				mask = ~mask;
1283 			}
1284 
1285 			dev->ctrls[c] = v4l2_ctrl_new_std_menu(hdl,
1286 			&bm2835_mmal_ctrl_ops, ctrl->id,
1287 			ctrl->max, mask, ctrl->def);
1288 			break;
1289 		}
1290 
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);
1295 			break;
1296 
1297 		case MMAL_CONTROL_TYPE_CLUSTER:
1298 			/* skip this entry when constructing controls */
1299 			continue;
1300 		}
1301 
1302 		if (hdl->error)
1303 			break;
1304 
1305 		dev->ctrls[c]->priv = (void *)ctrl;
1306 	}
1307 
1308 	if (hdl->error) {
1309 		pr_err("error adding control %d/%d id 0x%x\n", c,
1310 		       V4L2_CTRL_COUNT, ctrl->id);
1311 		return hdl->error;
1312 	}
1313 
1314 	for (c = 0; c < V4L2_CTRL_COUNT; c++) {
1315 		ctrl = &v4l2_ctrls[c];
1316 
1317 		switch (ctrl->type) {
1318 		case MMAL_CONTROL_TYPE_CLUSTER:
1319 			v4l2_ctrl_auto_cluster(ctrl->min,
1320 					       &dev->ctrls[c + 1],
1321 					       ctrl->max,
1322 					       ctrl->def);
1323 			break;
1324 
1325 		case MMAL_CONTROL_TYPE_STD:
1326 		case MMAL_CONTROL_TYPE_STD_MENU:
1327 		case MMAL_CONTROL_TYPE_INT_MENU:
1328 			break;
1329 		}
1330 	}
1331 
1332 	return 0;
1333 }
1334