linux/drivers/media/v4l2-core/v4l2-ctrls.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3    V4L2 controls framework implementation.
   4
   5    Copyright (C) 2010  Hans Verkuil <hverkuil@xs4all.nl>
   6
   7 */
   8
   9#include <linux/ctype.h>
  10#include <linux/mm.h>
  11#include <linux/slab.h>
  12#include <linux/export.h>
  13#include <media/v4l2-ioctl.h>
  14#include <media/v4l2-device.h>
  15#include <media/v4l2-ctrls.h>
  16#include <media/v4l2-event.h>
  17#include <media/v4l2-dev.h>
  18
  19#define has_op(master, op) \
  20        (master->ops && master->ops->op)
  21#define call_op(master, op) \
  22        (has_op(master, op) ? master->ops->op(master) : 0)
  23
  24/* Internal temporary helper struct, one for each v4l2_ext_control */
  25struct v4l2_ctrl_helper {
  26        /* Pointer to the control reference of the master control */
  27        struct v4l2_ctrl_ref *mref;
  28        /* The control ref corresponding to the v4l2_ext_control ID field. */
  29        struct v4l2_ctrl_ref *ref;
  30        /* v4l2_ext_control index of the next control belonging to the
  31           same cluster, or 0 if there isn't any. */
  32        u32 next;
  33};
  34
  35/* Small helper function to determine if the autocluster is set to manual
  36   mode. */
  37static bool is_cur_manual(const struct v4l2_ctrl *master)
  38{
  39        return master->is_auto && master->cur.val == master->manual_mode_value;
  40}
  41
  42/* Same as above, but this checks the against the new value instead of the
  43   current value. */
  44static bool is_new_manual(const struct v4l2_ctrl *master)
  45{
  46        return master->is_auto && master->val == master->manual_mode_value;
  47}
  48
  49/* Returns NULL or a character pointer array containing the menu for
  50   the given control ID. The pointer array ends with a NULL pointer.
  51   An empty string signifies a menu entry that is invalid. This allows
  52   drivers to disable certain options if it is not supported. */
  53const char * const *v4l2_ctrl_get_menu(u32 id)
  54{
  55        static const char * const mpeg_audio_sampling_freq[] = {
  56                "44.1 kHz",
  57                "48 kHz",
  58                "32 kHz",
  59                NULL
  60        };
  61        static const char * const mpeg_audio_encoding[] = {
  62                "MPEG-1/2 Layer I",
  63                "MPEG-1/2 Layer II",
  64                "MPEG-1/2 Layer III",
  65                "MPEG-2/4 AAC",
  66                "AC-3",
  67                NULL
  68        };
  69        static const char * const mpeg_audio_l1_bitrate[] = {
  70                "32 kbps",
  71                "64 kbps",
  72                "96 kbps",
  73                "128 kbps",
  74                "160 kbps",
  75                "192 kbps",
  76                "224 kbps",
  77                "256 kbps",
  78                "288 kbps",
  79                "320 kbps",
  80                "352 kbps",
  81                "384 kbps",
  82                "416 kbps",
  83                "448 kbps",
  84                NULL
  85        };
  86        static const char * const mpeg_audio_l2_bitrate[] = {
  87                "32 kbps",
  88                "48 kbps",
  89                "56 kbps",
  90                "64 kbps",
  91                "80 kbps",
  92                "96 kbps",
  93                "112 kbps",
  94                "128 kbps",
  95                "160 kbps",
  96                "192 kbps",
  97                "224 kbps",
  98                "256 kbps",
  99                "320 kbps",
 100                "384 kbps",
 101                NULL
 102        };
 103        static const char * const mpeg_audio_l3_bitrate[] = {
 104                "32 kbps",
 105                "40 kbps",
 106                "48 kbps",
 107                "56 kbps",
 108                "64 kbps",
 109                "80 kbps",
 110                "96 kbps",
 111                "112 kbps",
 112                "128 kbps",
 113                "160 kbps",
 114                "192 kbps",
 115                "224 kbps",
 116                "256 kbps",
 117                "320 kbps",
 118                NULL
 119        };
 120        static const char * const mpeg_audio_ac3_bitrate[] = {
 121                "32 kbps",
 122                "40 kbps",
 123                "48 kbps",
 124                "56 kbps",
 125                "64 kbps",
 126                "80 kbps",
 127                "96 kbps",
 128                "112 kbps",
 129                "128 kbps",
 130                "160 kbps",
 131                "192 kbps",
 132                "224 kbps",
 133                "256 kbps",
 134                "320 kbps",
 135                "384 kbps",
 136                "448 kbps",
 137                "512 kbps",
 138                "576 kbps",
 139                "640 kbps",
 140                NULL
 141        };
 142        static const char * const mpeg_audio_mode[] = {
 143                "Stereo",
 144                "Joint Stereo",
 145                "Dual",
 146                "Mono",
 147                NULL
 148        };
 149        static const char * const mpeg_audio_mode_extension[] = {
 150                "Bound 4",
 151                "Bound 8",
 152                "Bound 12",
 153                "Bound 16",
 154                NULL
 155        };
 156        static const char * const mpeg_audio_emphasis[] = {
 157                "No Emphasis",
 158                "50/15 us",
 159                "CCITT J17",
 160                NULL
 161        };
 162        static const char * const mpeg_audio_crc[] = {
 163                "No CRC",
 164                "16-bit CRC",
 165                NULL
 166        };
 167        static const char * const mpeg_audio_dec_playback[] = {
 168                "Auto",
 169                "Stereo",
 170                "Left",
 171                "Right",
 172                "Mono",
 173                "Swapped Stereo",
 174                NULL
 175        };
 176        static const char * const mpeg_video_encoding[] = {
 177                "MPEG-1",
 178                "MPEG-2",
 179                "MPEG-4 AVC",
 180                NULL
 181        };
 182        static const char * const mpeg_video_aspect[] = {
 183                "1x1",
 184                "4x3",
 185                "16x9",
 186                "2.21x1",
 187                NULL
 188        };
 189        static const char * const mpeg_video_bitrate_mode[] = {
 190                "Variable Bitrate",
 191                "Constant Bitrate",
 192                NULL
 193        };
 194        static const char * const mpeg_stream_type[] = {
 195                "MPEG-2 Program Stream",
 196                "MPEG-2 Transport Stream",
 197                "MPEG-1 System Stream",
 198                "MPEG-2 DVD-compatible Stream",
 199                "MPEG-1 VCD-compatible Stream",
 200                "MPEG-2 SVCD-compatible Stream",
 201                NULL
 202        };
 203        static const char * const mpeg_stream_vbi_fmt[] = {
 204                "No VBI",
 205                "Private Packet, IVTV Format",
 206                NULL
 207        };
 208        static const char * const camera_power_line_frequency[] = {
 209                "Disabled",
 210                "50 Hz",
 211                "60 Hz",
 212                "Auto",
 213                NULL
 214        };
 215        static const char * const camera_exposure_auto[] = {
 216                "Auto Mode",
 217                "Manual Mode",
 218                "Shutter Priority Mode",
 219                "Aperture Priority Mode",
 220                NULL
 221        };
 222        static const char * const camera_exposure_metering[] = {
 223                "Average",
 224                "Center Weighted",
 225                "Spot",
 226                "Matrix",
 227                NULL
 228        };
 229        static const char * const camera_auto_focus_range[] = {
 230                "Auto",
 231                "Normal",
 232                "Macro",
 233                "Infinity",
 234                NULL
 235        };
 236        static const char * const colorfx[] = {
 237                "None",
 238                "Black & White",
 239                "Sepia",
 240                "Negative",
 241                "Emboss",
 242                "Sketch",
 243                "Sky Blue",
 244                "Grass Green",
 245                "Skin Whiten",
 246                "Vivid",
 247                "Aqua",
 248                "Art Freeze",
 249                "Silhouette",
 250                "Solarization",
 251                "Antique",
 252                "Set Cb/Cr",
 253                NULL
 254        };
 255        static const char * const auto_n_preset_white_balance[] = {
 256                "Manual",
 257                "Auto",
 258                "Incandescent",
 259                "Fluorescent",
 260                "Fluorescent H",
 261                "Horizon",
 262                "Daylight",
 263                "Flash",
 264                "Cloudy",
 265                "Shade",
 266                NULL,
 267        };
 268        static const char * const camera_iso_sensitivity_auto[] = {
 269                "Manual",
 270                "Auto",
 271                NULL
 272        };
 273        static const char * const scene_mode[] = {
 274                "None",
 275                "Backlight",
 276                "Beach/Snow",
 277                "Candle Light",
 278                "Dusk/Dawn",
 279                "Fall Colors",
 280                "Fireworks",
 281                "Landscape",
 282                "Night",
 283                "Party/Indoor",
 284                "Portrait",
 285                "Sports",
 286                "Sunset",
 287                "Text",
 288                NULL
 289        };
 290        static const char * const tune_emphasis[] = {
 291                "None",
 292                "50 Microseconds",
 293                "75 Microseconds",
 294                NULL,
 295        };
 296        static const char * const header_mode[] = {
 297                "Separate Buffer",
 298                "Joined With 1st Frame",
 299                NULL,
 300        };
 301        static const char * const multi_slice[] = {
 302                "Single",
 303                "Max Macroblocks",
 304                "Max Bytes",
 305                NULL,
 306        };
 307        static const char * const entropy_mode[] = {
 308                "CAVLC",
 309                "CABAC",
 310                NULL,
 311        };
 312        static const char * const mpeg_h264_level[] = {
 313                "1",
 314                "1b",
 315                "1.1",
 316                "1.2",
 317                "1.3",
 318                "2",
 319                "2.1",
 320                "2.2",
 321                "3",
 322                "3.1",
 323                "3.2",
 324                "4",
 325                "4.1",
 326                "4.2",
 327                "5",
 328                "5.1",
 329                NULL,
 330        };
 331        static const char * const h264_loop_filter[] = {
 332                "Enabled",
 333                "Disabled",
 334                "Disabled at Slice Boundary",
 335                NULL,
 336        };
 337        static const char * const h264_profile[] = {
 338                "Baseline",
 339                "Constrained Baseline",
 340                "Main",
 341                "Extended",
 342                "High",
 343                "High 10",
 344                "High 422",
 345                "High 444 Predictive",
 346                "High 10 Intra",
 347                "High 422 Intra",
 348                "High 444 Intra",
 349                "CAVLC 444 Intra",
 350                "Scalable Baseline",
 351                "Scalable High",
 352                "Scalable High Intra",
 353                "Stereo High",
 354                "Multiview High",
 355                NULL,
 356        };
 357        static const char * const vui_sar_idc[] = {
 358                "Unspecified",
 359                "1:1",
 360                "12:11",
 361                "10:11",
 362                "16:11",
 363                "40:33",
 364                "24:11",
 365                "20:11",
 366                "32:11",
 367                "80:33",
 368                "18:11",
 369                "15:11",
 370                "64:33",
 371                "160:99",
 372                "4:3",
 373                "3:2",
 374                "2:1",
 375                "Extended SAR",
 376                NULL,
 377        };
 378        static const char * const h264_fp_arrangement_type[] = {
 379                "Checkerboard",
 380                "Column",
 381                "Row",
 382                "Side by Side",
 383                "Top Bottom",
 384                "Temporal",
 385                NULL,
 386        };
 387        static const char * const h264_fmo_map_type[] = {
 388                "Interleaved Slices",
 389                "Scattered Slices",
 390                "Foreground with Leftover",
 391                "Box Out",
 392                "Raster Scan",
 393                "Wipe Scan",
 394                "Explicit",
 395                NULL,
 396        };
 397        static const char * const mpeg_mpeg2_level[] = {
 398                "Low",
 399                "Main",
 400                "High 1440",
 401                "High",
 402                NULL,
 403        };
 404        static const char * const mpeg2_profile[] = {
 405                "Simple",
 406                "Main",
 407                "SNR Scalable",
 408                "Spatially Scalable",
 409                "High",
 410                NULL,
 411        };
 412        static const char * const mpeg_mpeg4_level[] = {
 413                "0",
 414                "0b",
 415                "1",
 416                "2",
 417                "3",
 418                "3b",
 419                "4",
 420                "5",
 421                NULL,
 422        };
 423        static const char * const mpeg4_profile[] = {
 424                "Simple",
 425                "Advanced Simple",
 426                "Core",
 427                "Simple Scalable",
 428                "Advanced Coding Efficiency",
 429                NULL,
 430        };
 431
 432        static const char * const vpx_golden_frame_sel[] = {
 433                "Use Previous Frame",
 434                "Use Previous Specific Frame",
 435                NULL,
 436        };
 437        static const char * const vp8_profile[] = {
 438                "0",
 439                "1",
 440                "2",
 441                "3",
 442                NULL,
 443        };
 444        static const char * const vp9_profile[] = {
 445                "0",
 446                "1",
 447                "2",
 448                "3",
 449                NULL,
 450        };
 451
 452        static const char * const flash_led_mode[] = {
 453                "Off",
 454                "Flash",
 455                "Torch",
 456                NULL,
 457        };
 458        static const char * const flash_strobe_source[] = {
 459                "Software",
 460                "External",
 461                NULL,
 462        };
 463
 464        static const char * const jpeg_chroma_subsampling[] = {
 465                "4:4:4",
 466                "4:2:2",
 467                "4:2:0",
 468                "4:1:1",
 469                "4:1:0",
 470                "Gray",
 471                NULL,
 472        };
 473        static const char * const dv_tx_mode[] = {
 474                "DVI-D",
 475                "HDMI",
 476                NULL,
 477        };
 478        static const char * const dv_rgb_range[] = {
 479                "Automatic",
 480                "RGB Limited Range (16-235)",
 481                "RGB Full Range (0-255)",
 482                NULL,
 483        };
 484        static const char * const dv_it_content_type[] = {
 485                "Graphics",
 486                "Photo",
 487                "Cinema",
 488                "Game",
 489                "No IT Content",
 490                NULL,
 491        };
 492        static const char * const detect_md_mode[] = {
 493                "Disabled",
 494                "Global",
 495                "Threshold Grid",
 496                "Region Grid",
 497                NULL,
 498        };
 499
 500        static const char * const hevc_profile[] = {
 501                "Main",
 502                "Main Still Picture",
 503                "Main 10",
 504                NULL,
 505        };
 506        static const char * const hevc_level[] = {
 507                "1",
 508                "2",
 509                "2.1",
 510                "3",
 511                "3.1",
 512                "4",
 513                "4.1",
 514                "5",
 515                "5.1",
 516                "5.2",
 517                "6",
 518                "6.1",
 519                "6.2",
 520                NULL,
 521        };
 522        static const char * const hevc_hierarchial_coding_type[] = {
 523                "B",
 524                "P",
 525                NULL,
 526        };
 527        static const char * const hevc_refresh_type[] = {
 528                "None",
 529                "CRA",
 530                "IDR",
 531                NULL,
 532        };
 533        static const char * const hevc_size_of_length_field[] = {
 534                "0",
 535                "1",
 536                "2",
 537                "4",
 538                NULL,
 539        };
 540        static const char * const hevc_tier[] = {
 541                "Main",
 542                "High",
 543                NULL,
 544        };
 545        static const char * const hevc_loop_filter_mode[] = {
 546                "Disabled",
 547                "Enabled",
 548                "Disabled at slice boundary",
 549                "NULL",
 550        };
 551
 552        switch (id) {
 553        case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
 554                return mpeg_audio_sampling_freq;
 555        case V4L2_CID_MPEG_AUDIO_ENCODING:
 556                return mpeg_audio_encoding;
 557        case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
 558                return mpeg_audio_l1_bitrate;
 559        case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
 560                return mpeg_audio_l2_bitrate;
 561        case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
 562                return mpeg_audio_l3_bitrate;
 563        case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
 564                return mpeg_audio_ac3_bitrate;
 565        case V4L2_CID_MPEG_AUDIO_MODE:
 566                return mpeg_audio_mode;
 567        case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
 568                return mpeg_audio_mode_extension;
 569        case V4L2_CID_MPEG_AUDIO_EMPHASIS:
 570                return mpeg_audio_emphasis;
 571        case V4L2_CID_MPEG_AUDIO_CRC:
 572                return mpeg_audio_crc;
 573        case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
 574        case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
 575                return mpeg_audio_dec_playback;
 576        case V4L2_CID_MPEG_VIDEO_ENCODING:
 577                return mpeg_video_encoding;
 578        case V4L2_CID_MPEG_VIDEO_ASPECT:
 579                return mpeg_video_aspect;
 580        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
 581                return mpeg_video_bitrate_mode;
 582        case V4L2_CID_MPEG_STREAM_TYPE:
 583                return mpeg_stream_type;
 584        case V4L2_CID_MPEG_STREAM_VBI_FMT:
 585                return mpeg_stream_vbi_fmt;
 586        case V4L2_CID_POWER_LINE_FREQUENCY:
 587                return camera_power_line_frequency;
 588        case V4L2_CID_EXPOSURE_AUTO:
 589                return camera_exposure_auto;
 590        case V4L2_CID_EXPOSURE_METERING:
 591                return camera_exposure_metering;
 592        case V4L2_CID_AUTO_FOCUS_RANGE:
 593                return camera_auto_focus_range;
 594        case V4L2_CID_COLORFX:
 595                return colorfx;
 596        case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
 597                return auto_n_preset_white_balance;
 598        case V4L2_CID_ISO_SENSITIVITY_AUTO:
 599                return camera_iso_sensitivity_auto;
 600        case V4L2_CID_SCENE_MODE:
 601                return scene_mode;
 602        case V4L2_CID_TUNE_PREEMPHASIS:
 603                return tune_emphasis;
 604        case V4L2_CID_TUNE_DEEMPHASIS:
 605                return tune_emphasis;
 606        case V4L2_CID_FLASH_LED_MODE:
 607                return flash_led_mode;
 608        case V4L2_CID_FLASH_STROBE_SOURCE:
 609                return flash_strobe_source;
 610        case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
 611                return header_mode;
 612        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
 613                return multi_slice;
 614        case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
 615                return entropy_mode;
 616        case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
 617                return mpeg_h264_level;
 618        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
 619                return h264_loop_filter;
 620        case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
 621                return h264_profile;
 622        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
 623                return vui_sar_idc;
 624        case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:
 625                return h264_fp_arrangement_type;
 626        case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
 627                return h264_fmo_map_type;
 628        case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:
 629                return mpeg_mpeg2_level;
 630        case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:
 631                return mpeg2_profile;
 632        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
 633                return mpeg_mpeg4_level;
 634        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
 635                return mpeg4_profile;
 636        case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:
 637                return vpx_golden_frame_sel;
 638        case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
 639                return vp8_profile;
 640        case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
 641                return vp9_profile;
 642        case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
 643                return jpeg_chroma_subsampling;
 644        case V4L2_CID_DV_TX_MODE:
 645                return dv_tx_mode;
 646        case V4L2_CID_DV_TX_RGB_RANGE:
 647        case V4L2_CID_DV_RX_RGB_RANGE:
 648                return dv_rgb_range;
 649        case V4L2_CID_DV_TX_IT_CONTENT_TYPE:
 650        case V4L2_CID_DV_RX_IT_CONTENT_TYPE:
 651                return dv_it_content_type;
 652        case V4L2_CID_DETECT_MD_MODE:
 653                return detect_md_mode;
 654        case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
 655                return hevc_profile;
 656        case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
 657                return hevc_level;
 658        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
 659                return hevc_hierarchial_coding_type;
 660        case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE:
 661                return hevc_refresh_type;
 662        case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
 663                return hevc_size_of_length_field;
 664        case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
 665                return hevc_tier;
 666        case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
 667                return hevc_loop_filter_mode;
 668
 669        default:
 670                return NULL;
 671        }
 672}
 673EXPORT_SYMBOL(v4l2_ctrl_get_menu);
 674
 675#define __v4l2_qmenu_int_len(arr, len) ({ *(len) = ARRAY_SIZE(arr); arr; })
 676/*
 677 * Returns NULL or an s64 type array containing the menu for given
 678 * control ID. The total number of the menu items is returned in @len.
 679 */
 680const s64 *v4l2_ctrl_get_int_menu(u32 id, u32 *len)
 681{
 682        static const s64 qmenu_int_vpx_num_partitions[] = {
 683                1, 2, 4, 8,
 684        };
 685
 686        static const s64 qmenu_int_vpx_num_ref_frames[] = {
 687                1, 2, 3,
 688        };
 689
 690        switch (id) {
 691        case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:
 692                return __v4l2_qmenu_int_len(qmenu_int_vpx_num_partitions, len);
 693        case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:
 694                return __v4l2_qmenu_int_len(qmenu_int_vpx_num_ref_frames, len);
 695        default:
 696                *len = 0;
 697                return NULL;
 698        }
 699}
 700EXPORT_SYMBOL(v4l2_ctrl_get_int_menu);
 701
 702/* Return the control name. */
 703const char *v4l2_ctrl_get_name(u32 id)
 704{
 705        switch (id) {
 706        /* USER controls */
 707        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
 708        case V4L2_CID_USER_CLASS:               return "User Controls";
 709        case V4L2_CID_BRIGHTNESS:               return "Brightness";
 710        case V4L2_CID_CONTRAST:                 return "Contrast";
 711        case V4L2_CID_SATURATION:               return "Saturation";
 712        case V4L2_CID_HUE:                      return "Hue";
 713        case V4L2_CID_AUDIO_VOLUME:             return "Volume";
 714        case V4L2_CID_AUDIO_BALANCE:            return "Balance";
 715        case V4L2_CID_AUDIO_BASS:               return "Bass";
 716        case V4L2_CID_AUDIO_TREBLE:             return "Treble";
 717        case V4L2_CID_AUDIO_MUTE:               return "Mute";
 718        case V4L2_CID_AUDIO_LOUDNESS:           return "Loudness";
 719        case V4L2_CID_BLACK_LEVEL:              return "Black Level";
 720        case V4L2_CID_AUTO_WHITE_BALANCE:       return "White Balance, Automatic";
 721        case V4L2_CID_DO_WHITE_BALANCE:         return "Do White Balance";
 722        case V4L2_CID_RED_BALANCE:              return "Red Balance";
 723        case V4L2_CID_BLUE_BALANCE:             return "Blue Balance";
 724        case V4L2_CID_GAMMA:                    return "Gamma";
 725        case V4L2_CID_EXPOSURE:                 return "Exposure";
 726        case V4L2_CID_AUTOGAIN:                 return "Gain, Automatic";
 727        case V4L2_CID_GAIN:                     return "Gain";
 728        case V4L2_CID_HFLIP:                    return "Horizontal Flip";
 729        case V4L2_CID_VFLIP:                    return "Vertical Flip";
 730        case V4L2_CID_POWER_LINE_FREQUENCY:     return "Power Line Frequency";
 731        case V4L2_CID_HUE_AUTO:                 return "Hue, Automatic";
 732        case V4L2_CID_WHITE_BALANCE_TEMPERATURE: return "White Balance Temperature";
 733        case V4L2_CID_SHARPNESS:                return "Sharpness";
 734        case V4L2_CID_BACKLIGHT_COMPENSATION:   return "Backlight Compensation";
 735        case V4L2_CID_CHROMA_AGC:               return "Chroma AGC";
 736        case V4L2_CID_COLOR_KILLER:             return "Color Killer";
 737        case V4L2_CID_COLORFX:                  return "Color Effects";
 738        case V4L2_CID_AUTOBRIGHTNESS:           return "Brightness, Automatic";
 739        case V4L2_CID_BAND_STOP_FILTER:         return "Band-Stop Filter";
 740        case V4L2_CID_ROTATE:                   return "Rotate";
 741        case V4L2_CID_BG_COLOR:                 return "Background Color";
 742        case V4L2_CID_CHROMA_GAIN:              return "Chroma Gain";
 743        case V4L2_CID_ILLUMINATORS_1:           return "Illuminator 1";
 744        case V4L2_CID_ILLUMINATORS_2:           return "Illuminator 2";
 745        case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:  return "Min Number of Capture Buffers";
 746        case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:   return "Min Number of Output Buffers";
 747        case V4L2_CID_ALPHA_COMPONENT:          return "Alpha Component";
 748        case V4L2_CID_COLORFX_CBCR:             return "Color Effects, CbCr";
 749
 750        /* Codec controls */
 751        /* The MPEG controls are applicable to all codec controls
 752         * and the 'MPEG' part of the define is historical */
 753        /* Keep the order of the 'case's the same as in videodev2.h! */
 754        case V4L2_CID_MPEG_CLASS:               return "Codec Controls";
 755        case V4L2_CID_MPEG_STREAM_TYPE:         return "Stream Type";
 756        case V4L2_CID_MPEG_STREAM_PID_PMT:      return "Stream PMT Program ID";
 757        case V4L2_CID_MPEG_STREAM_PID_AUDIO:    return "Stream Audio Program ID";
 758        case V4L2_CID_MPEG_STREAM_PID_VIDEO:    return "Stream Video Program ID";
 759        case V4L2_CID_MPEG_STREAM_PID_PCR:      return "Stream PCR Program ID";
 760        case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: return "Stream PES Audio ID";
 761        case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: return "Stream PES Video ID";
 762        case V4L2_CID_MPEG_STREAM_VBI_FMT:      return "Stream VBI Format";
 763        case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: return "Audio Sampling Frequency";
 764        case V4L2_CID_MPEG_AUDIO_ENCODING:      return "Audio Encoding";
 765        case V4L2_CID_MPEG_AUDIO_L1_BITRATE:    return "Audio Layer I Bitrate";
 766        case V4L2_CID_MPEG_AUDIO_L2_BITRATE:    return "Audio Layer II Bitrate";
 767        case V4L2_CID_MPEG_AUDIO_L3_BITRATE:    return "Audio Layer III Bitrate";
 768        case V4L2_CID_MPEG_AUDIO_MODE:          return "Audio Stereo Mode";
 769        case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: return "Audio Stereo Mode Extension";
 770        case V4L2_CID_MPEG_AUDIO_EMPHASIS:      return "Audio Emphasis";
 771        case V4L2_CID_MPEG_AUDIO_CRC:           return "Audio CRC";
 772        case V4L2_CID_MPEG_AUDIO_MUTE:          return "Audio Mute";
 773        case V4L2_CID_MPEG_AUDIO_AAC_BITRATE:   return "Audio AAC Bitrate";
 774        case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:   return "Audio AC-3 Bitrate";
 775        case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:  return "Audio Playback";
 776        case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK: return "Audio Multilingual Playback";
 777        case V4L2_CID_MPEG_VIDEO_ENCODING:      return "Video Encoding";
 778        case V4L2_CID_MPEG_VIDEO_ASPECT:        return "Video Aspect";
 779        case V4L2_CID_MPEG_VIDEO_B_FRAMES:      return "Video B Frames";
 780        case V4L2_CID_MPEG_VIDEO_GOP_SIZE:      return "Video GOP Size";
 781        case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:   return "Video GOP Closure";
 782        case V4L2_CID_MPEG_VIDEO_PULLDOWN:      return "Video Pulldown";
 783        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:  return "Video Bitrate Mode";
 784        case V4L2_CID_MPEG_VIDEO_BITRATE:       return "Video Bitrate";
 785        case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:  return "Video Peak Bitrate";
 786        case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: return "Video Temporal Decimation";
 787        case V4L2_CID_MPEG_VIDEO_MUTE:          return "Video Mute";
 788        case V4L2_CID_MPEG_VIDEO_MUTE_YUV:      return "Video Mute YUV";
 789        case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:       return "Decoder Slice Interface";
 790        case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:  return "MPEG4 Loop Filter Enable";
 791        case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB:       return "Number of Intra Refresh MBs";
 792        case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:               return "Frame Level Rate Control Enable";
 793        case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:                  return "H264 MB Level Rate Control";
 794        case V4L2_CID_MPEG_VIDEO_HEADER_MODE:                   return "Sequence Header Mode";
 795        case V4L2_CID_MPEG_VIDEO_MAX_REF_PIC:                   return "Max Number of Reference Pics";
 796        case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP:               return "H263 I-Frame QP Value";
 797        case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP:               return "H263 P-Frame QP Value";
 798        case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP:               return "H263 B-Frame QP Value";
 799        case V4L2_CID_MPEG_VIDEO_H263_MIN_QP:                   return "H263 Minimum QP Value";
 800        case V4L2_CID_MPEG_VIDEO_H263_MAX_QP:                   return "H263 Maximum QP Value";
 801        case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:               return "H264 I-Frame QP Value";
 802        case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:               return "H264 P-Frame QP Value";
 803        case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:               return "H264 B-Frame QP Value";
 804        case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:                   return "H264 Maximum QP Value";
 805        case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:                   return "H264 Minimum QP Value";
 806        case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:            return "H264 8x8 Transform Enable";
 807        case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE:                 return "H264 CPB Buffer Size";
 808        case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:             return "H264 Entropy Mode";
 809        case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD:                 return "H264 I-Frame Period";
 810        case V4L2_CID_MPEG_VIDEO_H264_LEVEL:                    return "H264 Level";
 811        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:        return "H264 Loop Filter Alpha Offset";
 812        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:         return "H264 Loop Filter Beta Offset";
 813        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:         return "H264 Loop Filter Mode";
 814        case V4L2_CID_MPEG_VIDEO_H264_PROFILE:                  return "H264 Profile";
 815        case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT:       return "Vertical Size of SAR";
 816        case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH:        return "Horizontal Size of SAR";
 817        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:           return "Aspect Ratio VUI Enable";
 818        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:              return "VUI Aspect Ratio IDC";
 819        case V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING:        return "H264 Enable Frame Packing SEI";
 820        case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0:   return "H264 Set Curr. Frame as Frame0";
 821        case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:  return "H264 FP Arrangement Type";
 822        case V4L2_CID_MPEG_VIDEO_H264_FMO:                      return "H264 Flexible MB Ordering";
 823        case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:             return "H264 Map Type for FMO";
 824        case V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP:          return "H264 FMO Number of Slice Groups";
 825        case V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION:     return "H264 FMO Direction of Change";
 826        case V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE:          return "H264 FMO Size of 1st Slice Grp";
 827        case V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH:           return "H264 FMO No. of Consecutive MBs";
 828        case V4L2_CID_MPEG_VIDEO_H264_ASO:                      return "H264 Arbitrary Slice Ordering";
 829        case V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER:          return "H264 ASO Slice Order";
 830        case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING:      return "Enable H264 Hierarchical Coding";
 831        case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE: return "H264 Hierarchical Coding Type";
 832        case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:return "H264 Number of HC Layers";
 833        case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP:
 834                                                                return "H264 Set QP Value for HC Layers";
 835        case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION:
 836                                                                return "H264 Constrained Intra Pred";
 837        case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET:   return "H264 Chroma QP Index Offset";
 838        case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP:           return "H264 I-Frame Minimum QP Value";
 839        case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:           return "H264 I-Frame Maximum QP Value";
 840        case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:           return "H264 P-Frame Minimum QP Value";
 841        case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:           return "H264 P-Frame Maximum QP Value";
 842        case V4L2_CID_MPEG_VIDEO_H264_SPS:                      return "H264 Sequence Parameter Set";
 843        case V4L2_CID_MPEG_VIDEO_H264_PPS:                      return "H264 Picture Parameter Set";
 844        case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:           return "H264 Scaling Matrix";
 845        case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS:             return "H264 Slice Parameters";
 846        case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS:            return "H264 Decode Parameters";
 847        case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:                   return "MPEG2 Level";
 848        case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:                 return "MPEG2 Profile";
 849        case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP:              return "MPEG4 I-Frame QP Value";
 850        case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP:              return "MPEG4 P-Frame QP Value";
 851        case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP:              return "MPEG4 B-Frame QP Value";
 852        case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP:                  return "MPEG4 Minimum QP Value";
 853        case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP:                  return "MPEG4 Maximum QP Value";
 854        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:                   return "MPEG4 Level";
 855        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:                 return "MPEG4 Profile";
 856        case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:                    return "Quarter Pixel Search Enable";
 857        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:         return "Maximum Bytes in a Slice";
 858        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:            return "Number of MBs in a Slice";
 859        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:              return "Slice Partitioning Method";
 860        case V4L2_CID_MPEG_VIDEO_VBV_SIZE:                      return "VBV Buffer Size";
 861        case V4L2_CID_MPEG_VIDEO_DEC_PTS:                       return "Video Decoder PTS";
 862        case V4L2_CID_MPEG_VIDEO_DEC_FRAME:                     return "Video Decoder Frame Count";
 863        case V4L2_CID_MPEG_VIDEO_VBV_DELAY:                     return "Initial Delay for VBV Control";
 864        case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE:             return "Horizontal MV Search Range";
 865        case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE:             return "Vertical MV Search Range";
 866        case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER:             return "Repeat Sequence Header";
 867        case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:               return "Force Key Frame";
 868        case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:            return "MPEG-2 Slice Parameters";
 869        case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:            return "MPEG-2 Quantization Matrices";
 870        case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS:                   return "FWHT Stateless Parameters";
 871        case V4L2_CID_FWHT_I_FRAME_QP:                          return "FWHT I-Frame QP Value";
 872        case V4L2_CID_FWHT_P_FRAME_QP:                          return "FWHT P-Frame QP Value";
 873
 874        /* VPX controls */
 875        case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:            return "VPX Number of Partitions";
 876        case V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4:           return "VPX Intra Mode Decision Disable";
 877        case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:            return "VPX No. of Refs for P Frame";
 878        case V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL:              return "VPX Loop Filter Level Range";
 879        case V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS:          return "VPX Deblocking Effect Control";
 880        case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD:   return "VPX Golden Frame Refresh Period";
 881        case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:          return "VPX Golden Frame Indicator";
 882        case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP:                    return "VPX Minimum QP Value";
 883        case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP:                    return "VPX Maximum QP Value";
 884        case V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP:                return "VPX I-Frame QP Value";
 885        case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP:                return "VPX P-Frame QP Value";
 886        case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:                   return "VP8 Profile";
 887        case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:                   return "VP9 Profile";
 888
 889        /* HEVC controls */
 890        case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:               return "HEVC I-Frame QP Value";
 891        case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:               return "HEVC P-Frame QP Value";
 892        case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:               return "HEVC B-Frame QP Value";
 893        case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:                   return "HEVC Minimum QP Value";
 894        case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:                   return "HEVC Maximum QP Value";
 895        case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:                  return "HEVC Profile";
 896        case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:                    return "HEVC Level";
 897        case V4L2_CID_MPEG_VIDEO_HEVC_TIER:                     return "HEVC Tier";
 898        case V4L2_CID_MPEG_VIDEO_HEVC_FRAME_RATE_RESOLUTION:    return "HEVC Frame Rate Resolution";
 899        case V4L2_CID_MPEG_VIDEO_HEVC_MAX_PARTITION_DEPTH:      return "HEVC Maximum Coding Unit Depth";
 900        case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE:             return "HEVC Refresh Type";
 901        case V4L2_CID_MPEG_VIDEO_HEVC_CONST_INTRA_PRED:         return "HEVC Constant Intra Prediction";
 902        case V4L2_CID_MPEG_VIDEO_HEVC_LOSSLESS_CU:              return "HEVC Lossless Encoding";
 903        case V4L2_CID_MPEG_VIDEO_HEVC_WAVEFRONT:                return "HEVC Wavefront";
 904        case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:         return "HEVC Loop Filter";
 905        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP:                  return "HEVC QP Values";
 906        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:         return "HEVC Hierarchical Coding Type";
 907        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER:        return "HEVC Hierarchical Coding Layer";
 908        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP:        return "HEVC Hierarchical Layer 0 QP";
 909        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP:        return "HEVC Hierarchical Layer 1 QP";
 910        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP:        return "HEVC Hierarchical Layer 2 QP";
 911        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP:        return "HEVC Hierarchical Layer 3 QP";
 912        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP:        return "HEVC Hierarchical Layer 4 QP";
 913        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP:        return "HEVC Hierarchical Layer 5 QP";
 914        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_QP:        return "HEVC Hierarchical Layer 6 QP";
 915        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR:        return "HEVC Hierarchical Lay 0 BitRate";
 916        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR:        return "HEVC Hierarchical Lay 1 BitRate";
 917        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR:        return "HEVC Hierarchical Lay 2 BitRate";
 918        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR:        return "HEVC Hierarchical Lay 3 BitRate";
 919        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR:        return "HEVC Hierarchical Lay 4 BitRate";
 920        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR:        return "HEVC Hierarchical Lay 5 BitRate";
 921        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR:        return "HEVC Hierarchical Lay 6 BitRate";
 922        case V4L2_CID_MPEG_VIDEO_HEVC_GENERAL_PB:               return "HEVC General PB";
 923        case V4L2_CID_MPEG_VIDEO_HEVC_TEMPORAL_ID:              return "HEVC Temporal ID";
 924        case V4L2_CID_MPEG_VIDEO_HEVC_STRONG_SMOOTHING:         return "HEVC Strong Intra Smoothing";
 925        case V4L2_CID_MPEG_VIDEO_HEVC_INTRA_PU_SPLIT:           return "HEVC Intra PU Split";
 926        case V4L2_CID_MPEG_VIDEO_HEVC_TMV_PREDICTION:           return "HEVC TMV Prediction";
 927        case V4L2_CID_MPEG_VIDEO_HEVC_MAX_NUM_MERGE_MV_MINUS1:  return "HEVC Max Num of Candidate MVs";
 928        case V4L2_CID_MPEG_VIDEO_HEVC_WITHOUT_STARTCODE:        return "HEVC ENC Without Startcode";
 929        case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_PERIOD:           return "HEVC Num of I-Frame b/w 2 IDR";
 930        case V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2:      return "HEVC Loop Filter Beta Offset";
 931        case V4L2_CID_MPEG_VIDEO_HEVC_LF_TC_OFFSET_DIV2:        return "HEVC Loop Filter TC Offset";
 932        case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:     return "HEVC Size of Length Field";
 933        case V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES:        return "Reference Frames for a P-Frame";
 934        case V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR:         return "Prepend SPS and PPS to IDR";
 935
 936        /* CAMERA controls */
 937        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
 938        case V4L2_CID_CAMERA_CLASS:             return "Camera Controls";
 939        case V4L2_CID_EXPOSURE_AUTO:            return "Auto Exposure";
 940        case V4L2_CID_EXPOSURE_ABSOLUTE:        return "Exposure Time, Absolute";
 941        case V4L2_CID_EXPOSURE_AUTO_PRIORITY:   return "Exposure, Dynamic Framerate";
 942        case V4L2_CID_PAN_RELATIVE:             return "Pan, Relative";
 943        case V4L2_CID_TILT_RELATIVE:            return "Tilt, Relative";
 944        case V4L2_CID_PAN_RESET:                return "Pan, Reset";
 945        case V4L2_CID_TILT_RESET:               return "Tilt, Reset";
 946        case V4L2_CID_PAN_ABSOLUTE:             return "Pan, Absolute";
 947        case V4L2_CID_TILT_ABSOLUTE:            return "Tilt, Absolute";
 948        case V4L2_CID_FOCUS_ABSOLUTE:           return "Focus, Absolute";
 949        case V4L2_CID_FOCUS_RELATIVE:           return "Focus, Relative";
 950        case V4L2_CID_FOCUS_AUTO:               return "Focus, Automatic Continuous";
 951        case V4L2_CID_ZOOM_ABSOLUTE:            return "Zoom, Absolute";
 952        case V4L2_CID_ZOOM_RELATIVE:            return "Zoom, Relative";
 953        case V4L2_CID_ZOOM_CONTINUOUS:          return "Zoom, Continuous";
 954        case V4L2_CID_PRIVACY:                  return "Privacy";
 955        case V4L2_CID_IRIS_ABSOLUTE:            return "Iris, Absolute";
 956        case V4L2_CID_IRIS_RELATIVE:            return "Iris, Relative";
 957        case V4L2_CID_AUTO_EXPOSURE_BIAS:       return "Auto Exposure, Bias";
 958        case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: return "White Balance, Auto & Preset";
 959        case V4L2_CID_WIDE_DYNAMIC_RANGE:       return "Wide Dynamic Range";
 960        case V4L2_CID_IMAGE_STABILIZATION:      return "Image Stabilization";
 961        case V4L2_CID_ISO_SENSITIVITY:          return "ISO Sensitivity";
 962        case V4L2_CID_ISO_SENSITIVITY_AUTO:     return "ISO Sensitivity, Auto";
 963        case V4L2_CID_EXPOSURE_METERING:        return "Exposure, Metering Mode";
 964        case V4L2_CID_SCENE_MODE:               return "Scene Mode";
 965        case V4L2_CID_3A_LOCK:                  return "3A Lock";
 966        case V4L2_CID_AUTO_FOCUS_START:         return "Auto Focus, Start";
 967        case V4L2_CID_AUTO_FOCUS_STOP:          return "Auto Focus, Stop";
 968        case V4L2_CID_AUTO_FOCUS_STATUS:        return "Auto Focus, Status";
 969        case V4L2_CID_AUTO_FOCUS_RANGE:         return "Auto Focus, Range";
 970        case V4L2_CID_PAN_SPEED:                return "Pan, Speed";
 971        case V4L2_CID_TILT_SPEED:               return "Tilt, Speed";
 972
 973        /* FM Radio Modulator controls */
 974        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
 975        case V4L2_CID_FM_TX_CLASS:              return "FM Radio Modulator Controls";
 976        case V4L2_CID_RDS_TX_DEVIATION:         return "RDS Signal Deviation";
 977        case V4L2_CID_RDS_TX_PI:                return "RDS Program ID";
 978        case V4L2_CID_RDS_TX_PTY:               return "RDS Program Type";
 979        case V4L2_CID_RDS_TX_PS_NAME:           return "RDS PS Name";
 980        case V4L2_CID_RDS_TX_RADIO_TEXT:        return "RDS Radio Text";
 981        case V4L2_CID_RDS_TX_MONO_STEREO:       return "RDS Stereo";
 982        case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:   return "RDS Artificial Head";
 983        case V4L2_CID_RDS_TX_COMPRESSED:        return "RDS Compressed";
 984        case V4L2_CID_RDS_TX_DYNAMIC_PTY:       return "RDS Dynamic PTY";
 985        case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT: return "RDS Traffic Announcement";
 986        case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:   return "RDS Traffic Program";
 987        case V4L2_CID_RDS_TX_MUSIC_SPEECH:      return "RDS Music";
 988        case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:  return "RDS Enable Alt Frequencies";
 989        case V4L2_CID_RDS_TX_ALT_FREQS:         return "RDS Alternate Frequencies";
 990        case V4L2_CID_AUDIO_LIMITER_ENABLED:    return "Audio Limiter Feature Enabled";
 991        case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME: return "Audio Limiter Release Time";
 992        case V4L2_CID_AUDIO_LIMITER_DEVIATION:  return "Audio Limiter Deviation";
 993        case V4L2_CID_AUDIO_COMPRESSION_ENABLED: return "Audio Compression Enabled";
 994        case V4L2_CID_AUDIO_COMPRESSION_GAIN:   return "Audio Compression Gain";
 995        case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD: return "Audio Compression Threshold";
 996        case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME: return "Audio Compression Attack Time";
 997        case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME: return "Audio Compression Release Time";
 998        case V4L2_CID_PILOT_TONE_ENABLED:       return "Pilot Tone Feature Enabled";
 999        case V4L2_CID_PILOT_TONE_DEVIATION:     return "Pilot Tone Deviation";
1000        case V4L2_CID_PILOT_TONE_FREQUENCY:     return "Pilot Tone Frequency";
1001        case V4L2_CID_TUNE_PREEMPHASIS:         return "Pre-Emphasis";
1002        case V4L2_CID_TUNE_POWER_LEVEL:         return "Tune Power Level";
1003        case V4L2_CID_TUNE_ANTENNA_CAPACITOR:   return "Tune Antenna Capacitor";
1004
1005        /* Flash controls */
1006        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
1007        case V4L2_CID_FLASH_CLASS:              return "Flash Controls";
1008        case V4L2_CID_FLASH_LED_MODE:           return "LED Mode";
1009        case V4L2_CID_FLASH_STROBE_SOURCE:      return "Strobe Source";
1010        case V4L2_CID_FLASH_STROBE:             return "Strobe";
1011        case V4L2_CID_FLASH_STROBE_STOP:        return "Stop Strobe";
1012        case V4L2_CID_FLASH_STROBE_STATUS:      return "Strobe Status";
1013        case V4L2_CID_FLASH_TIMEOUT:            return "Strobe Timeout";
1014        case V4L2_CID_FLASH_INTENSITY:          return "Intensity, Flash Mode";
1015        case V4L2_CID_FLASH_TORCH_INTENSITY:    return "Intensity, Torch Mode";
1016        case V4L2_CID_FLASH_INDICATOR_INTENSITY: return "Intensity, Indicator";
1017        case V4L2_CID_FLASH_FAULT:              return "Faults";
1018        case V4L2_CID_FLASH_CHARGE:             return "Charge";
1019        case V4L2_CID_FLASH_READY:              return "Ready to Strobe";
1020
1021        /* JPEG encoder controls */
1022        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
1023        case V4L2_CID_JPEG_CLASS:               return "JPEG Compression Controls";
1024        case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:  return "Chroma Subsampling";
1025        case V4L2_CID_JPEG_RESTART_INTERVAL:    return "Restart Interval";
1026        case V4L2_CID_JPEG_COMPRESSION_QUALITY: return "Compression Quality";
1027        case V4L2_CID_JPEG_ACTIVE_MARKER:       return "Active Markers";
1028
1029        /* Image source controls */
1030        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
1031        case V4L2_CID_IMAGE_SOURCE_CLASS:       return "Image Source Controls";
1032        case V4L2_CID_VBLANK:                   return "Vertical Blanking";
1033        case V4L2_CID_HBLANK:                   return "Horizontal Blanking";
1034        case V4L2_CID_ANALOGUE_GAIN:            return "Analogue Gain";
1035        case V4L2_CID_TEST_PATTERN_RED:         return "Red Pixel Value";
1036        case V4L2_CID_TEST_PATTERN_GREENR:      return "Green (Red) Pixel Value";
1037        case V4L2_CID_TEST_PATTERN_BLUE:        return "Blue Pixel Value";
1038        case V4L2_CID_TEST_PATTERN_GREENB:      return "Green (Blue) Pixel Value";
1039
1040        /* Image processing controls */
1041        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
1042        case V4L2_CID_IMAGE_PROC_CLASS:         return "Image Processing Controls";
1043        case V4L2_CID_LINK_FREQ:                return "Link Frequency";
1044        case V4L2_CID_PIXEL_RATE:               return "Pixel Rate";
1045        case V4L2_CID_TEST_PATTERN:             return "Test Pattern";
1046        case V4L2_CID_DEINTERLACING_MODE:       return "Deinterlacing Mode";
1047        case V4L2_CID_DIGITAL_GAIN:             return "Digital Gain";
1048
1049        /* DV controls */
1050        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
1051        case V4L2_CID_DV_CLASS:                 return "Digital Video Controls";
1052        case V4L2_CID_DV_TX_HOTPLUG:            return "Hotplug Present";
1053        case V4L2_CID_DV_TX_RXSENSE:            return "RxSense Present";
1054        case V4L2_CID_DV_TX_EDID_PRESENT:       return "EDID Present";
1055        case V4L2_CID_DV_TX_MODE:               return "Transmit Mode";
1056        case V4L2_CID_DV_TX_RGB_RANGE:          return "Tx RGB Quantization Range";
1057        case V4L2_CID_DV_TX_IT_CONTENT_TYPE:    return "Tx IT Content Type";
1058        case V4L2_CID_DV_RX_POWER_PRESENT:      return "Power Present";
1059        case V4L2_CID_DV_RX_RGB_RANGE:          return "Rx RGB Quantization Range";
1060        case V4L2_CID_DV_RX_IT_CONTENT_TYPE:    return "Rx IT Content Type";
1061
1062        case V4L2_CID_FM_RX_CLASS:              return "FM Radio Receiver Controls";
1063        case V4L2_CID_TUNE_DEEMPHASIS:          return "De-Emphasis";
1064        case V4L2_CID_RDS_RECEPTION:            return "RDS Reception";
1065        case V4L2_CID_RF_TUNER_CLASS:           return "RF Tuner Controls";
1066        case V4L2_CID_RF_TUNER_RF_GAIN:         return "RF Gain";
1067        case V4L2_CID_RF_TUNER_LNA_GAIN_AUTO:   return "LNA Gain, Auto";
1068        case V4L2_CID_RF_TUNER_LNA_GAIN:        return "LNA Gain";
1069        case V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO: return "Mixer Gain, Auto";
1070        case V4L2_CID_RF_TUNER_MIXER_GAIN:      return "Mixer Gain";
1071        case V4L2_CID_RF_TUNER_IF_GAIN_AUTO:    return "IF Gain, Auto";
1072        case V4L2_CID_RF_TUNER_IF_GAIN:         return "IF Gain";
1073        case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:  return "Bandwidth, Auto";
1074        case V4L2_CID_RF_TUNER_BANDWIDTH:       return "Bandwidth";
1075        case V4L2_CID_RF_TUNER_PLL_LOCK:        return "PLL Lock";
1076        case V4L2_CID_RDS_RX_PTY:               return "RDS Program Type";
1077        case V4L2_CID_RDS_RX_PS_NAME:           return "RDS PS Name";
1078        case V4L2_CID_RDS_RX_RADIO_TEXT:        return "RDS Radio Text";
1079        case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT: return "RDS Traffic Announcement";
1080        case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:   return "RDS Traffic Program";
1081        case V4L2_CID_RDS_RX_MUSIC_SPEECH:      return "RDS Music";
1082
1083        /* Detection controls */
1084        /* Keep the order of the 'case's the same as in v4l2-controls.h! */
1085        case V4L2_CID_DETECT_CLASS:             return "Detection Controls";
1086        case V4L2_CID_DETECT_MD_MODE:           return "Motion Detection Mode";
1087        case V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD: return "MD Global Threshold";
1088        case V4L2_CID_DETECT_MD_THRESHOLD_GRID: return "MD Threshold Grid";
1089        case V4L2_CID_DETECT_MD_REGION_GRID:    return "MD Region Grid";
1090        default:
1091                return NULL;
1092        }
1093}
1094EXPORT_SYMBOL(v4l2_ctrl_get_name);
1095
1096void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
1097                    s64 *min, s64 *max, u64 *step, s64 *def, u32 *flags)
1098{
1099        *name = v4l2_ctrl_get_name(id);
1100        *flags = 0;
1101
1102        switch (id) {
1103        case V4L2_CID_AUDIO_MUTE:
1104        case V4L2_CID_AUDIO_LOUDNESS:
1105        case V4L2_CID_AUTO_WHITE_BALANCE:
1106        case V4L2_CID_AUTOGAIN:
1107        case V4L2_CID_HFLIP:
1108        case V4L2_CID_VFLIP:
1109        case V4L2_CID_HUE_AUTO:
1110        case V4L2_CID_CHROMA_AGC:
1111        case V4L2_CID_COLOR_KILLER:
1112        case V4L2_CID_AUTOBRIGHTNESS:
1113        case V4L2_CID_MPEG_AUDIO_MUTE:
1114        case V4L2_CID_MPEG_VIDEO_MUTE:
1115        case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
1116        case V4L2_CID_MPEG_VIDEO_PULLDOWN:
1117        case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
1118        case V4L2_CID_FOCUS_AUTO:
1119        case V4L2_CID_PRIVACY:
1120        case V4L2_CID_AUDIO_LIMITER_ENABLED:
1121        case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
1122        case V4L2_CID_PILOT_TONE_ENABLED:
1123        case V4L2_CID_ILLUMINATORS_1:
1124        case V4L2_CID_ILLUMINATORS_2:
1125        case V4L2_CID_FLASH_STROBE_STATUS:
1126        case V4L2_CID_FLASH_CHARGE:
1127        case V4L2_CID_FLASH_READY:
1128        case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
1129        case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
1130        case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
1131        case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
1132        case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
1133        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:
1134        case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:
1135        case V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER:
1136        case V4L2_CID_WIDE_DYNAMIC_RANGE:
1137        case V4L2_CID_IMAGE_STABILIZATION:
1138        case V4L2_CID_RDS_RECEPTION:
1139        case V4L2_CID_RF_TUNER_LNA_GAIN_AUTO:
1140        case V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO:
1141        case V4L2_CID_RF_TUNER_IF_GAIN_AUTO:
1142        case V4L2_CID_RF_TUNER_BANDWIDTH_AUTO:
1143        case V4L2_CID_RF_TUNER_PLL_LOCK:
1144        case V4L2_CID_RDS_TX_MONO_STEREO:
1145        case V4L2_CID_RDS_TX_ARTIFICIAL_HEAD:
1146        case V4L2_CID_RDS_TX_COMPRESSED:
1147        case V4L2_CID_RDS_TX_DYNAMIC_PTY:
1148        case V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT:
1149        case V4L2_CID_RDS_TX_TRAFFIC_PROGRAM:
1150        case V4L2_CID_RDS_TX_MUSIC_SPEECH:
1151        case V4L2_CID_RDS_TX_ALT_FREQS_ENABLE:
1152        case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT:
1153        case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:
1154        case V4L2_CID_RDS_RX_MUSIC_SPEECH:
1155                *type = V4L2_CTRL_TYPE_BOOLEAN;
1156                *min = 0;
1157                *max = *step = 1;
1158                break;
1159        case V4L2_CID_ROTATE:
1160                *type = V4L2_CTRL_TYPE_INTEGER;
1161                *flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
1162                break;
1163        case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE:
1164        case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE:
1165                *type = V4L2_CTRL_TYPE_INTEGER;
1166                break;
1167        case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:
1168        case V4L2_CID_PAN_RESET:
1169        case V4L2_CID_TILT_RESET:
1170        case V4L2_CID_FLASH_STROBE:
1171        case V4L2_CID_FLASH_STROBE_STOP:
1172        case V4L2_CID_AUTO_FOCUS_START:
1173        case V4L2_CID_AUTO_FOCUS_STOP:
1174        case V4L2_CID_DO_WHITE_BALANCE:
1175                *type = V4L2_CTRL_TYPE_BUTTON;
1176                *flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
1177                          V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
1178                *min = *max = *step = *def = 0;
1179                break;
1180        case V4L2_CID_POWER_LINE_FREQUENCY:
1181        case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1182        case V4L2_CID_MPEG_AUDIO_ENCODING:
1183        case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1184        case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1185        case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1186        case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
1187        case V4L2_CID_MPEG_AUDIO_MODE:
1188        case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1189        case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1190        case V4L2_CID_MPEG_AUDIO_CRC:
1191        case V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK:
1192        case V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK:
1193        case V4L2_CID_MPEG_VIDEO_ENCODING:
1194        case V4L2_CID_MPEG_VIDEO_ASPECT:
1195        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1196        case V4L2_CID_MPEG_STREAM_TYPE:
1197        case V4L2_CID_MPEG_STREAM_VBI_FMT:
1198        case V4L2_CID_EXPOSURE_AUTO:
1199        case V4L2_CID_AUTO_FOCUS_RANGE:
1200        case V4L2_CID_COLORFX:
1201        case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
1202        case V4L2_CID_TUNE_PREEMPHASIS:
1203        case V4L2_CID_FLASH_LED_MODE:
1204        case V4L2_CID_FLASH_STROBE_SOURCE:
1205        case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
1206        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
1207        case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
1208        case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
1209        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
1210        case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
1211        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
1212        case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE:
1213        case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE:
1214        case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:
1215        case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:
1216        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
1217        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
1218        case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
1219        case V4L2_CID_ISO_SENSITIVITY_AUTO:
1220        case V4L2_CID_EXPOSURE_METERING:
1221        case V4L2_CID_SCENE_MODE:
1222        case V4L2_CID_DV_TX_MODE:
1223        case V4L2_CID_DV_TX_RGB_RANGE:
1224        case V4L2_CID_DV_TX_IT_CONTENT_TYPE:
1225        case V4L2_CID_DV_RX_RGB_RANGE:
1226        case V4L2_CID_DV_RX_IT_CONTENT_TYPE:
1227        case V4L2_CID_TEST_PATTERN:
1228        case V4L2_CID_DEINTERLACING_MODE:
1229        case V4L2_CID_TUNE_DEEMPHASIS:
1230        case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:
1231        case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
1232        case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
1233        case V4L2_CID_DETECT_MD_MODE:
1234        case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
1235        case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
1236        case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
1237        case V4L2_CID_MPEG_VIDEO_HEVC_REFRESH_TYPE:
1238        case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
1239        case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
1240        case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
1241                *type = V4L2_CTRL_TYPE_MENU;
1242                break;
1243        case V4L2_CID_LINK_FREQ:
1244                *type = V4L2_CTRL_TYPE_INTEGER_MENU;
1245                break;
1246        case V4L2_CID_RDS_TX_PS_NAME:
1247        case V4L2_CID_RDS_TX_RADIO_TEXT:
1248        case V4L2_CID_RDS_RX_PS_NAME:
1249        case V4L2_CID_RDS_RX_RADIO_TEXT:
1250                *type = V4L2_CTRL_TYPE_STRING;
1251                break;
1252        case V4L2_CID_ISO_SENSITIVITY:
1253        case V4L2_CID_AUTO_EXPOSURE_BIAS:
1254        case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS:
1255        case V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES:
1256                *type = V4L2_CTRL_TYPE_INTEGER_MENU;
1257                break;
1258        case V4L2_CID_USER_CLASS:
1259        case V4L2_CID_CAMERA_CLASS:
1260        case V4L2_CID_MPEG_CLASS:
1261        case V4L2_CID_FM_TX_CLASS:
1262        case V4L2_CID_FLASH_CLASS:
1263        case V4L2_CID_JPEG_CLASS:
1264        case V4L2_CID_IMAGE_SOURCE_CLASS:
1265        case V4L2_CID_IMAGE_PROC_CLASS:
1266        case V4L2_CID_DV_CLASS:
1267        case V4L2_CID_FM_RX_CLASS:
1268        case V4L2_CID_RF_TUNER_CLASS:
1269        case V4L2_CID_DETECT_CLASS:
1270                *type = V4L2_CTRL_TYPE_CTRL_CLASS;
1271                /* You can neither read not write these */
1272                *flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY;
1273                *min = *max = *step = *def = 0;
1274                break;
1275        case V4L2_CID_BG_COLOR:
1276                *type = V4L2_CTRL_TYPE_INTEGER;
1277                *step = 1;
1278                *min = 0;
1279                /* Max is calculated as RGB888 that is 2^24 */
1280                *max = 0xFFFFFF;
1281                break;
1282        case V4L2_CID_FLASH_FAULT:
1283        case V4L2_CID_JPEG_ACTIVE_MARKER:
1284        case V4L2_CID_3A_LOCK:
1285        case V4L2_CID_AUTO_FOCUS_STATUS:
1286        case V4L2_CID_DV_TX_HOTPLUG:
1287        case V4L2_CID_DV_TX_RXSENSE:
1288        case V4L2_CID_DV_TX_EDID_PRESENT:
1289        case V4L2_CID_DV_RX_POWER_PRESENT:
1290                *type = V4L2_CTRL_TYPE_BITMASK;
1291                break;
1292        case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
1293        case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
1294                *type = V4L2_CTRL_TYPE_INTEGER;
1295                *flags |= V4L2_CTRL_FLAG_READ_ONLY;
1296                break;
1297        case V4L2_CID_MPEG_VIDEO_DEC_PTS:
1298                *type = V4L2_CTRL_TYPE_INTEGER64;
1299                *flags |= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY;
1300                *min = *def = 0;
1301                *max = 0x1ffffffffLL;
1302                *step = 1;
1303                break;
1304        case V4L2_CID_MPEG_VIDEO_DEC_FRAME:
1305                *type = V4L2_CTRL_TYPE_INTEGER64;
1306                *flags |= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY;
1307                *min = *def = 0;
1308                *max = 0x7fffffffffffffffLL;
1309                *step = 1;
1310                break;
1311        case V4L2_CID_PIXEL_RATE:
1312                *type = V4L2_CTRL_TYPE_INTEGER64;
1313                *flags |= V4L2_CTRL_FLAG_READ_ONLY;
1314                break;
1315        case V4L2_CID_DETECT_MD_REGION_GRID:
1316                *type = V4L2_CTRL_TYPE_U8;
1317                break;
1318        case V4L2_CID_DETECT_MD_THRESHOLD_GRID:
1319                *type = V4L2_CTRL_TYPE_U16;
1320                break;
1321        case V4L2_CID_RDS_TX_ALT_FREQS:
1322                *type = V4L2_CTRL_TYPE_U32;
1323                break;
1324        case V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS:
1325                *type = V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS;
1326                break;
1327        case V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION:
1328                *type = V4L2_CTRL_TYPE_MPEG2_QUANTIZATION;
1329                break;
1330        case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS:
1331                *type = V4L2_CTRL_TYPE_FWHT_PARAMS;
1332                break;
1333        case V4L2_CID_MPEG_VIDEO_H264_SPS:
1334                *type = V4L2_CTRL_TYPE_H264_SPS;
1335                break;
1336        case V4L2_CID_MPEG_VIDEO_H264_PPS:
1337                *type = V4L2_CTRL_TYPE_H264_PPS;
1338                break;
1339        case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:
1340                *type = V4L2_CTRL_TYPE_H264_SCALING_MATRIX;
1341                break;
1342        case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS:
1343                *type = V4L2_CTRL_TYPE_H264_SLICE_PARAMS;
1344                break;
1345        case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS:
1346                *type = V4L2_CTRL_TYPE_H264_DECODE_PARAMS;
1347                break;
1348        default:
1349                *type = V4L2_CTRL_TYPE_INTEGER;
1350                break;
1351        }
1352        switch (id) {
1353        case V4L2_CID_MPEG_AUDIO_ENCODING:
1354        case V4L2_CID_MPEG_AUDIO_MODE:
1355        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1356        case V4L2_CID_MPEG_VIDEO_B_FRAMES:
1357        case V4L2_CID_MPEG_STREAM_TYPE:
1358                *flags |= V4L2_CTRL_FLAG_UPDATE;
1359                break;
1360        case V4L2_CID_AUDIO_VOLUME:
1361        case V4L2_CID_AUDIO_BALANCE:
1362        case V4L2_CID_AUDIO_BASS:
1363        case V4L2_CID_AUDIO_TREBLE:
1364        case V4L2_CID_BRIGHTNESS:
1365        case V4L2_CID_CONTRAST:
1366        case V4L2_CID_SATURATION:
1367        case V4L2_CID_HUE:
1368        case V4L2_CID_RED_BALANCE:
1369        case V4L2_CID_BLUE_BALANCE:
1370        case V4L2_CID_GAMMA:
1371        case V4L2_CID_SHARPNESS:
1372        case V4L2_CID_CHROMA_GAIN:
1373        case V4L2_CID_RDS_TX_DEVIATION:
1374        case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
1375        case V4L2_CID_AUDIO_LIMITER_DEVIATION:
1376        case V4L2_CID_AUDIO_COMPRESSION_GAIN:
1377        case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
1378        case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
1379        case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
1380        case V4L2_CID_PILOT_TONE_DEVIATION:
1381        case V4L2_CID_PILOT_TONE_FREQUENCY:
1382        case V4L2_CID_TUNE_POWER_LEVEL:
1383        case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
1384        case V4L2_CID_RF_TUNER_RF_GAIN:
1385        case V4L2_CID_RF_TUNER_LNA_GAIN:
1386        case V4L2_CID_RF_TUNER_MIXER_GAIN:
1387        case V4L2_CID_RF_TUNER_IF_GAIN:
1388        case V4L2_CID_RF_TUNER_BANDWIDTH:
1389        case V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD:
1390                *flags |= V4L2_CTRL_FLAG_SLIDER;
1391                break;
1392        case V4L2_CID_PAN_RELATIVE:
1393        case V4L2_CID_TILT_RELATIVE:
1394        case V4L2_CID_FOCUS_RELATIVE:
1395        case V4L2_CID_IRIS_RELATIVE:
1396        case V4L2_CID_ZOOM_RELATIVE:
1397                *flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
1398                          V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
1399                break;
1400        case V4L2_CID_FLASH_STROBE_STATUS:
1401        case V4L2_CID_AUTO_FOCUS_STATUS:
1402        case V4L2_CID_FLASH_READY:
1403        case V4L2_CID_DV_TX_HOTPLUG:
1404        case V4L2_CID_DV_TX_RXSENSE:
1405        case V4L2_CID_DV_TX_EDID_PRESENT:
1406        case V4L2_CID_DV_RX_POWER_PRESENT:
1407        case V4L2_CID_DV_RX_IT_CONTENT_TYPE:
1408        case V4L2_CID_RDS_RX_PTY:
1409        case V4L2_CID_RDS_RX_PS_NAME:
1410        case V4L2_CID_RDS_RX_RADIO_TEXT:
1411        case V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT:
1412        case V4L2_CID_RDS_RX_TRAFFIC_PROGRAM:
1413        case V4L2_CID_RDS_RX_MUSIC_SPEECH:
1414                *flags |= V4L2_CTRL_FLAG_READ_ONLY;
1415                break;
1416        case V4L2_CID_RF_TUNER_PLL_LOCK:
1417                *flags |= V4L2_CTRL_FLAG_VOLATILE;
1418                break;
1419        }
1420}
1421EXPORT_SYMBOL(v4l2_ctrl_fill);
1422
1423static u32 user_flags(const struct v4l2_ctrl *ctrl)
1424{
1425        u32 flags = ctrl->flags;
1426
1427        if (ctrl->is_ptr)
1428                flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
1429
1430        return flags;
1431}
1432
1433static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes)
1434{
1435        memset(ev, 0, sizeof(*ev));
1436        ev->type = V4L2_EVENT_CTRL;
1437        ev->id = ctrl->id;
1438        ev->u.ctrl.changes = changes;
1439        ev->u.ctrl.type = ctrl->type;
1440        ev->u.ctrl.flags = user_flags(ctrl);
1441        if (ctrl->is_ptr)
1442                ev->u.ctrl.value64 = 0;
1443        else
1444                ev->u.ctrl.value64 = *ctrl->p_cur.p_s64;
1445        ev->u.ctrl.minimum = ctrl->minimum;
1446        ev->u.ctrl.maximum = ctrl->maximum;
1447        if (ctrl->type == V4L2_CTRL_TYPE_MENU
1448            || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
1449                ev->u.ctrl.step = 1;
1450        else
1451                ev->u.ctrl.step = ctrl->step;
1452        ev->u.ctrl.default_value = ctrl->default_value;
1453}
1454
1455static void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
1456{
1457        struct v4l2_event ev;
1458        struct v4l2_subscribed_event *sev;
1459
1460        if (list_empty(&ctrl->ev_subs))
1461                return;
1462        fill_event(&ev, ctrl, changes);
1463
1464        list_for_each_entry(sev, &ctrl->ev_subs, node)
1465                if (sev->fh != fh ||
1466                    (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
1467                        v4l2_event_queue_fh(sev->fh, &ev);
1468}
1469
1470static bool std_equal(const struct v4l2_ctrl *ctrl, u32 idx,
1471                      union v4l2_ctrl_ptr ptr1,
1472                      union v4l2_ctrl_ptr ptr2)
1473{
1474        switch (ctrl->type) {
1475        case V4L2_CTRL_TYPE_BUTTON:
1476                return false;
1477        case V4L2_CTRL_TYPE_STRING:
1478                idx *= ctrl->elem_size;
1479                /* strings are always 0-terminated */
1480                return !strcmp(ptr1.p_char + idx, ptr2.p_char + idx);
1481        case V4L2_CTRL_TYPE_INTEGER64:
1482                return ptr1.p_s64[idx] == ptr2.p_s64[idx];
1483        case V4L2_CTRL_TYPE_U8:
1484                return ptr1.p_u8[idx] == ptr2.p_u8[idx];
1485        case V4L2_CTRL_TYPE_U16:
1486                return ptr1.p_u16[idx] == ptr2.p_u16[idx];
1487        case V4L2_CTRL_TYPE_U32:
1488                return ptr1.p_u32[idx] == ptr2.p_u32[idx];
1489        default:
1490                if (ctrl->is_int)
1491                        return ptr1.p_s32[idx] == ptr2.p_s32[idx];
1492                idx *= ctrl->elem_size;
1493                return !memcmp(ptr1.p + idx, ptr2.p + idx, ctrl->elem_size);
1494        }
1495}
1496
1497static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
1498                              union v4l2_ctrl_ptr ptr)
1499{
1500        struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
1501        void *p = ptr.p + idx * ctrl->elem_size;
1502
1503        memset(p, 0, ctrl->elem_size);
1504
1505        /*
1506         * The cast is needed to get rid of a gcc warning complaining that
1507         * V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS is not part of the
1508         * v4l2_ctrl_type enum.
1509         */
1510        switch ((u32)ctrl->type) {
1511        case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
1512                p_mpeg2_slice_params = p;
1513                /* 4:2:0 */
1514                p_mpeg2_slice_params->sequence.chroma_format = 1;
1515                /* interlaced top field */
1516                p_mpeg2_slice_params->picture.picture_structure = 1;
1517                p_mpeg2_slice_params->picture.picture_coding_type =
1518                                        V4L2_MPEG2_PICTURE_CODING_TYPE_I;
1519                break;
1520        }
1521}
1522
1523static void std_init(const struct v4l2_ctrl *ctrl, u32 idx,
1524                     union v4l2_ctrl_ptr ptr)
1525{
1526        switch (ctrl->type) {
1527        case V4L2_CTRL_TYPE_STRING:
1528                idx *= ctrl->elem_size;
1529                memset(ptr.p_char + idx, ' ', ctrl->minimum);
1530                ptr.p_char[idx + ctrl->minimum] = '\0';
1531                break;
1532        case V4L2_CTRL_TYPE_INTEGER64:
1533                ptr.p_s64[idx] = ctrl->default_value;
1534                break;
1535        case V4L2_CTRL_TYPE_INTEGER:
1536        case V4L2_CTRL_TYPE_INTEGER_MENU:
1537        case V4L2_CTRL_TYPE_MENU:
1538        case V4L2_CTRL_TYPE_BITMASK:
1539        case V4L2_CTRL_TYPE_BOOLEAN:
1540                ptr.p_s32[idx] = ctrl->default_value;
1541                break;
1542        case V4L2_CTRL_TYPE_BUTTON:
1543        case V4L2_CTRL_TYPE_CTRL_CLASS:
1544                ptr.p_s32[idx] = 0;
1545                break;
1546        case V4L2_CTRL_TYPE_U8:
1547                ptr.p_u8[idx] = ctrl->default_value;
1548                break;
1549        case V4L2_CTRL_TYPE_U16:
1550                ptr.p_u16[idx] = ctrl->default_value;
1551                break;
1552        case V4L2_CTRL_TYPE_U32:
1553                ptr.p_u32[idx] = ctrl->default_value;
1554                break;
1555        default:
1556                std_init_compound(ctrl, idx, ptr);
1557                break;
1558        }
1559}
1560
1561static void std_log(const struct v4l2_ctrl *ctrl)
1562{
1563        union v4l2_ctrl_ptr ptr = ctrl->p_cur;
1564
1565        if (ctrl->is_array) {
1566                unsigned i;
1567
1568                for (i = 0; i < ctrl->nr_of_dims; i++)
1569                        pr_cont("[%u]", ctrl->dims[i]);
1570                pr_cont(" ");
1571        }
1572
1573        switch (ctrl->type) {
1574        case V4L2_CTRL_TYPE_INTEGER:
1575                pr_cont("%d", *ptr.p_s32);
1576                break;
1577        case V4L2_CTRL_TYPE_BOOLEAN:
1578                pr_cont("%s", *ptr.p_s32 ? "true" : "false");
1579                break;
1580        case V4L2_CTRL_TYPE_MENU:
1581                pr_cont("%s", ctrl->qmenu[*ptr.p_s32]);
1582                break;
1583        case V4L2_CTRL_TYPE_INTEGER_MENU:
1584                pr_cont("%lld", ctrl->qmenu_int[*ptr.p_s32]);
1585                break;
1586        case V4L2_CTRL_TYPE_BITMASK:
1587                pr_cont("0x%08x", *ptr.p_s32);
1588                break;
1589        case V4L2_CTRL_TYPE_INTEGER64:
1590                pr_cont("%lld", *ptr.p_s64);
1591                break;
1592        case V4L2_CTRL_TYPE_STRING:
1593                pr_cont("%s", ptr.p_char);
1594                break;
1595        case V4L2_CTRL_TYPE_U8:
1596                pr_cont("%u", (unsigned)*ptr.p_u8);
1597                break;
1598        case V4L2_CTRL_TYPE_U16:
1599                pr_cont("%u", (unsigned)*ptr.p_u16);
1600                break;
1601        case V4L2_CTRL_TYPE_U32:
1602                pr_cont("%u", (unsigned)*ptr.p_u32);
1603                break;
1604        default:
1605                pr_cont("unknown type %d", ctrl->type);
1606                break;
1607        }
1608}
1609
1610/*
1611 * Round towards the closest legal value. Be careful when we are
1612 * close to the maximum range of the control type to prevent
1613 * wrap-arounds.
1614 */
1615#define ROUND_TO_RANGE(val, offset_type, ctrl)                  \
1616({                                                              \
1617        offset_type offset;                                     \
1618        if ((ctrl)->maximum >= 0 &&                             \
1619            val >= (ctrl)->maximum - (s32)((ctrl)->step / 2))   \
1620                val = (ctrl)->maximum;                          \
1621        else                                                    \
1622                val += (s32)((ctrl)->step / 2);                 \
1623        val = clamp_t(typeof(val), val,                         \
1624                      (ctrl)->minimum, (ctrl)->maximum);        \
1625        offset = (val) - (ctrl)->minimum;                       \
1626        offset = (ctrl)->step * (offset / (u32)(ctrl)->step);   \
1627        val = (ctrl)->minimum + offset;                         \
1628        0;                                                      \
1629})
1630
1631/* Validate a new control */
1632static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
1633                        union v4l2_ctrl_ptr ptr)
1634{
1635        struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
1636        size_t len;
1637        u64 offset;
1638        s64 val;
1639
1640        switch ((u32)ctrl->type) {
1641        case V4L2_CTRL_TYPE_INTEGER:
1642                return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl);
1643        case V4L2_CTRL_TYPE_INTEGER64:
1644                /*
1645                 * We can't use the ROUND_TO_RANGE define here due to
1646                 * the u64 divide that needs special care.
1647                 */
1648                val = ptr.p_s64[idx];
1649                if (ctrl->maximum >= 0 && val >= ctrl->maximum - (s64)(ctrl->step / 2))
1650                        val = ctrl->maximum;
1651                else
1652                        val += (s64)(ctrl->step / 2);
1653                val = clamp_t(s64, val, ctrl->minimum, ctrl->maximum);
1654                offset = val - ctrl->minimum;
1655                do_div(offset, ctrl->step);
1656                ptr.p_s64[idx] = ctrl->minimum + offset * ctrl->step;
1657                return 0;
1658        case V4L2_CTRL_TYPE_U8:
1659                return ROUND_TO_RANGE(ptr.p_u8[idx], u8, ctrl);
1660        case V4L2_CTRL_TYPE_U16:
1661                return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl);
1662        case V4L2_CTRL_TYPE_U32:
1663                return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl);
1664
1665        case V4L2_CTRL_TYPE_BOOLEAN:
1666                ptr.p_s32[idx] = !!ptr.p_s32[idx];
1667                return 0;
1668
1669        case V4L2_CTRL_TYPE_MENU:
1670        case V4L2_CTRL_TYPE_INTEGER_MENU:
1671                if (ptr.p_s32[idx] < ctrl->minimum || ptr.p_s32[idx] > ctrl->maximum)
1672                        return -ERANGE;
1673                if (ctrl->menu_skip_mask & (1ULL << ptr.p_s32[idx]))
1674                        return -EINVAL;
1675                if (ctrl->type == V4L2_CTRL_TYPE_MENU &&
1676                    ctrl->qmenu[ptr.p_s32[idx]][0] == '\0')
1677                        return -EINVAL;
1678                return 0;
1679
1680        case V4L2_CTRL_TYPE_BITMASK:
1681                ptr.p_s32[idx] &= ctrl->maximum;
1682                return 0;
1683
1684        case V4L2_CTRL_TYPE_BUTTON:
1685        case V4L2_CTRL_TYPE_CTRL_CLASS:
1686                ptr.p_s32[idx] = 0;
1687                return 0;
1688
1689        case V4L2_CTRL_TYPE_STRING:
1690                idx *= ctrl->elem_size;
1691                len = strlen(ptr.p_char + idx);
1692                if (len < ctrl->minimum)
1693                        return -ERANGE;
1694                if ((len - (u32)ctrl->minimum) % (u32)ctrl->step)
1695                        return -ERANGE;
1696                return 0;
1697
1698        case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
1699                p_mpeg2_slice_params = ptr.p;
1700
1701                switch (p_mpeg2_slice_params->sequence.chroma_format) {
1702                case 1: /* 4:2:0 */
1703                case 2: /* 4:2:2 */
1704                case 3: /* 4:4:4 */
1705                        break;
1706                default:
1707                        return -EINVAL;
1708                }
1709
1710                switch (p_mpeg2_slice_params->picture.intra_dc_precision) {
1711                case 0: /* 8 bits */
1712                case 1: /* 9 bits */
1713                case 2: /* 10 bits */
1714                case 3: /* 11 bits */
1715                        break;
1716                default:
1717                        return -EINVAL;
1718                }
1719
1720                switch (p_mpeg2_slice_params->picture.picture_structure) {
1721                case 1: /* interlaced top field */
1722                case 2: /* interlaced bottom field */
1723                case 3: /* progressive */
1724                        break;
1725                default:
1726                        return -EINVAL;
1727                }
1728
1729                switch (p_mpeg2_slice_params->picture.picture_coding_type) {
1730                case V4L2_MPEG2_PICTURE_CODING_TYPE_I:
1731                case V4L2_MPEG2_PICTURE_CODING_TYPE_P:
1732                case V4L2_MPEG2_PICTURE_CODING_TYPE_B:
1733                        break;
1734                default:
1735                        return -EINVAL;
1736                }
1737
1738                return 0;
1739
1740        case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
1741                return 0;
1742
1743        case V4L2_CTRL_TYPE_FWHT_PARAMS:
1744                return 0;
1745
1746        case V4L2_CTRL_TYPE_H264_SPS:
1747        case V4L2_CTRL_TYPE_H264_PPS:
1748        case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
1749        case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
1750        case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
1751                return 0;
1752
1753        default:
1754                return -EINVAL;
1755        }
1756}
1757
1758static const struct v4l2_ctrl_type_ops std_type_ops = {
1759        .equal = std_equal,
1760        .init = std_init,
1761        .log = std_log,
1762        .validate = std_validate,
1763};
1764
1765/* Helper function: copy the given control value back to the caller */
1766static int ptr_to_user(struct v4l2_ext_control *c,
1767                       struct v4l2_ctrl *ctrl,
1768                       union v4l2_ctrl_ptr ptr)
1769{
1770        u32 len;
1771
1772        if (ctrl->is_ptr && !ctrl->is_string)
1773                return copy_to_user(c->ptr, ptr.p, c->size) ?
1774                       -EFAULT : 0;
1775
1776        switch (ctrl->type) {
1777        case V4L2_CTRL_TYPE_STRING:
1778                len = strlen(ptr.p_char);
1779                if (c->size < len + 1) {
1780                        c->size = ctrl->elem_size;
1781                        return -ENOSPC;
1782                }
1783                return copy_to_user(c->string, ptr.p_char, len + 1) ?
1784                       -EFAULT : 0;
1785        case V4L2_CTRL_TYPE_INTEGER64:
1786                c->value64 = *ptr.p_s64;
1787                break;
1788        default:
1789                c->value = *ptr.p_s32;
1790                break;
1791        }
1792        return 0;
1793}
1794
1795/* Helper function: copy the current control value back to the caller */
1796static int cur_to_user(struct v4l2_ext_control *c,
1797                       struct v4l2_ctrl *ctrl)
1798{
1799        return ptr_to_user(c, ctrl, ctrl->p_cur);
1800}
1801
1802/* Helper function: copy the new control value back to the caller */
1803static int new_to_user(struct v4l2_ext_control *c,
1804                       struct v4l2_ctrl *ctrl)
1805{
1806        return ptr_to_user(c, ctrl, ctrl->p_new);
1807}
1808
1809/* Helper function: copy the request value back to the caller */
1810static int req_to_user(struct v4l2_ext_control *c,
1811                       struct v4l2_ctrl_ref *ref)
1812{
1813        return ptr_to_user(c, ref->ctrl, ref->p_req);
1814}
1815
1816/* Helper function: copy the initial control value back to the caller */
1817static int def_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl)
1818{
1819        int idx;
1820
1821        for (idx = 0; idx < ctrl->elems; idx++)
1822                ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
1823
1824        return ptr_to_user(c, ctrl, ctrl->p_new);
1825}
1826
1827/* Helper function: copy the caller-provider value to the given control value */
1828static int user_to_ptr(struct v4l2_ext_control *c,
1829                       struct v4l2_ctrl *ctrl,
1830                       union v4l2_ctrl_ptr ptr)
1831{
1832        int ret;
1833        u32 size;
1834
1835        ctrl->is_new = 1;
1836        if (ctrl->is_ptr && !ctrl->is_string) {
1837                unsigned idx;
1838
1839                ret = copy_from_user(ptr.p, c->ptr, c->size) ? -EFAULT : 0;
1840                if (ret || !ctrl->is_array)
1841                        return ret;
1842                for (idx = c->size / ctrl->elem_size; idx < ctrl->elems; idx++)
1843                        ctrl->type_ops->init(ctrl, idx, ptr);
1844                return 0;
1845        }
1846
1847        switch (ctrl->type) {
1848        case V4L2_CTRL_TYPE_INTEGER64:
1849                *ptr.p_s64 = c->value64;
1850                break;
1851        case V4L2_CTRL_TYPE_STRING:
1852                size = c->size;
1853                if (size == 0)
1854                        return -ERANGE;
1855                if (size > ctrl->maximum + 1)
1856                        size = ctrl->maximum + 1;
1857                ret = copy_from_user(ptr.p_char, c->string, size) ? -EFAULT : 0;
1858                if (!ret) {
1859                        char last = ptr.p_char[size - 1];
1860
1861                        ptr.p_char[size - 1] = 0;
1862                        /* If the string was longer than ctrl->maximum,
1863                           then return an error. */
1864                        if (strlen(ptr.p_char) == ctrl->maximum && last)
1865                                return -ERANGE;
1866                }
1867                return ret;
1868        default:
1869                *ptr.p_s32 = c->value;
1870                break;
1871        }
1872        return 0;
1873}
1874
1875/* Helper function: copy the caller-provider value as the new control value */
1876static int user_to_new(struct v4l2_ext_control *c,
1877                       struct v4l2_ctrl *ctrl)
1878{
1879        return user_to_ptr(c, ctrl, ctrl->p_new);
1880}
1881
1882/* Copy the one value to another. */
1883static void ptr_to_ptr(struct v4l2_ctrl *ctrl,
1884                       union v4l2_ctrl_ptr from, union v4l2_ctrl_ptr to)
1885{
1886        if (ctrl == NULL)
1887                return;
1888        memcpy(to.p, from.p, ctrl->elems * ctrl->elem_size);
1889}
1890
1891/* Copy the new value to the current value. */
1892static void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
1893{
1894        bool changed;
1895
1896        if (ctrl == NULL)
1897                return;
1898
1899        /* has_changed is set by cluster_changed */
1900        changed = ctrl->has_changed;
1901        if (changed)
1902                ptr_to_ptr(ctrl, ctrl->p_new, ctrl->p_cur);
1903
1904        if (ch_flags & V4L2_EVENT_CTRL_CH_FLAGS) {
1905                /* Note: CH_FLAGS is only set for auto clusters. */
1906                ctrl->flags &=
1907                        ~(V4L2_CTRL_FLAG_INACTIVE | V4L2_CTRL_FLAG_VOLATILE);
1908                if (!is_cur_manual(ctrl->cluster[0])) {
1909                        ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
1910                        if (ctrl->cluster[0]->has_volatiles)
1911                                ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
1912                }
1913                fh = NULL;
1914        }
1915        if (changed || ch_flags) {
1916                /* If a control was changed that was not one of the controls
1917                   modified by the application, then send the event to all. */
1918                if (!ctrl->is_new)
1919                        fh = NULL;
1920                send_event(fh, ctrl,
1921                        (changed ? V4L2_EVENT_CTRL_CH_VALUE : 0) | ch_flags);
1922                if (ctrl->call_notify && changed && ctrl->handler->notify)
1923                        ctrl->handler->notify(ctrl, ctrl->handler->notify_priv);
1924        }
1925}
1926
1927/* Copy the current value to the new value */
1928static void cur_to_new(struct v4l2_ctrl *ctrl)
1929{
1930        if (ctrl == NULL)
1931                return;
1932        ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new);
1933}
1934
1935/* Copy the new value to the request value */
1936static void new_to_req(struct v4l2_ctrl_ref *ref)
1937{
1938        if (!ref)
1939                return;
1940        ptr_to_ptr(ref->ctrl, ref->ctrl->p_new, ref->p_req);
1941        ref->req = ref;
1942}
1943
1944/* Copy the request value to the new value */
1945static void req_to_new(struct v4l2_ctrl_ref *ref)
1946{
1947        if (!ref)
1948                return;
1949        if (ref->req)
1950                ptr_to_ptr(ref->ctrl, ref->req->p_req, ref->ctrl->p_new);
1951        else
1952                ptr_to_ptr(ref->ctrl, ref->ctrl->p_cur, ref->ctrl->p_new);
1953}
1954
1955/* Return non-zero if one or more of the controls in the cluster has a new
1956   value that differs from the current value. */
1957static int cluster_changed(struct v4l2_ctrl *master)
1958{
1959        bool changed = false;
1960        unsigned idx;
1961        int i;
1962
1963        for (i = 0; i < master->ncontrols; i++) {
1964                struct v4l2_ctrl *ctrl = master->cluster[i];
1965                bool ctrl_changed = false;
1966
1967                if (ctrl == NULL)
1968                        continue;
1969
1970                if (ctrl->flags & V4L2_CTRL_FLAG_EXECUTE_ON_WRITE)
1971                        changed = ctrl_changed = true;
1972
1973                /*
1974                 * Set has_changed to false to avoid generating
1975                 * the event V4L2_EVENT_CTRL_CH_VALUE
1976                 */
1977                if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
1978                        ctrl->has_changed = false;
1979                        continue;
1980                }
1981
1982                for (idx = 0; !ctrl_changed && idx < ctrl->elems; idx++)
1983                        ctrl_changed = !ctrl->type_ops->equal(ctrl, idx,
1984                                ctrl->p_cur, ctrl->p_new);
1985                ctrl->has_changed = ctrl_changed;
1986                changed |= ctrl->has_changed;
1987        }
1988        return changed;
1989}
1990
1991/* Control range checking */
1992static int check_range(enum v4l2_ctrl_type type,
1993                s64 min, s64 max, u64 step, s64 def)
1994{
1995        switch (type) {
1996        case V4L2_CTRL_TYPE_BOOLEAN:
1997                if (step != 1 || max > 1 || min < 0)
1998                        return -ERANGE;
1999                /* fall through */
2000        case V4L2_CTRL_TYPE_U8:
2001        case V4L2_CTRL_TYPE_U16:
2002        case V4L2_CTRL_TYPE_U32:
2003        case V4L2_CTRL_TYPE_INTEGER:
2004        case V4L2_CTRL_TYPE_INTEGER64:
2005                if (step == 0 || min > max || def < min || def > max)
2006                        return -ERANGE;
2007                return 0;
2008        case V4L2_CTRL_TYPE_BITMASK:
2009                if (step || min || !max || (def & ~max))
2010                        return -ERANGE;
2011                return 0;
2012        case V4L2_CTRL_TYPE_MENU:
2013        case V4L2_CTRL_TYPE_INTEGER_MENU:
2014                if (min > max || def < min || def > max)
2015                        return -ERANGE;
2016                /* Note: step == menu_skip_mask for menu controls.
2017                   So here we check if the default value is masked out. */
2018                if (step && ((1 << def) & step))
2019                        return -EINVAL;
2020                return 0;
2021        case V4L2_CTRL_TYPE_STRING:
2022                if (min > max || min < 0 || step < 1 || def)
2023                        return -ERANGE;
2024                return 0;
2025        default:
2026                return 0;
2027        }
2028}
2029
2030/* Validate a new control */
2031static int validate_new(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr p_new)
2032{
2033        unsigned idx;
2034        int err = 0;
2035
2036        for (idx = 0; !err && idx < ctrl->elems; idx++)
2037                err = ctrl->type_ops->validate(ctrl, idx, p_new);
2038        return err;
2039}
2040
2041static inline u32 node2id(struct list_head *node)
2042{
2043        return list_entry(node, struct v4l2_ctrl_ref, node)->ctrl->id;
2044}
2045
2046/* Set the handler's error code if it wasn't set earlier already */
2047static inline int handler_set_err(struct v4l2_ctrl_handler *hdl, int err)
2048{
2049        if (hdl->error == 0)
2050                hdl->error = err;
2051        return err;
2052}
2053
2054/* Initialize the handler */
2055int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl,
2056                                 unsigned nr_of_controls_hint,
2057                                 struct lock_class_key *key, const char *name)
2058{
2059        mutex_init(&hdl->_lock);
2060        hdl->lock = &hdl->_lock;
2061        lockdep_set_class_and_name(hdl->lock, key, name);
2062        INIT_LIST_HEAD(&hdl->ctrls);
2063        INIT_LIST_HEAD(&hdl->ctrl_refs);
2064        INIT_LIST_HEAD(&hdl->requests);
2065        INIT_LIST_HEAD(&hdl->requests_queued);
2066        hdl->request_is_queued = false;
2067        hdl->nr_of_buckets = 1 + nr_of_controls_hint / 8;
2068        hdl->buckets = kvmalloc_array(hdl->nr_of_buckets,
2069                                      sizeof(hdl->buckets[0]),
2070                                      GFP_KERNEL | __GFP_ZERO);
2071        hdl->error = hdl->buckets ? 0 : -ENOMEM;
2072        media_request_object_init(&hdl->req_obj);
2073        return hdl->error;
2074}
2075EXPORT_SYMBOL(v4l2_ctrl_handler_init_class);
2076
2077/* Free all controls and control refs */
2078void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
2079{
2080        struct v4l2_ctrl_ref *ref, *next_ref;
2081        struct v4l2_ctrl *ctrl, *next_ctrl;
2082        struct v4l2_subscribed_event *sev, *next_sev;
2083
2084        if (hdl == NULL || hdl->buckets == NULL)
2085                return;
2086
2087        if (!hdl->req_obj.req && !list_empty(&hdl->requests)) {
2088                struct v4l2_ctrl_handler *req, *next_req;
2089
2090                list_for_each_entry_safe(req, next_req, &hdl->requests, requests) {
2091                        media_request_object_unbind(&req->req_obj);
2092                        media_request_object_put(&req->req_obj);
2093                }
2094        }
2095        mutex_lock(hdl->lock);
2096        /* Free all nodes */
2097        list_for_each_entry_safe(ref, next_ref, &hdl->ctrl_refs, node) {
2098                list_del(&ref->node);
2099                kfree(ref);
2100        }
2101        /* Free all controls owned by the handler */
2102        list_for_each_entry_safe(ctrl, next_ctrl, &hdl->ctrls, node) {
2103                list_del(&ctrl->node);
2104                list_for_each_entry_safe(sev, next_sev, &ctrl->ev_subs, node)
2105                        list_del(&sev->node);
2106                kvfree(ctrl);
2107        }
2108        kvfree(hdl->buckets);
2109        hdl->buckets = NULL;
2110        hdl->cached = NULL;
2111        hdl->error = 0;
2112        mutex_unlock(hdl->lock);
2113        mutex_destroy(&hdl->_lock);
2114}
2115EXPORT_SYMBOL(v4l2_ctrl_handler_free);
2116
2117/* For backwards compatibility: V4L2_CID_PRIVATE_BASE should no longer
2118   be used except in G_CTRL, S_CTRL, QUERYCTRL and QUERYMENU when dealing
2119   with applications that do not use the NEXT_CTRL flag.
2120
2121   We just find the n-th private user control. It's O(N), but that should not
2122   be an issue in this particular case. */
2123static struct v4l2_ctrl_ref *find_private_ref(
2124                struct v4l2_ctrl_handler *hdl, u32 id)
2125{
2126        struct v4l2_ctrl_ref *ref;
2127
2128        id -= V4L2_CID_PRIVATE_BASE;
2129        list_for_each_entry(ref, &hdl->ctrl_refs, node) {
2130                /* Search for private user controls that are compatible with
2131                   VIDIOC_G/S_CTRL. */
2132                if (V4L2_CTRL_ID2WHICH(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
2133                    V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
2134                        if (!ref->ctrl->is_int)
2135                                continue;
2136                        if (id == 0)
2137                                return ref;
2138                        id--;
2139                }
2140        }
2141        return NULL;
2142}
2143
2144/* Find a control with the given ID. */
2145static struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
2146{
2147        struct v4l2_ctrl_ref *ref;
2148        int bucket;
2149
2150        id &= V4L2_CTRL_ID_MASK;
2151
2152        /* Old-style private controls need special handling */
2153        if (id >= V4L2_CID_PRIVATE_BASE)
2154                return find_private_ref(hdl, id);
2155        bucket = id % hdl->nr_of_buckets;
2156
2157        /* Simple optimization: cache the last control found */
2158        if (hdl->cached && hdl->cached->ctrl->id == id)
2159                return hdl->cached;
2160
2161        /* Not in cache, search the hash */
2162        ref = hdl->buckets ? hdl->buckets[bucket] : NULL;
2163        while (ref && ref->ctrl->id != id)
2164                ref = ref->next;
2165
2166        if (ref)
2167                hdl->cached = ref; /* cache it! */
2168        return ref;
2169}
2170
2171/* Find a control with the given ID. Take the handler's lock first. */
2172static struct v4l2_ctrl_ref *find_ref_lock(
2173                struct v4l2_ctrl_handler *hdl, u32 id)
2174{
2175        struct v4l2_ctrl_ref *ref = NULL;
2176
2177        if (hdl) {
2178                mutex_lock(hdl->lock);
2179                ref = find_ref(hdl, id);
2180                mutex_unlock(hdl->lock);
2181        }
2182        return ref;
2183}
2184
2185/* Find a control with the given ID. */
2186struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
2187{
2188        struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
2189
2190        return ref ? ref->ctrl : NULL;
2191}
2192EXPORT_SYMBOL(v4l2_ctrl_find);
2193
2194/* Allocate a new v4l2_ctrl_ref and hook it into the handler. */
2195static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
2196                           struct v4l2_ctrl *ctrl,
2197                           struct v4l2_ctrl_ref **ctrl_ref,
2198                           bool from_other_dev, bool allocate_req)
2199{
2200        struct v4l2_ctrl_ref *ref;
2201        struct v4l2_ctrl_ref *new_ref;
2202        u32 id = ctrl->id;
2203        u32 class_ctrl = V4L2_CTRL_ID2WHICH(id) | 1;
2204        int bucket = id % hdl->nr_of_buckets;   /* which bucket to use */
2205        unsigned int size_extra_req = 0;
2206
2207        if (ctrl_ref)
2208                *ctrl_ref = NULL;
2209
2210        /*
2211         * Automatically add the control class if it is not yet present and
2212         * the new control is not a compound control.
2213         */
2214        if (ctrl->type < V4L2_CTRL_COMPOUND_TYPES &&
2215            id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)
2216                if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))
2217                        return hdl->error;
2218
2219        if (hdl->error)
2220                return hdl->error;
2221
2222        if (allocate_req)
2223                size_extra_req = ctrl->elems * ctrl->elem_size;
2224        new_ref = kzalloc(sizeof(*new_ref) + size_extra_req, GFP_KERNEL);
2225        if (!new_ref)
2226                return handler_set_err(hdl, -ENOMEM);
2227        new_ref->ctrl = ctrl;
2228        new_ref->from_other_dev = from_other_dev;
2229        if (size_extra_req)
2230                new_ref->p_req.p = &new_ref[1];
2231
2232        INIT_LIST_HEAD(&new_ref->node);
2233
2234        mutex_lock(hdl->lock);
2235
2236        /* Add immediately at the end of the list if the list is empty, or if
2237           the last element in the list has a lower ID.
2238           This ensures that when elements are added in ascending order the
2239           insertion is an O(1) operation. */
2240        if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
2241                list_add_tail(&new_ref->node, &hdl->ctrl_refs);
2242                goto insert_in_hash;
2243        }
2244
2245        /* Find insert position in sorted list */
2246        list_for_each_entry(ref, &hdl->ctrl_refs, node) {
2247                if (ref->ctrl->id < id)
2248                        continue;
2249                /* Don't add duplicates */
2250                if (ref->ctrl->id == id) {
2251                        kfree(new_ref);
2252                        goto unlock;
2253                }
2254                list_add(&new_ref->node, ref->node.prev);
2255                break;
2256        }
2257
2258insert_in_hash:
2259        /* Insert the control node in the hash */
2260        new_ref->next = hdl->buckets[bucket];
2261        hdl->buckets[bucket] = new_ref;
2262        if (ctrl_ref)
2263                *ctrl_ref = new_ref;
2264        if (ctrl->handler == hdl) {
2265                /* By default each control starts in a cluster of its own.
2266                 * new_ref->ctrl is basically a cluster array with one
2267                 * element, so that's perfect to use as the cluster pointer.
2268                 * But only do this for the handler that owns the control.
2269                 */
2270                ctrl->cluster = &new_ref->ctrl;
2271                ctrl->ncontrols = 1;
2272        }
2273
2274unlock:
2275        mutex_unlock(hdl->lock);
2276        return 0;
2277}
2278
2279/* Add a new control */
2280static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
2281                        const struct v4l2_ctrl_ops *ops,
2282                        const struct v4l2_ctrl_type_ops *type_ops,
2283                        u32 id, const char *name, enum v4l2_ctrl_type type,
2284                        s64 min, s64 max, u64 step, s64 def,
2285                        const u32 dims[V4L2_CTRL_MAX_DIMS], u32 elem_size,
2286                        u32 flags, const char * const *qmenu,
2287                        const s64 *qmenu_int, void *priv)
2288{
2289        struct v4l2_ctrl *ctrl;
2290        unsigned sz_extra;
2291        unsigned nr_of_dims = 0;
2292        unsigned elems = 1;
2293        bool is_array;
2294        unsigned tot_ctrl_size;
2295        unsigned idx;
2296        void *data;
2297        int err;
2298
2299        if (hdl->error)
2300                return NULL;
2301
2302        while (dims && dims[nr_of_dims]) {
2303                elems *= dims[nr_of_dims];
2304                nr_of_dims++;
2305                if (nr_of_dims == V4L2_CTRL_MAX_DIMS)
2306                        break;
2307        }
2308        is_array = nr_of_dims > 0;
2309
2310        /* Prefill elem_size for all types handled by std_type_ops */
2311        switch ((u32)type) {
2312        case V4L2_CTRL_TYPE_INTEGER64:
2313                elem_size = sizeof(s64);
2314                break;
2315        case V4L2_CTRL_TYPE_STRING:
2316                elem_size = max + 1;
2317                break;
2318        case V4L2_CTRL_TYPE_U8:
2319                elem_size = sizeof(u8);
2320                break;
2321        case V4L2_CTRL_TYPE_U16:
2322                elem_size = sizeof(u16);
2323                break;
2324        case V4L2_CTRL_TYPE_U32:
2325                elem_size = sizeof(u32);
2326                break;
2327        case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS:
2328                elem_size = sizeof(struct v4l2_ctrl_mpeg2_slice_params);
2329                break;
2330        case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION:
2331                elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantization);
2332                break;
2333        case V4L2_CTRL_TYPE_FWHT_PARAMS:
2334                elem_size = sizeof(struct v4l2_ctrl_fwht_params);
2335                break;
2336        case V4L2_CTRL_TYPE_H264_SPS:
2337                elem_size = sizeof(struct v4l2_ctrl_h264_sps);
2338                break;
2339        case V4L2_CTRL_TYPE_H264_PPS:
2340                elem_size = sizeof(struct v4l2_ctrl_h264_pps);
2341                break;
2342        case V4L2_CTRL_TYPE_H264_SCALING_MATRIX:
2343                elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix);
2344                break;
2345        case V4L2_CTRL_TYPE_H264_SLICE_PARAMS:
2346                elem_size = sizeof(struct v4l2_ctrl_h264_slice_params);
2347                break;
2348        case V4L2_CTRL_TYPE_H264_DECODE_PARAMS:
2349                elem_size = sizeof(struct v4l2_ctrl_h264_decode_params);
2350                break;
2351        default:
2352                if (type < V4L2_CTRL_COMPOUND_TYPES)
2353                        elem_size = sizeof(s32);
2354                break;
2355        }
2356        tot_ctrl_size = elem_size * elems;
2357
2358        /* Sanity checks */
2359        if (id == 0 || name == NULL || !elem_size ||
2360            id >= V4L2_CID_PRIVATE_BASE ||
2361            (type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
2362            (type == V4L2_CTRL_TYPE_INTEGER_MENU && qmenu_int == NULL)) {
2363                handler_set_err(hdl, -ERANGE);
2364                return NULL;
2365        }
2366        err = check_range(type, min, max, step, def);
2367        if (err) {
2368                handler_set_err(hdl, err);
2369                return NULL;
2370        }
2371        if (is_array &&
2372            (type == V4L2_CTRL_TYPE_BUTTON ||
2373             type == V4L2_CTRL_TYPE_CTRL_CLASS)) {
2374                handler_set_err(hdl, -EINVAL);
2375                return NULL;
2376        }
2377
2378        sz_extra = 0;
2379        if (type == V4L2_CTRL_TYPE_BUTTON)
2380                flags |= V4L2_CTRL_FLAG_WRITE_ONLY |
2381                        V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
2382        else if (type == V4L2_CTRL_TYPE_CTRL_CLASS)
2383                flags |= V4L2_CTRL_FLAG_READ_ONLY;
2384        else if (type == V4L2_CTRL_TYPE_INTEGER64 ||
2385                 type == V4L2_CTRL_TYPE_STRING ||
2386                 type >= V4L2_CTRL_COMPOUND_TYPES ||
2387                 is_array)
2388                sz_extra += 2 * tot_ctrl_size;
2389
2390        ctrl = kvzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
2391        if (ctrl == NULL) {
2392                handler_set_err(hdl, -ENOMEM);
2393                return NULL;
2394        }
2395
2396        INIT_LIST_HEAD(&ctrl->node);
2397        INIT_LIST_HEAD(&ctrl->ev_subs);
2398        ctrl->handler = hdl;
2399        ctrl->ops = ops;
2400        ctrl->type_ops = type_ops ? type_ops : &std_type_ops;
2401        ctrl->id = id;
2402        ctrl->name = name;
2403        ctrl->type = type;
2404        ctrl->flags = flags;
2405        ctrl->minimum = min;
2406        ctrl->maximum = max;
2407        ctrl->step = step;
2408        ctrl->default_value = def;
2409        ctrl->is_string = !is_array && type == V4L2_CTRL_TYPE_STRING;
2410        ctrl->is_ptr = is_array || type >= V4L2_CTRL_COMPOUND_TYPES || ctrl->is_string;
2411        ctrl->is_int = !ctrl->is_ptr && type != V4L2_CTRL_TYPE_INTEGER64;
2412        ctrl->is_array = is_array;
2413        ctrl->elems = elems;
2414        ctrl->nr_of_dims = nr_of_dims;
2415        if (nr_of_dims)
2416                memcpy(ctrl->dims, dims, nr_of_dims * sizeof(dims[0]));
2417        ctrl->elem_size = elem_size;
2418        if (type == V4L2_CTRL_TYPE_MENU)
2419                ctrl->qmenu = qmenu;
2420        else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2421                ctrl->qmenu_int = qmenu_int;
2422        ctrl->priv = priv;
2423        ctrl->cur.val = ctrl->val = def;
2424        data = &ctrl[1];
2425
2426        if (!ctrl->is_int) {
2427                ctrl->p_new.p = data;
2428                ctrl->p_cur.p = data + tot_ctrl_size;
2429        } else {
2430                ctrl->p_new.p = &ctrl->val;
2431                ctrl->p_cur.p = &ctrl->cur.val;
2432        }
2433        for (idx = 0; idx < elems; idx++) {
2434                ctrl->type_ops->init(ctrl, idx, ctrl->p_cur);
2435                ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
2436        }
2437
2438        if (handler_new_ref(hdl, ctrl, NULL, false, false)) {
2439                kvfree(ctrl);
2440                return NULL;
2441        }
2442        mutex_lock(hdl->lock);
2443        list_add_tail(&ctrl->node, &hdl->ctrls);
2444        mutex_unlock(hdl->lock);
2445        return ctrl;
2446}
2447
2448struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
2449                        const struct v4l2_ctrl_config *cfg, void *priv)
2450{
2451        bool is_menu;
2452        struct v4l2_ctrl *ctrl;
2453        const char *name = cfg->name;
2454        const char * const *qmenu = cfg->qmenu;
2455        const s64 *qmenu_int = cfg->qmenu_int;
2456        enum v4l2_ctrl_type type = cfg->type;
2457        u32 flags = cfg->flags;
2458        s64 min = cfg->min;
2459        s64 max = cfg->max;
2460        u64 step = cfg->step;
2461        s64 def = cfg->def;
2462
2463        if (name == NULL)
2464                v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step,
2465                                                                &def, &flags);
2466
2467        is_menu = (type == V4L2_CTRL_TYPE_MENU ||
2468                   type == V4L2_CTRL_TYPE_INTEGER_MENU);
2469        if (is_menu)
2470                WARN_ON(step);
2471        else
2472                WARN_ON(cfg->menu_skip_mask);
2473        if (type == V4L2_CTRL_TYPE_MENU && !qmenu) {
2474                qmenu = v4l2_ctrl_get_menu(cfg->id);
2475        } else if (type == V4L2_CTRL_TYPE_INTEGER_MENU && !qmenu_int) {
2476                handler_set_err(hdl, -EINVAL);
2477                return NULL;
2478        }
2479
2480        ctrl = v4l2_ctrl_new(hdl, cfg->ops, cfg->type_ops, cfg->id, name,
2481                        type, min, max,
2482                        is_menu ? cfg->menu_skip_mask : step, def,
2483                        cfg->dims, cfg->elem_size,
2484                        flags, qmenu, qmenu_int, priv);
2485        if (ctrl)
2486                ctrl->is_private = cfg->is_private;
2487        return ctrl;
2488}
2489EXPORT_SYMBOL(v4l2_ctrl_new_custom);
2490
2491/* Helper function for standard non-menu controls */
2492struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
2493                        const struct v4l2_ctrl_ops *ops,
2494                        u32 id, s64 min, s64 max, u64 step, s64 def)
2495{
2496        const char *name;
2497        enum v4l2_ctrl_type type;
2498        u32 flags;
2499
2500        v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2501        if (type == V4L2_CTRL_TYPE_MENU ||
2502            type == V4L2_CTRL_TYPE_INTEGER_MENU ||
2503            type >= V4L2_CTRL_COMPOUND_TYPES) {
2504                handler_set_err(hdl, -EINVAL);
2505                return NULL;
2506        }
2507        return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2508                             min, max, step, def, NULL, 0,
2509                             flags, NULL, NULL, NULL);
2510}
2511EXPORT_SYMBOL(v4l2_ctrl_new_std);
2512
2513/* Helper function for standard menu controls */
2514struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
2515                        const struct v4l2_ctrl_ops *ops,
2516                        u32 id, u8 _max, u64 mask, u8 _def)
2517{
2518        const char * const *qmenu = NULL;
2519        const s64 *qmenu_int = NULL;
2520        unsigned int qmenu_int_len = 0;
2521        const char *name;
2522        enum v4l2_ctrl_type type;
2523        s64 min;
2524        s64 max = _max;
2525        s64 def = _def;
2526        u64 step;
2527        u32 flags;
2528
2529        v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2530
2531        if (type == V4L2_CTRL_TYPE_MENU)
2532                qmenu = v4l2_ctrl_get_menu(id);
2533        else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
2534                qmenu_int = v4l2_ctrl_get_int_menu(id, &qmenu_int_len);
2535
2536        if ((!qmenu && !qmenu_int) || (qmenu_int && max > qmenu_int_len)) {
2537                handler_set_err(hdl, -EINVAL);
2538                return NULL;
2539        }
2540        return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2541                             0, max, mask, def, NULL, 0,
2542                             flags, qmenu, qmenu_int, NULL);
2543}
2544EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
2545
2546/* Helper function for standard menu controls with driver defined menu */
2547struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl,
2548                        const struct v4l2_ctrl_ops *ops, u32 id, u8 _max,
2549                        u64 mask, u8 _def, const char * const *qmenu)
2550{
2551        enum v4l2_ctrl_type type;
2552        const char *name;
2553        u32 flags;
2554        u64 step;
2555        s64 min;
2556        s64 max = _max;
2557        s64 def = _def;
2558
2559        /* v4l2_ctrl_new_std_menu_items() should only be called for
2560         * standard controls without a standard menu.
2561         */
2562        if (v4l2_ctrl_get_menu(id)) {
2563                handler_set_err(hdl, -EINVAL);
2564                return NULL;
2565        }
2566
2567        v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2568        if (type != V4L2_CTRL_TYPE_MENU || qmenu == NULL) {
2569                handler_set_err(hdl, -EINVAL);
2570                return NULL;
2571        }
2572        return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2573                             0, max, mask, def, NULL, 0,
2574                             flags, qmenu, NULL, NULL);
2575
2576}
2577EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
2578
2579/* Helper function for standard integer menu controls */
2580struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
2581                        const struct v4l2_ctrl_ops *ops,
2582                        u32 id, u8 _max, u8 _def, const s64 *qmenu_int)
2583{
2584        const char *name;
2585        enum v4l2_ctrl_type type;
2586        s64 min;
2587        u64 step;
2588        s64 max = _max;
2589        s64 def = _def;
2590        u32 flags;
2591
2592        v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
2593        if (type != V4L2_CTRL_TYPE_INTEGER_MENU) {
2594                handler_set_err(hdl, -EINVAL);
2595                return NULL;
2596        }
2597        return v4l2_ctrl_new(hdl, ops, NULL, id, name, type,
2598                             0, max, 0, def, NULL, 0,
2599                             flags, NULL, qmenu_int, NULL);
2600}
2601EXPORT_SYMBOL(v4l2_ctrl_new_int_menu);
2602
2603/* Add the controls from another handler to our own. */
2604int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
2605                          struct v4l2_ctrl_handler *add,
2606                          bool (*filter)(const struct v4l2_ctrl *ctrl),
2607                          bool from_other_dev)
2608{
2609        struct v4l2_ctrl_ref *ref;
2610        int ret = 0;
2611
2612        /* Do nothing if either handler is NULL or if they are the same */
2613        if (!hdl || !add || hdl == add)
2614                return 0;
2615        if (hdl->error)
2616                return hdl->error;
2617        mutex_lock(add->lock);
2618        list_for_each_entry(ref, &add->ctrl_refs, node) {
2619                struct v4l2_ctrl *ctrl = ref->ctrl;
2620
2621                /* Skip handler-private controls. */
2622                if (ctrl->is_private)
2623                        continue;
2624                /* And control classes */
2625                if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2626                        continue;
2627                /* Filter any unwanted controls */
2628                if (filter && !filter(ctrl))
2629                        continue;
2630                ret = handler_new_ref(hdl, ctrl, NULL, from_other_dev, false);
2631                if (ret)
2632                        break;
2633        }
2634        mutex_unlock(add->lock);
2635        return ret;
2636}
2637EXPORT_SYMBOL(v4l2_ctrl_add_handler);
2638
2639bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl)
2640{
2641        if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_TX)
2642                return true;
2643        if (V4L2_CTRL_ID2WHICH(ctrl->id) == V4L2_CTRL_CLASS_FM_RX)
2644                return true;
2645        switch (ctrl->id) {
2646        case V4L2_CID_AUDIO_MUTE:
2647        case V4L2_CID_AUDIO_VOLUME:
2648        case V4L2_CID_AUDIO_BALANCE:
2649        case V4L2_CID_AUDIO_BASS:
2650        case V4L2_CID_AUDIO_TREBLE:
2651        case V4L2_CID_AUDIO_LOUDNESS:
2652                return true;
2653        default:
2654                break;
2655        }
2656        return false;
2657}
2658EXPORT_SYMBOL(v4l2_ctrl_radio_filter);
2659
2660/* Cluster controls */
2661void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls)
2662{
2663        bool has_volatiles = false;
2664        int i;
2665
2666        /* The first control is the master control and it must not be NULL */
2667        if (WARN_ON(ncontrols == 0 || controls[0] == NULL))
2668                return;
2669
2670        for (i = 0; i < ncontrols; i++) {
2671                if (controls[i]) {
2672                        controls[i]->cluster = controls;
2673                        controls[i]->ncontrols = ncontrols;
2674                        if (controls[i]->flags & V4L2_CTRL_FLAG_VOLATILE)
2675                                has_volatiles = true;
2676                }
2677        }
2678        controls[0]->has_volatiles = has_volatiles;
2679}
2680EXPORT_SYMBOL(v4l2_ctrl_cluster);
2681
2682void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
2683                            u8 manual_val, bool set_volatile)
2684{
2685        struct v4l2_ctrl *master = controls[0];
2686        u32 flag = 0;
2687        int i;
2688
2689        v4l2_ctrl_cluster(ncontrols, controls);
2690        WARN_ON(ncontrols <= 1);
2691        WARN_ON(manual_val < master->minimum || manual_val > master->maximum);
2692        WARN_ON(set_volatile && !has_op(master, g_volatile_ctrl));
2693        master->is_auto = true;
2694        master->has_volatiles = set_volatile;
2695        master->manual_mode_value = manual_val;
2696        master->flags |= V4L2_CTRL_FLAG_UPDATE;
2697
2698        if (!is_cur_manual(master))
2699                flag = V4L2_CTRL_FLAG_INACTIVE |
2700                        (set_volatile ? V4L2_CTRL_FLAG_VOLATILE : 0);
2701
2702        for (i = 1; i < ncontrols; i++)
2703                if (controls[i])
2704                        controls[i]->flags |= flag;
2705}
2706EXPORT_SYMBOL(v4l2_ctrl_auto_cluster);
2707
2708/* Activate/deactivate a control. */
2709void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
2710{
2711        /* invert since the actual flag is called 'inactive' */
2712        bool inactive = !active;
2713        bool old;
2714
2715        if (ctrl == NULL)
2716                return;
2717
2718        if (inactive)
2719                /* set V4L2_CTRL_FLAG_INACTIVE */
2720                old = test_and_set_bit(4, &ctrl->flags);
2721        else
2722                /* clear V4L2_CTRL_FLAG_INACTIVE */
2723                old = test_and_clear_bit(4, &ctrl->flags);
2724        if (old != inactive)
2725                send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2726}
2727EXPORT_SYMBOL(v4l2_ctrl_activate);
2728
2729void __v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
2730{
2731        bool old;
2732
2733        if (ctrl == NULL)
2734                return;
2735
2736        lockdep_assert_held(ctrl->handler->lock);
2737
2738        if (grabbed)
2739                /* set V4L2_CTRL_FLAG_GRABBED */
2740                old = test_and_set_bit(1, &ctrl->flags);
2741        else
2742                /* clear V4L2_CTRL_FLAG_GRABBED */
2743                old = test_and_clear_bit(1, &ctrl->flags);
2744        if (old != grabbed)
2745                send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
2746}
2747EXPORT_SYMBOL(__v4l2_ctrl_grab);
2748
2749/* Log the control name and value */
2750static void log_ctrl(const struct v4l2_ctrl *ctrl,
2751                     const char *prefix, const char *colon)
2752{
2753        if (ctrl->flags & (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_WRITE_ONLY))
2754                return;
2755        if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
2756                return;
2757
2758        pr_info("%s%s%s: ", prefix, colon, ctrl->name);
2759
2760        ctrl->type_ops->log(ctrl);
2761
2762        if (ctrl->flags & (V4L2_CTRL_FLAG_INACTIVE |
2763                           V4L2_CTRL_FLAG_GRABBED |
2764                           V4L2_CTRL_FLAG_VOLATILE)) {
2765                if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
2766                        pr_cont(" inactive");
2767                if (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)
2768                        pr_cont(" grabbed");
2769                if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE)
2770                        pr_cont(" volatile");
2771        }
2772        pr_cont("\n");
2773}
2774
2775/* Log all controls owned by the handler */
2776void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
2777                                  const char *prefix)
2778{
2779        struct v4l2_ctrl *ctrl;
2780        const char *colon = "";
2781        int len;
2782
2783        if (hdl == NULL)
2784                return;
2785        if (prefix == NULL)
2786                prefix = "";
2787        len = strlen(prefix);
2788        if (len && prefix[len - 1] != ' ')
2789                colon = ": ";
2790        mutex_lock(hdl->lock);
2791        list_for_each_entry(ctrl, &hdl->ctrls, node)
2792                if (!(ctrl->flags & V4L2_CTRL_FLAG_DISABLED))
2793                        log_ctrl(ctrl, prefix, colon);
2794        mutex_unlock(hdl->lock);
2795}
2796EXPORT_SYMBOL(v4l2_ctrl_handler_log_status);
2797
2798int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd)
2799{
2800        v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name);
2801        return 0;
2802}
2803EXPORT_SYMBOL(v4l2_ctrl_subdev_log_status);
2804
2805/* Call s_ctrl for all controls owned by the handler */
2806int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2807{
2808        struct v4l2_ctrl *ctrl;
2809        int ret = 0;
2810
2811        if (hdl == NULL)
2812                return 0;
2813
2814        lockdep_assert_held(hdl->lock);
2815
2816        list_for_each_entry(ctrl, &hdl->ctrls, node)
2817                ctrl->done = false;
2818
2819        list_for_each_entry(ctrl, &hdl->ctrls, node) {
2820                struct v4l2_ctrl *master = ctrl->cluster[0];
2821                int i;
2822
2823                /* Skip if this control was already handled by a cluster. */
2824                /* Skip button controls and read-only controls. */
2825                if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
2826                    (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
2827                        continue;
2828
2829                for (i = 0; i < master->ncontrols; i++) {
2830                        if (master->cluster[i]) {
2831                                cur_to_new(master->cluster[i]);
2832                                master->cluster[i]->is_new = 1;
2833                                master->cluster[i]->done = true;
2834                        }
2835                }
2836                ret = call_op(master, s_ctrl);
2837                if (ret)
2838                        break;
2839        }
2840
2841        return ret;
2842}
2843EXPORT_SYMBOL_GPL(__v4l2_ctrl_handler_setup);
2844
2845int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
2846{
2847        int ret;
2848
2849        if (hdl == NULL)
2850                return 0;
2851
2852        mutex_lock(hdl->lock);
2853        ret = __v4l2_ctrl_handler_setup(hdl);
2854        mutex_unlock(hdl->lock);
2855
2856        return ret;
2857}
2858EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
2859
2860/* Implement VIDIOC_QUERY_EXT_CTRL */
2861int v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_query_ext_ctrl *qc)
2862{
2863        const unsigned next_flags = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
2864        u32 id = qc->id & V4L2_CTRL_ID_MASK;
2865        struct v4l2_ctrl_ref *ref;
2866        struct v4l2_ctrl *ctrl;
2867
2868        if (hdl == NULL)
2869                return -EINVAL;
2870
2871        mutex_lock(hdl->lock);
2872
2873        /* Try to find it */
2874        ref = find_ref(hdl, id);
2875
2876        if ((qc->id & next_flags) && !list_empty(&hdl->ctrl_refs)) {
2877                bool is_compound;
2878                /* Match any control that is not hidden */
2879                unsigned mask = 1;
2880                bool match = false;
2881
2882                if ((qc->id & next_flags) == V4L2_CTRL_FLAG_NEXT_COMPOUND) {
2883                        /* Match any hidden control */
2884                        match = true;
2885                } else if ((qc->id & next_flags) == next_flags) {
2886                        /* Match any control, compound or not */
2887                        mask = 0;
2888                }
2889
2890                /* Find the next control with ID > qc->id */
2891
2892                /* Did we reach the end of the control list? */
2893                if (id >= node2id(hdl->ctrl_refs.prev)) {
2894                        ref = NULL; /* Yes, so there is no next control */
2895                } else if (ref) {
2896                        /* We found a control with the given ID, so just get
2897                           the next valid one in the list. */
2898                        list_for_each_entry_continue(ref, &hdl->ctrl_refs, node) {
2899                                is_compound = ref->ctrl->is_array ||
2900                                        ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
2901                                if (id < ref->ctrl->id &&
2902                                    (is_compound & mask) == match)
2903                                        break;
2904                        }
2905                        if (&ref->node == &hdl->ctrl_refs)
2906                                ref = NULL;
2907                } else {
2908                        /* No control with the given ID exists, so start
2909                           searching for the next largest ID. We know there
2910                           is one, otherwise the first 'if' above would have
2911                           been true. */
2912                        list_for_each_entry(ref, &hdl->ctrl_refs, node) {
2913                                is_compound = ref->ctrl->is_array ||
2914                                        ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
2915                                if (id < ref->ctrl->id &&
2916                                    (is_compound & mask) == match)
2917                                        break;
2918                        }
2919                        if (&ref->node == &hdl->ctrl_refs)
2920                                ref = NULL;
2921                }
2922        }
2923        mutex_unlock(hdl->lock);
2924
2925        if (!ref)
2926                return -EINVAL;
2927
2928        ctrl = ref->ctrl;
2929        memset(qc, 0, sizeof(*qc));
2930        if (id >= V4L2_CID_PRIVATE_BASE)
2931                qc->id = id;
2932        else
2933                qc->id = ctrl->id;
2934        strscpy(qc->name, ctrl->name, sizeof(qc->name));
2935        qc->flags = user_flags(ctrl);
2936        qc->type = ctrl->type;
2937        qc->elem_size = ctrl->elem_size;
2938        qc->elems = ctrl->elems;
2939        qc->nr_of_dims = ctrl->nr_of_dims;
2940        memcpy(qc->dims, ctrl->dims, qc->nr_of_dims * sizeof(qc->dims[0]));
2941        qc->minimum = ctrl->minimum;
2942        qc->maximum = ctrl->maximum;
2943        qc->default_value = ctrl->default_value;
2944        if (ctrl->type == V4L2_CTRL_TYPE_MENU
2945            || ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
2946                qc->step = 1;
2947        else
2948                qc->step = ctrl->step;
2949        return 0;
2950}
2951EXPORT_SYMBOL(v4l2_query_ext_ctrl);
2952
2953/* Implement VIDIOC_QUERYCTRL */
2954int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc)
2955{
2956        struct v4l2_query_ext_ctrl qec = { qc->id };
2957        int rc;
2958
2959        rc = v4l2_query_ext_ctrl(hdl, &qec);
2960        if (rc)
2961                return rc;
2962
2963        qc->id = qec.id;
2964        qc->type = qec.type;
2965        qc->flags = qec.flags;
2966        strscpy(qc->name, qec.name, sizeof(qc->name));
2967        switch (qc->type) {
2968        case V4L2_CTRL_TYPE_INTEGER:
2969        case V4L2_CTRL_TYPE_BOOLEAN:
2970        case V4L2_CTRL_TYPE_MENU:
2971        case V4L2_CTRL_TYPE_INTEGER_MENU:
2972        case V4L2_CTRL_TYPE_STRING:
2973        case V4L2_CTRL_TYPE_BITMASK:
2974                qc->minimum = qec.minimum;
2975                qc->maximum = qec.maximum;
2976                qc->step = qec.step;
2977                qc->default_value = qec.default_value;
2978                break;
2979        default:
2980                qc->minimum = 0;
2981                qc->maximum = 0;
2982                qc->step = 0;
2983                qc->default_value = 0;
2984                break;
2985        }
2986        return 0;
2987}
2988EXPORT_SYMBOL(v4l2_queryctrl);
2989
2990/* Implement VIDIOC_QUERYMENU */
2991int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm)
2992{
2993        struct v4l2_ctrl *ctrl;
2994        u32 i = qm->index;
2995
2996        ctrl = v4l2_ctrl_find(hdl, qm->id);
2997        if (!ctrl)
2998                return -EINVAL;
2999
3000        qm->reserved = 0;
3001        /* Sanity checks */
3002        switch (ctrl->type) {
3003        case V4L2_CTRL_TYPE_MENU:
3004                if (ctrl->qmenu == NULL)
3005                        return -EINVAL;
3006                break;
3007        case V4L2_CTRL_TYPE_INTEGER_MENU:
3008                if (ctrl->qmenu_int == NULL)
3009                        return -EINVAL;
3010                break;
3011        default:
3012                return -EINVAL;
3013        }
3014
3015        if (i < ctrl->minimum || i > ctrl->maximum)
3016                return -EINVAL;
3017
3018        /* Use mask to see if this menu item should be skipped */
3019        if (ctrl->menu_skip_mask & (1ULL << i))
3020                return -EINVAL;
3021        /* Empty menu items should also be skipped */
3022        if (ctrl->type == V4L2_CTRL_TYPE_MENU) {
3023                if (ctrl->qmenu[i] == NULL || ctrl->qmenu[i][0] == '\0')
3024                        return -EINVAL;
3025                strscpy(qm->name, ctrl->qmenu[i], sizeof(qm->name));
3026        } else {
3027                qm->value = ctrl->qmenu_int[i];
3028        }
3029        return 0;
3030}
3031EXPORT_SYMBOL(v4l2_querymenu);
3032
3033static int v4l2_ctrl_request_clone(struct v4l2_ctrl_handler *hdl,
3034                                   const struct v4l2_ctrl_handler *from)
3035{
3036        struct v4l2_ctrl_ref *ref;
3037        int err = 0;
3038
3039        if (WARN_ON(!hdl || hdl == from))
3040                return -EINVAL;
3041
3042        if (hdl->error)
3043                return hdl->error;
3044
3045        WARN_ON(hdl->lock != &hdl->_lock);
3046
3047        mutex_lock(from->lock);
3048        list_for_each_entry(ref, &from->ctrl_refs, node) {
3049                struct v4l2_ctrl *ctrl = ref->ctrl;
3050                struct v4l2_ctrl_ref *new_ref;
3051
3052                /* Skip refs inherited from other devices */
3053                if (ref->from_other_dev)
3054                        continue;
3055                /* And buttons */
3056                if (ctrl->type == V4L2_CTRL_TYPE_BUTTON)
3057                        continue;
3058                err = handler_new_ref(hdl, ctrl, &new_ref, false, true);
3059                if (err)
3060                        break;
3061        }
3062        mutex_unlock(from->lock);
3063        return err;
3064}
3065
3066static void v4l2_ctrl_request_queue(struct media_request_object *obj)
3067{
3068        struct v4l2_ctrl_handler *hdl =
3069                container_of(obj, struct v4l2_ctrl_handler, req_obj);
3070        struct v4l2_ctrl_handler *main_hdl = obj->priv;
3071        struct v4l2_ctrl_handler *prev_hdl = NULL;
3072        struct v4l2_ctrl_ref *ref_ctrl, *ref_ctrl_prev = NULL;
3073
3074        if (list_empty(&main_hdl->requests_queued))
3075                goto queue;
3076
3077        prev_hdl = list_last_entry(&main_hdl->requests_queued,
3078                                   struct v4l2_ctrl_handler, requests_queued);
3079        /*
3080         * Note: prev_hdl and hdl must contain the same list of control
3081         * references, so if any differences are detected then that is a
3082         * driver bug and the WARN_ON is triggered.
3083         */
3084        mutex_lock(prev_hdl->lock);
3085        ref_ctrl_prev = list_first_entry(&prev_hdl->ctrl_refs,
3086                                         struct v4l2_ctrl_ref, node);
3087        list_for_each_entry(ref_ctrl, &hdl->ctrl_refs, node) {
3088                if (ref_ctrl->req)
3089                        continue;
3090                while (ref_ctrl_prev->ctrl->id < ref_ctrl->ctrl->id) {
3091                        /* Should never happen, but just in case... */
3092                        if (list_is_last(&ref_ctrl_prev->node,
3093                                         &prev_hdl->ctrl_refs))
3094                                break;
3095                        ref_ctrl_prev = list_next_entry(ref_ctrl_prev, node);
3096                }
3097                if (WARN_ON(ref_ctrl_prev->ctrl->id != ref_ctrl->ctrl->id))
3098                        break;
3099                ref_ctrl->req = ref_ctrl_prev->req;
3100        }
3101        mutex_unlock(prev_hdl->lock);
3102queue:
3103        list_add_tail(&hdl->requests_queued, &main_hdl->requests_queued);
3104        hdl->request_is_queued = true;
3105}
3106
3107static void v4l2_ctrl_request_unbind(struct media_request_object *obj)
3108{
3109        struct v4l2_ctrl_handler *hdl =
3110                container_of(obj, struct v4l2_ctrl_handler, req_obj);
3111
3112        list_del_init(&hdl->requests);
3113        if (hdl->request_is_queued) {
3114                list_del_init(&hdl->requests_queued);
3115                hdl->request_is_queued = false;
3116        }
3117}
3118
3119static void v4l2_ctrl_request_release(struct media_request_object *obj)
3120{
3121        struct v4l2_ctrl_handler *hdl =
3122                container_of(obj, struct v4l2_ctrl_handler, req_obj);
3123
3124        v4l2_ctrl_handler_free(hdl);
3125        kfree(hdl);
3126}
3127
3128static const struct media_request_object_ops req_ops = {
3129        .queue = v4l2_ctrl_request_queue,
3130        .unbind = v4l2_ctrl_request_unbind,
3131        .release = v4l2_ctrl_request_release,
3132};
3133
3134struct v4l2_ctrl_handler *v4l2_ctrl_request_hdl_find(struct media_request *req,
3135                                        struct v4l2_ctrl_handler *parent)
3136{
3137        struct media_request_object *obj;
3138
3139        if (WARN_ON(req->state != MEDIA_REQUEST_STATE_VALIDATING &&
3140                    req->state != MEDIA_REQUEST_STATE_QUEUED))
3141                return NULL;
3142
3143        obj = media_request_object_find(req, &req_ops, parent);
3144        if (obj)
3145                return container_of(obj, struct v4l2_ctrl_handler, req_obj);
3146        return NULL;
3147}
3148EXPORT_SYMBOL_GPL(v4l2_ctrl_request_hdl_find);
3149
3150struct v4l2_ctrl *
3151v4l2_ctrl_request_hdl_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
3152{
3153        struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
3154
3155        return (ref && ref->req == ref) ? ref->ctrl : NULL;
3156}
3157EXPORT_SYMBOL_GPL(v4l2_ctrl_request_hdl_ctrl_find);
3158
3159static int v4l2_ctrl_request_bind(struct media_request *req,
3160                           struct v4l2_ctrl_handler *hdl,
3161                           struct v4l2_ctrl_handler *from)
3162{
3163        int ret;
3164
3165        ret = v4l2_ctrl_request_clone(hdl, from);
3166
3167        if (!ret) {
3168                ret = media_request_object_bind(req, &req_ops,
3169                                                from, false, &hdl->req_obj);
3170                if (!ret)
3171                        list_add_tail(&hdl->requests, &from->requests);
3172        }
3173        return ret;
3174}
3175
3176/* Some general notes on the atomic requirements of VIDIOC_G/TRY/S_EXT_CTRLS:
3177
3178   It is not a fully atomic operation, just best-effort only. After all, if
3179   multiple controls have to be set through multiple i2c writes (for example)
3180   then some initial writes may succeed while others fail. Thus leaving the
3181   system in an inconsistent state. The question is how much effort you are
3182   willing to spend on trying to make something atomic that really isn't.
3183
3184   From the point of view of an application the main requirement is that
3185   when you call VIDIOC_S_EXT_CTRLS and some values are invalid then an
3186   error should be returned without actually affecting any controls.
3187
3188   If all the values are correct, then it is acceptable to just give up
3189   in case of low-level errors.
3190
3191   It is important though that the application can tell when only a partial
3192   configuration was done. The way we do that is through the error_idx field
3193   of struct v4l2_ext_controls: if that is equal to the count field then no
3194   controls were affected. Otherwise all controls before that index were
3195   successful in performing their 'get' or 'set' operation, the control at
3196   the given index failed, and you don't know what happened with the controls
3197   after the failed one. Since if they were part of a control cluster they
3198   could have been successfully processed (if a cluster member was encountered
3199   at index < error_idx), they could have failed (if a cluster member was at
3200   error_idx), or they may not have been processed yet (if the first cluster
3201   member appeared after error_idx).
3202
3203   It is all fairly theoretical, though. In practice all you can do is to
3204   bail out. If error_idx == count, then it is an application bug. If
3205   error_idx < count then it is only an application bug if the error code was
3206   EBUSY. That usually means that something started streaming just when you
3207   tried to set the controls. In all other cases it is a driver/hardware
3208   problem and all you can do is to retry or bail out.
3209
3210   Note that these rules do not apply to VIDIOC_TRY_EXT_CTRLS: since that
3211   never modifies controls the error_idx is just set to whatever control
3212   has an invalid value.
3213 */
3214
3215/* Prepare for the extended g/s/try functions.
3216   Find the controls in the control array and do some basic checks. */
3217static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
3218                             struct v4l2_ext_controls *cs,
3219                             struct v4l2_ctrl_helper *helpers,
3220                             bool get)
3221{
3222        struct v4l2_ctrl_helper *h;
3223        bool have_clusters = false;
3224        u32 i;
3225
3226        for (i = 0, h = helpers; i < cs->count; i++, h++) {
3227                struct v4l2_ext_control *c = &cs->controls[i];
3228                struct v4l2_ctrl_ref *ref;
3229                struct v4l2_ctrl *ctrl;
3230                u32 id = c->id & V4L2_CTRL_ID_MASK;
3231
3232                cs->error_idx = i;
3233
3234                if (cs->which &&
3235                    cs->which != V4L2_CTRL_WHICH_DEF_VAL &&
3236                    cs->which != V4L2_CTRL_WHICH_REQUEST_VAL &&
3237                    V4L2_CTRL_ID2WHICH(id) != cs->which)
3238                        return -EINVAL;
3239
3240                /* Old-style private controls are not allowed for
3241                   extended controls */
3242                if (id >= V4L2_CID_PRIVATE_BASE)
3243                        return -EINVAL;
3244                ref = find_ref_lock(hdl, id);
3245                if (ref == NULL)
3246                        return -EINVAL;
3247                h->ref = ref;
3248                ctrl = ref->ctrl;
3249                if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED)
3250                        return -EINVAL;
3251
3252                if (ctrl->cluster[0]->ncontrols > 1)
3253                        have_clusters = true;
3254                if (ctrl->cluster[0] != ctrl)
3255                        ref = find_ref_lock(hdl, ctrl->cluster[0]->id);
3256                if (ctrl->is_ptr && !ctrl->is_string) {
3257                        unsigned tot_size = ctrl->elems * ctrl->elem_size;
3258
3259                        if (c->size < tot_size) {
3260                                if (get) {
3261                                        c->size = tot_size;
3262                                        return -ENOSPC;
3263                                }
3264                                return -EFAULT;
3265                        }
3266                        c->size = tot_size;
3267                }
3268                /* Store the ref to the master control of the cluster */
3269                h->mref = ref;
3270                /* Initially set next to 0, meaning that there is no other
3271                   control in this helper array belonging to the same
3272                   cluster */
3273                h->next = 0;
3274        }
3275
3276        /* We are done if there were no controls that belong to a multi-
3277           control cluster. */
3278        if (!have_clusters)
3279                return 0;
3280
3281        /* The code below figures out in O(n) time which controls in the list
3282           belong to the same cluster. */
3283
3284        /* This has to be done with the handler lock taken. */
3285        mutex_lock(hdl->lock);
3286
3287        /* First zero the helper field in the master control references */
3288        for (i = 0; i < cs->count; i++)
3289                helpers[i].mref->helper = NULL;
3290        for (i = 0, h = helpers; i < cs->count; i++, h++) {
3291                struct v4l2_ctrl_ref *mref = h->mref;
3292
3293                /* If the mref->helper is set, then it points to an earlier
3294                   helper that belongs to the same cluster. */
3295                if (mref->helper) {
3296                        /* Set the next field of mref->helper to the current
3297                           index: this means that that earlier helper now
3298                           points to the next helper in the same cluster. */
3299                        mref->helper->next = i;
3300                        /* mref should be set only for the first helper in the
3301                           cluster, clear the others. */
3302                        h->mref = NULL;
3303                }
3304                /* Point the mref helper to the current helper struct. */
3305                mref->helper = h;
3306        }
3307        mutex_unlock(hdl->lock);
3308        return 0;
3309}
3310
3311/* Handles the corner case where cs->count == 0. It checks whether the
3312   specified control class exists. If that class ID is 0, then it checks
3313   whether there are any controls at all. */
3314static int class_check(struct v4l2_ctrl_handler *hdl, u32 which)
3315{
3316        if (which == 0 || which == V4L2_CTRL_WHICH_DEF_VAL ||
3317            which == V4L2_CTRL_WHICH_REQUEST_VAL)
3318                return 0;
3319        return find_ref_lock(hdl, which | 1) ? 0 : -EINVAL;
3320}
3321
3322/* Get extended controls. Allocates the helpers array if needed. */
3323static int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *hdl,
3324                                   struct v4l2_ext_controls *cs)
3325{
3326        struct v4l2_ctrl_helper helper[4];
3327        struct v4l2_ctrl_helper *helpers = helper;
3328        int ret;
3329        int i, j;
3330        bool def_value;
3331
3332        def_value = (cs->which == V4L2_CTRL_WHICH_DEF_VAL);
3333
3334        cs->error_idx = cs->count;
3335        cs->which = V4L2_CTRL_ID2WHICH(cs->which);
3336
3337        if (hdl == NULL)
3338                return -EINVAL;
3339
3340        if (cs->count == 0)
3341                return class_check(hdl, cs->which);
3342
3343        if (cs->count > ARRAY_SIZE(helper)) {
3344                helpers = kvmalloc_array(cs->count, sizeof(helper[0]),
3345                                         GFP_KERNEL);
3346                if (helpers == NULL)
3347                        return -ENOMEM;
3348        }
3349
3350        ret = prepare_ext_ctrls(hdl, cs, helpers, true);
3351        cs->error_idx = cs->count;
3352
3353        for (i = 0; !ret && i < cs->count; i++)
3354                if (helpers[i].ref->ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
3355                        ret = -EACCES;
3356
3357        for (i = 0; !ret && i < cs->count; i++) {
3358                int (*ctrl_to_user)(struct v4l2_ext_control *c,
3359                                    struct v4l2_ctrl *ctrl);
3360                struct v4l2_ctrl *master;
3361
3362                ctrl_to_user = def_value ? def_to_user : cur_to_user;
3363
3364                if (helpers[i].mref == NULL)
3365                        continue;
3366
3367                master = helpers[i].mref->ctrl;
3368                cs->error_idx = i;
3369
3370                v4l2_ctrl_lock(master);
3371
3372                /* g_volatile_ctrl will update the new control values */
3373                if (!def_value &&
3374                    ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
3375                    (master->has_volatiles && !is_cur_manual(master)))) {
3376                        for (j = 0; j < master->ncontrols; j++)
3377                                cur_to_new(master->cluster[j]);
3378                        ret = call_op(master, g_volatile_ctrl);
3379                        ctrl_to_user = new_to_user;
3380                }
3381                /* If OK, then copy the current (for non-volatile controls)
3382                   or the new (for volatile controls) control values to the
3383                   caller */
3384                if (!ret) {
3385                        u32 idx = i;
3386
3387                        do {
3388                                if (helpers[idx].ref->req)
3389                                        ret = req_to_user(cs->controls + idx,
3390                                                helpers[idx].ref->req);
3391                                else
3392                                        ret = ctrl_to_user(cs->controls + idx,
3393                                                helpers[idx].ref->ctrl);
3394                                idx = helpers[idx].next;
3395                        } while (!ret && idx);
3396                }
3397                v4l2_ctrl_unlock(master);
3398        }
3399
3400        if (cs->count > ARRAY_SIZE(helper))
3401                kvfree(helpers);
3402        return ret;
3403}
3404
3405static struct media_request_object *
3406v4l2_ctrls_find_req_obj(struct v4l2_ctrl_handler *hdl,
3407                        struct media_request *req, bool set)
3408{
3409        struct media_request_object *obj;
3410        struct v4l2_ctrl_handler *new_hdl;
3411        int ret;
3412
3413        if (IS_ERR(req))
3414                return ERR_CAST(req);
3415
3416        if (set && WARN_ON(req->state != MEDIA_REQUEST_STATE_UPDATING))
3417                return ERR_PTR(-EBUSY);
3418
3419        obj = media_request_object_find(req, &req_ops, hdl);
3420        if (obj)
3421                return obj;
3422        if (!set)
3423                return ERR_PTR(-ENOENT);
3424
3425        new_hdl = kzalloc(sizeof(*new_hdl), GFP_KERNEL);
3426        if (!new_hdl)
3427                return ERR_PTR(-ENOMEM);
3428
3429        obj = &new_hdl->req_obj;
3430        ret = v4l2_ctrl_handler_init(new_hdl, (hdl->nr_of_buckets - 1) * 8);
3431        if (!ret)
3432                ret = v4l2_ctrl_request_bind(req, new_hdl, hdl);
3433        if (ret) {
3434                kfree(new_hdl);
3435
3436                return ERR_PTR(ret);
3437        }
3438
3439        media_request_object_get(obj);
3440        return obj;
3441}
3442
3443int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
3444                     struct v4l2_ext_controls *cs)
3445{
3446        struct media_request_object *obj = NULL;
3447        struct media_request *req = NULL;
3448        int ret;
3449
3450        if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL) {
3451                if (!mdev || cs->request_fd < 0)
3452                        return -EINVAL;
3453
3454                req = media_request_get_by_fd(mdev, cs->request_fd);
3455                if (IS_ERR(req))
3456                        return PTR_ERR(req);
3457
3458                if (req->state != MEDIA_REQUEST_STATE_COMPLETE) {
3459                        media_request_put(req);
3460                        return -EACCES;
3461                }
3462
3463                ret = media_request_lock_for_access(req);
3464                if (ret) {
3465                        media_request_put(req);
3466                        return ret;
3467                }
3468
3469                obj = v4l2_ctrls_find_req_obj(hdl, req, false);
3470                if (IS_ERR(obj)) {
3471                        media_request_unlock_for_access(req);
3472                        media_request_put(req);
3473                        return PTR_ERR(obj);
3474                }
3475
3476                hdl = container_of(obj, struct v4l2_ctrl_handler,
3477                                   req_obj);
3478        }
3479
3480        ret = v4l2_g_ext_ctrls_common(hdl, cs);
3481
3482        if (obj) {
3483                media_request_unlock_for_access(req);
3484                media_request_object_put(obj);
3485                media_request_put(req);
3486        }
3487        return ret;
3488}
3489EXPORT_SYMBOL(v4l2_g_ext_ctrls);
3490
3491/* Helper function to get a single control */
3492static int get_ctrl(struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
3493{
3494        struct v4l2_ctrl *master = ctrl->cluster[0];
3495        int ret = 0;
3496        int i;
3497
3498        /* Compound controls are not supported. The new_to_user() and
3499         * cur_to_user() calls below would need to be modified not to access
3500         * userspace memory when called from get_ctrl().
3501         */
3502        if (!ctrl->is_int && ctrl->type != V4L2_CTRL_TYPE_INTEGER64)
3503                return -EINVAL;
3504
3505        if (ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
3506                return -EACCES;
3507
3508        v4l2_ctrl_lock(master);
3509        /* g_volatile_ctrl will update the current control values */
3510        if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
3511                for (i = 0; i < master->ncontrols; i++)
3512                        cur_to_new(master->cluster[i]);
3513                ret = call_op(master, g_volatile_ctrl);
3514                new_to_user(c, ctrl);
3515        } else {
3516                cur_to_user(c, ctrl);
3517        }
3518        v4l2_ctrl_unlock(master);
3519        return ret;
3520}
3521
3522int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
3523{
3524        struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
3525        struct v4l2_ext_control c;
3526        int ret;
3527
3528        if (ctrl == NULL || !ctrl->is_int)
3529                return -EINVAL;
3530        ret = get_ctrl(ctrl, &c);
3531        control->value = c.value;
3532        return ret;
3533}
3534EXPORT_SYMBOL(v4l2_g_ctrl);
3535
3536s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
3537{
3538        struct v4l2_ext_control c;
3539
3540        /* It's a driver bug if this happens. */
3541        WARN_ON(!ctrl->is_int);
3542        c.value = 0;
3543        get_ctrl(ctrl, &c);
3544        return c.value;
3545}
3546EXPORT_SYMBOL(v4l2_ctrl_g_ctrl);
3547
3548s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl)
3549{
3550        struct v4l2_ext_control c;
3551
3552        /* It's a driver bug if this happens. */
3553        WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
3554        c.value64 = 0;
3555        get_ctrl(ctrl, &c);
3556        return c.value64;
3557}
3558EXPORT_SYMBOL(v4l2_ctrl_g_ctrl_int64);
3559
3560
3561/* Core function that calls try/s_ctrl and ensures that the new value is
3562   copied to the current value on a set.
3563   Must be called with ctrl->handler->lock held. */
3564static int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,
3565                              bool set, u32 ch_flags)
3566{
3567        bool update_flag;
3568        int ret;
3569        int i;
3570
3571        /* Go through the cluster and either validate the new value or
3572           (if no new value was set), copy the current value to the new
3573           value, ensuring a consistent view for the control ops when
3574           called. */
3575        for (i = 0; i < master->ncontrols; i++) {
3576                struct v4l2_ctrl *ctrl = master->cluster[i];
3577
3578                if (ctrl == NULL)
3579                        continue;
3580
3581                if (!ctrl->is_new) {
3582                        cur_to_new(ctrl);
3583                        continue;
3584                }
3585                /* Check again: it may have changed since the
3586                   previous check in try_or_set_ext_ctrls(). */
3587                if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
3588                        return -EBUSY;
3589        }
3590
3591        ret = call_op(master, try_ctrl);
3592
3593        /* Don't set if there is no change */
3594        if (ret || !set || !cluster_changed(master))
3595                return ret;
3596        ret = call_op(master, s_ctrl);
3597        if (ret)
3598                return ret;
3599
3600        /* If OK, then make the new values permanent. */
3601        update_flag = is_cur_manual(master) != is_new_manual(master);
3602
3603        for (i = 0; i < master->ncontrols; i++) {
3604                /*
3605                 * If we switch from auto to manual mode, and this cluster
3606                 * contains volatile controls, then all non-master controls
3607                 * have to be marked as changed. The 'new' value contains
3608                 * the volatile value (obtained by update_from_auto_cluster),
3609                 * which now has to become the current value.
3610                 */
3611                if (i && update_flag && is_new_manual(master) &&
3612                    master->has_volatiles && master->cluster[i])
3613                        master->cluster[i]->has_changed = true;
3614
3615                new_to_cur(fh, master->cluster[i], ch_flags |
3616                        ((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
3617        }
3618        return 0;
3619}
3620
3621/* Validate controls. */
3622static int validate_ctrls(struct v4l2_ext_controls *cs,
3623                          struct v4l2_ctrl_helper *helpers, bool set)
3624{
3625        unsigned i;
3626        int ret = 0;
3627
3628        cs->error_idx = cs->count;
3629        for (i = 0; i < cs->count; i++) {
3630                struct v4l2_ctrl *ctrl = helpers[i].ref->ctrl;
3631                union v4l2_ctrl_ptr p_new;
3632
3633                cs->error_idx = i;
3634
3635                if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
3636                        return -EACCES;
3637                /* This test is also done in try_set_control_cluster() which
3638                   is called in atomic context, so that has the final say,
3639                   but it makes sense to do an up-front check as well. Once
3640                   an error occurs in try_set_control_cluster() some other
3641                   controls may have been set already and we want to do a
3642                   best-effort to avoid that. */
3643                if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
3644                        return -EBUSY;
3645                /*
3646                 * Skip validation for now if the payload needs to be copied
3647                 * from userspace into kernelspace. We'll validate those later.
3648                 */
3649                if (ctrl->is_ptr)
3650                        continue;
3651                if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
3652                        p_new.p_s64 = &cs->controls[i].value64;
3653                else
3654                        p_new.p_s32 = &cs->controls[i].value;
3655                ret = validate_new(ctrl, p_new);
3656                if (ret)
3657                        return ret;
3658        }
3659        return 0;
3660}
3661
3662/* Obtain the current volatile values of an autocluster and mark them
3663   as new. */
3664static void update_from_auto_cluster(struct v4l2_ctrl *master)
3665{
3666        int i;
3667
3668        for (i = 1; i < master->ncontrols; i++)
3669                cur_to_new(master->cluster[i]);
3670        if (!call_op(master, g_volatile_ctrl))
3671                for (i = 1; i < master->ncontrols; i++)
3672                        if (master->cluster[i])
3673                                master->cluster[i]->is_new = 1;
3674}
3675
3676/* Try or try-and-set controls */
3677static int try_set_ext_ctrls_common(struct v4l2_fh *fh,
3678                                    struct v4l2_ctrl_handler *hdl,
3679                                    struct v4l2_ext_controls *cs, bool set)
3680{
3681        struct v4l2_ctrl_helper helper[4];
3682        struct v4l2_ctrl_helper *helpers = helper;
3683        unsigned i, j;
3684        int ret;
3685
3686        cs->error_idx = cs->count;
3687
3688        /* Default value cannot be changed */
3689        if (cs->which == V4L2_CTRL_WHICH_DEF_VAL)
3690                return -EINVAL;
3691
3692        cs->which = V4L2_CTRL_ID2WHICH(cs->which);
3693
3694        if (hdl == NULL)
3695                return -EINVAL;
3696
3697        if (cs->count == 0)
3698                return class_check(hdl, cs->which);
3699
3700        if (cs->count > ARRAY_SIZE(helper)) {
3701                helpers = kvmalloc_array(cs->count, sizeof(helper[0]),
3702                                         GFP_KERNEL);
3703                if (!helpers)
3704                        return -ENOMEM;
3705        }
3706        ret = prepare_ext_ctrls(hdl, cs, helpers, false);
3707        if (!ret)
3708                ret = validate_ctrls(cs, helpers, set);
3709        if (ret && set)
3710                cs->error_idx = cs->count;
3711        for (i = 0; !ret && i < cs->count; i++) {
3712                struct v4l2_ctrl *master;
3713                u32 idx = i;
3714
3715                if (helpers[i].mref == NULL)
3716                        continue;
3717
3718                cs->error_idx = i;
3719                master = helpers[i].mref->ctrl;
3720                v4l2_ctrl_lock(master);
3721
3722                /* Reset the 'is_new' flags of the cluster */
3723                for (j = 0; j < master->ncontrols; j++)
3724                        if (master->cluster[j])
3725                                master->cluster[j]->is_new = 0;
3726
3727                /* For volatile autoclusters that are currently in auto mode
3728                   we need to discover if it will be set to manual mode.
3729                   If so, then we have to copy the current volatile values
3730                   first since those will become the new manual values (which
3731                   may be overwritten by explicit new values from this set
3732                   of controls). */
3733                if (master->is_auto && master->has_volatiles &&
3734                                                !is_cur_manual(master)) {
3735                        /* Pick an initial non-manual value */
3736                        s32 new_auto_val = master->manual_mode_value + 1;
3737                        u32 tmp_idx = idx;
3738
3739                        do {
3740                                /* Check if the auto control is part of the
3741                                   list, and remember the new value. */
3742                                if (helpers[tmp_idx].ref->ctrl == master)
3743                                        new_auto_val = cs->controls[tmp_idx].value;
3744                                tmp_idx = helpers[tmp_idx].next;
3745                        } while (tmp_idx);
3746                        /* If the new value == the manual value, then copy
3747                           the current volatile values. */
3748                        if (new_auto_val == master->manual_mode_value)
3749                                update_from_auto_cluster(master);
3750                }
3751
3752                /* Copy the new caller-supplied control values.
3753                   user_to_new() sets 'is_new' to 1. */
3754                do {
3755                        struct v4l2_ctrl *ctrl = helpers[idx].ref->ctrl;
3756
3757                        ret = user_to_new(cs->controls + idx, ctrl);
3758                        if (!ret && ctrl->is_ptr)
3759                                ret = validate_new(ctrl, ctrl->p_new);
3760                        idx = helpers[idx].next;
3761                } while (!ret && idx);
3762
3763                if (!ret)
3764                        ret = try_or_set_cluster(fh, master,
3765                                                 !hdl->req_obj.req && set, 0);
3766                if (!ret && hdl->req_obj.req && set) {
3767                        for (j = 0; j < master->ncontrols; j++) {
3768                                struct v4l2_ctrl_ref *ref =
3769                                        find_ref(hdl, master->cluster[j]->id);
3770
3771                                new_to_req(ref);
3772                        }
3773                }
3774
3775                /* Copy the new values back to userspace. */
3776                if (!ret) {
3777                        idx = i;
3778                        do {
3779                                ret = new_to_user(cs->controls + idx,
3780                                                helpers[idx].ref->ctrl);
3781                                idx = helpers[idx].next;
3782                        } while (!ret && idx);
3783                }
3784                v4l2_ctrl_unlock(master);
3785        }
3786
3787        if (cs->count > ARRAY_SIZE(helper))
3788                kvfree(helpers);
3789        return ret;
3790}
3791
3792static int try_set_ext_ctrls(struct v4l2_fh *fh,
3793                             struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
3794                             struct v4l2_ext_controls *cs, bool set)
3795{
3796        struct media_request_object *obj = NULL;
3797        struct media_request *req = NULL;
3798        int ret;
3799
3800        if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL) {
3801                if (!mdev || cs->request_fd < 0)
3802                        return -EINVAL;
3803
3804                req = media_request_get_by_fd(mdev, cs->request_fd);
3805                if (IS_ERR(req))
3806                        return PTR_ERR(req);
3807
3808                ret = media_request_lock_for_update(req);
3809                if (ret) {
3810                        media_request_put(req);
3811                        return ret;
3812                }
3813
3814                obj = v4l2_ctrls_find_req_obj(hdl, req, set);
3815                if (IS_ERR(obj)) {
3816                        media_request_unlock_for_update(req);
3817                        media_request_put(req);
3818                        return PTR_ERR(obj);
3819                }
3820                hdl = container_of(obj, struct v4l2_ctrl_handler,
3821                                   req_obj);
3822        }
3823
3824        ret = try_set_ext_ctrls_common(fh, hdl, cs, set);
3825
3826        if (obj) {
3827                media_request_unlock_for_update(req);
3828                media_request_object_put(obj);
3829                media_request_put(req);
3830        }
3831
3832        return ret;
3833}
3834
3835int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct media_device *mdev,
3836                       struct v4l2_ext_controls *cs)
3837{
3838        return try_set_ext_ctrls(NULL, hdl, mdev, cs, false);
3839}
3840EXPORT_SYMBOL(v4l2_try_ext_ctrls);
3841
3842int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
3843                     struct media_device *mdev, struct v4l2_ext_controls *cs)
3844{
3845        return try_set_ext_ctrls(fh, hdl, mdev, cs, true);
3846}
3847EXPORT_SYMBOL(v4l2_s_ext_ctrls);
3848
3849/* Helper function for VIDIOC_S_CTRL compatibility */
3850static int set_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
3851{
3852        struct v4l2_ctrl *master = ctrl->cluster[0];
3853        int ret;
3854        int i;
3855
3856        /* Reset the 'is_new' flags of the cluster */
3857        for (i = 0; i < master->ncontrols; i++)
3858                if (master->cluster[i])
3859                        master->cluster[i]->is_new = 0;
3860
3861        ret = validate_new(ctrl, ctrl->p_new);
3862        if (ret)
3863                return ret;
3864
3865        /* For autoclusters with volatiles that are switched from auto to
3866           manual mode we have to update the current volatile values since
3867           those will become the initial manual values after such a switch. */
3868        if (master->is_auto && master->has_volatiles && ctrl == master &&
3869            !is_cur_manual(master) && ctrl->val == master->manual_mode_value)
3870                update_from_auto_cluster(master);
3871
3872        ctrl->is_new = 1;
3873        return try_or_set_cluster(fh, master, true, ch_flags);
3874}
3875
3876/* Helper function for VIDIOC_S_CTRL compatibility */
3877static int set_ctrl_lock(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
3878                         struct v4l2_ext_control *c)
3879{
3880        int ret;
3881
3882        v4l2_ctrl_lock(ctrl);
3883        user_to_new(c, ctrl);
3884        ret = set_ctrl(fh, ctrl, 0);
3885        if (!ret)
3886                cur_to_user(c, ctrl);
3887        v4l2_ctrl_unlock(ctrl);
3888        return ret;
3889}
3890
3891int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
3892                                        struct v4l2_control *control)
3893{
3894        struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
3895        struct v4l2_ext_control c = { control->id };
3896        int ret;
3897
3898        if (ctrl == NULL || !ctrl->is_int)
3899                return -EINVAL;
3900
3901        if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
3902                return -EACCES;
3903
3904        c.value = control->value;
3905        ret = set_ctrl_lock(fh, ctrl, &c);
3906        control->value = c.value;
3907        return ret;
3908}
3909EXPORT_SYMBOL(v4l2_s_ctrl);
3910
3911int __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
3912{
3913        lockdep_assert_held(ctrl->handler->lock);
3914
3915        /* It's a driver bug if this happens. */
3916        WARN_ON(!ctrl->is_int);
3917        ctrl->val = val;
3918        return set_ctrl(NULL, ctrl, 0);
3919}
3920EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl);
3921
3922int __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val)
3923{
3924        lockdep_assert_held(ctrl->handler->lock);
3925
3926        /* It's a driver bug if this happens. */
3927        WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
3928        *ctrl->p_new.p_s64 = val;
3929        return set_ctrl(NULL, ctrl, 0);
3930}
3931EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_int64);
3932
3933int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
3934{
3935        lockdep_assert_held(ctrl->handler->lock);
3936
3937        /* It's a driver bug if this happens. */
3938        WARN_ON(ctrl->type != V4L2_CTRL_TYPE_STRING);
3939        strscpy(ctrl->p_new.p_char, s, ctrl->maximum + 1);
3940        return set_ctrl(NULL, ctrl, 0);
3941}
3942EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
3943
3944void v4l2_ctrl_request_complete(struct media_request *req,
3945                                struct v4l2_ctrl_handler *main_hdl)
3946{
3947        struct media_request_object *obj;
3948        struct v4l2_ctrl_handler *hdl;
3949        struct v4l2_ctrl_ref *ref;
3950
3951        if (!req || !main_hdl)
3952                return;
3953
3954        /*
3955         * Note that it is valid if nothing was found. It means
3956         * that this request doesn't have any controls and so just
3957         * wants to leave the controls unchanged.
3958         */
3959        obj = media_request_object_find(req, &req_ops, main_hdl);
3960        if (!obj)
3961                return;
3962        hdl = container_of(obj, struct v4l2_ctrl_handler, req_obj);
3963
3964        list_for_each_entry(ref, &hdl->ctrl_refs, node) {
3965                struct v4l2_ctrl *ctrl = ref->ctrl;
3966                struct v4l2_ctrl *master = ctrl->cluster[0];
3967                unsigned int i;
3968
3969                if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
3970                        ref->req = ref;
3971
3972                        v4l2_ctrl_lock(master);
3973                        /* g_volatile_ctrl will update the current control values */
3974                        for (i = 0; i < master->ncontrols; i++)
3975                                cur_to_new(master->cluster[i]);
3976                        call_op(master, g_volatile_ctrl);
3977                        new_to_req(ref);
3978                        v4l2_ctrl_unlock(master);
3979                        continue;
3980                }
3981                if (ref->req == ref)
3982                        continue;
3983
3984                v4l2_ctrl_lock(ctrl);
3985                if (ref->req)
3986                        ptr_to_ptr(ctrl, ref->req->p_req, ref->p_req);
3987                else
3988                        ptr_to_ptr(ctrl, ctrl->p_cur, ref->p_req);
3989                v4l2_ctrl_unlock(ctrl);
3990        }
3991
3992        WARN_ON(!hdl->request_is_queued);
3993        list_del_init(&hdl->requests_queued);
3994        hdl->request_is_queued = false;
3995        media_request_object_complete(obj);
3996        media_request_object_put(obj);
3997}
3998EXPORT_SYMBOL(v4l2_ctrl_request_complete);
3999
4000int v4l2_ctrl_request_setup(struct media_request *req,
4001                             struct v4l2_ctrl_handler *main_hdl)
4002{
4003        struct media_request_object *obj;
4004        struct v4l2_ctrl_handler *hdl;
4005        struct v4l2_ctrl_ref *ref;
4006        int ret = 0;
4007
4008        if (!req || !main_hdl)
4009                return 0;
4010
4011        if (WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED))
4012                return -EBUSY;
4013
4014        /*
4015         * Note that it is valid if nothing was found. It means
4016         * that this request doesn't have any controls and so just
4017         * wants to leave the controls unchanged.
4018         */
4019        obj = media_request_object_find(req, &req_ops, main_hdl);
4020        if (!obj)
4021                return 0;
4022        if (obj->completed) {
4023                media_request_object_put(obj);
4024                return -EBUSY;
4025        }
4026        hdl = container_of(obj, struct v4l2_ctrl_handler, req_obj);
4027
4028        list_for_each_entry(ref, &hdl->ctrl_refs, node)
4029                ref->req_done = false;
4030
4031        list_for_each_entry(ref, &hdl->ctrl_refs, node) {
4032                struct v4l2_ctrl *ctrl = ref->ctrl;
4033                struct v4l2_ctrl *master = ctrl->cluster[0];
4034                bool have_new_data = false;
4035                int i;
4036
4037                /*
4038                 * Skip if this control was already handled by a cluster.
4039                 * Skip button controls and read-only controls.
4040                 */
4041                if (ref->req_done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
4042                    (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
4043                        continue;
4044
4045                v4l2_ctrl_lock(master);
4046                for (i = 0; i < master->ncontrols; i++) {
4047                        if (master->cluster[i]) {
4048                                struct v4l2_ctrl_ref *r =
4049                                        find_ref(hdl, master->cluster[i]->id);
4050
4051                                if (r->req && r == r->req) {
4052                                        have_new_data = true;
4053                                        break;
4054                                }
4055                        }
4056                }
4057                if (!have_new_data) {
4058                        v4l2_ctrl_unlock(master);
4059                        continue;
4060                }
4061
4062                for (i = 0; i < master->ncontrols; i++) {
4063                        if (master->cluster[i]) {
4064                                struct v4l2_ctrl_ref *r =
4065                                        find_ref(hdl, master->cluster[i]->id);
4066
4067                                req_to_new(r);
4068                                master->cluster[i]->is_new = 1;
4069                                r->req_done = true;
4070                        }
4071                }
4072                /*
4073                 * For volatile autoclusters that are currently in auto mode
4074                 * we need to discover if it will be set to manual mode.
4075                 * If so, then we have to copy the current volatile values
4076                 * first since those will become the new manual values (which
4077                 * may be overwritten by explicit new values from this set
4078                 * of controls).
4079                 */
4080                if (master->is_auto && master->has_volatiles &&
4081                    !is_cur_manual(master)) {
4082                        s32 new_auto_val = *master->p_new.p_s32;
4083
4084                        /*
4085                         * If the new value == the manual value, then copy
4086                         * the current volatile values.
4087                         */
4088                        if (new_auto_val == master->manual_mode_value)
4089                                update_from_auto_cluster(master);
4090                }
4091
4092                ret = try_or_set_cluster(NULL, master, true, 0);
4093                v4l2_ctrl_unlock(master);
4094
4095                if (ret)
4096                        break;
4097        }
4098
4099        media_request_object_put(obj);
4100        return ret;
4101}
4102EXPORT_SYMBOL(v4l2_ctrl_request_setup);
4103
4104void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv)
4105{
4106        if (ctrl == NULL)
4107                return;
4108        if (notify == NULL) {
4109                ctrl->call_notify = 0;
4110                return;
4111        }
4112        if (WARN_ON(ctrl->handler->notify && ctrl->handler->notify != notify))
4113                return;
4114        ctrl->handler->notify = notify;
4115        ctrl->handler->notify_priv = priv;
4116        ctrl->call_notify = 1;
4117}
4118EXPORT_SYMBOL(v4l2_ctrl_notify);
4119
4120int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
4121                        s64 min, s64 max, u64 step, s64 def)
4122{
4123        bool value_changed;
4124        bool range_changed = false;
4125        int ret;
4126
4127        lockdep_assert_held(ctrl->handler->lock);
4128
4129        switch (ctrl->type) {
4130        case V4L2_CTRL_TYPE_INTEGER:
4131        case V4L2_CTRL_TYPE_INTEGER64:
4132        case V4L2_CTRL_TYPE_BOOLEAN:
4133        case V4L2_CTRL_TYPE_MENU:
4134        case V4L2_CTRL_TYPE_INTEGER_MENU:
4135        case V4L2_CTRL_TYPE_BITMASK:
4136        case V4L2_CTRL_TYPE_U8:
4137        case V4L2_CTRL_TYPE_U16:
4138        case V4L2_CTRL_TYPE_U32:
4139                if (ctrl->is_array)
4140                        return -EINVAL;
4141                ret = check_range(ctrl->type, min, max, step, def);
4142                if (ret)
4143                        return ret;
4144                break;
4145        default:
4146                return -EINVAL;
4147        }
4148        if ((ctrl->minimum != min) || (ctrl->maximum != max) ||
4149                (ctrl->step != step) || ctrl->default_value != def) {
4150                range_changed = true;
4151                ctrl->minimum = min;
4152                ctrl->maximum = max;
4153                ctrl->step = step;
4154                ctrl->default_value = def;
4155        }
4156        cur_to_new(ctrl);
4157        if (validate_new(ctrl, ctrl->p_new)) {
4158                if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
4159                        *ctrl->p_new.p_s64 = def;
4160                else
4161                        *ctrl->p_new.p_s32 = def;
4162        }
4163
4164        if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
4165                value_changed = *ctrl->p_new.p_s64 != *ctrl->p_cur.p_s64;
4166        else
4167                value_changed = *ctrl->p_new.p_s32 != *ctrl->p_cur.p_s32;
4168        if (value_changed)
4169                ret = set_ctrl(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
4170        else if (range_changed)
4171                send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
4172        return ret;
4173}
4174EXPORT_SYMBOL(__v4l2_ctrl_modify_range);
4175
4176static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev, unsigned elems)
4177{
4178        struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
4179
4180        if (ctrl == NULL)
4181                return -EINVAL;
4182
4183        v4l2_ctrl_lock(ctrl);
4184        list_add_tail(&sev->node, &ctrl->ev_subs);
4185        if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
4186            (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL)) {
4187                struct v4l2_event ev;
4188                u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
4189
4190                if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
4191                        changes |= V4L2_EVENT_CTRL_CH_VALUE;
4192                fill_event(&ev, ctrl, changes);
4193                /* Mark the queue as active, allowing this initial
4194                   event to be accepted. */
4195                sev->elems = elems;
4196                v4l2_event_queue_fh(sev->fh, &ev);
4197        }
4198        v4l2_ctrl_unlock(ctrl);
4199        return 0;
4200}
4201
4202static void v4l2_ctrl_del_event(struct v4l2_subscribed_event *sev)
4203{
4204        struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
4205
4206        if (ctrl == NULL)
4207                return;
4208
4209        v4l2_ctrl_lock(ctrl);
4210        list_del(&sev->node);
4211        v4l2_ctrl_unlock(ctrl);
4212}
4213
4214void v4l2_ctrl_replace(struct v4l2_event *old, const struct v4l2_event *new)
4215{
4216        u32 old_changes = old->u.ctrl.changes;
4217
4218        old->u.ctrl = new->u.ctrl;
4219        old->u.ctrl.changes |= old_changes;
4220}
4221EXPORT_SYMBOL(v4l2_ctrl_replace);
4222
4223void v4l2_ctrl_merge(const struct v4l2_event *old, struct v4l2_event *new)
4224{
4225        new->u.ctrl.changes |= old->u.ctrl.changes;
4226}
4227EXPORT_SYMBOL(v4l2_ctrl_merge);
4228
4229const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops = {
4230        .add = v4l2_ctrl_add_event,
4231        .del = v4l2_ctrl_del_event,
4232        .replace = v4l2_ctrl_replace,
4233        .merge = v4l2_ctrl_merge,
4234};
4235EXPORT_SYMBOL(v4l2_ctrl_sub_ev_ops);
4236
4237int v4l2_ctrl_log_status(struct file *file, void *fh)
4238{
4239        struct video_device *vfd = video_devdata(file);
4240        struct v4l2_fh *vfh = file->private_data;
4241
4242        if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) && vfd->v4l2_dev)
4243                v4l2_ctrl_handler_log_status(vfh->ctrl_handler,
4244                        vfd->v4l2_dev->name);
4245        return 0;
4246}
4247EXPORT_SYMBOL(v4l2_ctrl_log_status);
4248
4249int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
4250                                const struct v4l2_event_subscription *sub)
4251{
4252        if (sub->type == V4L2_EVENT_CTRL)
4253                return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
4254        return -EINVAL;
4255}
4256EXPORT_SYMBOL(v4l2_ctrl_subscribe_event);
4257
4258int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
4259                                     struct v4l2_event_subscription *sub)
4260{
4261        if (!sd->ctrl_handler)
4262                return -EINVAL;
4263        return v4l2_ctrl_subscribe_event(fh, sub);
4264}
4265EXPORT_SYMBOL(v4l2_ctrl_subdev_subscribe_event);
4266
4267__poll_t v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait)
4268{
4269        struct v4l2_fh *fh = file->private_data;
4270
4271        poll_wait(file, &fh->wait, wait);
4272        if (v4l2_event_pending(fh))
4273                return EPOLLPRI;
4274        return 0;
4275}
4276EXPORT_SYMBOL(v4l2_ctrl_poll);
4277