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