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