1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * vivid-ctrls.c - control support functions.
4  *
5  * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6  */
7 
8 #include <linux/errno.h>
9 #include <linux/kernel.h>
10 #include <linux/videodev2.h>
11 #include <media/v4l2-event.h>
12 #include <media/v4l2-common.h>
13 
14 #include "vivid-core.h"
15 #include "vivid-vid-cap.h"
16 #include "vivid-vid-out.h"
17 #include "vivid-vid-common.h"
18 #include "vivid-radio-common.h"
19 #include "vivid-osd.h"
20 #include "vivid-ctrls.h"
21 #include "vivid-cec.h"
22 
23 #define VIVID_CID_CUSTOM_BASE		(V4L2_CID_USER_BASE | 0xf000)
24 #define VIVID_CID_BUTTON		(VIVID_CID_CUSTOM_BASE + 0)
25 #define VIVID_CID_BOOLEAN		(VIVID_CID_CUSTOM_BASE + 1)
26 #define VIVID_CID_INTEGER		(VIVID_CID_CUSTOM_BASE + 2)
27 #define VIVID_CID_INTEGER64		(VIVID_CID_CUSTOM_BASE + 3)
28 #define VIVID_CID_MENU			(VIVID_CID_CUSTOM_BASE + 4)
29 #define VIVID_CID_STRING		(VIVID_CID_CUSTOM_BASE + 5)
30 #define VIVID_CID_BITMASK		(VIVID_CID_CUSTOM_BASE + 6)
31 #define VIVID_CID_INTMENU		(VIVID_CID_CUSTOM_BASE + 7)
32 #define VIVID_CID_U32_ARRAY		(VIVID_CID_CUSTOM_BASE + 8)
33 #define VIVID_CID_U16_MATRIX		(VIVID_CID_CUSTOM_BASE + 9)
34 #define VIVID_CID_U8_4D_ARRAY		(VIVID_CID_CUSTOM_BASE + 10)
35 #define VIVID_CID_AREA			(VIVID_CID_CUSTOM_BASE + 11)
36 #define VIVID_CID_RO_INTEGER		(VIVID_CID_CUSTOM_BASE + 12)
37 
38 #define VIVID_CID_VIVID_BASE		(0x00f00000 | 0xf000)
39 #define VIVID_CID_VIVID_CLASS		(0x00f00000 | 1)
40 #define VIVID_CID_TEST_PATTERN		(VIVID_CID_VIVID_BASE + 0)
41 #define VIVID_CID_OSD_TEXT_MODE		(VIVID_CID_VIVID_BASE + 1)
42 #define VIVID_CID_HOR_MOVEMENT		(VIVID_CID_VIVID_BASE + 2)
43 #define VIVID_CID_VERT_MOVEMENT		(VIVID_CID_VIVID_BASE + 3)
44 #define VIVID_CID_SHOW_BORDER		(VIVID_CID_VIVID_BASE + 4)
45 #define VIVID_CID_SHOW_SQUARE		(VIVID_CID_VIVID_BASE + 5)
46 #define VIVID_CID_INSERT_SAV		(VIVID_CID_VIVID_BASE + 6)
47 #define VIVID_CID_INSERT_EAV		(VIVID_CID_VIVID_BASE + 7)
48 #define VIVID_CID_VBI_CAP_INTERLACED	(VIVID_CID_VIVID_BASE + 8)
49 
50 #define VIVID_CID_HFLIP			(VIVID_CID_VIVID_BASE + 20)
51 #define VIVID_CID_VFLIP			(VIVID_CID_VIVID_BASE + 21)
52 #define VIVID_CID_STD_ASPECT_RATIO	(VIVID_CID_VIVID_BASE + 22)
53 #define VIVID_CID_DV_TIMINGS_ASPECT_RATIO	(VIVID_CID_VIVID_BASE + 23)
54 #define VIVID_CID_TSTAMP_SRC		(VIVID_CID_VIVID_BASE + 24)
55 #define VIVID_CID_COLORSPACE		(VIVID_CID_VIVID_BASE + 25)
56 #define VIVID_CID_XFER_FUNC		(VIVID_CID_VIVID_BASE + 26)
57 #define VIVID_CID_YCBCR_ENC		(VIVID_CID_VIVID_BASE + 27)
58 #define VIVID_CID_QUANTIZATION		(VIVID_CID_VIVID_BASE + 28)
59 #define VIVID_CID_LIMITED_RGB_RANGE	(VIVID_CID_VIVID_BASE + 29)
60 #define VIVID_CID_ALPHA_MODE		(VIVID_CID_VIVID_BASE + 30)
61 #define VIVID_CID_HAS_CROP_CAP		(VIVID_CID_VIVID_BASE + 31)
62 #define VIVID_CID_HAS_COMPOSE_CAP	(VIVID_CID_VIVID_BASE + 32)
63 #define VIVID_CID_HAS_SCALER_CAP	(VIVID_CID_VIVID_BASE + 33)
64 #define VIVID_CID_HAS_CROP_OUT		(VIVID_CID_VIVID_BASE + 34)
65 #define VIVID_CID_HAS_COMPOSE_OUT	(VIVID_CID_VIVID_BASE + 35)
66 #define VIVID_CID_HAS_SCALER_OUT	(VIVID_CID_VIVID_BASE + 36)
67 #define VIVID_CID_LOOP_VIDEO		(VIVID_CID_VIVID_BASE + 37)
68 #define VIVID_CID_SEQ_WRAP		(VIVID_CID_VIVID_BASE + 38)
69 #define VIVID_CID_TIME_WRAP		(VIVID_CID_VIVID_BASE + 39)
70 #define VIVID_CID_MAX_EDID_BLOCKS	(VIVID_CID_VIVID_BASE + 40)
71 #define VIVID_CID_PERCENTAGE_FILL	(VIVID_CID_VIVID_BASE + 41)
72 #define VIVID_CID_REDUCED_FPS		(VIVID_CID_VIVID_BASE + 42)
73 #define VIVID_CID_HSV_ENC		(VIVID_CID_VIVID_BASE + 43)
74 #define VIVID_CID_DISPLAY_PRESENT	(VIVID_CID_VIVID_BASE + 44)
75 
76 #define VIVID_CID_STD_SIGNAL_MODE	(VIVID_CID_VIVID_BASE + 60)
77 #define VIVID_CID_STANDARD		(VIVID_CID_VIVID_BASE + 61)
78 #define VIVID_CID_DV_TIMINGS_SIGNAL_MODE	(VIVID_CID_VIVID_BASE + 62)
79 #define VIVID_CID_DV_TIMINGS		(VIVID_CID_VIVID_BASE + 63)
80 #define VIVID_CID_PERC_DROPPED		(VIVID_CID_VIVID_BASE + 64)
81 #define VIVID_CID_DISCONNECT		(VIVID_CID_VIVID_BASE + 65)
82 #define VIVID_CID_DQBUF_ERROR		(VIVID_CID_VIVID_BASE + 66)
83 #define VIVID_CID_QUEUE_SETUP_ERROR	(VIVID_CID_VIVID_BASE + 67)
84 #define VIVID_CID_BUF_PREPARE_ERROR	(VIVID_CID_VIVID_BASE + 68)
85 #define VIVID_CID_START_STR_ERROR	(VIVID_CID_VIVID_BASE + 69)
86 #define VIVID_CID_QUEUE_ERROR		(VIVID_CID_VIVID_BASE + 70)
87 #define VIVID_CID_CLEAR_FB		(VIVID_CID_VIVID_BASE + 71)
88 #define VIVID_CID_REQ_VALIDATE_ERROR	(VIVID_CID_VIVID_BASE + 72)
89 
90 #define VIVID_CID_RADIO_SEEK_MODE	(VIVID_CID_VIVID_BASE + 90)
91 #define VIVID_CID_RADIO_SEEK_PROG_LIM	(VIVID_CID_VIVID_BASE + 91)
92 #define VIVID_CID_RADIO_RX_RDS_RBDS	(VIVID_CID_VIVID_BASE + 92)
93 #define VIVID_CID_RADIO_RX_RDS_BLOCKIO	(VIVID_CID_VIVID_BASE + 93)
94 
95 #define VIVID_CID_RADIO_TX_RDS_BLOCKIO	(VIVID_CID_VIVID_BASE + 94)
96 
97 #define VIVID_CID_SDR_CAP_FM_DEVIATION	(VIVID_CID_VIVID_BASE + 110)
98 
99 #define VIVID_CID_META_CAP_GENERATE_PTS	(VIVID_CID_VIVID_BASE + 111)
100 #define VIVID_CID_META_CAP_GENERATE_SCR	(VIVID_CID_VIVID_BASE + 112)
101 
102 /* General User Controls */
103 
vivid_unregister_dev(bool valid,struct video_device * vdev)104 static void vivid_unregister_dev(bool valid, struct video_device *vdev)
105 {
106 	if (!valid)
107 		return;
108 	clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
109 	v4l2_event_wake_all(vdev);
110 }
111 
vivid_user_gen_s_ctrl(struct v4l2_ctrl * ctrl)112 static int vivid_user_gen_s_ctrl(struct v4l2_ctrl *ctrl)
113 {
114 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_user_gen);
115 
116 	switch (ctrl->id) {
117 	case VIVID_CID_DISCONNECT:
118 		v4l2_info(&dev->v4l2_dev, "disconnect\n");
119 		dev->disconnect_error = true;
120 		vivid_unregister_dev(dev->has_vid_cap, &dev->vid_cap_dev);
121 		vivid_unregister_dev(dev->has_vid_out, &dev->vid_out_dev);
122 		vivid_unregister_dev(dev->has_vbi_cap, &dev->vbi_cap_dev);
123 		vivid_unregister_dev(dev->has_vbi_out, &dev->vbi_out_dev);
124 		vivid_unregister_dev(dev->has_radio_rx, &dev->radio_rx_dev);
125 		vivid_unregister_dev(dev->has_radio_tx, &dev->radio_tx_dev);
126 		vivid_unregister_dev(dev->has_sdr_cap, &dev->sdr_cap_dev);
127 		vivid_unregister_dev(dev->has_meta_cap, &dev->meta_cap_dev);
128 		vivid_unregister_dev(dev->has_meta_out, &dev->meta_out_dev);
129 		vivid_unregister_dev(dev->has_touch_cap, &dev->touch_cap_dev);
130 		break;
131 	case VIVID_CID_BUTTON:
132 		dev->button_pressed = 30;
133 		break;
134 	}
135 	return 0;
136 }
137 
138 static const struct v4l2_ctrl_ops vivid_user_gen_ctrl_ops = {
139 	.s_ctrl = vivid_user_gen_s_ctrl,
140 };
141 
142 static const struct v4l2_ctrl_config vivid_ctrl_button = {
143 	.ops = &vivid_user_gen_ctrl_ops,
144 	.id = VIVID_CID_BUTTON,
145 	.name = "Button",
146 	.type = V4L2_CTRL_TYPE_BUTTON,
147 };
148 
149 static const struct v4l2_ctrl_config vivid_ctrl_boolean = {
150 	.ops = &vivid_user_gen_ctrl_ops,
151 	.id = VIVID_CID_BOOLEAN,
152 	.name = "Boolean",
153 	.type = V4L2_CTRL_TYPE_BOOLEAN,
154 	.min = 0,
155 	.max = 1,
156 	.step = 1,
157 	.def = 1,
158 };
159 
160 static const struct v4l2_ctrl_config vivid_ctrl_int32 = {
161 	.ops = &vivid_user_gen_ctrl_ops,
162 	.id = VIVID_CID_INTEGER,
163 	.name = "Integer 32 Bits",
164 	.type = V4L2_CTRL_TYPE_INTEGER,
165 	.min = 0xffffffff80000000ULL,
166 	.max = 0x7fffffff,
167 	.step = 1,
168 };
169 
170 static const struct v4l2_ctrl_config vivid_ctrl_int64 = {
171 	.ops = &vivid_user_gen_ctrl_ops,
172 	.id = VIVID_CID_INTEGER64,
173 	.name = "Integer 64 Bits",
174 	.type = V4L2_CTRL_TYPE_INTEGER64,
175 	.min = 0x8000000000000000ULL,
176 	.max = 0x7fffffffffffffffLL,
177 	.step = 1,
178 };
179 
180 static const struct v4l2_ctrl_config vivid_ctrl_u32_array = {
181 	.ops = &vivid_user_gen_ctrl_ops,
182 	.id = VIVID_CID_U32_ARRAY,
183 	.name = "U32 1 Element Array",
184 	.type = V4L2_CTRL_TYPE_U32,
185 	.def = 0x18,
186 	.min = 0x10,
187 	.max = 0x20000,
188 	.step = 1,
189 	.dims = { 1 },
190 };
191 
192 static const struct v4l2_ctrl_config vivid_ctrl_u16_matrix = {
193 	.ops = &vivid_user_gen_ctrl_ops,
194 	.id = VIVID_CID_U16_MATRIX,
195 	.name = "U16 8x16 Matrix",
196 	.type = V4L2_CTRL_TYPE_U16,
197 	.def = 0x18,
198 	.min = 0x10,
199 	.max = 0x2000,
200 	.step = 1,
201 	.dims = { 8, 16 },
202 };
203 
204 static const struct v4l2_ctrl_config vivid_ctrl_u8_4d_array = {
205 	.ops = &vivid_user_gen_ctrl_ops,
206 	.id = VIVID_CID_U8_4D_ARRAY,
207 	.name = "U8 2x3x4x5 Array",
208 	.type = V4L2_CTRL_TYPE_U8,
209 	.def = 0x18,
210 	.min = 0x10,
211 	.max = 0x20,
212 	.step = 1,
213 	.dims = { 2, 3, 4, 5 },
214 };
215 
216 static const char * const vivid_ctrl_menu_strings[] = {
217 	"Menu Item 0 (Skipped)",
218 	"Menu Item 1",
219 	"Menu Item 2 (Skipped)",
220 	"Menu Item 3",
221 	"Menu Item 4",
222 	"Menu Item 5 (Skipped)",
223 	NULL,
224 };
225 
226 static const struct v4l2_ctrl_config vivid_ctrl_menu = {
227 	.ops = &vivid_user_gen_ctrl_ops,
228 	.id = VIVID_CID_MENU,
229 	.name = "Menu",
230 	.type = V4L2_CTRL_TYPE_MENU,
231 	.min = 1,
232 	.max = 4,
233 	.def = 3,
234 	.menu_skip_mask = 0x04,
235 	.qmenu = vivid_ctrl_menu_strings,
236 };
237 
238 static const struct v4l2_ctrl_config vivid_ctrl_string = {
239 	.ops = &vivid_user_gen_ctrl_ops,
240 	.id = VIVID_CID_STRING,
241 	.name = "String",
242 	.type = V4L2_CTRL_TYPE_STRING,
243 	.min = 2,
244 	.max = 4,
245 	.step = 1,
246 };
247 
248 static const struct v4l2_ctrl_config vivid_ctrl_bitmask = {
249 	.ops = &vivid_user_gen_ctrl_ops,
250 	.id = VIVID_CID_BITMASK,
251 	.name = "Bitmask",
252 	.type = V4L2_CTRL_TYPE_BITMASK,
253 	.def = 0x80002000,
254 	.min = 0,
255 	.max = 0x80402010,
256 	.step = 0,
257 };
258 
259 static const s64 vivid_ctrl_int_menu_values[] = {
260 	1, 1, 2, 3, 5, 8, 13, 21, 42,
261 };
262 
263 static const struct v4l2_ctrl_config vivid_ctrl_int_menu = {
264 	.ops = &vivid_user_gen_ctrl_ops,
265 	.id = VIVID_CID_INTMENU,
266 	.name = "Integer Menu",
267 	.type = V4L2_CTRL_TYPE_INTEGER_MENU,
268 	.min = 1,
269 	.max = 8,
270 	.def = 4,
271 	.menu_skip_mask = 0x02,
272 	.qmenu_int = vivid_ctrl_int_menu_values,
273 };
274 
275 static const struct v4l2_ctrl_config vivid_ctrl_disconnect = {
276 	.ops = &vivid_user_gen_ctrl_ops,
277 	.id = VIVID_CID_DISCONNECT,
278 	.name = "Disconnect",
279 	.type = V4L2_CTRL_TYPE_BUTTON,
280 };
281 
282 static const struct v4l2_area area = {
283 	.width = 1000,
284 	.height = 2000,
285 };
286 
287 static const struct v4l2_ctrl_config vivid_ctrl_area = {
288 	.ops = &vivid_user_gen_ctrl_ops,
289 	.id = VIVID_CID_AREA,
290 	.name = "Area",
291 	.type = V4L2_CTRL_TYPE_AREA,
292 	.p_def.p_const = &area,
293 };
294 
295 static const struct v4l2_ctrl_config vivid_ctrl_ro_int32 = {
296 	.ops = &vivid_user_gen_ctrl_ops,
297 	.id = VIVID_CID_RO_INTEGER,
298 	.name = "Read-Only Integer 32 Bits",
299 	.type = V4L2_CTRL_TYPE_INTEGER,
300 	.flags = V4L2_CTRL_FLAG_READ_ONLY,
301 	.min = 0,
302 	.max = 255,
303 	.step = 1,
304 };
305 
306 /* Framebuffer Controls */
307 
vivid_fb_s_ctrl(struct v4l2_ctrl * ctrl)308 static int vivid_fb_s_ctrl(struct v4l2_ctrl *ctrl)
309 {
310 	struct vivid_dev *dev = container_of(ctrl->handler,
311 					     struct vivid_dev, ctrl_hdl_fb);
312 
313 	switch (ctrl->id) {
314 	case VIVID_CID_CLEAR_FB:
315 		vivid_clear_fb(dev);
316 		break;
317 	}
318 	return 0;
319 }
320 
321 static const struct v4l2_ctrl_ops vivid_fb_ctrl_ops = {
322 	.s_ctrl = vivid_fb_s_ctrl,
323 };
324 
325 static const struct v4l2_ctrl_config vivid_ctrl_clear_fb = {
326 	.ops = &vivid_fb_ctrl_ops,
327 	.id = VIVID_CID_CLEAR_FB,
328 	.name = "Clear Framebuffer",
329 	.type = V4L2_CTRL_TYPE_BUTTON,
330 };
331 
332 
333 /* Video User Controls */
334 
vivid_user_vid_g_volatile_ctrl(struct v4l2_ctrl * ctrl)335 static int vivid_user_vid_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
336 {
337 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_user_vid);
338 
339 	switch (ctrl->id) {
340 	case V4L2_CID_AUTOGAIN:
341 		dev->gain->val = (jiffies_to_msecs(jiffies) / 1000) & 0xff;
342 		break;
343 	}
344 	return 0;
345 }
346 
vivid_user_vid_s_ctrl(struct v4l2_ctrl * ctrl)347 static int vivid_user_vid_s_ctrl(struct v4l2_ctrl *ctrl)
348 {
349 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_user_vid);
350 
351 	switch (ctrl->id) {
352 	case V4L2_CID_BRIGHTNESS:
353 		dev->input_brightness[dev->input] = ctrl->val - dev->input * 128;
354 		tpg_s_brightness(&dev->tpg, dev->input_brightness[dev->input]);
355 		break;
356 	case V4L2_CID_CONTRAST:
357 		tpg_s_contrast(&dev->tpg, ctrl->val);
358 		break;
359 	case V4L2_CID_SATURATION:
360 		tpg_s_saturation(&dev->tpg, ctrl->val);
361 		break;
362 	case V4L2_CID_HUE:
363 		tpg_s_hue(&dev->tpg, ctrl->val);
364 		break;
365 	case V4L2_CID_HFLIP:
366 		dev->hflip = ctrl->val;
367 		tpg_s_hflip(&dev->tpg, dev->sensor_hflip ^ dev->hflip);
368 		break;
369 	case V4L2_CID_VFLIP:
370 		dev->vflip = ctrl->val;
371 		tpg_s_vflip(&dev->tpg, dev->sensor_vflip ^ dev->vflip);
372 		break;
373 	case V4L2_CID_ALPHA_COMPONENT:
374 		tpg_s_alpha_component(&dev->tpg, ctrl->val);
375 		break;
376 	}
377 	return 0;
378 }
379 
380 static const struct v4l2_ctrl_ops vivid_user_vid_ctrl_ops = {
381 	.g_volatile_ctrl = vivid_user_vid_g_volatile_ctrl,
382 	.s_ctrl = vivid_user_vid_s_ctrl,
383 };
384 
385 
386 /* Video Capture Controls */
387 
vivid_vid_cap_s_ctrl(struct v4l2_ctrl * ctrl)388 static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
389 {
390 	static const u32 colorspaces[] = {
391 		V4L2_COLORSPACE_SMPTE170M,
392 		V4L2_COLORSPACE_REC709,
393 		V4L2_COLORSPACE_SRGB,
394 		V4L2_COLORSPACE_OPRGB,
395 		V4L2_COLORSPACE_BT2020,
396 		V4L2_COLORSPACE_DCI_P3,
397 		V4L2_COLORSPACE_SMPTE240M,
398 		V4L2_COLORSPACE_470_SYSTEM_M,
399 		V4L2_COLORSPACE_470_SYSTEM_BG,
400 	};
401 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vid_cap);
402 	unsigned int i, j;
403 
404 	switch (ctrl->id) {
405 	case VIVID_CID_TEST_PATTERN:
406 		vivid_update_quality(dev);
407 		tpg_s_pattern(&dev->tpg, ctrl->val);
408 		break;
409 	case VIVID_CID_COLORSPACE:
410 		tpg_s_colorspace(&dev->tpg, colorspaces[ctrl->val]);
411 		vivid_send_source_change(dev, TV);
412 		vivid_send_source_change(dev, SVID);
413 		vivid_send_source_change(dev, HDMI);
414 		vivid_send_source_change(dev, WEBCAM);
415 		break;
416 	case VIVID_CID_XFER_FUNC:
417 		tpg_s_xfer_func(&dev->tpg, ctrl->val);
418 		vivid_send_source_change(dev, TV);
419 		vivid_send_source_change(dev, SVID);
420 		vivid_send_source_change(dev, HDMI);
421 		vivid_send_source_change(dev, WEBCAM);
422 		break;
423 	case VIVID_CID_YCBCR_ENC:
424 		tpg_s_ycbcr_enc(&dev->tpg, ctrl->val);
425 		vivid_send_source_change(dev, TV);
426 		vivid_send_source_change(dev, SVID);
427 		vivid_send_source_change(dev, HDMI);
428 		vivid_send_source_change(dev, WEBCAM);
429 		break;
430 	case VIVID_CID_HSV_ENC:
431 		tpg_s_hsv_enc(&dev->tpg, ctrl->val ? V4L2_HSV_ENC_256 :
432 						     V4L2_HSV_ENC_180);
433 		vivid_send_source_change(dev, TV);
434 		vivid_send_source_change(dev, SVID);
435 		vivid_send_source_change(dev, HDMI);
436 		vivid_send_source_change(dev, WEBCAM);
437 		break;
438 	case VIVID_CID_QUANTIZATION:
439 		tpg_s_quantization(&dev->tpg, ctrl->val);
440 		vivid_send_source_change(dev, TV);
441 		vivid_send_source_change(dev, SVID);
442 		vivid_send_source_change(dev, HDMI);
443 		vivid_send_source_change(dev, WEBCAM);
444 		break;
445 	case V4L2_CID_DV_RX_RGB_RANGE:
446 		if (!vivid_is_hdmi_cap(dev))
447 			break;
448 		tpg_s_rgb_range(&dev->tpg, ctrl->val);
449 		break;
450 	case VIVID_CID_LIMITED_RGB_RANGE:
451 		tpg_s_real_rgb_range(&dev->tpg, ctrl->val ?
452 				V4L2_DV_RGB_RANGE_LIMITED : V4L2_DV_RGB_RANGE_FULL);
453 		break;
454 	case VIVID_CID_ALPHA_MODE:
455 		tpg_s_alpha_mode(&dev->tpg, ctrl->val);
456 		break;
457 	case VIVID_CID_HOR_MOVEMENT:
458 		tpg_s_mv_hor_mode(&dev->tpg, ctrl->val);
459 		break;
460 	case VIVID_CID_VERT_MOVEMENT:
461 		tpg_s_mv_vert_mode(&dev->tpg, ctrl->val);
462 		break;
463 	case VIVID_CID_OSD_TEXT_MODE:
464 		dev->osd_mode = ctrl->val;
465 		break;
466 	case VIVID_CID_PERCENTAGE_FILL:
467 		tpg_s_perc_fill(&dev->tpg, ctrl->val);
468 		for (i = 0; i < VIDEO_MAX_FRAME; i++)
469 			dev->must_blank[i] = ctrl->val < 100;
470 		break;
471 	case VIVID_CID_INSERT_SAV:
472 		tpg_s_insert_sav(&dev->tpg, ctrl->val);
473 		break;
474 	case VIVID_CID_INSERT_EAV:
475 		tpg_s_insert_eav(&dev->tpg, ctrl->val);
476 		break;
477 	case VIVID_CID_HFLIP:
478 		dev->sensor_hflip = ctrl->val;
479 		tpg_s_hflip(&dev->tpg, dev->sensor_hflip ^ dev->hflip);
480 		break;
481 	case VIVID_CID_VFLIP:
482 		dev->sensor_vflip = ctrl->val;
483 		tpg_s_vflip(&dev->tpg, dev->sensor_vflip ^ dev->vflip);
484 		break;
485 	case VIVID_CID_REDUCED_FPS:
486 		dev->reduced_fps = ctrl->val;
487 		vivid_update_format_cap(dev, true);
488 		break;
489 	case VIVID_CID_HAS_CROP_CAP:
490 		dev->has_crop_cap = ctrl->val;
491 		vivid_update_format_cap(dev, true);
492 		break;
493 	case VIVID_CID_HAS_COMPOSE_CAP:
494 		dev->has_compose_cap = ctrl->val;
495 		vivid_update_format_cap(dev, true);
496 		break;
497 	case VIVID_CID_HAS_SCALER_CAP:
498 		dev->has_scaler_cap = ctrl->val;
499 		vivid_update_format_cap(dev, true);
500 		break;
501 	case VIVID_CID_SHOW_BORDER:
502 		tpg_s_show_border(&dev->tpg, ctrl->val);
503 		break;
504 	case VIVID_CID_SHOW_SQUARE:
505 		tpg_s_show_square(&dev->tpg, ctrl->val);
506 		break;
507 	case VIVID_CID_STD_ASPECT_RATIO:
508 		dev->std_aspect_ratio[dev->input] = ctrl->val;
509 		tpg_s_video_aspect(&dev->tpg, vivid_get_video_aspect(dev));
510 		break;
511 	case VIVID_CID_DV_TIMINGS_SIGNAL_MODE:
512 		dev->dv_timings_signal_mode[dev->input] =
513 			dev->ctrl_dv_timings_signal_mode->val;
514 		dev->query_dv_timings[dev->input] = dev->ctrl_dv_timings->val;
515 
516 		dev->power_present = 0;
517 		for (i = 0, j = 0;
518 		     i < ARRAY_SIZE(dev->dv_timings_signal_mode);
519 		     i++)
520 			if (dev->input_type[i] == HDMI) {
521 				if (dev->dv_timings_signal_mode[i] != NO_SIGNAL)
522 					dev->power_present |= (1 << j);
523 				j++;
524 			}
525 		__v4l2_ctrl_s_ctrl(dev->ctrl_rx_power_present,
526 				   dev->power_present);
527 
528 		v4l2_ctrl_activate(dev->ctrl_dv_timings,
529 			dev->dv_timings_signal_mode[dev->input] ==
530 				SELECTED_DV_TIMINGS);
531 
532 		vivid_update_quality(dev);
533 		vivid_send_source_change(dev, HDMI);
534 		break;
535 	case VIVID_CID_DV_TIMINGS_ASPECT_RATIO:
536 		dev->dv_timings_aspect_ratio[dev->input] = ctrl->val;
537 		tpg_s_video_aspect(&dev->tpg, vivid_get_video_aspect(dev));
538 		break;
539 	case VIVID_CID_TSTAMP_SRC:
540 		dev->tstamp_src_is_soe = ctrl->val;
541 		dev->vb_vid_cap_q.timestamp_flags &= ~V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
542 		if (dev->tstamp_src_is_soe)
543 			dev->vb_vid_cap_q.timestamp_flags |= V4L2_BUF_FLAG_TSTAMP_SRC_SOE;
544 		break;
545 	case VIVID_CID_MAX_EDID_BLOCKS:
546 		dev->edid_max_blocks = ctrl->val;
547 		if (dev->edid_blocks > dev->edid_max_blocks)
548 			dev->edid_blocks = dev->edid_max_blocks;
549 		break;
550 	}
551 	return 0;
552 }
553 
554 static const struct v4l2_ctrl_ops vivid_vid_cap_ctrl_ops = {
555 	.s_ctrl = vivid_vid_cap_s_ctrl,
556 };
557 
558 static const char * const vivid_ctrl_hor_movement_strings[] = {
559 	"Move Left Fast",
560 	"Move Left",
561 	"Move Left Slow",
562 	"No Movement",
563 	"Move Right Slow",
564 	"Move Right",
565 	"Move Right Fast",
566 	NULL,
567 };
568 
569 static const struct v4l2_ctrl_config vivid_ctrl_hor_movement = {
570 	.ops = &vivid_vid_cap_ctrl_ops,
571 	.id = VIVID_CID_HOR_MOVEMENT,
572 	.name = "Horizontal Movement",
573 	.type = V4L2_CTRL_TYPE_MENU,
574 	.max = TPG_MOVE_POS_FAST,
575 	.def = TPG_MOVE_NONE,
576 	.qmenu = vivid_ctrl_hor_movement_strings,
577 };
578 
579 static const char * const vivid_ctrl_vert_movement_strings[] = {
580 	"Move Up Fast",
581 	"Move Up",
582 	"Move Up Slow",
583 	"No Movement",
584 	"Move Down Slow",
585 	"Move Down",
586 	"Move Down Fast",
587 	NULL,
588 };
589 
590 static const struct v4l2_ctrl_config vivid_ctrl_vert_movement = {
591 	.ops = &vivid_vid_cap_ctrl_ops,
592 	.id = VIVID_CID_VERT_MOVEMENT,
593 	.name = "Vertical Movement",
594 	.type = V4L2_CTRL_TYPE_MENU,
595 	.max = TPG_MOVE_POS_FAST,
596 	.def = TPG_MOVE_NONE,
597 	.qmenu = vivid_ctrl_vert_movement_strings,
598 };
599 
600 static const struct v4l2_ctrl_config vivid_ctrl_show_border = {
601 	.ops = &vivid_vid_cap_ctrl_ops,
602 	.id = VIVID_CID_SHOW_BORDER,
603 	.name = "Show Border",
604 	.type = V4L2_CTRL_TYPE_BOOLEAN,
605 	.max = 1,
606 	.step = 1,
607 };
608 
609 static const struct v4l2_ctrl_config vivid_ctrl_show_square = {
610 	.ops = &vivid_vid_cap_ctrl_ops,
611 	.id = VIVID_CID_SHOW_SQUARE,
612 	.name = "Show Square",
613 	.type = V4L2_CTRL_TYPE_BOOLEAN,
614 	.max = 1,
615 	.step = 1,
616 };
617 
618 static const char * const vivid_ctrl_osd_mode_strings[] = {
619 	"All",
620 	"Counters Only",
621 	"None",
622 	NULL,
623 };
624 
625 static const struct v4l2_ctrl_config vivid_ctrl_osd_mode = {
626 	.ops = &vivid_vid_cap_ctrl_ops,
627 	.id = VIVID_CID_OSD_TEXT_MODE,
628 	.name = "OSD Text Mode",
629 	.type = V4L2_CTRL_TYPE_MENU,
630 	.max = ARRAY_SIZE(vivid_ctrl_osd_mode_strings) - 2,
631 	.qmenu = vivid_ctrl_osd_mode_strings,
632 };
633 
634 static const struct v4l2_ctrl_config vivid_ctrl_perc_fill = {
635 	.ops = &vivid_vid_cap_ctrl_ops,
636 	.id = VIVID_CID_PERCENTAGE_FILL,
637 	.name = "Fill Percentage of Frame",
638 	.type = V4L2_CTRL_TYPE_INTEGER,
639 	.min = 0,
640 	.max = 100,
641 	.def = 100,
642 	.step = 1,
643 };
644 
645 static const struct v4l2_ctrl_config vivid_ctrl_insert_sav = {
646 	.ops = &vivid_vid_cap_ctrl_ops,
647 	.id = VIVID_CID_INSERT_SAV,
648 	.name = "Insert SAV Code in Image",
649 	.type = V4L2_CTRL_TYPE_BOOLEAN,
650 	.max = 1,
651 	.step = 1,
652 };
653 
654 static const struct v4l2_ctrl_config vivid_ctrl_insert_eav = {
655 	.ops = &vivid_vid_cap_ctrl_ops,
656 	.id = VIVID_CID_INSERT_EAV,
657 	.name = "Insert EAV Code in Image",
658 	.type = V4L2_CTRL_TYPE_BOOLEAN,
659 	.max = 1,
660 	.step = 1,
661 };
662 
663 static const struct v4l2_ctrl_config vivid_ctrl_hflip = {
664 	.ops = &vivid_vid_cap_ctrl_ops,
665 	.id = VIVID_CID_HFLIP,
666 	.name = "Sensor Flipped Horizontally",
667 	.type = V4L2_CTRL_TYPE_BOOLEAN,
668 	.max = 1,
669 	.step = 1,
670 };
671 
672 static const struct v4l2_ctrl_config vivid_ctrl_vflip = {
673 	.ops = &vivid_vid_cap_ctrl_ops,
674 	.id = VIVID_CID_VFLIP,
675 	.name = "Sensor Flipped Vertically",
676 	.type = V4L2_CTRL_TYPE_BOOLEAN,
677 	.max = 1,
678 	.step = 1,
679 };
680 
681 static const struct v4l2_ctrl_config vivid_ctrl_reduced_fps = {
682 	.ops = &vivid_vid_cap_ctrl_ops,
683 	.id = VIVID_CID_REDUCED_FPS,
684 	.name = "Reduced Framerate",
685 	.type = V4L2_CTRL_TYPE_BOOLEAN,
686 	.max = 1,
687 	.step = 1,
688 };
689 
690 static const struct v4l2_ctrl_config vivid_ctrl_has_crop_cap = {
691 	.ops = &vivid_vid_cap_ctrl_ops,
692 	.id = VIVID_CID_HAS_CROP_CAP,
693 	.name = "Enable Capture Cropping",
694 	.type = V4L2_CTRL_TYPE_BOOLEAN,
695 	.max = 1,
696 	.def = 1,
697 	.step = 1,
698 };
699 
700 static const struct v4l2_ctrl_config vivid_ctrl_has_compose_cap = {
701 	.ops = &vivid_vid_cap_ctrl_ops,
702 	.id = VIVID_CID_HAS_COMPOSE_CAP,
703 	.name = "Enable Capture Composing",
704 	.type = V4L2_CTRL_TYPE_BOOLEAN,
705 	.max = 1,
706 	.def = 1,
707 	.step = 1,
708 };
709 
710 static const struct v4l2_ctrl_config vivid_ctrl_has_scaler_cap = {
711 	.ops = &vivid_vid_cap_ctrl_ops,
712 	.id = VIVID_CID_HAS_SCALER_CAP,
713 	.name = "Enable Capture Scaler",
714 	.type = V4L2_CTRL_TYPE_BOOLEAN,
715 	.max = 1,
716 	.def = 1,
717 	.step = 1,
718 };
719 
720 static const char * const vivid_ctrl_tstamp_src_strings[] = {
721 	"End of Frame",
722 	"Start of Exposure",
723 	NULL,
724 };
725 
726 static const struct v4l2_ctrl_config vivid_ctrl_tstamp_src = {
727 	.ops = &vivid_vid_cap_ctrl_ops,
728 	.id = VIVID_CID_TSTAMP_SRC,
729 	.name = "Timestamp Source",
730 	.type = V4L2_CTRL_TYPE_MENU,
731 	.max = ARRAY_SIZE(vivid_ctrl_tstamp_src_strings) - 2,
732 	.qmenu = vivid_ctrl_tstamp_src_strings,
733 };
734 
735 static const struct v4l2_ctrl_config vivid_ctrl_std_aspect_ratio = {
736 	.ops = &vivid_vid_cap_ctrl_ops,
737 	.id = VIVID_CID_STD_ASPECT_RATIO,
738 	.name = "Standard Aspect Ratio",
739 	.type = V4L2_CTRL_TYPE_MENU,
740 	.min = 1,
741 	.max = 4,
742 	.def = 1,
743 	.qmenu = tpg_aspect_strings,
744 };
745 
746 static const char * const vivid_ctrl_dv_timings_signal_mode_strings[] = {
747 	"Current DV Timings",
748 	"No Signal",
749 	"No Lock",
750 	"Out of Range",
751 	"Selected DV Timings",
752 	"Cycle Through All DV Timings",
753 	"Custom DV Timings",
754 	NULL,
755 };
756 
757 static const struct v4l2_ctrl_config vivid_ctrl_dv_timings_signal_mode = {
758 	.ops = &vivid_vid_cap_ctrl_ops,
759 	.id = VIVID_CID_DV_TIMINGS_SIGNAL_MODE,
760 	.name = "DV Timings Signal Mode",
761 	.type = V4L2_CTRL_TYPE_MENU,
762 	.max = 5,
763 	.qmenu = vivid_ctrl_dv_timings_signal_mode_strings,
764 };
765 
766 static const struct v4l2_ctrl_config vivid_ctrl_dv_timings_aspect_ratio = {
767 	.ops = &vivid_vid_cap_ctrl_ops,
768 	.id = VIVID_CID_DV_TIMINGS_ASPECT_RATIO,
769 	.name = "DV Timings Aspect Ratio",
770 	.type = V4L2_CTRL_TYPE_MENU,
771 	.max = 3,
772 	.qmenu = tpg_aspect_strings,
773 };
774 
775 static const struct v4l2_ctrl_config vivid_ctrl_max_edid_blocks = {
776 	.ops = &vivid_vid_cap_ctrl_ops,
777 	.id = VIVID_CID_MAX_EDID_BLOCKS,
778 	.name = "Maximum EDID Blocks",
779 	.type = V4L2_CTRL_TYPE_INTEGER,
780 	.min = 1,
781 	.max = 256,
782 	.def = 2,
783 	.step = 1,
784 };
785 
786 static const char * const vivid_ctrl_colorspace_strings[] = {
787 	"SMPTE 170M",
788 	"Rec. 709",
789 	"sRGB",
790 	"opRGB",
791 	"BT.2020",
792 	"DCI-P3",
793 	"SMPTE 240M",
794 	"470 System M",
795 	"470 System BG",
796 	NULL,
797 };
798 
799 static const struct v4l2_ctrl_config vivid_ctrl_colorspace = {
800 	.ops = &vivid_vid_cap_ctrl_ops,
801 	.id = VIVID_CID_COLORSPACE,
802 	.name = "Colorspace",
803 	.type = V4L2_CTRL_TYPE_MENU,
804 	.max = ARRAY_SIZE(vivid_ctrl_colorspace_strings) - 2,
805 	.def = 2,
806 	.qmenu = vivid_ctrl_colorspace_strings,
807 };
808 
809 static const char * const vivid_ctrl_xfer_func_strings[] = {
810 	"Default",
811 	"Rec. 709",
812 	"sRGB",
813 	"opRGB",
814 	"SMPTE 240M",
815 	"None",
816 	"DCI-P3",
817 	"SMPTE 2084",
818 	NULL,
819 };
820 
821 static const struct v4l2_ctrl_config vivid_ctrl_xfer_func = {
822 	.ops = &vivid_vid_cap_ctrl_ops,
823 	.id = VIVID_CID_XFER_FUNC,
824 	.name = "Transfer Function",
825 	.type = V4L2_CTRL_TYPE_MENU,
826 	.max = ARRAY_SIZE(vivid_ctrl_xfer_func_strings) - 2,
827 	.qmenu = vivid_ctrl_xfer_func_strings,
828 };
829 
830 static const char * const vivid_ctrl_ycbcr_enc_strings[] = {
831 	"Default",
832 	"ITU-R 601",
833 	"Rec. 709",
834 	"xvYCC 601",
835 	"xvYCC 709",
836 	"",
837 	"BT.2020",
838 	"BT.2020 Constant Luminance",
839 	"SMPTE 240M",
840 	NULL,
841 };
842 
843 static const struct v4l2_ctrl_config vivid_ctrl_ycbcr_enc = {
844 	.ops = &vivid_vid_cap_ctrl_ops,
845 	.id = VIVID_CID_YCBCR_ENC,
846 	.name = "Y'CbCr Encoding",
847 	.type = V4L2_CTRL_TYPE_MENU,
848 	.menu_skip_mask = 1 << 5,
849 	.max = ARRAY_SIZE(vivid_ctrl_ycbcr_enc_strings) - 2,
850 	.qmenu = vivid_ctrl_ycbcr_enc_strings,
851 };
852 
853 static const char * const vivid_ctrl_hsv_enc_strings[] = {
854 	"Hue 0-179",
855 	"Hue 0-256",
856 	NULL,
857 };
858 
859 static const struct v4l2_ctrl_config vivid_ctrl_hsv_enc = {
860 	.ops = &vivid_vid_cap_ctrl_ops,
861 	.id = VIVID_CID_HSV_ENC,
862 	.name = "HSV Encoding",
863 	.type = V4L2_CTRL_TYPE_MENU,
864 	.max = ARRAY_SIZE(vivid_ctrl_hsv_enc_strings) - 2,
865 	.qmenu = vivid_ctrl_hsv_enc_strings,
866 };
867 
868 static const char * const vivid_ctrl_quantization_strings[] = {
869 	"Default",
870 	"Full Range",
871 	"Limited Range",
872 	NULL,
873 };
874 
875 static const struct v4l2_ctrl_config vivid_ctrl_quantization = {
876 	.ops = &vivid_vid_cap_ctrl_ops,
877 	.id = VIVID_CID_QUANTIZATION,
878 	.name = "Quantization",
879 	.type = V4L2_CTRL_TYPE_MENU,
880 	.max = ARRAY_SIZE(vivid_ctrl_quantization_strings) - 2,
881 	.qmenu = vivid_ctrl_quantization_strings,
882 };
883 
884 static const struct v4l2_ctrl_config vivid_ctrl_alpha_mode = {
885 	.ops = &vivid_vid_cap_ctrl_ops,
886 	.id = VIVID_CID_ALPHA_MODE,
887 	.name = "Apply Alpha To Red Only",
888 	.type = V4L2_CTRL_TYPE_BOOLEAN,
889 	.max = 1,
890 	.step = 1,
891 };
892 
893 static const struct v4l2_ctrl_config vivid_ctrl_limited_rgb_range = {
894 	.ops = &vivid_vid_cap_ctrl_ops,
895 	.id = VIVID_CID_LIMITED_RGB_RANGE,
896 	.name = "Limited RGB Range (16-235)",
897 	.type = V4L2_CTRL_TYPE_BOOLEAN,
898 	.max = 1,
899 	.step = 1,
900 };
901 
902 
903 /* Video Loop Control */
904 
vivid_loop_cap_s_ctrl(struct v4l2_ctrl * ctrl)905 static int vivid_loop_cap_s_ctrl(struct v4l2_ctrl *ctrl)
906 {
907 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_loop_cap);
908 
909 	switch (ctrl->id) {
910 	case VIVID_CID_LOOP_VIDEO:
911 		dev->loop_video = ctrl->val;
912 		vivid_update_quality(dev);
913 		vivid_send_source_change(dev, SVID);
914 		vivid_send_source_change(dev, HDMI);
915 		break;
916 	}
917 	return 0;
918 }
919 
920 static const struct v4l2_ctrl_ops vivid_loop_cap_ctrl_ops = {
921 	.s_ctrl = vivid_loop_cap_s_ctrl,
922 };
923 
924 static const struct v4l2_ctrl_config vivid_ctrl_loop_video = {
925 	.ops = &vivid_loop_cap_ctrl_ops,
926 	.id = VIVID_CID_LOOP_VIDEO,
927 	.name = "Loop Video",
928 	.type = V4L2_CTRL_TYPE_BOOLEAN,
929 	.max = 1,
930 	.step = 1,
931 };
932 
933 
934 /* VBI Capture Control */
935 
vivid_vbi_cap_s_ctrl(struct v4l2_ctrl * ctrl)936 static int vivid_vbi_cap_s_ctrl(struct v4l2_ctrl *ctrl)
937 {
938 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vbi_cap);
939 
940 	switch (ctrl->id) {
941 	case VIVID_CID_VBI_CAP_INTERLACED:
942 		dev->vbi_cap_interlaced = ctrl->val;
943 		break;
944 	}
945 	return 0;
946 }
947 
948 static const struct v4l2_ctrl_ops vivid_vbi_cap_ctrl_ops = {
949 	.s_ctrl = vivid_vbi_cap_s_ctrl,
950 };
951 
952 static const struct v4l2_ctrl_config vivid_ctrl_vbi_cap_interlaced = {
953 	.ops = &vivid_vbi_cap_ctrl_ops,
954 	.id = VIVID_CID_VBI_CAP_INTERLACED,
955 	.name = "Interlaced VBI Format",
956 	.type = V4L2_CTRL_TYPE_BOOLEAN,
957 	.max = 1,
958 	.step = 1,
959 };
960 
961 
962 /* Video Output Controls */
963 
vivid_vid_out_s_ctrl(struct v4l2_ctrl * ctrl)964 static int vivid_vid_out_s_ctrl(struct v4l2_ctrl *ctrl)
965 {
966 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vid_out);
967 	struct v4l2_bt_timings *bt = &dev->dv_timings_out.bt;
968 	u32 display_present = 0;
969 	unsigned int i, j, bus_idx;
970 
971 	switch (ctrl->id) {
972 	case VIVID_CID_HAS_CROP_OUT:
973 		dev->has_crop_out = ctrl->val;
974 		vivid_update_format_out(dev);
975 		break;
976 	case VIVID_CID_HAS_COMPOSE_OUT:
977 		dev->has_compose_out = ctrl->val;
978 		vivid_update_format_out(dev);
979 		break;
980 	case VIVID_CID_HAS_SCALER_OUT:
981 		dev->has_scaler_out = ctrl->val;
982 		vivid_update_format_out(dev);
983 		break;
984 	case V4L2_CID_DV_TX_MODE:
985 		dev->dvi_d_out = ctrl->val == V4L2_DV_TX_MODE_DVI_D;
986 		if (!vivid_is_hdmi_out(dev))
987 			break;
988 		if (!dev->dvi_d_out && (bt->flags & V4L2_DV_FL_IS_CE_VIDEO)) {
989 			if (bt->width == 720 && bt->height <= 576)
990 				dev->colorspace_out = V4L2_COLORSPACE_SMPTE170M;
991 			else
992 				dev->colorspace_out = V4L2_COLORSPACE_REC709;
993 			dev->quantization_out = V4L2_QUANTIZATION_DEFAULT;
994 		} else {
995 			dev->colorspace_out = V4L2_COLORSPACE_SRGB;
996 			dev->quantization_out = dev->dvi_d_out ?
997 					V4L2_QUANTIZATION_LIM_RANGE :
998 					V4L2_QUANTIZATION_DEFAULT;
999 		}
1000 		if (dev->loop_video)
1001 			vivid_send_source_change(dev, HDMI);
1002 		break;
1003 	case VIVID_CID_DISPLAY_PRESENT:
1004 		if (dev->output_type[dev->output] != HDMI)
1005 			break;
1006 
1007 		dev->display_present[dev->output] = ctrl->val;
1008 		for (i = 0, j = 0; i < dev->num_outputs; i++)
1009 			if (dev->output_type[i] == HDMI)
1010 				display_present |=
1011 					dev->display_present[i] << j++;
1012 
1013 		__v4l2_ctrl_s_ctrl(dev->ctrl_tx_rxsense, display_present);
1014 
1015 		if (dev->edid_blocks) {
1016 			__v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present,
1017 					   display_present);
1018 			__v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug,
1019 					   display_present);
1020 		}
1021 
1022 		bus_idx = dev->cec_output2bus_map[dev->output];
1023 		if (!dev->cec_tx_adap[bus_idx])
1024 			break;
1025 
1026 		if (ctrl->val && dev->edid_blocks)
1027 			cec_s_phys_addr(dev->cec_tx_adap[bus_idx],
1028 					dev->cec_tx_adap[bus_idx]->phys_addr,
1029 					false);
1030 		else
1031 			cec_phys_addr_invalidate(dev->cec_tx_adap[bus_idx]);
1032 
1033 		break;
1034 	}
1035 	return 0;
1036 }
1037 
1038 static const struct v4l2_ctrl_ops vivid_vid_out_ctrl_ops = {
1039 	.s_ctrl = vivid_vid_out_s_ctrl,
1040 };
1041 
1042 static const struct v4l2_ctrl_config vivid_ctrl_has_crop_out = {
1043 	.ops = &vivid_vid_out_ctrl_ops,
1044 	.id = VIVID_CID_HAS_CROP_OUT,
1045 	.name = "Enable Output Cropping",
1046 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1047 	.max = 1,
1048 	.def = 1,
1049 	.step = 1,
1050 };
1051 
1052 static const struct v4l2_ctrl_config vivid_ctrl_has_compose_out = {
1053 	.ops = &vivid_vid_out_ctrl_ops,
1054 	.id = VIVID_CID_HAS_COMPOSE_OUT,
1055 	.name = "Enable Output Composing",
1056 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1057 	.max = 1,
1058 	.def = 1,
1059 	.step = 1,
1060 };
1061 
1062 static const struct v4l2_ctrl_config vivid_ctrl_has_scaler_out = {
1063 	.ops = &vivid_vid_out_ctrl_ops,
1064 	.id = VIVID_CID_HAS_SCALER_OUT,
1065 	.name = "Enable Output Scaler",
1066 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1067 	.max = 1,
1068 	.def = 1,
1069 	.step = 1,
1070 };
1071 
1072 static const struct v4l2_ctrl_config vivid_ctrl_display_present = {
1073 	.ops = &vivid_vid_out_ctrl_ops,
1074 	.id = VIVID_CID_DISPLAY_PRESENT,
1075 	.name = "Display Present",
1076 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1077 	.max = 1,
1078 	.def = 1,
1079 	.step = 1,
1080 };
1081 
1082 /* Streaming Controls */
1083 
vivid_streaming_s_ctrl(struct v4l2_ctrl * ctrl)1084 static int vivid_streaming_s_ctrl(struct v4l2_ctrl *ctrl)
1085 {
1086 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_streaming);
1087 	u64 rem;
1088 
1089 	switch (ctrl->id) {
1090 	case VIVID_CID_DQBUF_ERROR:
1091 		dev->dqbuf_error = true;
1092 		break;
1093 	case VIVID_CID_PERC_DROPPED:
1094 		dev->perc_dropped_buffers = ctrl->val;
1095 		break;
1096 	case VIVID_CID_QUEUE_SETUP_ERROR:
1097 		dev->queue_setup_error = true;
1098 		break;
1099 	case VIVID_CID_BUF_PREPARE_ERROR:
1100 		dev->buf_prepare_error = true;
1101 		break;
1102 	case VIVID_CID_START_STR_ERROR:
1103 		dev->start_streaming_error = true;
1104 		break;
1105 	case VIVID_CID_REQ_VALIDATE_ERROR:
1106 		dev->req_validate_error = true;
1107 		break;
1108 	case VIVID_CID_QUEUE_ERROR:
1109 		if (vb2_start_streaming_called(&dev->vb_vid_cap_q))
1110 			vb2_queue_error(&dev->vb_vid_cap_q);
1111 		if (vb2_start_streaming_called(&dev->vb_vbi_cap_q))
1112 			vb2_queue_error(&dev->vb_vbi_cap_q);
1113 		if (vb2_start_streaming_called(&dev->vb_vid_out_q))
1114 			vb2_queue_error(&dev->vb_vid_out_q);
1115 		if (vb2_start_streaming_called(&dev->vb_vbi_out_q))
1116 			vb2_queue_error(&dev->vb_vbi_out_q);
1117 		if (vb2_start_streaming_called(&dev->vb_sdr_cap_q))
1118 			vb2_queue_error(&dev->vb_sdr_cap_q);
1119 		break;
1120 	case VIVID_CID_SEQ_WRAP:
1121 		dev->seq_wrap = ctrl->val;
1122 		break;
1123 	case VIVID_CID_TIME_WRAP:
1124 		dev->time_wrap = ctrl->val;
1125 		if (ctrl->val == 0) {
1126 			dev->time_wrap_offset = 0;
1127 			break;
1128 		}
1129 		/*
1130 		 * We want to set the time 16 seconds before the 32 bit tv_sec
1131 		 * value of struct timeval would wrap around. So first we
1132 		 * calculate ktime_get_ns() % ((1 << 32) * NSEC_PER_SEC), and
1133 		 * then we set the offset to ((1 << 32) - 16) * NSEC_PER_SEC).
1134 		 */
1135 		div64_u64_rem(ktime_get_ns(),
1136 			0x100000000ULL * NSEC_PER_SEC, &rem);
1137 		dev->time_wrap_offset =
1138 			(0x100000000ULL - 16) * NSEC_PER_SEC - rem;
1139 		break;
1140 	}
1141 	return 0;
1142 }
1143 
1144 static const struct v4l2_ctrl_ops vivid_streaming_ctrl_ops = {
1145 	.s_ctrl = vivid_streaming_s_ctrl,
1146 };
1147 
1148 static const struct v4l2_ctrl_config vivid_ctrl_dqbuf_error = {
1149 	.ops = &vivid_streaming_ctrl_ops,
1150 	.id = VIVID_CID_DQBUF_ERROR,
1151 	.name = "Inject V4L2_BUF_FLAG_ERROR",
1152 	.type = V4L2_CTRL_TYPE_BUTTON,
1153 };
1154 
1155 static const struct v4l2_ctrl_config vivid_ctrl_perc_dropped = {
1156 	.ops = &vivid_streaming_ctrl_ops,
1157 	.id = VIVID_CID_PERC_DROPPED,
1158 	.name = "Percentage of Dropped Buffers",
1159 	.type = V4L2_CTRL_TYPE_INTEGER,
1160 	.min = 0,
1161 	.max = 100,
1162 	.step = 1,
1163 };
1164 
1165 static const struct v4l2_ctrl_config vivid_ctrl_queue_setup_error = {
1166 	.ops = &vivid_streaming_ctrl_ops,
1167 	.id = VIVID_CID_QUEUE_SETUP_ERROR,
1168 	.name = "Inject VIDIOC_REQBUFS Error",
1169 	.type = V4L2_CTRL_TYPE_BUTTON,
1170 };
1171 
1172 static const struct v4l2_ctrl_config vivid_ctrl_buf_prepare_error = {
1173 	.ops = &vivid_streaming_ctrl_ops,
1174 	.id = VIVID_CID_BUF_PREPARE_ERROR,
1175 	.name = "Inject VIDIOC_QBUF Error",
1176 	.type = V4L2_CTRL_TYPE_BUTTON,
1177 };
1178 
1179 static const struct v4l2_ctrl_config vivid_ctrl_start_streaming_error = {
1180 	.ops = &vivid_streaming_ctrl_ops,
1181 	.id = VIVID_CID_START_STR_ERROR,
1182 	.name = "Inject VIDIOC_STREAMON Error",
1183 	.type = V4L2_CTRL_TYPE_BUTTON,
1184 };
1185 
1186 static const struct v4l2_ctrl_config vivid_ctrl_queue_error = {
1187 	.ops = &vivid_streaming_ctrl_ops,
1188 	.id = VIVID_CID_QUEUE_ERROR,
1189 	.name = "Inject Fatal Streaming Error",
1190 	.type = V4L2_CTRL_TYPE_BUTTON,
1191 };
1192 
1193 #ifdef CONFIG_MEDIA_CONTROLLER
1194 static const struct v4l2_ctrl_config vivid_ctrl_req_validate_error = {
1195 	.ops = &vivid_streaming_ctrl_ops,
1196 	.id = VIVID_CID_REQ_VALIDATE_ERROR,
1197 	.name = "Inject req_validate() Error",
1198 	.type = V4L2_CTRL_TYPE_BUTTON,
1199 };
1200 #endif
1201 
1202 static const struct v4l2_ctrl_config vivid_ctrl_seq_wrap = {
1203 	.ops = &vivid_streaming_ctrl_ops,
1204 	.id = VIVID_CID_SEQ_WRAP,
1205 	.name = "Wrap Sequence Number",
1206 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1207 	.max = 1,
1208 	.step = 1,
1209 };
1210 
1211 static const struct v4l2_ctrl_config vivid_ctrl_time_wrap = {
1212 	.ops = &vivid_streaming_ctrl_ops,
1213 	.id = VIVID_CID_TIME_WRAP,
1214 	.name = "Wrap Timestamp",
1215 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1216 	.max = 1,
1217 	.step = 1,
1218 };
1219 
1220 
1221 /* SDTV Capture Controls */
1222 
vivid_sdtv_cap_s_ctrl(struct v4l2_ctrl * ctrl)1223 static int vivid_sdtv_cap_s_ctrl(struct v4l2_ctrl *ctrl)
1224 {
1225 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_sdtv_cap);
1226 
1227 	switch (ctrl->id) {
1228 	case VIVID_CID_STD_SIGNAL_MODE:
1229 		dev->std_signal_mode[dev->input] =
1230 			dev->ctrl_std_signal_mode->val;
1231 		if (dev->std_signal_mode[dev->input] == SELECTED_STD)
1232 			dev->query_std[dev->input] =
1233 				vivid_standard[dev->ctrl_standard->val];
1234 		v4l2_ctrl_activate(dev->ctrl_standard,
1235 				   dev->std_signal_mode[dev->input] ==
1236 					SELECTED_STD);
1237 		vivid_update_quality(dev);
1238 		vivid_send_source_change(dev, TV);
1239 		vivid_send_source_change(dev, SVID);
1240 		break;
1241 	}
1242 	return 0;
1243 }
1244 
1245 static const struct v4l2_ctrl_ops vivid_sdtv_cap_ctrl_ops = {
1246 	.s_ctrl = vivid_sdtv_cap_s_ctrl,
1247 };
1248 
1249 static const char * const vivid_ctrl_std_signal_mode_strings[] = {
1250 	"Current Standard",
1251 	"No Signal",
1252 	"No Lock",
1253 	"",
1254 	"Selected Standard",
1255 	"Cycle Through All Standards",
1256 	NULL,
1257 };
1258 
1259 static const struct v4l2_ctrl_config vivid_ctrl_std_signal_mode = {
1260 	.ops = &vivid_sdtv_cap_ctrl_ops,
1261 	.id = VIVID_CID_STD_SIGNAL_MODE,
1262 	.name = "Standard Signal Mode",
1263 	.type = V4L2_CTRL_TYPE_MENU,
1264 	.max = ARRAY_SIZE(vivid_ctrl_std_signal_mode_strings) - 2,
1265 	.menu_skip_mask = 1 << 3,
1266 	.qmenu = vivid_ctrl_std_signal_mode_strings,
1267 };
1268 
1269 static const struct v4l2_ctrl_config vivid_ctrl_standard = {
1270 	.ops = &vivid_sdtv_cap_ctrl_ops,
1271 	.id = VIVID_CID_STANDARD,
1272 	.name = "Standard",
1273 	.type = V4L2_CTRL_TYPE_MENU,
1274 	.max = 14,
1275 	.qmenu = vivid_ctrl_standard_strings,
1276 };
1277 
1278 
1279 
1280 /* Radio Receiver Controls */
1281 
vivid_radio_rx_s_ctrl(struct v4l2_ctrl * ctrl)1282 static int vivid_radio_rx_s_ctrl(struct v4l2_ctrl *ctrl)
1283 {
1284 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_radio_rx);
1285 
1286 	switch (ctrl->id) {
1287 	case VIVID_CID_RADIO_SEEK_MODE:
1288 		dev->radio_rx_hw_seek_mode = ctrl->val;
1289 		break;
1290 	case VIVID_CID_RADIO_SEEK_PROG_LIM:
1291 		dev->radio_rx_hw_seek_prog_lim = ctrl->val;
1292 		break;
1293 	case VIVID_CID_RADIO_RX_RDS_RBDS:
1294 		dev->rds_gen.use_rbds = ctrl->val;
1295 		break;
1296 	case VIVID_CID_RADIO_RX_RDS_BLOCKIO:
1297 		dev->radio_rx_rds_controls = ctrl->val;
1298 		dev->radio_rx_caps &= ~V4L2_CAP_READWRITE;
1299 		dev->radio_rx_rds_use_alternates = false;
1300 		if (!dev->radio_rx_rds_controls) {
1301 			dev->radio_rx_caps |= V4L2_CAP_READWRITE;
1302 			__v4l2_ctrl_s_ctrl(dev->radio_rx_rds_pty, 0);
1303 			__v4l2_ctrl_s_ctrl(dev->radio_rx_rds_ta, 0);
1304 			__v4l2_ctrl_s_ctrl(dev->radio_rx_rds_tp, 0);
1305 			__v4l2_ctrl_s_ctrl(dev->radio_rx_rds_ms, 0);
1306 			__v4l2_ctrl_s_ctrl_string(dev->radio_rx_rds_psname, "");
1307 			__v4l2_ctrl_s_ctrl_string(dev->radio_rx_rds_radiotext, "");
1308 		}
1309 		v4l2_ctrl_activate(dev->radio_rx_rds_pty, dev->radio_rx_rds_controls);
1310 		v4l2_ctrl_activate(dev->radio_rx_rds_psname, dev->radio_rx_rds_controls);
1311 		v4l2_ctrl_activate(dev->radio_rx_rds_radiotext, dev->radio_rx_rds_controls);
1312 		v4l2_ctrl_activate(dev->radio_rx_rds_ta, dev->radio_rx_rds_controls);
1313 		v4l2_ctrl_activate(dev->radio_rx_rds_tp, dev->radio_rx_rds_controls);
1314 		v4l2_ctrl_activate(dev->radio_rx_rds_ms, dev->radio_rx_rds_controls);
1315 		dev->radio_rx_dev.device_caps = dev->radio_rx_caps;
1316 		break;
1317 	case V4L2_CID_RDS_RECEPTION:
1318 		dev->radio_rx_rds_enabled = ctrl->val;
1319 		break;
1320 	}
1321 	return 0;
1322 }
1323 
1324 static const struct v4l2_ctrl_ops vivid_radio_rx_ctrl_ops = {
1325 	.s_ctrl = vivid_radio_rx_s_ctrl,
1326 };
1327 
1328 static const char * const vivid_ctrl_radio_rds_mode_strings[] = {
1329 	"Block I/O",
1330 	"Controls",
1331 	NULL,
1332 };
1333 
1334 static const struct v4l2_ctrl_config vivid_ctrl_radio_rx_rds_blockio = {
1335 	.ops = &vivid_radio_rx_ctrl_ops,
1336 	.id = VIVID_CID_RADIO_RX_RDS_BLOCKIO,
1337 	.name = "RDS Rx I/O Mode",
1338 	.type = V4L2_CTRL_TYPE_MENU,
1339 	.qmenu = vivid_ctrl_radio_rds_mode_strings,
1340 	.max = 1,
1341 };
1342 
1343 static const struct v4l2_ctrl_config vivid_ctrl_radio_rx_rds_rbds = {
1344 	.ops = &vivid_radio_rx_ctrl_ops,
1345 	.id = VIVID_CID_RADIO_RX_RDS_RBDS,
1346 	.name = "Generate RBDS Instead of RDS",
1347 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1348 	.max = 1,
1349 	.step = 1,
1350 };
1351 
1352 static const char * const vivid_ctrl_radio_hw_seek_mode_strings[] = {
1353 	"Bounded",
1354 	"Wrap Around",
1355 	"Both",
1356 	NULL,
1357 };
1358 
1359 static const struct v4l2_ctrl_config vivid_ctrl_radio_hw_seek_mode = {
1360 	.ops = &vivid_radio_rx_ctrl_ops,
1361 	.id = VIVID_CID_RADIO_SEEK_MODE,
1362 	.name = "Radio HW Seek Mode",
1363 	.type = V4L2_CTRL_TYPE_MENU,
1364 	.max = 2,
1365 	.qmenu = vivid_ctrl_radio_hw_seek_mode_strings,
1366 };
1367 
1368 static const struct v4l2_ctrl_config vivid_ctrl_radio_hw_seek_prog_lim = {
1369 	.ops = &vivid_radio_rx_ctrl_ops,
1370 	.id = VIVID_CID_RADIO_SEEK_PROG_LIM,
1371 	.name = "Radio Programmable HW Seek",
1372 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1373 	.max = 1,
1374 	.step = 1,
1375 };
1376 
1377 
1378 /* Radio Transmitter Controls */
1379 
vivid_radio_tx_s_ctrl(struct v4l2_ctrl * ctrl)1380 static int vivid_radio_tx_s_ctrl(struct v4l2_ctrl *ctrl)
1381 {
1382 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_radio_tx);
1383 
1384 	switch (ctrl->id) {
1385 	case VIVID_CID_RADIO_TX_RDS_BLOCKIO:
1386 		dev->radio_tx_rds_controls = ctrl->val;
1387 		dev->radio_tx_caps &= ~V4L2_CAP_READWRITE;
1388 		if (!dev->radio_tx_rds_controls)
1389 			dev->radio_tx_caps |= V4L2_CAP_READWRITE;
1390 		dev->radio_tx_dev.device_caps = dev->radio_tx_caps;
1391 		break;
1392 	case V4L2_CID_RDS_TX_PTY:
1393 		if (dev->radio_rx_rds_controls)
1394 			v4l2_ctrl_s_ctrl(dev->radio_rx_rds_pty, ctrl->val);
1395 		break;
1396 	case V4L2_CID_RDS_TX_PS_NAME:
1397 		if (dev->radio_rx_rds_controls)
1398 			v4l2_ctrl_s_ctrl_string(dev->radio_rx_rds_psname, ctrl->p_new.p_char);
1399 		break;
1400 	case V4L2_CID_RDS_TX_RADIO_TEXT:
1401 		if (dev->radio_rx_rds_controls)
1402 			v4l2_ctrl_s_ctrl_string(dev->radio_rx_rds_radiotext, ctrl->p_new.p_char);
1403 		break;
1404 	case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT:
1405 		if (dev->radio_rx_rds_controls)
1406 			v4l2_ctrl_s_ctrl(dev->radio_rx_rds_ta, ctrl->val);
1407 		break;
1408 	case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:
1409 		if (dev->radio_rx_rds_controls)
1410 			v4l2_ctrl_s_ctrl(dev->radio_rx_rds_tp, ctrl->val);
1411 		break;
1412 	case V4L2_CID_RDS_TX_MUSIC_SPEECH:
1413 		if (dev->radio_rx_rds_controls)
1414 			v4l2_ctrl_s_ctrl(dev->radio_rx_rds_ms, ctrl->val);
1415 		break;
1416 	}
1417 	return 0;
1418 }
1419 
1420 static const struct v4l2_ctrl_ops vivid_radio_tx_ctrl_ops = {
1421 	.s_ctrl = vivid_radio_tx_s_ctrl,
1422 };
1423 
1424 static const struct v4l2_ctrl_config vivid_ctrl_radio_tx_rds_blockio = {
1425 	.ops = &vivid_radio_tx_ctrl_ops,
1426 	.id = VIVID_CID_RADIO_TX_RDS_BLOCKIO,
1427 	.name = "RDS Tx I/O Mode",
1428 	.type = V4L2_CTRL_TYPE_MENU,
1429 	.qmenu = vivid_ctrl_radio_rds_mode_strings,
1430 	.max = 1,
1431 	.def = 1,
1432 };
1433 
1434 
1435 /* SDR Capture Controls */
1436 
vivid_sdr_cap_s_ctrl(struct v4l2_ctrl * ctrl)1437 static int vivid_sdr_cap_s_ctrl(struct v4l2_ctrl *ctrl)
1438 {
1439 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_sdr_cap);
1440 
1441 	switch (ctrl->id) {
1442 	case VIVID_CID_SDR_CAP_FM_DEVIATION:
1443 		dev->sdr_fm_deviation = ctrl->val;
1444 		break;
1445 	}
1446 	return 0;
1447 }
1448 
1449 static const struct v4l2_ctrl_ops vivid_sdr_cap_ctrl_ops = {
1450 	.s_ctrl = vivid_sdr_cap_s_ctrl,
1451 };
1452 
1453 static const struct v4l2_ctrl_config vivid_ctrl_sdr_cap_fm_deviation = {
1454 	.ops = &vivid_sdr_cap_ctrl_ops,
1455 	.id = VIVID_CID_SDR_CAP_FM_DEVIATION,
1456 	.name = "FM Deviation",
1457 	.type = V4L2_CTRL_TYPE_INTEGER,
1458 	.min =    100,
1459 	.max = 200000,
1460 	.def =  75000,
1461 	.step =     1,
1462 };
1463 
1464 /* Metadata Capture Control */
1465 
vivid_meta_cap_s_ctrl(struct v4l2_ctrl * ctrl)1466 static int vivid_meta_cap_s_ctrl(struct v4l2_ctrl *ctrl)
1467 {
1468 	struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev,
1469 					     ctrl_hdl_meta_cap);
1470 
1471 	switch (ctrl->id) {
1472 	case VIVID_CID_META_CAP_GENERATE_PTS:
1473 		dev->meta_pts = ctrl->val;
1474 		break;
1475 	case VIVID_CID_META_CAP_GENERATE_SCR:
1476 		dev->meta_scr = ctrl->val;
1477 		break;
1478 	}
1479 	return 0;
1480 }
1481 
1482 static const struct v4l2_ctrl_ops vivid_meta_cap_ctrl_ops = {
1483 	.s_ctrl = vivid_meta_cap_s_ctrl,
1484 };
1485 
1486 static const struct v4l2_ctrl_config vivid_ctrl_meta_has_pts = {
1487 	.ops = &vivid_meta_cap_ctrl_ops,
1488 	.id = VIVID_CID_META_CAP_GENERATE_PTS,
1489 	.name = "Generate PTS",
1490 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1491 	.max = 1,
1492 	.def = 1,
1493 	.step = 1,
1494 };
1495 
1496 static const struct v4l2_ctrl_config vivid_ctrl_meta_has_src_clk = {
1497 	.ops = &vivid_meta_cap_ctrl_ops,
1498 	.id = VIVID_CID_META_CAP_GENERATE_SCR,
1499 	.name = "Generate SCR",
1500 	.type = V4L2_CTRL_TYPE_BOOLEAN,
1501 	.max = 1,
1502 	.def = 1,
1503 	.step = 1,
1504 };
1505 
1506 static const struct v4l2_ctrl_config vivid_ctrl_class = {
1507 	.ops = &vivid_user_gen_ctrl_ops,
1508 	.flags = V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY,
1509 	.id = VIVID_CID_VIVID_CLASS,
1510 	.name = "Vivid Controls",
1511 	.type = V4L2_CTRL_TYPE_CTRL_CLASS,
1512 };
1513 
vivid_create_controls(struct vivid_dev * dev,bool show_ccs_cap,bool show_ccs_out,bool no_error_inj,bool has_sdtv,bool has_hdmi)1514 int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
1515 		bool show_ccs_out, bool no_error_inj,
1516 		bool has_sdtv, bool has_hdmi)
1517 {
1518 	struct v4l2_ctrl_handler *hdl_user_gen = &dev->ctrl_hdl_user_gen;
1519 	struct v4l2_ctrl_handler *hdl_user_vid = &dev->ctrl_hdl_user_vid;
1520 	struct v4l2_ctrl_handler *hdl_user_aud = &dev->ctrl_hdl_user_aud;
1521 	struct v4l2_ctrl_handler *hdl_streaming = &dev->ctrl_hdl_streaming;
1522 	struct v4l2_ctrl_handler *hdl_sdtv_cap = &dev->ctrl_hdl_sdtv_cap;
1523 	struct v4l2_ctrl_handler *hdl_loop_cap = &dev->ctrl_hdl_loop_cap;
1524 	struct v4l2_ctrl_handler *hdl_fb = &dev->ctrl_hdl_fb;
1525 	struct v4l2_ctrl_handler *hdl_vid_cap = &dev->ctrl_hdl_vid_cap;
1526 	struct v4l2_ctrl_handler *hdl_vid_out = &dev->ctrl_hdl_vid_out;
1527 	struct v4l2_ctrl_handler *hdl_vbi_cap = &dev->ctrl_hdl_vbi_cap;
1528 	struct v4l2_ctrl_handler *hdl_vbi_out = &dev->ctrl_hdl_vbi_out;
1529 	struct v4l2_ctrl_handler *hdl_radio_rx = &dev->ctrl_hdl_radio_rx;
1530 	struct v4l2_ctrl_handler *hdl_radio_tx = &dev->ctrl_hdl_radio_tx;
1531 	struct v4l2_ctrl_handler *hdl_sdr_cap = &dev->ctrl_hdl_sdr_cap;
1532 	struct v4l2_ctrl_handler *hdl_meta_cap = &dev->ctrl_hdl_meta_cap;
1533 	struct v4l2_ctrl_handler *hdl_meta_out = &dev->ctrl_hdl_meta_out;
1534 	struct v4l2_ctrl_handler *hdl_tch_cap = &dev->ctrl_hdl_touch_cap;
1535 
1536 	struct v4l2_ctrl_config vivid_ctrl_dv_timings = {
1537 		.ops = &vivid_vid_cap_ctrl_ops,
1538 		.id = VIVID_CID_DV_TIMINGS,
1539 		.name = "DV Timings",
1540 		.type = V4L2_CTRL_TYPE_MENU,
1541 	};
1542 	int i;
1543 
1544 	v4l2_ctrl_handler_init(hdl_user_gen, 10);
1545 	v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_class, NULL);
1546 	v4l2_ctrl_handler_init(hdl_user_vid, 9);
1547 	v4l2_ctrl_new_custom(hdl_user_vid, &vivid_ctrl_class, NULL);
1548 	v4l2_ctrl_handler_init(hdl_user_aud, 2);
1549 	v4l2_ctrl_new_custom(hdl_user_aud, &vivid_ctrl_class, NULL);
1550 	v4l2_ctrl_handler_init(hdl_streaming, 8);
1551 	v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_class, NULL);
1552 	v4l2_ctrl_handler_init(hdl_sdtv_cap, 2);
1553 	v4l2_ctrl_new_custom(hdl_sdtv_cap, &vivid_ctrl_class, NULL);
1554 	v4l2_ctrl_handler_init(hdl_loop_cap, 1);
1555 	v4l2_ctrl_new_custom(hdl_loop_cap, &vivid_ctrl_class, NULL);
1556 	v4l2_ctrl_handler_init(hdl_fb, 1);
1557 	v4l2_ctrl_new_custom(hdl_fb, &vivid_ctrl_class, NULL);
1558 	v4l2_ctrl_handler_init(hdl_vid_cap, 55);
1559 	v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_class, NULL);
1560 	v4l2_ctrl_handler_init(hdl_vid_out, 26);
1561 	if (!no_error_inj || dev->has_fb || dev->num_hdmi_outputs)
1562 		v4l2_ctrl_new_custom(hdl_vid_out, &vivid_ctrl_class, NULL);
1563 	v4l2_ctrl_handler_init(hdl_vbi_cap, 21);
1564 	v4l2_ctrl_new_custom(hdl_vbi_cap, &vivid_ctrl_class, NULL);
1565 	v4l2_ctrl_handler_init(hdl_vbi_out, 19);
1566 	if (!no_error_inj)
1567 		v4l2_ctrl_new_custom(hdl_vbi_out, &vivid_ctrl_class, NULL);
1568 	v4l2_ctrl_handler_init(hdl_radio_rx, 17);
1569 	v4l2_ctrl_new_custom(hdl_radio_rx, &vivid_ctrl_class, NULL);
1570 	v4l2_ctrl_handler_init(hdl_radio_tx, 17);
1571 	v4l2_ctrl_new_custom(hdl_radio_tx, &vivid_ctrl_class, NULL);
1572 	v4l2_ctrl_handler_init(hdl_sdr_cap, 19);
1573 	v4l2_ctrl_new_custom(hdl_sdr_cap, &vivid_ctrl_class, NULL);
1574 	v4l2_ctrl_handler_init(hdl_meta_cap, 2);
1575 	v4l2_ctrl_new_custom(hdl_meta_cap, &vivid_ctrl_class, NULL);
1576 	v4l2_ctrl_handler_init(hdl_meta_out, 2);
1577 	v4l2_ctrl_new_custom(hdl_meta_out, &vivid_ctrl_class, NULL);
1578 	v4l2_ctrl_handler_init(hdl_tch_cap, 2);
1579 	v4l2_ctrl_new_custom(hdl_tch_cap, &vivid_ctrl_class, NULL);
1580 
1581 	/* User Controls */
1582 	dev->volume = v4l2_ctrl_new_std(hdl_user_aud, NULL,
1583 		V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);
1584 	dev->mute = v4l2_ctrl_new_std(hdl_user_aud, NULL,
1585 		V4L2_CID_AUDIO_MUTE, 0, 1, 1, 0);
1586 	if (dev->has_vid_cap) {
1587 		dev->brightness = v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1588 			V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
1589 		for (i = 0; i < MAX_INPUTS; i++)
1590 			dev->input_brightness[i] = 128;
1591 		dev->contrast = v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1592 			V4L2_CID_CONTRAST, 0, 255, 1, 128);
1593 		dev->saturation = v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1594 			V4L2_CID_SATURATION, 0, 255, 1, 128);
1595 		dev->hue = v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1596 			V4L2_CID_HUE, -128, 128, 1, 0);
1597 		v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1598 			V4L2_CID_HFLIP, 0, 1, 1, 0);
1599 		v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1600 			V4L2_CID_VFLIP, 0, 1, 1, 0);
1601 		dev->autogain = v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1602 			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1603 		dev->gain = v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1604 			V4L2_CID_GAIN, 0, 255, 1, 100);
1605 		dev->alpha = v4l2_ctrl_new_std(hdl_user_vid, &vivid_user_vid_ctrl_ops,
1606 			V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 0);
1607 	}
1608 	dev->button = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_button, NULL);
1609 	dev->int32 = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_int32, NULL);
1610 	dev->int64 = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_int64, NULL);
1611 	dev->boolean = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_boolean, NULL);
1612 	dev->menu = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_menu, NULL);
1613 	dev->string = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_string, NULL);
1614 	dev->bitmask = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_bitmask, NULL);
1615 	dev->int_menu = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_int_menu, NULL);
1616 	dev->ro_int32 = v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_ro_int32, NULL);
1617 	v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_area, NULL);
1618 	v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_u32_array, NULL);
1619 	v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_u16_matrix, NULL);
1620 	v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_u8_4d_array, NULL);
1621 
1622 	if (dev->has_vid_cap) {
1623 		/* Image Processing Controls */
1624 		struct v4l2_ctrl_config vivid_ctrl_test_pattern = {
1625 			.ops = &vivid_vid_cap_ctrl_ops,
1626 			.id = VIVID_CID_TEST_PATTERN,
1627 			.name = "Test Pattern",
1628 			.type = V4L2_CTRL_TYPE_MENU,
1629 			.max = TPG_PAT_NOISE,
1630 			.qmenu = tpg_pattern_strings,
1631 		};
1632 
1633 		dev->test_pattern = v4l2_ctrl_new_custom(hdl_vid_cap,
1634 				&vivid_ctrl_test_pattern, NULL);
1635 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_perc_fill, NULL);
1636 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_hor_movement, NULL);
1637 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_vert_movement, NULL);
1638 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_osd_mode, NULL);
1639 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_show_border, NULL);
1640 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_show_square, NULL);
1641 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_hflip, NULL);
1642 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_vflip, NULL);
1643 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_insert_sav, NULL);
1644 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_insert_eav, NULL);
1645 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_reduced_fps, NULL);
1646 		if (show_ccs_cap) {
1647 			dev->ctrl_has_crop_cap = v4l2_ctrl_new_custom(hdl_vid_cap,
1648 				&vivid_ctrl_has_crop_cap, NULL);
1649 			dev->ctrl_has_compose_cap = v4l2_ctrl_new_custom(hdl_vid_cap,
1650 				&vivid_ctrl_has_compose_cap, NULL);
1651 			dev->ctrl_has_scaler_cap = v4l2_ctrl_new_custom(hdl_vid_cap,
1652 				&vivid_ctrl_has_scaler_cap, NULL);
1653 		}
1654 
1655 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_tstamp_src, NULL);
1656 		dev->colorspace = v4l2_ctrl_new_custom(hdl_vid_cap,
1657 			&vivid_ctrl_colorspace, NULL);
1658 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_xfer_func, NULL);
1659 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_ycbcr_enc, NULL);
1660 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_hsv_enc, NULL);
1661 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_quantization, NULL);
1662 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_alpha_mode, NULL);
1663 	}
1664 
1665 	if (dev->has_vid_out && show_ccs_out) {
1666 		dev->ctrl_has_crop_out = v4l2_ctrl_new_custom(hdl_vid_out,
1667 			&vivid_ctrl_has_crop_out, NULL);
1668 		dev->ctrl_has_compose_out = v4l2_ctrl_new_custom(hdl_vid_out,
1669 			&vivid_ctrl_has_compose_out, NULL);
1670 		dev->ctrl_has_scaler_out = v4l2_ctrl_new_custom(hdl_vid_out,
1671 			&vivid_ctrl_has_scaler_out, NULL);
1672 	}
1673 
1674 	/*
1675 	 * Testing this driver with v4l2-compliance will trigger the error
1676 	 * injection controls, and after that nothing will work as expected.
1677 	 * So we have a module option to drop these error injecting controls
1678 	 * allowing us to run v4l2_compliance again.
1679 	 */
1680 	if (!no_error_inj) {
1681 		v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_disconnect, NULL);
1682 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_dqbuf_error, NULL);
1683 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_perc_dropped, NULL);
1684 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_queue_setup_error, NULL);
1685 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_buf_prepare_error, NULL);
1686 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_start_streaming_error, NULL);
1687 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_queue_error, NULL);
1688 #ifdef CONFIG_MEDIA_CONTROLLER
1689 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_req_validate_error, NULL);
1690 #endif
1691 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_seq_wrap, NULL);
1692 		v4l2_ctrl_new_custom(hdl_streaming, &vivid_ctrl_time_wrap, NULL);
1693 	}
1694 
1695 	if (has_sdtv && (dev->has_vid_cap || dev->has_vbi_cap)) {
1696 		if (dev->has_vid_cap)
1697 			v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_std_aspect_ratio, NULL);
1698 		dev->ctrl_std_signal_mode = v4l2_ctrl_new_custom(hdl_sdtv_cap,
1699 			&vivid_ctrl_std_signal_mode, NULL);
1700 		dev->ctrl_standard = v4l2_ctrl_new_custom(hdl_sdtv_cap,
1701 			&vivid_ctrl_standard, NULL);
1702 		if (dev->ctrl_std_signal_mode)
1703 			v4l2_ctrl_cluster(2, &dev->ctrl_std_signal_mode);
1704 		if (dev->has_raw_vbi_cap)
1705 			v4l2_ctrl_new_custom(hdl_vbi_cap, &vivid_ctrl_vbi_cap_interlaced, NULL);
1706 	}
1707 
1708 	if (dev->num_hdmi_inputs) {
1709 		s64 hdmi_input_mask = GENMASK(dev->num_hdmi_inputs - 1, 0);
1710 
1711 		dev->ctrl_dv_timings_signal_mode = v4l2_ctrl_new_custom(hdl_vid_cap,
1712 					&vivid_ctrl_dv_timings_signal_mode, NULL);
1713 
1714 		vivid_ctrl_dv_timings.max = dev->query_dv_timings_size - 1;
1715 		vivid_ctrl_dv_timings.qmenu =
1716 			(const char * const *)dev->query_dv_timings_qmenu;
1717 		dev->ctrl_dv_timings = v4l2_ctrl_new_custom(hdl_vid_cap,
1718 			&vivid_ctrl_dv_timings, NULL);
1719 		if (dev->ctrl_dv_timings_signal_mode)
1720 			v4l2_ctrl_cluster(2, &dev->ctrl_dv_timings_signal_mode);
1721 
1722 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_dv_timings_aspect_ratio, NULL);
1723 		v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_max_edid_blocks, NULL);
1724 		dev->real_rgb_range_cap = v4l2_ctrl_new_custom(hdl_vid_cap,
1725 			&vivid_ctrl_limited_rgb_range, NULL);
1726 		dev->rgb_range_cap = v4l2_ctrl_new_std_menu(hdl_vid_cap,
1727 			&vivid_vid_cap_ctrl_ops,
1728 			V4L2_CID_DV_RX_RGB_RANGE, V4L2_DV_RGB_RANGE_FULL,
1729 			0, V4L2_DV_RGB_RANGE_AUTO);
1730 		dev->ctrl_rx_power_present = v4l2_ctrl_new_std(hdl_vid_cap,
1731 			NULL, V4L2_CID_DV_RX_POWER_PRESENT, 0, hdmi_input_mask,
1732 			0, hdmi_input_mask);
1733 
1734 	}
1735 	if (dev->num_hdmi_outputs) {
1736 		s64 hdmi_output_mask = GENMASK(dev->num_hdmi_outputs - 1, 0);
1737 
1738 		/*
1739 		 * We aren't doing anything with this at the moment, but
1740 		 * HDMI outputs typically have this controls.
1741 		 */
1742 		dev->ctrl_tx_rgb_range = v4l2_ctrl_new_std_menu(hdl_vid_out, NULL,
1743 			V4L2_CID_DV_TX_RGB_RANGE, V4L2_DV_RGB_RANGE_FULL,
1744 			0, V4L2_DV_RGB_RANGE_AUTO);
1745 		dev->ctrl_tx_mode = v4l2_ctrl_new_std_menu(hdl_vid_out, NULL,
1746 			V4L2_CID_DV_TX_MODE, V4L2_DV_TX_MODE_HDMI,
1747 			0, V4L2_DV_TX_MODE_HDMI);
1748 		dev->ctrl_display_present = v4l2_ctrl_new_custom(hdl_vid_out,
1749 			&vivid_ctrl_display_present, NULL);
1750 		dev->ctrl_tx_hotplug = v4l2_ctrl_new_std(hdl_vid_out,
1751 			NULL, V4L2_CID_DV_TX_HOTPLUG, 0, hdmi_output_mask,
1752 			0, hdmi_output_mask);
1753 		dev->ctrl_tx_rxsense = v4l2_ctrl_new_std(hdl_vid_out,
1754 			NULL, V4L2_CID_DV_TX_RXSENSE, 0, hdmi_output_mask,
1755 			0, hdmi_output_mask);
1756 		dev->ctrl_tx_edid_present = v4l2_ctrl_new_std(hdl_vid_out,
1757 			NULL, V4L2_CID_DV_TX_EDID_PRESENT, 0, hdmi_output_mask,
1758 			0, hdmi_output_mask);
1759 	}
1760 	if ((dev->has_vid_cap && dev->has_vid_out) ||
1761 	    (dev->has_vbi_cap && dev->has_vbi_out))
1762 		v4l2_ctrl_new_custom(hdl_loop_cap, &vivid_ctrl_loop_video, NULL);
1763 
1764 	if (dev->has_fb)
1765 		v4l2_ctrl_new_custom(hdl_fb, &vivid_ctrl_clear_fb, NULL);
1766 
1767 	if (dev->has_radio_rx) {
1768 		v4l2_ctrl_new_custom(hdl_radio_rx, &vivid_ctrl_radio_hw_seek_mode, NULL);
1769 		v4l2_ctrl_new_custom(hdl_radio_rx, &vivid_ctrl_radio_hw_seek_prog_lim, NULL);
1770 		v4l2_ctrl_new_custom(hdl_radio_rx, &vivid_ctrl_radio_rx_rds_blockio, NULL);
1771 		v4l2_ctrl_new_custom(hdl_radio_rx, &vivid_ctrl_radio_rx_rds_rbds, NULL);
1772 		v4l2_ctrl_new_std(hdl_radio_rx, &vivid_radio_rx_ctrl_ops,
1773 			V4L2_CID_RDS_RECEPTION, 0, 1, 1, 1);
1774 		dev->radio_rx_rds_pty = v4l2_ctrl_new_std(hdl_radio_rx,
1775 			&vivid_radio_rx_ctrl_ops,
1776 			V4L2_CID_RDS_RX_PTY, 0, 31, 1, 0);
1777 		dev->radio_rx_rds_psname = v4l2_ctrl_new_std(hdl_radio_rx,
1778 			&vivid_radio_rx_ctrl_ops,
1779 			V4L2_CID_RDS_RX_PS_NAME, 0, 8, 8, 0);
1780 		dev->radio_rx_rds_radiotext = v4l2_ctrl_new_std(hdl_radio_rx,
1781 			&vivid_radio_rx_ctrl_ops,
1782 			V4L2_CID_RDS_RX_RADIO_TEXT, 0, 64, 64, 0);
1783 		dev->radio_rx_rds_ta = v4l2_ctrl_new_std(hdl_radio_rx,
1784 			&vivid_radio_rx_ctrl_ops,
1785 			V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT, 0, 1, 1, 0);
1786 		dev->radio_rx_rds_tp = v4l2_ctrl_new_std(hdl_radio_rx,
1787 			&vivid_radio_rx_ctrl_ops,
1788 			V4L2_CID_RDS_RX_TRAFFIC_PROGRAM, 0, 1, 1, 0);
1789 		dev->radio_rx_rds_ms = v4l2_ctrl_new_std(hdl_radio_rx,
1790 			&vivid_radio_rx_ctrl_ops,
1791 			V4L2_CID_RDS_RX_MUSIC_SPEECH, 0, 1, 1, 1);
1792 	}
1793 	if (dev->has_radio_tx) {
1794 		v4l2_ctrl_new_custom(hdl_radio_tx,
1795 			&vivid_ctrl_radio_tx_rds_blockio, NULL);
1796 		dev->radio_tx_rds_pi = v4l2_ctrl_new_std(hdl_radio_tx,
1797 			&vivid_radio_tx_ctrl_ops,
1798 			V4L2_CID_RDS_TX_PI, 0, 0xffff, 1, 0x8088);
1799 		dev->radio_tx_rds_pty = v4l2_ctrl_new_std(hdl_radio_tx,
1800 			&vivid_radio_tx_ctrl_ops,
1801 			V4L2_CID_RDS_TX_PTY, 0, 31, 1, 3);
1802 		dev->radio_tx_rds_psname = v4l2_ctrl_new_std(hdl_radio_tx,
1803 			&vivid_radio_tx_ctrl_ops,
1804 			V4L2_CID_RDS_TX_PS_NAME, 0, 8, 8, 0);
1805 		if (dev->radio_tx_rds_psname)
1806 			v4l2_ctrl_s_ctrl_string(dev->radio_tx_rds_psname, "VIVID-TX");
1807 		dev->radio_tx_rds_radiotext = v4l2_ctrl_new_std(hdl_radio_tx,
1808 			&vivid_radio_tx_ctrl_ops,
1809 			V4L2_CID_RDS_TX_RADIO_TEXT, 0, 64 * 2, 64, 0);
1810 		if (dev->radio_tx_rds_radiotext)
1811 			v4l2_ctrl_s_ctrl_string(dev->radio_tx_rds_radiotext,
1812 			       "This is a VIVID default Radio Text template text, change at will");
1813 		dev->radio_tx_rds_mono_stereo = v4l2_ctrl_new_std(hdl_radio_tx,
1814 			&vivid_radio_tx_ctrl_ops,
1815 			V4L2_CID_RDS_TX_MONO_STEREO, 0, 1, 1, 1);
1816 		dev->radio_tx_rds_art_head = v4l2_ctrl_new_std(hdl_radio_tx,
1817 			&vivid_radio_tx_ctrl_ops,
1818 			V4L2_CID_RDS_TX_ARTIFICIAL_HEAD, 0, 1, 1, 0);
1819 		dev->radio_tx_rds_compressed = v4l2_ctrl_new_std(hdl_radio_tx,
1820 			&vivid_radio_tx_ctrl_ops,
1821 			V4L2_CID_RDS_TX_COMPRESSED, 0, 1, 1, 0);
1822 		dev->radio_tx_rds_dyn_pty = v4l2_ctrl_new_std(hdl_radio_tx,
1823 			&vivid_radio_tx_ctrl_ops,
1824 			V4L2_CID_RDS_TX_DYNAMIC_PTY, 0, 1, 1, 0);
1825 		dev->radio_tx_rds_ta = v4l2_ctrl_new_std(hdl_radio_tx,
1826 			&vivid_radio_tx_ctrl_ops,
1827 			V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT, 0, 1, 1, 0);
1828 		dev->radio_tx_rds_tp = v4l2_ctrl_new_std(hdl_radio_tx,
1829 			&vivid_radio_tx_ctrl_ops,
1830 			V4L2_CID_RDS_TX_TRAFFIC_PROGRAM, 0, 1, 1, 1);
1831 		dev->radio_tx_rds_ms = v4l2_ctrl_new_std(hdl_radio_tx,
1832 			&vivid_radio_tx_ctrl_ops,
1833 			V4L2_CID_RDS_TX_MUSIC_SPEECH, 0, 1, 1, 1);
1834 	}
1835 	if (dev->has_sdr_cap) {
1836 		v4l2_ctrl_new_custom(hdl_sdr_cap,
1837 			&vivid_ctrl_sdr_cap_fm_deviation, NULL);
1838 	}
1839 	if (dev->has_meta_cap) {
1840 		v4l2_ctrl_new_custom(hdl_meta_cap,
1841 				     &vivid_ctrl_meta_has_pts, NULL);
1842 		v4l2_ctrl_new_custom(hdl_meta_cap,
1843 				     &vivid_ctrl_meta_has_src_clk, NULL);
1844 	}
1845 
1846 	if (hdl_user_gen->error)
1847 		return hdl_user_gen->error;
1848 	if (hdl_user_vid->error)
1849 		return hdl_user_vid->error;
1850 	if (hdl_user_aud->error)
1851 		return hdl_user_aud->error;
1852 	if (hdl_streaming->error)
1853 		return hdl_streaming->error;
1854 	if (hdl_sdr_cap->error)
1855 		return hdl_sdr_cap->error;
1856 	if (hdl_loop_cap->error)
1857 		return hdl_loop_cap->error;
1858 
1859 	if (dev->autogain)
1860 		v4l2_ctrl_auto_cluster(2, &dev->autogain, 0, true);
1861 
1862 	if (dev->has_vid_cap) {
1863 		v4l2_ctrl_add_handler(hdl_vid_cap, hdl_user_gen, NULL, false);
1864 		v4l2_ctrl_add_handler(hdl_vid_cap, hdl_user_vid, NULL, false);
1865 		v4l2_ctrl_add_handler(hdl_vid_cap, hdl_user_aud, NULL, false);
1866 		v4l2_ctrl_add_handler(hdl_vid_cap, hdl_streaming, NULL, false);
1867 		v4l2_ctrl_add_handler(hdl_vid_cap, hdl_sdtv_cap, NULL, false);
1868 		v4l2_ctrl_add_handler(hdl_vid_cap, hdl_loop_cap, NULL, false);
1869 		v4l2_ctrl_add_handler(hdl_vid_cap, hdl_fb, NULL, false);
1870 		if (hdl_vid_cap->error)
1871 			return hdl_vid_cap->error;
1872 		dev->vid_cap_dev.ctrl_handler = hdl_vid_cap;
1873 	}
1874 	if (dev->has_vid_out) {
1875 		v4l2_ctrl_add_handler(hdl_vid_out, hdl_user_gen, NULL, false);
1876 		v4l2_ctrl_add_handler(hdl_vid_out, hdl_user_aud, NULL, false);
1877 		v4l2_ctrl_add_handler(hdl_vid_out, hdl_streaming, NULL, false);
1878 		v4l2_ctrl_add_handler(hdl_vid_out, hdl_fb, NULL, false);
1879 		if (hdl_vid_out->error)
1880 			return hdl_vid_out->error;
1881 		dev->vid_out_dev.ctrl_handler = hdl_vid_out;
1882 	}
1883 	if (dev->has_vbi_cap) {
1884 		v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_user_gen, NULL, false);
1885 		v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_streaming, NULL, false);
1886 		v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_sdtv_cap, NULL, false);
1887 		v4l2_ctrl_add_handler(hdl_vbi_cap, hdl_loop_cap, NULL, false);
1888 		if (hdl_vbi_cap->error)
1889 			return hdl_vbi_cap->error;
1890 		dev->vbi_cap_dev.ctrl_handler = hdl_vbi_cap;
1891 	}
1892 	if (dev->has_vbi_out) {
1893 		v4l2_ctrl_add_handler(hdl_vbi_out, hdl_user_gen, NULL, false);
1894 		v4l2_ctrl_add_handler(hdl_vbi_out, hdl_streaming, NULL, false);
1895 		if (hdl_vbi_out->error)
1896 			return hdl_vbi_out->error;
1897 		dev->vbi_out_dev.ctrl_handler = hdl_vbi_out;
1898 	}
1899 	if (dev->has_radio_rx) {
1900 		v4l2_ctrl_add_handler(hdl_radio_rx, hdl_user_gen, NULL, false);
1901 		v4l2_ctrl_add_handler(hdl_radio_rx, hdl_user_aud, NULL, false);
1902 		if (hdl_radio_rx->error)
1903 			return hdl_radio_rx->error;
1904 		dev->radio_rx_dev.ctrl_handler = hdl_radio_rx;
1905 	}
1906 	if (dev->has_radio_tx) {
1907 		v4l2_ctrl_add_handler(hdl_radio_tx, hdl_user_gen, NULL, false);
1908 		v4l2_ctrl_add_handler(hdl_radio_tx, hdl_user_aud, NULL, false);
1909 		if (hdl_radio_tx->error)
1910 			return hdl_radio_tx->error;
1911 		dev->radio_tx_dev.ctrl_handler = hdl_radio_tx;
1912 	}
1913 	if (dev->has_sdr_cap) {
1914 		v4l2_ctrl_add_handler(hdl_sdr_cap, hdl_user_gen, NULL, false);
1915 		v4l2_ctrl_add_handler(hdl_sdr_cap, hdl_streaming, NULL, false);
1916 		if (hdl_sdr_cap->error)
1917 			return hdl_sdr_cap->error;
1918 		dev->sdr_cap_dev.ctrl_handler = hdl_sdr_cap;
1919 	}
1920 	if (dev->has_meta_cap) {
1921 		v4l2_ctrl_add_handler(hdl_meta_cap, hdl_user_gen, NULL, false);
1922 		v4l2_ctrl_add_handler(hdl_meta_cap, hdl_streaming, NULL, false);
1923 		if (hdl_meta_cap->error)
1924 			return hdl_meta_cap->error;
1925 		dev->meta_cap_dev.ctrl_handler = hdl_meta_cap;
1926 	}
1927 	if (dev->has_meta_out) {
1928 		v4l2_ctrl_add_handler(hdl_meta_out, hdl_user_gen, NULL, false);
1929 		v4l2_ctrl_add_handler(hdl_meta_out, hdl_streaming, NULL, false);
1930 		if (hdl_meta_out->error)
1931 			return hdl_meta_out->error;
1932 		dev->meta_out_dev.ctrl_handler = hdl_meta_out;
1933 	}
1934 	if (dev->has_touch_cap) {
1935 		v4l2_ctrl_add_handler(hdl_tch_cap, hdl_user_gen, NULL, false);
1936 		v4l2_ctrl_add_handler(hdl_tch_cap, hdl_streaming, NULL, false);
1937 		if (hdl_tch_cap->error)
1938 			return hdl_tch_cap->error;
1939 		dev->touch_cap_dev.ctrl_handler = hdl_tch_cap;
1940 	}
1941 	return 0;
1942 }
1943 
vivid_free_controls(struct vivid_dev * dev)1944 void vivid_free_controls(struct vivid_dev *dev)
1945 {
1946 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_vid_cap);
1947 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_vid_out);
1948 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_vbi_cap);
1949 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_vbi_out);
1950 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_radio_rx);
1951 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_radio_tx);
1952 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_sdr_cap);
1953 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_user_gen);
1954 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_user_vid);
1955 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_user_aud);
1956 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_streaming);
1957 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_sdtv_cap);
1958 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_loop_cap);
1959 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_fb);
1960 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_meta_cap);
1961 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_meta_out);
1962 	v4l2_ctrl_handler_free(&dev->ctrl_hdl_touch_cap);
1963 }
1964