linux/drivers/media/video/v4l2-ctrls.c
<<
>>
Prefs
   1/*
   2    V4L2 controls framework implementation.
   3
   4    Copyright (C) 2010  Hans Verkuil <hverkuil@xs4all.nl>
   5
   6    This program is free software; you can redistribute it and/or modify
   7    it under the terms of the GNU General Public License as published by
   8    the Free Software Foundation; either version 2 of the License, or
   9    (at your option) any later version.
  10
  11    This program is distributed in the hope that it will be useful,
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14    GNU General Public License for more details.
  15
  16    You should have received a copy of the GNU General Public License
  17    along with this program; if not, write to the Free Software
  18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19 */
  20
  21#include <linux/ctype.h>
  22#include <linux/slab.h>
  23#include <linux/export.h>
  24#include <media/v4l2-ioctl.h>
  25#include <media/v4l2-device.h>
  26#include <media/v4l2-ctrls.h>
  27#include <media/v4l2-event.h>
  28#include <media/v4l2-dev.h>
  29
  30#define has_op(master, op) \
  31        (master->ops && master->ops->op)
  32#define call_op(master, op) \
  33        (has_op(master, op) ? master->ops->op(master) : 0)
  34
  35/* Internal temporary helper struct, one for each v4l2_ext_control */
  36struct v4l2_ctrl_helper {
  37        /* Pointer to the control reference of the master control */
  38        struct v4l2_ctrl_ref *mref;
  39        /* The control corresponding to the v4l2_ext_control ID field. */
  40        struct v4l2_ctrl *ctrl;
  41        /* v4l2_ext_control index of the next control belonging to the
  42           same cluster, or 0 if there isn't any. */
  43        u32 next;
  44};
  45
  46/* Small helper function to determine if the autocluster is set to manual
  47   mode. */
  48static bool is_cur_manual(const struct v4l2_ctrl *master)
  49{
  50        return master->is_auto && master->cur.val == master->manual_mode_value;
  51}
  52
  53/* Same as above, but this checks the against the new value instead of the
  54   current value. */
  55static bool is_new_manual(const struct v4l2_ctrl *master)
  56{
  57        return master->is_auto && master->val == master->manual_mode_value;
  58}
  59
  60/* Returns NULL or a character pointer array containing the menu for
  61   the given control ID. The pointer array ends with a NULL pointer.
  62   An empty string signifies a menu entry that is invalid. This allows
  63   drivers to disable certain options if it is not supported. */
  64const char * const *v4l2_ctrl_get_menu(u32 id)
  65{
  66        static const char * const mpeg_audio_sampling_freq[] = {
  67                "44.1 kHz",
  68                "48 kHz",
  69                "32 kHz",
  70                NULL
  71        };
  72        static const char * const mpeg_audio_encoding[] = {
  73                "MPEG-1/2 Layer I",
  74                "MPEG-1/2 Layer II",
  75                "MPEG-1/2 Layer III",
  76                "MPEG-2/4 AAC",
  77                "AC-3",
  78                NULL
  79        };
  80        static const char * const mpeg_audio_l1_bitrate[] = {
  81                "32 kbps",
  82                "64 kbps",
  83                "96 kbps",
  84                "128 kbps",
  85                "160 kbps",
  86                "192 kbps",
  87                "224 kbps",
  88                "256 kbps",
  89                "288 kbps",
  90                "320 kbps",
  91                "352 kbps",
  92                "384 kbps",
  93                "416 kbps",
  94                "448 kbps",
  95                NULL
  96        };
  97        static const char * const mpeg_audio_l2_bitrate[] = {
  98                "32 kbps",
  99                "48 kbps",
 100                "56 kbps",
 101                "64 kbps",
 102                "80 kbps",
 103                "96 kbps",
 104                "112 kbps",
 105                "128 kbps",
 106                "160 kbps",
 107                "192 kbps",
 108                "224 kbps",
 109                "256 kbps",
 110                "320 kbps",
 111                "384 kbps",
 112                NULL
 113        };
 114        static const char * const mpeg_audio_l3_bitrate[] = {
 115                "32 kbps",
 116                "40 kbps",
 117                "48 kbps",
 118                "56 kbps",
 119                "64 kbps",
 120                "80 kbps",
 121                "96 kbps",
 122                "112 kbps",
 123                "128 kbps",
 124                "160 kbps",
 125                "192 kbps",
 126                "224 kbps",
 127                "256 kbps",
 128                "320 kbps",
 129                NULL
 130        };
 131        static const char * const mpeg_audio_ac3_bitrate[] = {
 132                "32 kbps",
 133                "40 kbps",
 134                "48 kbps",
 135                "56 kbps",
 136                "64 kbps",
 137                "80 kbps",
 138                "96 kbps",
 139                "112 kbps",
 140                "128 kbps",
 141                "160 kbps",
 142                "192 kbps",
 143                "224 kbps",
 144                "256 kbps",
 145                "320 kbps",
 146                "384 kbps",
 147                "448 kbps",
 148                "512 kbps",
 149                "576 kbps",
 150                "640 kbps",
 151                NULL
 152        };
 153        static const char * const mpeg_audio_mode[] = {
 154                "Stereo",
 155                "Joint Stereo",
 156                "Dual",
 157                "Mono",
 158                NULL
 159        };
 160        static const char * const mpeg_audio_mode_extension[] = {
 161                "Bound 4",
 162                "Bound 8",
 163                "Bound 12",
 164                "Bound 16",
 165                NULL
 166        };
 167        static const char * const mpeg_audio_emphasis[] = {
 168                "No Emphasis",
 169                "50/15 us",
 170                "CCITT J17",
 171                NULL
 172        };
 173        static const char * const mpeg_audio_crc[] = {
 174                "No CRC",
 175                "16-bit CRC",
 176                NULL
 177        };
 178        static const char * const mpeg_video_encoding[] = {
 179                "MPEG-1",
 180                "MPEG-2",
 181                "MPEG-4 AVC",
 182                NULL
 183        };
 184        static const char * const mpeg_video_aspect[] = {
 185                "1x1",
 186                "4x3",
 187                "16x9",
 188                "2.21x1",
 189                NULL
 190        };
 191        static const char * const mpeg_video_bitrate_mode[] = {
 192                "Variable Bitrate",
 193                "Constant Bitrate",
 194                NULL
 195        };
 196        static const char * const mpeg_stream_type[] = {
 197                "MPEG-2 Program Stream",
 198                "MPEG-2 Transport Stream",
 199                "MPEG-1 System Stream",
 200                "MPEG-2 DVD-compatible Stream",
 201                "MPEG-1 VCD-compatible Stream",
 202                "MPEG-2 SVCD-compatible Stream",
 203                NULL
 204        };
 205        static const char * const mpeg_stream_vbi_fmt[] = {
 206                "No VBI",
 207                "Private Packet, IVTV Format",
 208                NULL
 209        };
 210        static const char * const camera_power_line_frequency[] = {
 211                "Disabled",
 212                "50 Hz",
 213                "60 Hz",
 214                "Auto",
 215                NULL
 216        };
 217        static const char * const camera_exposure_auto[] = {
 218                "Auto Mode",
 219                "Manual Mode",
 220                "Shutter Priority Mode",
 221                "Aperture Priority Mode",
 222                NULL
 223        };
 224        static const char * const colorfx[] = {
 225                "None",
 226                "Black & White",
 227                "Sepia",
 228                "Negative",
 229                "Emboss",
 230                "Sketch",
 231                "Sky Blue",
 232                "Grass Green",
 233                "Skin Whiten",
 234                "Vivid",
 235                NULL
 236        };
 237        static const char * const tune_preemphasis[] = {
 238                "No Preemphasis",
 239                "50 useconds",
 240                "75 useconds",
 241                NULL,
 242        };
 243        static const char * const header_mode[] = {
 244                "Separate Buffer",
 245                "Joined With 1st Frame",
 246                NULL,
 247        };
 248        static const char * const multi_slice[] = {
 249                "Single",
 250                "Max Macroblocks",
 251                "Max Bytes",
 252                NULL,
 253        };
 254        static const char * const entropy_mode[] = {
 255                "CAVLC",
 256                "CABAC",
 257                NULL,
 258        };
 259        static const char * const mpeg_h264_level[] = {
 260                "1",
 261                "1b",
 262                "1.1",
 263                "1.2",
 264                "1.3",
 265                "2",
 266                "2.1",
 267                "2.2",
 268                "3",
 269                "3.1",
 270                "3.2",
 271                "4",
 272                "4.1",
 273                "4.2",
 274                "5",
 275                "5.1",
 276                NULL,
 277        };
 278        static const char * const h264_loop_filter[] = {
 279                "Enabled",
 280                "Disabled",
 281                "Disabled at Slice Boundary",
 282                NULL,
 283        };
 284        static const char * const h264_profile[] = {
 285                "Baseline",
 286                "Constrained Baseline",
 287                "Main",
 288                "Extended",
 289                "High",
 290                "High 10",
 291                "High 422",
 292                "High 444 Predictive",
 293                "High 10 Intra",
 294                "High 422 Intra",
 295                "High 444 Intra",
 296                "CAVLC 444 Intra",
 297                "Scalable Baseline",
 298                "Scalable High",
 299                "Scalable High Intra",
 300                "Multiview High",
 301                NULL,
 302        };
 303        static const char * const vui_sar_idc[] = {
 304                "Unspecified",
 305                "1:1",
 306                "12:11",
 307                "10:11",
 308                "16:11",
 309                "40:33",
 310                "24:11",
 311                "20:11",
 312                "32:11",
 313                "80:33",
 314                "18:11",
 315                "15:11",
 316                "64:33",
 317                "160:99",
 318                "4:3",
 319                "3:2",
 320                "2:1",
 321                "Extended SAR",
 322                NULL,
 323        };
 324        static const char * const mpeg_mpeg4_level[] = {
 325                "0",
 326                "0b",
 327                "1",
 328                "2",
 329                "3",
 330                "3b",
 331                "4",
 332                "5",
 333                NULL,
 334        };
 335        static const char * const mpeg4_profile[] = {
 336                "Simple",
 337                "Adcanved Simple",
 338                "Core",
 339                "Simple Scalable",
 340                "Advanced Coding Efficency",
 341                NULL,
 342        };
 343
 344        static const char * const flash_led_mode[] = {
 345                "Off",
 346                "Flash",
 347                "Torch",
 348                NULL,
 349        };
 350        static const char * const flash_strobe_source[] = {
 351                "Software",
 352                "External",
 353                NULL,
 354        };
 355
 356        switch (id) {
 357        case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
 358                return mpeg_audio_sampling_freq;
 359        case V4L2_CID_MPEG_AUDIO_ENCODING:
 360                return mpeg_audio_encoding;
 361        case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
 362                return mpeg_audio_l1_bitrate;
 363        case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
 364                return mpeg_audio_l2_bitrate;
 365        case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
 366                return mpeg_audio_l3_bitrate;
 367        case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
 368                return mpeg_audio_ac3_bitrate;
 369        case V4L2_CID_MPEG_AUDIO_MODE:
 370                return mpeg_audio_mode;
 371        case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
 372                return mpeg_audio_mode_extension;
 373        case V4L2_CID_MPEG_AUDIO_EMPHASIS:
 374                return mpeg_audio_emphasis;
 375        case V4L2_CID_MPEG_AUDIO_CRC:
 376                return mpeg_audio_crc;
 377        case V4L2_CID_MPEG_VIDEO_ENCODING:
 378                return mpeg_video_encoding;
 379        case V4L2_CID_MPEG_VIDEO_ASPECT:
 380                return mpeg_video_aspect;
 381        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
 382                return mpeg_video_bitrate_mode;
 383        case V4L2_CID_MPEG_STREAM_TYPE:
 384                return mpeg_stream_type;
 385        case V4L2_CID_MPEG_STREAM_VBI_FMT:
 386                return mpeg_stream_vbi_fmt;
 387        case V4L2_CID_POWER_LINE_FREQUENCY:
 388                return camera_power_line_frequency;
 389        case V4L2_CID_EXPOSURE_AUTO:
 390                return camera_exposure_auto;
 391        case V4L2_CID_COLORFX:
 392                return colorfx;
 393        case V4L2_CID_TUNE_PREEMPHASIS:
 394                return tune_preemphasis;
 395        case V4L2_CID_FLASH_LED_MODE:
 396                return flash_led_mode;
 397        case V4L2_CID_FLASH_STROBE_SOURCE:
 398                return flash_strobe_source;
 399        case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
 400                return header_mode;
 401        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
 402                return multi_slice;
 403        case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
 404                return entropy_mode;
 405        case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
 406                return mpeg_h264_level;
 407        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
 408                return h264_loop_filter;
 409        case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
 410                return h264_profile;
 411        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
 412                return vui_sar_idc;
 413        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
 414                return mpeg_mpeg4_level;
 415        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
 416                return mpeg4_profile;
 417        default:
 418                return NULL;
 419        }
 420}
 421EXPORT_SYMBOL(v4l2_ctrl_get_menu);
 422
 423/* Return the control name. */
 424const char *v4l2_ctrl_get_name(u32 id)
 425{
 426        switch (id) {
 427        /* USER controls */
 428        /* Keep the order of the 'case's the same as in videodev2.h! */
 429        case V4L2_CID_USER_CLASS:               return "User Controls";
 430        case V4L2_CID_BRIGHTNESS:               return "Brightness";
 431        case V4L2_CID_CONTRAST:                 return "Contrast";
 432        case V4L2_CID_SATURATION:               return "Saturation";
 433        case V4L2_CID_HUE:                      return "Hue";
 434        case V4L2_CID_AUDIO_VOLUME:             return "Volume";
 435        case V4L2_CID_AUDIO_BALANCE:            return "Balance";
 436        case V4L2_CID_AUDIO_BASS:               return "Bass";
 437        case V4L2_CID_AUDIO_TREBLE:             return "Treble";
 438        case V4L2_CID_AUDIO_MUTE:               return "Mute";
 439        case V4L2_CID_AUDIO_LOUDNESS:           return "Loudness";
 440        case V4L2_CID_BLACK_LEVEL:              return "Black Level";
 441        case V4L2_CID_AUTO_WHITE_BALANCE:       return "White Balance, Automatic";
 442        case V4L2_CID_DO_WHITE_BALANCE:         return "Do White Balance";
 443        case V4L2_CID_RED_BALANCE:              return "Red Balance";
 444        case V4L2_CID_BLUE_BALANCE:             return "Blue Balance";
 445        case V4L2_CID_GAMMA:                    return "Gamma";
 446        case V4L2_CID_EXPOSURE:                 return "Exposure";
 447        case V4L2_CID_AUTOGAIN:                 return "Gain, Automatic";
 448        case V4L2_CID_GAIN:                     return "Gain";
 449        case V4L2_CID_HFLIP:                    return "Horizontal Flip";
 450        case V4L2_CID_VFLIP:                    return "Vertical Flip";
 451        case V4L2_CID_HCENTER:                  return "Horizontal Center";
 452        case V4L2_CID_VCENTER:                  return "Vertical Center";
 453        case V4L2_CID_POWER_LINE_FREQUENCY:     return "Power Line Frequency";
 454        case V4L2_CID_HUE_AUTO:                 return "Hue, Automatic";
 455        case V4L2_CID_WHITE_BALANCE_TEMPERATURE: return "White Balance Temperature";
 456        case V4L2_CID_SHARPNESS:                return "Sharpness";
 457        case V4L2_CID_BACKLIGHT_COMPENSATION:   return "Backlight Compensation";
 458        case V4L2_CID_CHROMA_AGC:               return "Chroma AGC";
 459        case V4L2_CID_COLOR_KILLER:             return "Color Killer";
 460        case V4L2_CID_COLORFX:                  return "Color Effects";
 461        case V4L2_CID_AUTOBRIGHTNESS:           return "Brightness, Automatic";
 462        case V4L2_CID_BAND_STOP_FILTER:         return "Band-Stop Filter";
 463        case V4L2_CID_ROTATE:                   return "Rotate";
 464        case V4L2_CID_BG_COLOR:                 return "Background Color";
 465        case V4L2_CID_CHROMA_GAIN:              return "Chroma Gain";
 466        case V4L2_CID_ILLUMINATORS_1:           return "Illuminator 1";
 467        case V4L2_CID_ILLUMINATORS_2:           return "Illuminator 2";
 468        case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:  return "Min Number of Capture Buffers";
 469        case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:   return "Min Number of Output Buffers";
 470        case V4L2_CID_ALPHA_COMPONENT:          return "Alpha Component";
 471
 472        /* MPEG controls */
 473        /* Keep the order of the 'case's the same as in videodev2.h! */
 474        case V4L2_CID_MPEG_CLASS:               return "MPEG Encoder Controls";
 475        case V4L2_CID_MPEG_STREAM_TYPE:         return "Stream Type";
 476        case V4L2_CID_MPEG_STREAM_PID_PMT:      return "Stream PMT Program ID";
 477        case V4L2_CID_MPEG_STREAM_PID_AUDIO:    return "Stream Audio Program ID";
 478        case V4L2_CID_MPEG_STREAM_PID_VIDEO:    return "Stream Video Program ID";
 479        case V4L2_CID_MPEG_STREAM_PID_PCR:      return "Stream PCR Program ID";
 480        case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: return "Stream PES Audio ID";
 481        case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: return "Stream PES Video ID";
 482        case V4L2_CID_MPEG_STREAM_VBI_FMT:      return "Stream VBI Format";
 483        case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: return "Audio Sampling Frequency";
 484        case V4L2_CID_MPEG_AUDIO_ENCODING:      return "Audio Encoding";
 485        case V4L2_CID_MPEG_AUDIO_L1_BITRATE:    return "Audio Layer I Bitrate";
 486        case V4L2_CID_MPEG_AUDIO_L2_BITRATE:    return "Audio Layer II Bitrate";
 487        case V4L2_CID_MPEG_AUDIO_L3_BITRATE:    return "Audio Layer III Bitrate";
 488        case V4L2_CID_MPEG_AUDIO_MODE:          return "Audio Stereo Mode";
 489        case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: return "Audio Stereo Mode Extension";
 490        case V4L2_CID_MPEG_AUDIO_EMPHASIS:      return "Audio Emphasis";
 491        case V4L2_CID_MPEG_AUDIO_CRC:           return "Audio CRC";
 492        case V4L2_CID_MPEG_AUDIO_MUTE:          return "Audio Mute";
 493        case V4L2_CID_MPEG_AUDIO_AAC_BITRATE:   return "Audio AAC Bitrate";
 494        case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:   return "Audio AC-3 Bitrate";
 495        case V4L2_CID_MPEG_VIDEO_ENCODING:      return "Video Encoding";
 496        case V4L2_CID_MPEG_VIDEO_ASPECT:        return "Video Aspect";
 497        case V4L2_CID_MPEG_VIDEO_B_FRAMES:      return "Video B Frames";
 498        case V4L2_CID_MPEG_VIDEO_GOP_SIZE:      return "Video GOP Size";
 499        case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:   return "Video GOP Closure";
 500        case V4L2_CID_MPEG_VIDEO_PULLDOWN:      return "Video Pulldown";
 501        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:  return "Video Bitrate Mode";
 502        case V4L2_CID_MPEG_VIDEO_BITRATE:       return "Video Bitrate";
 503        case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:  return "Video Peak Bitrate";
 504        case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: return "Video Temporal Decimation";
 505        case V4L2_CID_MPEG_VIDEO_MUTE:          return "Video Mute";
 506        case V4L2_CID_MPEG_VIDEO_MUTE_YUV:      return "Video Mute YUV";
 507        case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:       return "Decoder Slice Interface";
 508        case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:  return "MPEG4 Loop Filter Enable";
 509        case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB:       return "Number of Intra Refresh MBs";
 510        case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:               return "Frame Level Rate Control Enable";
 511        case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:                  return "H264 MB Level Rate Control";
 512        case V4L2_CID_MPEG_VIDEO_HEADER_MODE:                   return "Sequence Header Mode";
 513        case V4L2_CID_MPEG_VIDEO_MAX_REF_PIC:                   return "Max Number of Reference Pics";
 514        case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP:               return "H263 I-Frame QP Value";
 515        case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP:               return "H263 P-Frame QP Value";
 516        case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP:               return "H263 B-Frame QP Value";
 517        case V4L2_CID_MPEG_VIDEO_H263_MIN_QP:                   return "H263 Minimum QP Value";
 518        case V4L2_CID_MPEG_VIDEO_H263_MAX_QP:                   return "H263 Maximum QP Value";
 519        case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:               return "H264 I-Frame QP Value";
 520        case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:               return "H264 P-Frame QP Value";
 521        case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:               return "H264 B-Frame QP Value";
 522        case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:                   return "H264 Maximum QP Value";
 523        case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:                   return "H264 Minimum QP Value";
 524        case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:            return "H264 8x8 Transform Enable";
 525        case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE:                 return "H264 CPB Buffer Size";
 526        case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:             return "H264 Entropy Mode";
 527        case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD:                 return "H264 I-Frame Period";
 528        case V4L2_CID_MPEG_VIDEO_H264_LEVEL:                    return "H264 Level";
 529        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:        return "H264 Loop Filter Alpha Offset";
 530        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:         return "H264 Loop Filter Beta Offset";
 531        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:         return "H264 Loop Filter Mode";
 532        case V4L2_CID_MPEG_VIDEO_H264_PROFILE:                  return "H264 Profile";
 533        case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT:       return "Vertical Size of SAR";
 534        case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH:        return "Horizontal Size of SAR";
 535        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:           return "Aspect Ratio VUI Enable";
 536        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:              return "VUI Aspect Ratio IDC";
 537        case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP:              return "MPEG4 I-Frame QP Value";
 538        case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP:              return "MPEG4 P-Frame QP Value";
 539        case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP:              return "MPEG4 B-Frame QP Value";
 540        case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP:                  return "MPEG4 Minimum QP Value";
 541        case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP:                  return "MPEG4 Maximum QP Value";
 542        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:                   return "MPEG4 Level";
 543        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:                 return "MPEG4 Profile";
 544        case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:                    return "Quarter Pixel Search Enable";
 545        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:         return "Maximum Bytes in a Slice";
 546        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:            return "Number of MBs in a Slice";
 547        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:              return "Slice Partitioning Method";
 548        case V4L2_CID_MPEG_VIDEO_VBV_SIZE:                      return "VBV Buffer Size";
 549
 550        /* CAMERA controls */
 551        /* Keep the order of the 'case's the same as in videodev2.h! */
 552        case V4L2_CID_CAMERA_CLASS:             return "Camera Controls";
 553        case V4L2_CID_EXPOSURE_AUTO:            return "Auto Exposure";
 554        case V4L2_CID_EXPOSURE_ABSOLUTE:        return "Exposure Time, Absolute";
 555        case V4L2_CID_EXPOSURE_AUTO_PRIORITY:   return "Exposure, Dynamic Framerate";
 556        case V4L2_CID_PAN_RELATIVE:             return "Pan, Relative";
 557        case V4L2_CID_TILT_RELATIVE:            return "Tilt, Relative";
 558        case V4L2_CID_PAN_RESET:                return "Pan, Reset";
 559        case V4L2_CID_TILT_RESET:               return "Tilt, Reset";
 560        case V4L2_CID_PAN_ABSOLUTE:             return "Pan, Absolute";
 561        case V4L2_CID_TILT_ABSOLUTE:            return "Tilt, Absolute";
 562        case V4L2_CID_FOCUS_ABSOLUTE:           return "Focus, Absolute";
 563        case V4L2_CID_FOCUS_RELATIVE:           return "Focus, Relative";
 564        case V4L2_CID_FOCUS_AUTO:               return "Focus, Automatic";
 565        case V4L2_CID_ZOOM_ABSOLUTE:            return "Zoom, Absolute";
 566        case V4L2_CID_ZOOM_RELATIVE:            return "Zoom, Relative";
 567        case V4L2_CID_ZOOM_CONTINUOUS:          return "Zoom, Continuous";
 568        case V4L2_CID_PRIVACY:                  return "Privacy";
 569        case V4L2_CID_IRIS_ABSOLUTE:            return "Iris, Absolute";
 570        case V4L2_CID_IRIS_RELATIVE:            return "Iris, Relative";
 571
 572        /* FM Radio Modulator control */
 573        /* Keep the order of the 'case's the same as in videodev2.h! */
 574        case V4L2_CID_FM_TX_CLASS:              return "FM Radio Modulator Controls";
 575        case V4L2_CID_RDS_TX_DEVIATION:         return "RDS Signal Deviation";
 576        case V4L2_CID_RDS_TX_PI:                return "RDS Program ID";
 577        case V4L2_CID_RDS_TX_PTY:               return "RDS Program Type";
 578        case V4L2_CID_RDS_TX_PS_NAME:           return "RDS PS Name";
 579        case V4L2_CID_RDS_TX_RADIO_TEXT:        return "RDS Radio Text";
 580        case V4L2_CID_AUDIO_LIMITER_ENABLED:    return "Audio Limiter Feature Enabled";
 581        case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME: return "Audio Limiter Release Time";
 582        case V4L2_CID_AUDIO_LIMITER_DEVIATION:  return "Audio Limiter Deviation";
 583        case V4L2_CID_AUDIO_COMPRESSION_ENABLED: return "Audio Compression Enabled";
 584        case V4L2_CID_AUDIO_COMPRESSION_GAIN:   return "Audio Compression Gain";
 585        case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD: return "Audio Compression Threshold";
 586        case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME: return "Audio Compression Attack Time";
 587        case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME: return "Audio Compression Release Time";
 588        case V4L2_CID_PILOT_TONE_ENABLED:       return "Pilot Tone Feature Enabled";
 589        case V4L2_CID_PILOT_TONE_DEVIATION:     return "Pilot Tone Deviation";
 590        case V4L2_CID_PILOT_TONE_FREQUENCY:     return "Pilot Tone Frequency";
 591        case V4L2_CID_TUNE_PREEMPHASIS:         return "Pre-Emphasis";
 592        case V4L2_CID_TUNE_POWER_LEVEL:         return "Tune Power Level";
 593        case V4L2_CID_TUNE_ANTENNA_CAPACITOR:   return "Tune Antenna Capacitor";
 594
 595        /* Flash controls */
 596        case V4L2_CID_FLASH_CLASS:              return "Flash Controls";
 597        case V4L2_CID_FLASH_LED_MODE:           return "LED Mode";
 598        case V4L2_CID_FLASH_STROBE_SOURCE:      return "Strobe Source";
 599        case V4L2_CID_FLASH_STROBE:             return "Strobe";
 600        case V4L2_CID_FLASH_STROBE_STOP:        return "Stop Strobe";
 601        case V4L2_CID_FLASH_STROBE_STATUS:      return "Strobe Status";
 602        case V4L2_CID_FLASH_TIMEOUT:            return "Strobe Timeout";
 603        case V4L2_CID_FLASH_INTENSITY:          return "Intensity, Flash Mode";
 604        case V4L2_CID_FLASH_TORCH_INTENSITY:    return "Intensity, Torch Mode";
 605        case V4L2_CID_FLASH_INDICATOR_INTENSITY: return "Intensity, Indicator";
 606        case V4L2_CID_FLASH_FAULT:              return "Faults";
 607        case V4L2_CID_FLASH_CHARGE:             return "Charge";
 608        case V4L2_CID_FLASH_READY:              return "Ready to Strobe";
 609
 610        default:
 611                return NULL;
 612        }
 613}
 614EXPORT_SYMBOL(v4l2_ctrl_get_name);
 615
 616void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
 617                    s32 *min, s32 *max, s32 *step, s32 *def, u32 *flags)
 618{
 619        *name = v4l2_ctrl_get_name(id);
 620        *flags = 0;
 621
 622        switch (id) {
 623        case V4L2_CID_AUDIO_MUTE:
 624        case V4L2_CID_AUDIO_LOUDNESS:
 625        case V4L2_CID_AUTO_WHITE_BALANCE:
 626        case V4L2_CID_AUTOGAIN:
 627        case V4L2_CID_HFLIP:
 628        case V4L2_CID_VFLIP:
 629        case V4L2_CID_HUE_AUTO:
 630        case V4L2_CID_CHROMA_AGC:
 631        case V4L2_CID_COLOR_KILLER:
 632        case V4L2_CID_MPEG_AUDIO_MUTE:
 633        case V4L2_CID_MPEG_VIDEO_MUTE:
 634        case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
 635        case V4L2_CID_MPEG_VIDEO_PULLDOWN:
 636        case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
 637        case V4L2_CID_FOCUS_AUTO:
 638        case V4L2_CID_PRIVACY:
 639        case V4L2_CID_AUDIO_LIMITER_ENABLED:
 640        case V4L2_CID_AUDIO_COMPRESSION_ENABLED:
 641        case V4L2_CID_PILOT_TONE_ENABLED:
 642        case V4L2_CID_ILLUMINATORS_1:
 643        case V4L2_CID_ILLUMINATORS_2:
 644        case V4L2_CID_FLASH_STROBE_STATUS:
 645        case V4L2_CID_FLASH_CHARGE:
 646        case V4L2_CID_FLASH_READY:
 647        case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
 648        case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
 649        case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
 650        case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
 651        case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
 652        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:
 653        case V4L2_CID_MPEG_VIDEO_MPEG4_QPEL:
 654                *type = V4L2_CTRL_TYPE_BOOLEAN;
 655                *min = 0;
 656                *max = *step = 1;
 657                break;
 658        case V4L2_CID_PAN_RESET:
 659        case V4L2_CID_TILT_RESET:
 660        case V4L2_CID_FLASH_STROBE:
 661        case V4L2_CID_FLASH_STROBE_STOP:
 662                *type = V4L2_CTRL_TYPE_BUTTON;
 663                *flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
 664                *min = *max = *step = *def = 0;
 665                break;
 666        case V4L2_CID_POWER_LINE_FREQUENCY:
 667        case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
 668        case V4L2_CID_MPEG_AUDIO_ENCODING:
 669        case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
 670        case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
 671        case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
 672        case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
 673        case V4L2_CID_MPEG_AUDIO_MODE:
 674        case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
 675        case V4L2_CID_MPEG_AUDIO_EMPHASIS:
 676        case V4L2_CID_MPEG_AUDIO_CRC:
 677        case V4L2_CID_MPEG_VIDEO_ENCODING:
 678        case V4L2_CID_MPEG_VIDEO_ASPECT:
 679        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
 680        case V4L2_CID_MPEG_STREAM_TYPE:
 681        case V4L2_CID_MPEG_STREAM_VBI_FMT:
 682        case V4L2_CID_EXPOSURE_AUTO:
 683        case V4L2_CID_COLORFX:
 684        case V4L2_CID_TUNE_PREEMPHASIS:
 685        case V4L2_CID_FLASH_LED_MODE:
 686        case V4L2_CID_FLASH_STROBE_SOURCE:
 687        case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
 688        case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
 689        case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
 690        case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
 691        case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
 692        case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
 693        case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
 694        case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
 695        case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
 696                *type = V4L2_CTRL_TYPE_MENU;
 697                break;
 698        case V4L2_CID_RDS_TX_PS_NAME:
 699        case V4L2_CID_RDS_TX_RADIO_TEXT:
 700                *type = V4L2_CTRL_TYPE_STRING;
 701                break;
 702        case V4L2_CID_USER_CLASS:
 703        case V4L2_CID_CAMERA_CLASS:
 704        case V4L2_CID_MPEG_CLASS:
 705        case V4L2_CID_FM_TX_CLASS:
 706        case V4L2_CID_FLASH_CLASS:
 707                *type = V4L2_CTRL_TYPE_CTRL_CLASS;
 708                /* You can neither read not write these */
 709                *flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_WRITE_ONLY;
 710                *min = *max = *step = *def = 0;
 711                break;
 712        case V4L2_CID_BG_COLOR:
 713                *type = V4L2_CTRL_TYPE_INTEGER;
 714                *step = 1;
 715                *min = 0;
 716                /* Max is calculated as RGB888 that is 2^24 */
 717                *max = 0xFFFFFF;
 718                break;
 719        case V4L2_CID_FLASH_FAULT:
 720                *type = V4L2_CTRL_TYPE_BITMASK;
 721                break;
 722        case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
 723        case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
 724                *type = V4L2_CTRL_TYPE_INTEGER;
 725                *flags |= V4L2_CTRL_FLAG_READ_ONLY;
 726                break;
 727        default:
 728                *type = V4L2_CTRL_TYPE_INTEGER;
 729                break;
 730        }
 731        switch (id) {
 732        case V4L2_CID_MPEG_AUDIO_ENCODING:
 733        case V4L2_CID_MPEG_AUDIO_MODE:
 734        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
 735        case V4L2_CID_MPEG_VIDEO_B_FRAMES:
 736        case V4L2_CID_MPEG_STREAM_TYPE:
 737                *flags |= V4L2_CTRL_FLAG_UPDATE;
 738                break;
 739        case V4L2_CID_AUDIO_VOLUME:
 740        case V4L2_CID_AUDIO_BALANCE:
 741        case V4L2_CID_AUDIO_BASS:
 742        case V4L2_CID_AUDIO_TREBLE:
 743        case V4L2_CID_BRIGHTNESS:
 744        case V4L2_CID_CONTRAST:
 745        case V4L2_CID_SATURATION:
 746        case V4L2_CID_HUE:
 747        case V4L2_CID_RED_BALANCE:
 748        case V4L2_CID_BLUE_BALANCE:
 749        case V4L2_CID_GAMMA:
 750        case V4L2_CID_SHARPNESS:
 751        case V4L2_CID_CHROMA_GAIN:
 752        case V4L2_CID_RDS_TX_DEVIATION:
 753        case V4L2_CID_AUDIO_LIMITER_RELEASE_TIME:
 754        case V4L2_CID_AUDIO_LIMITER_DEVIATION:
 755        case V4L2_CID_AUDIO_COMPRESSION_GAIN:
 756        case V4L2_CID_AUDIO_COMPRESSION_THRESHOLD:
 757        case V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME:
 758        case V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME:
 759        case V4L2_CID_PILOT_TONE_DEVIATION:
 760        case V4L2_CID_PILOT_TONE_FREQUENCY:
 761        case V4L2_CID_TUNE_POWER_LEVEL:
 762        case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
 763                *flags |= V4L2_CTRL_FLAG_SLIDER;
 764                break;
 765        case V4L2_CID_PAN_RELATIVE:
 766        case V4L2_CID_TILT_RELATIVE:
 767        case V4L2_CID_FOCUS_RELATIVE:
 768        case V4L2_CID_IRIS_RELATIVE:
 769        case V4L2_CID_ZOOM_RELATIVE:
 770                *flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
 771                break;
 772        case V4L2_CID_FLASH_STROBE_STATUS:
 773        case V4L2_CID_FLASH_READY:
 774                *flags |= V4L2_CTRL_FLAG_READ_ONLY;
 775                break;
 776        }
 777}
 778EXPORT_SYMBOL(v4l2_ctrl_fill);
 779
 780/* Helper function to determine whether the control type is compatible with
 781   VIDIOC_G/S_CTRL. */
 782static bool type_is_int(const struct v4l2_ctrl *ctrl)
 783{
 784        switch (ctrl->type) {
 785        case V4L2_CTRL_TYPE_INTEGER64:
 786        case V4L2_CTRL_TYPE_STRING:
 787                /* Nope, these need v4l2_ext_control */
 788                return false;
 789        default:
 790                return true;
 791        }
 792}
 793
 794static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes)
 795{
 796        memset(ev->reserved, 0, sizeof(ev->reserved));
 797        ev->type = V4L2_EVENT_CTRL;
 798        ev->id = ctrl->id;
 799        ev->u.ctrl.changes = changes;
 800        ev->u.ctrl.type = ctrl->type;
 801        ev->u.ctrl.flags = ctrl->flags;
 802        if (ctrl->type == V4L2_CTRL_TYPE_STRING)
 803                ev->u.ctrl.value64 = 0;
 804        else
 805                ev->u.ctrl.value64 = ctrl->cur.val64;
 806        ev->u.ctrl.minimum = ctrl->minimum;
 807        ev->u.ctrl.maximum = ctrl->maximum;
 808        if (ctrl->type == V4L2_CTRL_TYPE_MENU)
 809                ev->u.ctrl.step = 1;
 810        else
 811                ev->u.ctrl.step = ctrl->step;
 812        ev->u.ctrl.default_value = ctrl->default_value;
 813}
 814
 815static void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
 816{
 817        struct v4l2_event ev;
 818        struct v4l2_subscribed_event *sev;
 819
 820        if (list_empty(&ctrl->ev_subs))
 821                return;
 822        fill_event(&ev, ctrl, changes);
 823
 824        list_for_each_entry(sev, &ctrl->ev_subs, node)
 825                if (sev->fh != fh ||
 826                    (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK))
 827                        v4l2_event_queue_fh(sev->fh, &ev);
 828}
 829
 830/* Helper function: copy the current control value back to the caller */
 831static int cur_to_user(struct v4l2_ext_control *c,
 832                       struct v4l2_ctrl *ctrl)
 833{
 834        u32 len;
 835
 836        switch (ctrl->type) {
 837        case V4L2_CTRL_TYPE_STRING:
 838                len = strlen(ctrl->cur.string);
 839                if (c->size < len + 1) {
 840                        c->size = len + 1;
 841                        return -ENOSPC;
 842                }
 843                return copy_to_user(c->string, ctrl->cur.string,
 844                                                len + 1) ? -EFAULT : 0;
 845        case V4L2_CTRL_TYPE_INTEGER64:
 846                c->value64 = ctrl->cur.val64;
 847                break;
 848        default:
 849                c->value = ctrl->cur.val;
 850                break;
 851        }
 852        return 0;
 853}
 854
 855/* Helper function: copy the caller-provider value as the new control value */
 856static int user_to_new(struct v4l2_ext_control *c,
 857                       struct v4l2_ctrl *ctrl)
 858{
 859        int ret;
 860        u32 size;
 861
 862        ctrl->is_new = 1;
 863        switch (ctrl->type) {
 864        case V4L2_CTRL_TYPE_INTEGER64:
 865                ctrl->val64 = c->value64;
 866                break;
 867        case V4L2_CTRL_TYPE_STRING:
 868                size = c->size;
 869                if (size == 0)
 870                        return -ERANGE;
 871                if (size > ctrl->maximum + 1)
 872                        size = ctrl->maximum + 1;
 873                ret = copy_from_user(ctrl->string, c->string, size);
 874                if (!ret) {
 875                        char last = ctrl->string[size - 1];
 876
 877                        ctrl->string[size - 1] = 0;
 878                        /* If the string was longer than ctrl->maximum,
 879                           then return an error. */
 880                        if (strlen(ctrl->string) == ctrl->maximum && last)
 881                                return -ERANGE;
 882                }
 883                return ret ? -EFAULT : 0;
 884        default:
 885                ctrl->val = c->value;
 886                break;
 887        }
 888        return 0;
 889}
 890
 891/* Helper function: copy the new control value back to the caller */
 892static int new_to_user(struct v4l2_ext_control *c,
 893                       struct v4l2_ctrl *ctrl)
 894{
 895        u32 len;
 896
 897        switch (ctrl->type) {
 898        case V4L2_CTRL_TYPE_STRING:
 899                len = strlen(ctrl->string);
 900                if (c->size < len + 1) {
 901                        c->size = ctrl->maximum + 1;
 902                        return -ENOSPC;
 903                }
 904                return copy_to_user(c->string, ctrl->string,
 905                                                len + 1) ? -EFAULT : 0;
 906        case V4L2_CTRL_TYPE_INTEGER64:
 907                c->value64 = ctrl->val64;
 908                break;
 909        default:
 910                c->value = ctrl->val;
 911                break;
 912        }
 913        return 0;
 914}
 915
 916/* Copy the new value to the current value. */
 917static void new_to_cur(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
 918                                                bool update_inactive)
 919{
 920        bool changed = false;
 921
 922        if (ctrl == NULL)
 923                return;
 924        switch (ctrl->type) {
 925        case V4L2_CTRL_TYPE_BUTTON:
 926                changed = true;
 927                break;
 928        case V4L2_CTRL_TYPE_STRING:
 929                /* strings are always 0-terminated */
 930                changed = strcmp(ctrl->string, ctrl->cur.string);
 931                strcpy(ctrl->cur.string, ctrl->string);
 932                break;
 933        case V4L2_CTRL_TYPE_INTEGER64:
 934                changed = ctrl->val64 != ctrl->cur.val64;
 935                ctrl->cur.val64 = ctrl->val64;
 936                break;
 937        default:
 938                changed = ctrl->val != ctrl->cur.val;
 939                ctrl->cur.val = ctrl->val;
 940                break;
 941        }
 942        if (update_inactive) {
 943                /* Note: update_inactive can only be true for auto clusters. */
 944                ctrl->flags &=
 945                        ~(V4L2_CTRL_FLAG_INACTIVE | V4L2_CTRL_FLAG_VOLATILE);
 946                if (!is_cur_manual(ctrl->cluster[0])) {
 947                        ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
 948                        if (ctrl->cluster[0]->has_volatiles)
 949                                ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
 950                }
 951                fh = NULL;
 952        }
 953        if (changed || update_inactive) {
 954                /* If a control was changed that was not one of the controls
 955                   modified by the application, then send the event to all. */
 956                if (!ctrl->is_new)
 957                        fh = NULL;
 958                send_event(fh, ctrl,
 959                        (changed ? V4L2_EVENT_CTRL_CH_VALUE : 0) |
 960                        (update_inactive ? V4L2_EVENT_CTRL_CH_FLAGS : 0));
 961        }
 962}
 963
 964/* Copy the current value to the new value */
 965static void cur_to_new(struct v4l2_ctrl *ctrl)
 966{
 967        if (ctrl == NULL)
 968                return;
 969        switch (ctrl->type) {
 970        case V4L2_CTRL_TYPE_STRING:
 971                /* strings are always 0-terminated */
 972                strcpy(ctrl->string, ctrl->cur.string);
 973                break;
 974        case V4L2_CTRL_TYPE_INTEGER64:
 975                ctrl->val64 = ctrl->cur.val64;
 976                break;
 977        default:
 978                ctrl->val = ctrl->cur.val;
 979                break;
 980        }
 981}
 982
 983/* Return non-zero if one or more of the controls in the cluster has a new
 984   value that differs from the current value. */
 985static int cluster_changed(struct v4l2_ctrl *master)
 986{
 987        int diff = 0;
 988        int i;
 989
 990        for (i = 0; !diff && i < master->ncontrols; i++) {
 991                struct v4l2_ctrl *ctrl = master->cluster[i];
 992
 993                if (ctrl == NULL)
 994                        continue;
 995                switch (ctrl->type) {
 996                case V4L2_CTRL_TYPE_BUTTON:
 997                        /* Button controls are always 'different' */
 998                        return 1;
 999                case V4L2_CTRL_TYPE_STRING:
1000                        /* strings are always 0-terminated */
1001                        diff = strcmp(ctrl->string, ctrl->cur.string);
1002                        break;
1003                case V4L2_CTRL_TYPE_INTEGER64:
1004                        diff = ctrl->val64 != ctrl->cur.val64;
1005                        break;
1006                default:
1007                        diff = ctrl->val != ctrl->cur.val;
1008                        break;
1009                }
1010        }
1011        return diff;
1012}
1013
1014/* Validate integer-type control */
1015static int validate_new_int(const struct v4l2_ctrl *ctrl, s32 *pval)
1016{
1017        s32 val = *pval;
1018        u32 offset;
1019
1020        switch (ctrl->type) {
1021        case V4L2_CTRL_TYPE_INTEGER:
1022                /* Round towards the closest legal value */
1023                val += ctrl->step / 2;
1024                if (val < ctrl->minimum)
1025                        val = ctrl->minimum;
1026                if (val > ctrl->maximum)
1027                        val = ctrl->maximum;
1028                offset = val - ctrl->minimum;
1029                offset = ctrl->step * (offset / ctrl->step);
1030                val = ctrl->minimum + offset;
1031                *pval = val;
1032                return 0;
1033
1034        case V4L2_CTRL_TYPE_BOOLEAN:
1035                *pval = !!val;
1036                return 0;
1037
1038        case V4L2_CTRL_TYPE_MENU:
1039                if (val < ctrl->minimum || val > ctrl->maximum)
1040                        return -ERANGE;
1041                if (ctrl->qmenu[val][0] == '\0' ||
1042                    (ctrl->menu_skip_mask & (1 << val)))
1043                        return -EINVAL;
1044                return 0;
1045
1046        case V4L2_CTRL_TYPE_BITMASK:
1047                *pval &= ctrl->maximum;
1048                return 0;
1049
1050        case V4L2_CTRL_TYPE_BUTTON:
1051        case V4L2_CTRL_TYPE_CTRL_CLASS:
1052                *pval = 0;
1053                return 0;
1054
1055        default:
1056                return -EINVAL;
1057        }
1058}
1059
1060/* Validate a new control */
1061static int validate_new(const struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
1062{
1063        char *s = c->string;
1064        size_t len;
1065
1066        switch (ctrl->type) {
1067        case V4L2_CTRL_TYPE_INTEGER:
1068        case V4L2_CTRL_TYPE_BOOLEAN:
1069        case V4L2_CTRL_TYPE_MENU:
1070        case V4L2_CTRL_TYPE_BITMASK:
1071        case V4L2_CTRL_TYPE_BUTTON:
1072        case V4L2_CTRL_TYPE_CTRL_CLASS:
1073                return validate_new_int(ctrl, &c->value);
1074
1075        case V4L2_CTRL_TYPE_INTEGER64:
1076                return 0;
1077
1078        case V4L2_CTRL_TYPE_STRING:
1079                len = strlen(s);
1080                if (len < ctrl->minimum)
1081                        return -ERANGE;
1082                if ((len - ctrl->minimum) % ctrl->step)
1083                        return -ERANGE;
1084                return 0;
1085
1086        default:
1087                return -EINVAL;
1088        }
1089}
1090
1091static inline u32 node2id(struct list_head *node)
1092{
1093        return list_entry(node, struct v4l2_ctrl_ref, node)->ctrl->id;
1094}
1095
1096/* Set the handler's error code if it wasn't set earlier already */
1097static inline int handler_set_err(struct v4l2_ctrl_handler *hdl, int err)
1098{
1099        if (hdl->error == 0)
1100                hdl->error = err;
1101        return err;
1102}
1103
1104/* Initialize the handler */
1105int v4l2_ctrl_handler_init(struct v4l2_ctrl_handler *hdl,
1106                           unsigned nr_of_controls_hint)
1107{
1108        mutex_init(&hdl->lock);
1109        INIT_LIST_HEAD(&hdl->ctrls);
1110        INIT_LIST_HEAD(&hdl->ctrl_refs);
1111        hdl->nr_of_buckets = 1 + nr_of_controls_hint / 8;
1112        hdl->buckets = kcalloc(hdl->nr_of_buckets, sizeof(hdl->buckets[0]),
1113                               GFP_KERNEL);
1114        hdl->error = hdl->buckets ? 0 : -ENOMEM;
1115        return hdl->error;
1116}
1117EXPORT_SYMBOL(v4l2_ctrl_handler_init);
1118
1119/* Free all controls and control refs */
1120void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
1121{
1122        struct v4l2_ctrl_ref *ref, *next_ref;
1123        struct v4l2_ctrl *ctrl, *next_ctrl;
1124        struct v4l2_subscribed_event *sev, *next_sev;
1125
1126        if (hdl == NULL || hdl->buckets == NULL)
1127                return;
1128
1129        mutex_lock(&hdl->lock);
1130        /* Free all nodes */
1131        list_for_each_entry_safe(ref, next_ref, &hdl->ctrl_refs, node) {
1132                list_del(&ref->node);
1133                kfree(ref);
1134        }
1135        /* Free all controls owned by the handler */
1136        list_for_each_entry_safe(ctrl, next_ctrl, &hdl->ctrls, node) {
1137                list_del(&ctrl->node);
1138                list_for_each_entry_safe(sev, next_sev, &ctrl->ev_subs, node)
1139                        list_del(&sev->node);
1140                kfree(ctrl);
1141        }
1142        kfree(hdl->buckets);
1143        hdl->buckets = NULL;
1144        hdl->cached = NULL;
1145        hdl->error = 0;
1146        mutex_unlock(&hdl->lock);
1147}
1148EXPORT_SYMBOL(v4l2_ctrl_handler_free);
1149
1150/* For backwards compatibility: V4L2_CID_PRIVATE_BASE should no longer
1151   be used except in G_CTRL, S_CTRL, QUERYCTRL and QUERYMENU when dealing
1152   with applications that do not use the NEXT_CTRL flag.
1153
1154   We just find the n-th private user control. It's O(N), but that should not
1155   be an issue in this particular case. */
1156static struct v4l2_ctrl_ref *find_private_ref(
1157                struct v4l2_ctrl_handler *hdl, u32 id)
1158{
1159        struct v4l2_ctrl_ref *ref;
1160
1161        id -= V4L2_CID_PRIVATE_BASE;
1162        list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1163                /* Search for private user controls that are compatible with
1164                   VIDIOC_G/S_CTRL. */
1165                if (V4L2_CTRL_ID2CLASS(ref->ctrl->id) == V4L2_CTRL_CLASS_USER &&
1166                    V4L2_CTRL_DRIVER_PRIV(ref->ctrl->id)) {
1167                        if (!type_is_int(ref->ctrl))
1168                                continue;
1169                        if (id == 0)
1170                                return ref;
1171                        id--;
1172                }
1173        }
1174        return NULL;
1175}
1176
1177/* Find a control with the given ID. */
1178static struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
1179{
1180        struct v4l2_ctrl_ref *ref;
1181        int bucket;
1182
1183        id &= V4L2_CTRL_ID_MASK;
1184
1185        /* Old-style private controls need special handling */
1186        if (id >= V4L2_CID_PRIVATE_BASE)
1187                return find_private_ref(hdl, id);
1188        bucket = id % hdl->nr_of_buckets;
1189
1190        /* Simple optimization: cache the last control found */
1191        if (hdl->cached && hdl->cached->ctrl->id == id)
1192                return hdl->cached;
1193
1194        /* Not in cache, search the hash */
1195        ref = hdl->buckets ? hdl->buckets[bucket] : NULL;
1196        while (ref && ref->ctrl->id != id)
1197                ref = ref->next;
1198
1199        if (ref)
1200                hdl->cached = ref; /* cache it! */
1201        return ref;
1202}
1203
1204/* Find a control with the given ID. Take the handler's lock first. */
1205static struct v4l2_ctrl_ref *find_ref_lock(
1206                struct v4l2_ctrl_handler *hdl, u32 id)
1207{
1208        struct v4l2_ctrl_ref *ref = NULL;
1209
1210        if (hdl) {
1211                mutex_lock(&hdl->lock);
1212                ref = find_ref(hdl, id);
1213                mutex_unlock(&hdl->lock);
1214        }
1215        return ref;
1216}
1217
1218/* Find a control with the given ID. */
1219struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
1220{
1221        struct v4l2_ctrl_ref *ref = find_ref_lock(hdl, id);
1222
1223        return ref ? ref->ctrl : NULL;
1224}
1225EXPORT_SYMBOL(v4l2_ctrl_find);
1226
1227/* Allocate a new v4l2_ctrl_ref and hook it into the handler. */
1228static int handler_new_ref(struct v4l2_ctrl_handler *hdl,
1229                           struct v4l2_ctrl *ctrl)
1230{
1231        struct v4l2_ctrl_ref *ref;
1232        struct v4l2_ctrl_ref *new_ref;
1233        u32 id = ctrl->id;
1234        u32 class_ctrl = V4L2_CTRL_ID2CLASS(id) | 1;
1235        int bucket = id % hdl->nr_of_buckets;   /* which bucket to use */
1236
1237        /* Automatically add the control class if it is not yet present. */
1238        if (id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)
1239                if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))
1240                        return hdl->error;
1241
1242        if (hdl->error)
1243                return hdl->error;
1244
1245        new_ref = kzalloc(sizeof(*new_ref), GFP_KERNEL);
1246        if (!new_ref)
1247                return handler_set_err(hdl, -ENOMEM);
1248        new_ref->ctrl = ctrl;
1249        if (ctrl->handler == hdl) {
1250                /* By default each control starts in a cluster of its own.
1251                   new_ref->ctrl is basically a cluster array with one
1252                   element, so that's perfect to use as the cluster pointer.
1253                   But only do this for the handler that owns the control. */
1254                ctrl->cluster = &new_ref->ctrl;
1255                ctrl->ncontrols = 1;
1256        }
1257
1258        INIT_LIST_HEAD(&new_ref->node);
1259
1260        mutex_lock(&hdl->lock);
1261
1262        /* Add immediately at the end of the list if the list is empty, or if
1263           the last element in the list has a lower ID.
1264           This ensures that when elements are added in ascending order the
1265           insertion is an O(1) operation. */
1266        if (list_empty(&hdl->ctrl_refs) || id > node2id(hdl->ctrl_refs.prev)) {
1267                list_add_tail(&new_ref->node, &hdl->ctrl_refs);
1268                goto insert_in_hash;
1269        }
1270
1271        /* Find insert position in sorted list */
1272        list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1273                if (ref->ctrl->id < id)
1274                        continue;
1275                /* Don't add duplicates */
1276                if (ref->ctrl->id == id) {
1277                        kfree(new_ref);
1278                        goto unlock;
1279                }
1280                list_add(&new_ref->node, ref->node.prev);
1281                break;
1282        }
1283
1284insert_in_hash:
1285        /* Insert the control node in the hash */
1286        new_ref->next = hdl->buckets[bucket];
1287        hdl->buckets[bucket] = new_ref;
1288
1289unlock:
1290        mutex_unlock(&hdl->lock);
1291        return 0;
1292}
1293
1294/* Add a new control */
1295static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
1296                        const struct v4l2_ctrl_ops *ops,
1297                        u32 id, const char *name, enum v4l2_ctrl_type type,
1298                        s32 min, s32 max, u32 step, s32 def,
1299                        u32 flags, const char * const *qmenu, void *priv)
1300{
1301        struct v4l2_ctrl *ctrl;
1302        unsigned sz_extra = 0;
1303
1304        if (hdl->error)
1305                return NULL;
1306
1307        /* Sanity checks */
1308        if (id == 0 || name == NULL || id >= V4L2_CID_PRIVATE_BASE ||
1309            (type == V4L2_CTRL_TYPE_INTEGER && step == 0) ||
1310            (type == V4L2_CTRL_TYPE_BITMASK && max == 0) ||
1311            (type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ||
1312            (type == V4L2_CTRL_TYPE_STRING && max == 0)) {
1313                handler_set_err(hdl, -ERANGE);
1314                return NULL;
1315        }
1316        if (type != V4L2_CTRL_TYPE_BITMASK && max < min) {
1317                handler_set_err(hdl, -ERANGE);
1318                return NULL;
1319        }
1320        if ((type == V4L2_CTRL_TYPE_INTEGER ||
1321             type == V4L2_CTRL_TYPE_MENU ||
1322             type == V4L2_CTRL_TYPE_BOOLEAN) &&
1323            (def < min || def > max)) {
1324                handler_set_err(hdl, -ERANGE);
1325                return NULL;
1326        }
1327        if (type == V4L2_CTRL_TYPE_BITMASK && ((def & ~max) || min || step)) {
1328                handler_set_err(hdl, -ERANGE);
1329                return NULL;
1330        }
1331
1332        if (type == V4L2_CTRL_TYPE_BUTTON)
1333                flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
1334        else if (type == V4L2_CTRL_TYPE_CTRL_CLASS)
1335                flags |= V4L2_CTRL_FLAG_READ_ONLY;
1336        else if (type == V4L2_CTRL_TYPE_STRING)
1337                sz_extra += 2 * (max + 1);
1338
1339        ctrl = kzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
1340        if (ctrl == NULL) {
1341                handler_set_err(hdl, -ENOMEM);
1342                return NULL;
1343        }
1344
1345        INIT_LIST_HEAD(&ctrl->node);
1346        INIT_LIST_HEAD(&ctrl->ev_subs);
1347        ctrl->handler = hdl;
1348        ctrl->ops = ops;
1349        ctrl->id = id;
1350        ctrl->name = name;
1351        ctrl->type = type;
1352        ctrl->flags = flags;
1353        ctrl->minimum = min;
1354        ctrl->maximum = max;
1355        ctrl->step = step;
1356        ctrl->qmenu = qmenu;
1357        ctrl->priv = priv;
1358        ctrl->cur.val = ctrl->val = ctrl->default_value = def;
1359
1360        if (ctrl->type == V4L2_CTRL_TYPE_STRING) {
1361                ctrl->cur.string = (char *)&ctrl[1] + sz_extra - (max + 1);
1362                ctrl->string = (char *)&ctrl[1] + sz_extra - 2 * (max + 1);
1363                if (ctrl->minimum)
1364                        memset(ctrl->cur.string, ' ', ctrl->minimum);
1365        }
1366        if (handler_new_ref(hdl, ctrl)) {
1367                kfree(ctrl);
1368                return NULL;
1369        }
1370        mutex_lock(&hdl->lock);
1371        list_add_tail(&ctrl->node, &hdl->ctrls);
1372        mutex_unlock(&hdl->lock);
1373        return ctrl;
1374}
1375
1376struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
1377                        const struct v4l2_ctrl_config *cfg, void *priv)
1378{
1379        bool is_menu;
1380        struct v4l2_ctrl *ctrl;
1381        const char *name = cfg->name;
1382        const char * const *qmenu = cfg->qmenu;
1383        enum v4l2_ctrl_type type = cfg->type;
1384        u32 flags = cfg->flags;
1385        s32 min = cfg->min;
1386        s32 max = cfg->max;
1387        u32 step = cfg->step;
1388        s32 def = cfg->def;
1389
1390        if (name == NULL)
1391                v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step,
1392                                                                &def, &flags);
1393
1394        is_menu = (cfg->type == V4L2_CTRL_TYPE_MENU);
1395        if (is_menu)
1396                WARN_ON(step);
1397        else
1398                WARN_ON(cfg->menu_skip_mask);
1399        if (is_menu && qmenu == NULL)
1400                qmenu = v4l2_ctrl_get_menu(cfg->id);
1401
1402        ctrl = v4l2_ctrl_new(hdl, cfg->ops, cfg->id, name,
1403                        type, min, max,
1404                        is_menu ? cfg->menu_skip_mask : step,
1405                        def, flags, qmenu, priv);
1406        if (ctrl)
1407                ctrl->is_private = cfg->is_private;
1408        return ctrl;
1409}
1410EXPORT_SYMBOL(v4l2_ctrl_new_custom);
1411
1412/* Helper function for standard non-menu controls */
1413struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
1414                        const struct v4l2_ctrl_ops *ops,
1415                        u32 id, s32 min, s32 max, u32 step, s32 def)
1416{
1417        const char *name;
1418        enum v4l2_ctrl_type type;
1419        u32 flags;
1420
1421        v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1422        if (type == V4L2_CTRL_TYPE_MENU) {
1423                handler_set_err(hdl, -EINVAL);
1424                return NULL;
1425        }
1426        return v4l2_ctrl_new(hdl, ops, id, name, type,
1427                                    min, max, step, def, flags, NULL, NULL);
1428}
1429EXPORT_SYMBOL(v4l2_ctrl_new_std);
1430
1431/* Helper function for standard menu controls */
1432struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
1433                        const struct v4l2_ctrl_ops *ops,
1434                        u32 id, s32 max, s32 mask, s32 def)
1435{
1436        const char * const *qmenu = v4l2_ctrl_get_menu(id);
1437        const char *name;
1438        enum v4l2_ctrl_type type;
1439        s32 min;
1440        s32 step;
1441        u32 flags;
1442
1443        v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
1444        if (type != V4L2_CTRL_TYPE_MENU) {
1445                handler_set_err(hdl, -EINVAL);
1446                return NULL;
1447        }
1448        return v4l2_ctrl_new(hdl, ops, id, name, type,
1449                                    0, max, mask, def, flags, qmenu, NULL);
1450}
1451EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
1452
1453/* Add a control from another handler to this handler */
1454struct v4l2_ctrl *v4l2_ctrl_add_ctrl(struct v4l2_ctrl_handler *hdl,
1455                                          struct v4l2_ctrl *ctrl)
1456{
1457        if (hdl == NULL || hdl->error)
1458                return NULL;
1459        if (ctrl == NULL) {
1460                handler_set_err(hdl, -EINVAL);
1461                return NULL;
1462        }
1463        if (ctrl->handler == hdl)
1464                return ctrl;
1465        return handler_new_ref(hdl, ctrl) ? NULL : ctrl;
1466}
1467EXPORT_SYMBOL(v4l2_ctrl_add_ctrl);
1468
1469/* Add the controls from another handler to our own. */
1470int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
1471                          struct v4l2_ctrl_handler *add)
1472{
1473        struct v4l2_ctrl *ctrl;
1474        int ret = 0;
1475
1476        /* Do nothing if either handler is NULL or if they are the same */
1477        if (!hdl || !add || hdl == add)
1478                return 0;
1479        if (hdl->error)
1480                return hdl->error;
1481        mutex_lock(&add->lock);
1482        list_for_each_entry(ctrl, &add->ctrls, node) {
1483                /* Skip handler-private controls. */
1484                if (ctrl->is_private)
1485                        continue;
1486                /* And control classes */
1487                if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
1488                        continue;
1489                ret = handler_new_ref(hdl, ctrl);
1490                if (ret)
1491                        break;
1492        }
1493        mutex_unlock(&add->lock);
1494        return ret;
1495}
1496EXPORT_SYMBOL(v4l2_ctrl_add_handler);
1497
1498/* Cluster controls */
1499void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls)
1500{
1501        bool has_volatiles = false;
1502        int i;
1503
1504        /* The first control is the master control and it must not be NULL */
1505        BUG_ON(ncontrols == 0 || controls[0] == NULL);
1506
1507        for (i = 0; i < ncontrols; i++) {
1508                if (controls[i]) {
1509                        controls[i]->cluster = controls;
1510                        controls[i]->ncontrols = ncontrols;
1511                        if (controls[i]->flags & V4L2_CTRL_FLAG_VOLATILE)
1512                                has_volatiles = true;
1513                }
1514        }
1515        controls[0]->has_volatiles = has_volatiles;
1516}
1517EXPORT_SYMBOL(v4l2_ctrl_cluster);
1518
1519void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
1520                            u8 manual_val, bool set_volatile)
1521{
1522        struct v4l2_ctrl *master = controls[0];
1523        u32 flag = 0;
1524        int i;
1525
1526        v4l2_ctrl_cluster(ncontrols, controls);
1527        WARN_ON(ncontrols <= 1);
1528        WARN_ON(manual_val < master->minimum || manual_val > master->maximum);
1529        WARN_ON(set_volatile && !has_op(master, g_volatile_ctrl));
1530        master->is_auto = true;
1531        master->has_volatiles = set_volatile;
1532        master->manual_mode_value = manual_val;
1533        master->flags |= V4L2_CTRL_FLAG_UPDATE;
1534
1535        if (!is_cur_manual(master))
1536                flag = V4L2_CTRL_FLAG_INACTIVE |
1537                        (set_volatile ? V4L2_CTRL_FLAG_VOLATILE : 0);
1538
1539        for (i = 1; i < ncontrols; i++)
1540                if (controls[i])
1541                        controls[i]->flags |= flag;
1542}
1543EXPORT_SYMBOL(v4l2_ctrl_auto_cluster);
1544
1545/* Activate/deactivate a control. */
1546void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
1547{
1548        /* invert since the actual flag is called 'inactive' */
1549        bool inactive = !active;
1550        bool old;
1551
1552        if (ctrl == NULL)
1553                return;
1554
1555        if (inactive)
1556                /* set V4L2_CTRL_FLAG_INACTIVE */
1557                old = test_and_set_bit(4, &ctrl->flags);
1558        else
1559                /* clear V4L2_CTRL_FLAG_INACTIVE */
1560                old = test_and_clear_bit(4, &ctrl->flags);
1561        if (old != inactive)
1562                send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
1563}
1564EXPORT_SYMBOL(v4l2_ctrl_activate);
1565
1566/* Grab/ungrab a control.
1567   Typically used when streaming starts and you want to grab controls,
1568   preventing the user from changing them.
1569
1570   Just call this and the framework will block any attempts to change
1571   these controls. */
1572void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
1573{
1574        bool old;
1575
1576        if (ctrl == NULL)
1577                return;
1578
1579        v4l2_ctrl_lock(ctrl);
1580        if (grabbed)
1581                /* set V4L2_CTRL_FLAG_GRABBED */
1582                old = test_and_set_bit(1, &ctrl->flags);
1583        else
1584                /* clear V4L2_CTRL_FLAG_GRABBED */
1585                old = test_and_clear_bit(1, &ctrl->flags);
1586        if (old != grabbed)
1587                send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_FLAGS);
1588        v4l2_ctrl_unlock(ctrl);
1589}
1590EXPORT_SYMBOL(v4l2_ctrl_grab);
1591
1592/* Log the control name and value */
1593static void log_ctrl(const struct v4l2_ctrl *ctrl,
1594                     const char *prefix, const char *colon)
1595{
1596        if (ctrl->flags & (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_WRITE_ONLY))
1597                return;
1598        if (ctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
1599                return;
1600
1601        printk(KERN_INFO "%s%s%s: ", prefix, colon, ctrl->name);
1602
1603        switch (ctrl->type) {
1604        case V4L2_CTRL_TYPE_INTEGER:
1605                printk(KERN_CONT "%d", ctrl->cur.val);
1606                break;
1607        case V4L2_CTRL_TYPE_BOOLEAN:
1608                printk(KERN_CONT "%s", ctrl->cur.val ? "true" : "false");
1609                break;
1610        case V4L2_CTRL_TYPE_MENU:
1611                printk(KERN_CONT "%s", ctrl->qmenu[ctrl->cur.val]);
1612                break;
1613        case V4L2_CTRL_TYPE_BITMASK:
1614                printk(KERN_CONT "0x%08x", ctrl->cur.val);
1615                break;
1616        case V4L2_CTRL_TYPE_INTEGER64:
1617                printk(KERN_CONT "%lld", ctrl->cur.val64);
1618                break;
1619        case V4L2_CTRL_TYPE_STRING:
1620                printk(KERN_CONT "%s", ctrl->cur.string);
1621                break;
1622        default:
1623                printk(KERN_CONT "unknown type %d", ctrl->type);
1624                break;
1625        }
1626        if (ctrl->flags & (V4L2_CTRL_FLAG_INACTIVE |
1627                           V4L2_CTRL_FLAG_GRABBED |
1628                           V4L2_CTRL_FLAG_VOLATILE)) {
1629                if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
1630                        printk(KERN_CONT " inactive");
1631                if (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)
1632                        printk(KERN_CONT " grabbed");
1633                if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE)
1634                        printk(KERN_CONT " volatile");
1635        }
1636        printk(KERN_CONT "\n");
1637}
1638
1639/* Log all controls owned by the handler */
1640void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
1641                                  const char *prefix)
1642{
1643        struct v4l2_ctrl *ctrl;
1644        const char *colon = "";
1645        int len;
1646
1647        if (hdl == NULL)
1648                return;
1649        if (prefix == NULL)
1650                prefix = "";
1651        len = strlen(prefix);
1652        if (len && prefix[len - 1] != ' ')
1653                colon = ": ";
1654        mutex_lock(&hdl->lock);
1655        list_for_each_entry(ctrl, &hdl->ctrls, node)
1656                if (!(ctrl->flags & V4L2_CTRL_FLAG_DISABLED))
1657                        log_ctrl(ctrl, prefix, colon);
1658        mutex_unlock(&hdl->lock);
1659}
1660EXPORT_SYMBOL(v4l2_ctrl_handler_log_status);
1661
1662/* Call s_ctrl for all controls owned by the handler */
1663int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
1664{
1665        struct v4l2_ctrl *ctrl;
1666        int ret = 0;
1667
1668        if (hdl == NULL)
1669                return 0;
1670        mutex_lock(&hdl->lock);
1671        list_for_each_entry(ctrl, &hdl->ctrls, node)
1672                ctrl->done = false;
1673
1674        list_for_each_entry(ctrl, &hdl->ctrls, node) {
1675                struct v4l2_ctrl *master = ctrl->cluster[0];
1676                int i;
1677
1678                /* Skip if this control was already handled by a cluster. */
1679                /* Skip button controls and read-only controls. */
1680                if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON ||
1681                    (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY))
1682                        continue;
1683
1684                for (i = 0; i < master->ncontrols; i++) {
1685                        if (master->cluster[i]) {
1686                                cur_to_new(master->cluster[i]);
1687                                master->cluster[i]->is_new = 1;
1688                                master->cluster[i]->done = true;
1689                        }
1690                }
1691                ret = call_op(master, s_ctrl);
1692                if (ret)
1693                        break;
1694        }
1695        mutex_unlock(&hdl->lock);
1696        return ret;
1697}
1698EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
1699
1700/* Implement VIDIOC_QUERYCTRL */
1701int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc)
1702{
1703        u32 id = qc->id & V4L2_CTRL_ID_MASK;
1704        struct v4l2_ctrl_ref *ref;
1705        struct v4l2_ctrl *ctrl;
1706
1707        if (hdl == NULL)
1708                return -EINVAL;
1709
1710        mutex_lock(&hdl->lock);
1711
1712        /* Try to find it */
1713        ref = find_ref(hdl, id);
1714
1715        if ((qc->id & V4L2_CTRL_FLAG_NEXT_CTRL) && !list_empty(&hdl->ctrl_refs)) {
1716                /* Find the next control with ID > qc->id */
1717
1718                /* Did we reach the end of the control list? */
1719                if (id >= node2id(hdl->ctrl_refs.prev)) {
1720                        ref = NULL; /* Yes, so there is no next control */
1721                } else if (ref) {
1722                        /* We found a control with the given ID, so just get
1723                           the next one in the list. */
1724                        ref = list_entry(ref->node.next, typeof(*ref), node);
1725                } else {
1726                        /* No control with the given ID exists, so start
1727                           searching for the next largest ID. We know there
1728                           is one, otherwise the first 'if' above would have
1729                           been true. */
1730                        list_for_each_entry(ref, &hdl->ctrl_refs, node)
1731                                if (id < ref->ctrl->id)
1732                                        break;
1733                }
1734        }
1735        mutex_unlock(&hdl->lock);
1736        if (!ref)
1737                return -EINVAL;
1738
1739        ctrl = ref->ctrl;
1740        memset(qc, 0, sizeof(*qc));
1741        if (id >= V4L2_CID_PRIVATE_BASE)
1742                qc->id = id;
1743        else
1744                qc->id = ctrl->id;
1745        strlcpy(qc->name, ctrl->name, sizeof(qc->name));
1746        qc->minimum = ctrl->minimum;
1747        qc->maximum = ctrl->maximum;
1748        qc->default_value = ctrl->default_value;
1749        if (ctrl->type == V4L2_CTRL_TYPE_MENU)
1750                qc->step = 1;
1751        else
1752                qc->step = ctrl->step;
1753        qc->flags = ctrl->flags;
1754        qc->type = ctrl->type;
1755        return 0;
1756}
1757EXPORT_SYMBOL(v4l2_queryctrl);
1758
1759int v4l2_subdev_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
1760{
1761        if (qc->id & V4L2_CTRL_FLAG_NEXT_CTRL)
1762                return -EINVAL;
1763        return v4l2_queryctrl(sd->ctrl_handler, qc);
1764}
1765EXPORT_SYMBOL(v4l2_subdev_queryctrl);
1766
1767/* Implement VIDIOC_QUERYMENU */
1768int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm)
1769{
1770        struct v4l2_ctrl *ctrl;
1771        u32 i = qm->index;
1772
1773        ctrl = v4l2_ctrl_find(hdl, qm->id);
1774        if (!ctrl)
1775                return -EINVAL;
1776
1777        qm->reserved = 0;
1778        /* Sanity checks */
1779        if (ctrl->qmenu == NULL ||
1780            i < ctrl->minimum || i > ctrl->maximum)
1781                return -EINVAL;
1782        /* Use mask to see if this menu item should be skipped */
1783        if (ctrl->menu_skip_mask & (1 << i))
1784                return -EINVAL;
1785        /* Empty menu items should also be skipped */
1786        if (ctrl->qmenu[i] == NULL || ctrl->qmenu[i][0] == '\0')
1787                return -EINVAL;
1788        strlcpy(qm->name, ctrl->qmenu[i], sizeof(qm->name));
1789        return 0;
1790}
1791EXPORT_SYMBOL(v4l2_querymenu);
1792
1793int v4l2_subdev_querymenu(struct v4l2_subdev *sd, struct v4l2_querymenu *qm)
1794{
1795        return v4l2_querymenu(sd->ctrl_handler, qm);
1796}
1797EXPORT_SYMBOL(v4l2_subdev_querymenu);
1798
1799
1800
1801/* Some general notes on the atomic requirements of VIDIOC_G/TRY/S_EXT_CTRLS:
1802
1803   It is not a fully atomic operation, just best-effort only. After all, if
1804   multiple controls have to be set through multiple i2c writes (for example)
1805   then some initial writes may succeed while others fail. Thus leaving the
1806   system in an inconsistent state. The question is how much effort you are
1807   willing to spend on trying to make something atomic that really isn't.
1808
1809   From the point of view of an application the main requirement is that
1810   when you call VIDIOC_S_EXT_CTRLS and some values are invalid then an
1811   error should be returned without actually affecting any controls.
1812
1813   If all the values are correct, then it is acceptable to just give up
1814   in case of low-level errors.
1815
1816   It is important though that the application can tell when only a partial
1817   configuration was done. The way we do that is through the error_idx field
1818   of struct v4l2_ext_controls: if that is equal to the count field then no
1819   controls were affected. Otherwise all controls before that index were
1820   successful in performing their 'get' or 'set' operation, the control at
1821   the given index failed, and you don't know what happened with the controls
1822   after the failed one. Since if they were part of a control cluster they
1823   could have been successfully processed (if a cluster member was encountered
1824   at index < error_idx), they could have failed (if a cluster member was at
1825   error_idx), or they may not have been processed yet (if the first cluster
1826   member appeared after error_idx).
1827
1828   It is all fairly theoretical, though. In practice all you can do is to
1829   bail out. If error_idx == count, then it is an application bug. If
1830   error_idx < count then it is only an application bug if the error code was
1831   EBUSY. That usually means that something started streaming just when you
1832   tried to set the controls. In all other cases it is a driver/hardware
1833   problem and all you can do is to retry or bail out.
1834
1835   Note that these rules do not apply to VIDIOC_TRY_EXT_CTRLS: since that
1836   never modifies controls the error_idx is just set to whatever control
1837   has an invalid value.
1838 */
1839
1840/* Prepare for the extended g/s/try functions.
1841   Find the controls in the control array and do some basic checks. */
1842static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
1843                             struct v4l2_ext_controls *cs,
1844                             struct v4l2_ctrl_helper *helpers)
1845{
1846        struct v4l2_ctrl_helper *h;
1847        bool have_clusters = false;
1848        u32 i;
1849
1850        for (i = 0, h = helpers; i < cs->count; i++, h++) {
1851                struct v4l2_ext_control *c = &cs->controls[i];
1852                struct v4l2_ctrl_ref *ref;
1853                struct v4l2_ctrl *ctrl;
1854                u32 id = c->id & V4L2_CTRL_ID_MASK;
1855
1856                cs->error_idx = i;
1857
1858                if (cs->ctrl_class && V4L2_CTRL_ID2CLASS(id) != cs->ctrl_class)
1859                        return -EINVAL;
1860
1861                /* Old-style private controls are not allowed for
1862                   extended controls */
1863                if (id >= V4L2_CID_PRIVATE_BASE)
1864                        return -EINVAL;
1865                ref = find_ref_lock(hdl, id);
1866                if (ref == NULL)
1867                        return -EINVAL;
1868                ctrl = ref->ctrl;
1869                if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED)
1870                        return -EINVAL;
1871
1872                if (ctrl->cluster[0]->ncontrols > 1)
1873                        have_clusters = true;
1874                if (ctrl->cluster[0] != ctrl)
1875                        ref = find_ref_lock(hdl, ctrl->cluster[0]->id);
1876                /* Store the ref to the master control of the cluster */
1877                h->mref = ref;
1878                h->ctrl = ctrl;
1879                /* Initially set next to 0, meaning that there is no other
1880                   control in this helper array belonging to the same
1881                   cluster */
1882                h->next = 0;
1883        }
1884
1885        /* We are done if there were no controls that belong to a multi-
1886           control cluster. */
1887        if (!have_clusters)
1888                return 0;
1889
1890        /* The code below figures out in O(n) time which controls in the list
1891           belong to the same cluster. */
1892
1893        /* This has to be done with the handler lock taken. */
1894        mutex_lock(&hdl->lock);
1895
1896        /* First zero the helper field in the master control references */
1897        for (i = 0; i < cs->count; i++)
1898                helpers[i].mref->helper = 0;
1899        for (i = 0, h = helpers; i < cs->count; i++, h++) {
1900                struct v4l2_ctrl_ref *mref = h->mref;
1901
1902                /* If the mref->helper is set, then it points to an earlier
1903                   helper that belongs to the same cluster. */
1904                if (mref->helper) {
1905                        /* Set the next field of mref->helper to the current
1906                           index: this means that that earlier helper now
1907                           points to the next helper in the same cluster. */
1908                        mref->helper->next = i;
1909                        /* mref should be set only for the first helper in the
1910                           cluster, clear the others. */
1911                        h->mref = NULL;
1912                }
1913                /* Point the mref helper to the current helper struct. */
1914                mref->helper = h;
1915        }
1916        mutex_unlock(&hdl->lock);
1917        return 0;
1918}
1919
1920/* Handles the corner case where cs->count == 0. It checks whether the
1921   specified control class exists. If that class ID is 0, then it checks
1922   whether there are any controls at all. */
1923static int class_check(struct v4l2_ctrl_handler *hdl, u32 ctrl_class)
1924{
1925        if (ctrl_class == 0)
1926                return list_empty(&hdl->ctrl_refs) ? -EINVAL : 0;
1927        return find_ref_lock(hdl, ctrl_class | 1) ? 0 : -EINVAL;
1928}
1929
1930
1931
1932/* Get extended controls. Allocates the helpers array if needed. */
1933int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs)
1934{
1935        struct v4l2_ctrl_helper helper[4];
1936        struct v4l2_ctrl_helper *helpers = helper;
1937        int ret;
1938        int i, j;
1939
1940        cs->error_idx = cs->count;
1941        cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
1942
1943        if (hdl == NULL)
1944                return -EINVAL;
1945
1946        if (cs->count == 0)
1947                return class_check(hdl, cs->ctrl_class);
1948
1949        if (cs->count > ARRAY_SIZE(helper)) {
1950                helpers = kmalloc(sizeof(helper[0]) * cs->count, GFP_KERNEL);
1951                if (helpers == NULL)
1952                        return -ENOMEM;
1953        }
1954
1955        ret = prepare_ext_ctrls(hdl, cs, helpers);
1956        cs->error_idx = cs->count;
1957
1958        for (i = 0; !ret && i < cs->count; i++)
1959                if (helpers[i].ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
1960                        ret = -EACCES;
1961
1962        for (i = 0; !ret && i < cs->count; i++) {
1963                int (*ctrl_to_user)(struct v4l2_ext_control *c,
1964                                    struct v4l2_ctrl *ctrl) = cur_to_user;
1965                struct v4l2_ctrl *master;
1966
1967                if (helpers[i].mref == NULL)
1968                        continue;
1969
1970                master = helpers[i].mref->ctrl;
1971                cs->error_idx = i;
1972
1973                v4l2_ctrl_lock(master);
1974
1975                /* g_volatile_ctrl will update the new control values */
1976                if ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
1977                        (master->has_volatiles && !is_cur_manual(master))) {
1978                        for (j = 0; j < master->ncontrols; j++)
1979                                cur_to_new(master->cluster[j]);
1980                        ret = call_op(master, g_volatile_ctrl);
1981                        ctrl_to_user = new_to_user;
1982                }
1983                /* If OK, then copy the current (for non-volatile controls)
1984                   or the new (for volatile controls) control values to the
1985                   caller */
1986                if (!ret) {
1987                        u32 idx = i;
1988
1989                        do {
1990                                ret = ctrl_to_user(cs->controls + idx,
1991                                                   helpers[idx].ctrl);
1992                                idx = helpers[idx].next;
1993                        } while (!ret && idx);
1994                }
1995                v4l2_ctrl_unlock(master);
1996        }
1997
1998        if (cs->count > ARRAY_SIZE(helper))
1999                kfree(helpers);
2000        return ret;
2001}
2002EXPORT_SYMBOL(v4l2_g_ext_ctrls);
2003
2004int v4l2_subdev_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
2005{
2006        return v4l2_g_ext_ctrls(sd->ctrl_handler, cs);
2007}
2008EXPORT_SYMBOL(v4l2_subdev_g_ext_ctrls);
2009
2010/* Helper function to get a single control */
2011static int get_ctrl(struct v4l2_ctrl *ctrl, s32 *val)
2012{
2013        struct v4l2_ctrl *master = ctrl->cluster[0];
2014        int ret = 0;
2015        int i;
2016
2017        if (ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
2018                return -EACCES;
2019
2020        v4l2_ctrl_lock(master);
2021        /* g_volatile_ctrl will update the current control values */
2022        if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
2023                for (i = 0; i < master->ncontrols; i++)
2024                        cur_to_new(master->cluster[i]);
2025                ret = call_op(master, g_volatile_ctrl);
2026                *val = ctrl->val;
2027        } else {
2028                *val = ctrl->cur.val;
2029        }
2030        v4l2_ctrl_unlock(master);
2031        return ret;
2032}
2033
2034int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
2035{
2036        struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
2037
2038        if (ctrl == NULL || !type_is_int(ctrl))
2039                return -EINVAL;
2040        return get_ctrl(ctrl, &control->value);
2041}
2042EXPORT_SYMBOL(v4l2_g_ctrl);
2043
2044int v4l2_subdev_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *control)
2045{
2046        return v4l2_g_ctrl(sd->ctrl_handler, control);
2047}
2048EXPORT_SYMBOL(v4l2_subdev_g_ctrl);
2049
2050s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
2051{
2052        s32 val = 0;
2053
2054        /* It's a driver bug if this happens. */
2055        WARN_ON(!type_is_int(ctrl));
2056        get_ctrl(ctrl, &val);
2057        return val;
2058}
2059EXPORT_SYMBOL(v4l2_ctrl_g_ctrl);
2060
2061
2062/* Core function that calls try/s_ctrl and ensures that the new value is
2063   copied to the current value on a set.
2064   Must be called with ctrl->handler->lock held. */
2065static int try_or_set_cluster(struct v4l2_fh *fh,
2066                              struct v4l2_ctrl *master, bool set)
2067{
2068        bool update_flag;
2069        int ret;
2070        int i;
2071
2072        /* Go through the cluster and either validate the new value or
2073           (if no new value was set), copy the current value to the new
2074           value, ensuring a consistent view for the control ops when
2075           called. */
2076        for (i = 0; i < master->ncontrols; i++) {
2077                struct v4l2_ctrl *ctrl = master->cluster[i];
2078
2079                if (ctrl == NULL)
2080                        continue;
2081
2082                if (!ctrl->is_new) {
2083                        cur_to_new(ctrl);
2084                        continue;
2085                }
2086                /* Check again: it may have changed since the
2087                   previous check in try_or_set_ext_ctrls(). */
2088                if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
2089                        return -EBUSY;
2090        }
2091
2092        ret = call_op(master, try_ctrl);
2093
2094        /* Don't set if there is no change */
2095        if (ret || !set || !cluster_changed(master))
2096                return ret;
2097        ret = call_op(master, s_ctrl);
2098        if (ret)
2099                return ret;
2100
2101        /* If OK, then make the new values permanent. */
2102        update_flag = is_cur_manual(master) != is_new_manual(master);
2103        for (i = 0; i < master->ncontrols; i++)
2104                new_to_cur(fh, master->cluster[i], update_flag && i > 0);
2105        return 0;
2106}
2107
2108/* Validate controls. */
2109static int validate_ctrls(struct v4l2_ext_controls *cs,
2110                          struct v4l2_ctrl_helper *helpers, bool set)
2111{
2112        unsigned i;
2113        int ret = 0;
2114
2115        cs->error_idx = cs->count;
2116        for (i = 0; i < cs->count; i++) {
2117                struct v4l2_ctrl *ctrl = helpers[i].ctrl;
2118
2119                cs->error_idx = i;
2120
2121                if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
2122                        return -EACCES;
2123                /* This test is also done in try_set_control_cluster() which
2124                   is called in atomic context, so that has the final say,
2125                   but it makes sense to do an up-front check as well. Once
2126                   an error occurs in try_set_control_cluster() some other
2127                   controls may have been set already and we want to do a
2128                   best-effort to avoid that. */
2129                if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED))
2130                        return -EBUSY;
2131                ret = validate_new(ctrl, &cs->controls[i]);
2132                if (ret)
2133                        return ret;
2134        }
2135        return 0;
2136}
2137
2138/* Obtain the current volatile values of an autocluster and mark them
2139   as new. */
2140static void update_from_auto_cluster(struct v4l2_ctrl *master)
2141{
2142        int i;
2143
2144        for (i = 0; i < master->ncontrols; i++)
2145                cur_to_new(master->cluster[i]);
2146        if (!call_op(master, g_volatile_ctrl))
2147                for (i = 1; i < master->ncontrols; i++)
2148                        if (master->cluster[i])
2149                                master->cluster[i]->is_new = 1;
2150}
2151
2152/* Try or try-and-set controls */
2153static int try_set_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
2154                             struct v4l2_ext_controls *cs,
2155                             bool set)
2156{
2157        struct v4l2_ctrl_helper helper[4];
2158        struct v4l2_ctrl_helper *helpers = helper;
2159        unsigned i, j;
2160        int ret;
2161
2162        cs->error_idx = cs->count;
2163        cs->ctrl_class = V4L2_CTRL_ID2CLASS(cs->ctrl_class);
2164
2165        if (hdl == NULL)
2166                return -EINVAL;
2167
2168        if (cs->count == 0)
2169                return class_check(hdl, cs->ctrl_class);
2170
2171        if (cs->count > ARRAY_SIZE(helper)) {
2172                helpers = kmalloc(sizeof(helper[0]) * cs->count, GFP_KERNEL);
2173                if (!helpers)
2174                        return -ENOMEM;
2175        }
2176        ret = prepare_ext_ctrls(hdl, cs, helpers);
2177        if (!ret)
2178                ret = validate_ctrls(cs, helpers, set);
2179        if (ret && set)
2180                cs->error_idx = cs->count;
2181        for (i = 0; !ret && i < cs->count; i++) {
2182                struct v4l2_ctrl *master;
2183                u32 idx = i;
2184
2185                if (helpers[i].mref == NULL)
2186                        continue;
2187
2188                cs->error_idx = i;
2189                master = helpers[i].mref->ctrl;
2190                v4l2_ctrl_lock(master);
2191
2192                /* Reset the 'is_new' flags of the cluster */
2193                for (j = 0; j < master->ncontrols; j++)
2194                        if (master->cluster[j])
2195                                master->cluster[j]->is_new = 0;
2196
2197                /* For volatile autoclusters that are currently in auto mode
2198                   we need to discover if it will be set to manual mode.
2199                   If so, then we have to copy the current volatile values
2200                   first since those will become the new manual values (which
2201                   may be overwritten by explicit new values from this set
2202                   of controls). */
2203                if (master->is_auto && master->has_volatiles &&
2204                                                !is_cur_manual(master)) {
2205                        /* Pick an initial non-manual value */
2206                        s32 new_auto_val = master->manual_mode_value + 1;
2207                        u32 tmp_idx = idx;
2208
2209                        do {
2210                                /* Check if the auto control is part of the
2211                                   list, and remember the new value. */
2212                                if (helpers[tmp_idx].ctrl == master)
2213                                        new_auto_val = cs->controls[tmp_idx].value;
2214                                tmp_idx = helpers[tmp_idx].next;
2215                        } while (tmp_idx);
2216                        /* If the new value == the manual value, then copy
2217                           the current volatile values. */
2218                        if (new_auto_val == master->manual_mode_value)
2219                                update_from_auto_cluster(master);
2220                }
2221
2222                /* Copy the new caller-supplied control values.
2223                   user_to_new() sets 'is_new' to 1. */
2224                do {
2225                        ret = user_to_new(cs->controls + idx, helpers[idx].ctrl);
2226                        idx = helpers[idx].next;
2227                } while (!ret && idx);
2228
2229                if (!ret)
2230                        ret = try_or_set_cluster(fh, master, set);
2231
2232                /* Copy the new values back to userspace. */
2233                if (!ret) {
2234                        idx = i;
2235                        do {
2236                                ret = new_to_user(cs->controls + idx,
2237                                                helpers[idx].ctrl);
2238                                idx = helpers[idx].next;
2239                        } while (!ret && idx);
2240                }
2241                v4l2_ctrl_unlock(master);
2242        }
2243
2244        if (cs->count > ARRAY_SIZE(helper))
2245                kfree(helpers);
2246        return ret;
2247}
2248
2249int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *cs)
2250{
2251        return try_set_ext_ctrls(NULL, hdl, cs, false);
2252}
2253EXPORT_SYMBOL(v4l2_try_ext_ctrls);
2254
2255int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
2256                                        struct v4l2_ext_controls *cs)
2257{
2258        return try_set_ext_ctrls(fh, hdl, cs, true);
2259}
2260EXPORT_SYMBOL(v4l2_s_ext_ctrls);
2261
2262int v4l2_subdev_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
2263{
2264        return try_set_ext_ctrls(NULL, sd->ctrl_handler, cs, false);
2265}
2266EXPORT_SYMBOL(v4l2_subdev_try_ext_ctrls);
2267
2268int v4l2_subdev_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs)
2269{
2270        return try_set_ext_ctrls(NULL, sd->ctrl_handler, cs, true);
2271}
2272EXPORT_SYMBOL(v4l2_subdev_s_ext_ctrls);
2273
2274/* Helper function for VIDIOC_S_CTRL compatibility */
2275static int set_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, s32 *val)
2276{
2277        struct v4l2_ctrl *master = ctrl->cluster[0];
2278        int ret;
2279        int i;
2280
2281        ret = validate_new_int(ctrl, val);
2282        if (ret)
2283                return ret;
2284
2285        v4l2_ctrl_lock(ctrl);
2286
2287        /* Reset the 'is_new' flags of the cluster */
2288        for (i = 0; i < master->ncontrols; i++)
2289                if (master->cluster[i])
2290                        master->cluster[i]->is_new = 0;
2291
2292        /* For autoclusters with volatiles that are switched from auto to
2293           manual mode we have to update the current volatile values since
2294           those will become the initial manual values after such a switch. */
2295        if (master->is_auto && master->has_volatiles && ctrl == master &&
2296            !is_cur_manual(master) && *val == master->manual_mode_value)
2297                update_from_auto_cluster(master);
2298        ctrl->val = *val;
2299        ctrl->is_new = 1;
2300        ret = try_or_set_cluster(fh, master, true);
2301        *val = ctrl->cur.val;
2302        v4l2_ctrl_unlock(ctrl);
2303        return ret;
2304}
2305
2306int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
2307                                        struct v4l2_control *control)
2308{
2309        struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
2310
2311        if (ctrl == NULL || !type_is_int(ctrl))
2312                return -EINVAL;
2313
2314        if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
2315                return -EACCES;
2316
2317        return set_ctrl(fh, ctrl, &control->value);
2318}
2319EXPORT_SYMBOL(v4l2_s_ctrl);
2320
2321int v4l2_subdev_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *control)
2322{
2323        return v4l2_s_ctrl(NULL, sd->ctrl_handler, control);
2324}
2325EXPORT_SYMBOL(v4l2_subdev_s_ctrl);
2326
2327int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
2328{
2329        /* It's a driver bug if this happens. */
2330        WARN_ON(!type_is_int(ctrl));
2331        return set_ctrl(NULL, ctrl, &val);
2332}
2333EXPORT_SYMBOL(v4l2_ctrl_s_ctrl);
2334
2335void v4l2_ctrl_add_event(struct v4l2_ctrl *ctrl,
2336                                struct v4l2_subscribed_event *sev)
2337{
2338        v4l2_ctrl_lock(ctrl);
2339        list_add_tail(&sev->node, &ctrl->ev_subs);
2340        if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
2341            (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL)) {
2342                struct v4l2_event ev;
2343                u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
2344
2345                if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
2346                        changes |= V4L2_EVENT_CTRL_CH_VALUE;
2347                fill_event(&ev, ctrl, changes);
2348                v4l2_event_queue_fh(sev->fh, &ev);
2349        }
2350        v4l2_ctrl_unlock(ctrl);
2351}
2352EXPORT_SYMBOL(v4l2_ctrl_add_event);
2353
2354void v4l2_ctrl_del_event(struct v4l2_ctrl *ctrl,
2355                                struct v4l2_subscribed_event *sev)
2356{
2357        v4l2_ctrl_lock(ctrl);
2358        list_del(&sev->node);
2359        v4l2_ctrl_unlock(ctrl);
2360}
2361EXPORT_SYMBOL(v4l2_ctrl_del_event);
2362
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.