linux/drivers/media/test-drivers/vivid/vivid-ctrls.c
<<
>>
Prefs
   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
 103static 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
 126static const struct v4l2_ctrl_ops vivid_user_gen_ctrl_ops = {
 127        .s_ctrl = vivid_user_gen_s_ctrl,
 128};
 129
 130static 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
 137static 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
 148static 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
 158static 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
 168static 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
 180static 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
 192static 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
 204static 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
 214static 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
 226static 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
 236static 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
 247static const s64 vivid_ctrl_int_menu_values[] = {
 248        1, 1, 2, 3, 5, 8, 13, 21, 42,
 249};
 250
 251static 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
 263static 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
 270static const struct v4l2_area area = {
 271        .width = 1000,
 272        .height = 2000,
 273};
 274
 275static 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
 285static 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
 298static const struct v4l2_ctrl_ops vivid_fb_ctrl_ops = {
 299        .s_ctrl = vivid_fb_s_ctrl,
 300};
 301
 302static 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
 312static 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
 324static 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
 357static 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
 365static 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
 531static const struct v4l2_ctrl_ops vivid_vid_cap_ctrl_ops = {
 532        .s_ctrl = vivid_vid_cap_s_ctrl,
 533};
 534
 535static 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
 546static 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
 556static 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
 567static 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
 577static 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
 586static 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
 595static const char * const vivid_ctrl_osd_mode_strings[] = {
 596        "All",
 597        "Counters Only",
 598        "None",
 599        NULL,
 600};
 601
 602static 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
 611static 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
 622static 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
 631static 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
 640static 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
 649static 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
 658static 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
 667static 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
 677static 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
 687static 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
 697static const char * const vivid_ctrl_tstamp_src_strings[] = {
 698        "End of Frame",
 699        "Start of Exposure",
 700        NULL,
 701};
 702
 703static 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
 712static 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
 723static 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
 734static 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
 743static 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
 752static 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
 763static 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
 776static 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
 786static 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
 798static 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
 807static 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
 820static 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
 830static const char * const vivid_ctrl_hsv_enc_strings[] = {
 831        "Hue 0-179",
 832        "Hue 0-256",
 833        NULL,
 834};
 835
 836static 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
 845static const char * const vivid_ctrl_quantization_strings[] = {
 846        "Default",
 847        "Full Range",
 848        "Limited Range",
 849        NULL,
 850};
 851
 852static 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
 861static 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
 870static 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
 882static 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
 897static const struct v4l2_ctrl_ops vivid_loop_cap_ctrl_ops = {
 898        .s_ctrl = vivid_loop_cap_s_ctrl,
 899};
 900
 901static 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
 913static 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
 925static const struct v4l2_ctrl_ops vivid_vbi_cap_ctrl_ops = {
 926        .s_ctrl = vivid_vbi_cap_s_ctrl,
 927};
 928
 929static 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
 941static 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
1015static const struct v4l2_ctrl_ops vivid_vid_out_ctrl_ops = {
1016        .s_ctrl = vivid_vid_out_s_ctrl,
1017};
1018
1019static 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
1029static 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
1039static 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
1049static 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
1061static 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
1121static const struct v4l2_ctrl_ops vivid_streaming_ctrl_ops = {
1122        .s_ctrl = vivid_streaming_s_ctrl,
1123};
1124
1125static 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
1132static 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
1142static 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
1149static 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
1156static 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
1163static 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
1171static 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
1179static 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
1188static 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
1200static 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
1222static const struct v4l2_ctrl_ops vivid_sdtv_cap_ctrl_ops = {
1223        .s_ctrl = vivid_sdtv_cap_s_ctrl,
1224};
1225
1226static 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
1236static 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
1246static 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
1259static 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
1301static const struct v4l2_ctrl_ops vivid_radio_rx_ctrl_ops = {
1302        .s_ctrl = vivid_radio_rx_s_ctrl,
1303};
1304
1305static const char * const vivid_ctrl_radio_rds_mode_strings[] = {
1306        "Block I/O",
1307        "Controls",
1308        NULL,
1309};
1310
1311static 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
1320static 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
1329static const char * const vivid_ctrl_radio_hw_seek_mode_strings[] = {
1330        "Bounded",
1331        "Wrap Around",
1332        "Both",
1333        NULL,
1334};
1335
1336static 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
1345static 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
1357static 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
1397static const struct v4l2_ctrl_ops vivid_radio_tx_ctrl_ops = {
1398        .s_ctrl = vivid_radio_tx_s_ctrl,
1399};
1400
1401static 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
1414static 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
1426static const struct v4l2_ctrl_ops vivid_sdr_cap_ctrl_ops = {
1427        .s_ctrl = vivid_sdr_cap_s_ctrl,
1428};
1429
1430static 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
1443static 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
1459static const struct v4l2_ctrl_ops vivid_meta_cap_ctrl_ops = {
1460        .s_ctrl = vivid_meta_cap_s_ctrl,
1461};
1462
1463static 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
1473static 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
1483static 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
1491int 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
1920void 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}
1940