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