root/drivers/media/usb/uvc/uvc_ctrl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. uvc_ctrl_get_zoom
  2. uvc_ctrl_set_zoom
  3. uvc_ctrl_get_rel_speed
  4. uvc_ctrl_set_rel_speed
  5. uvc_ctrl_data
  6. uvc_test_bit
  7. uvc_clear_bit
  8. uvc_get_le_value
  9. uvc_set_le_value
  10. uvc_entity_match_guid
  11. __uvc_find_control
  12. uvc_find_control
  13. uvc_ctrl_populate_cache
  14. __uvc_ctrl_get_value
  15. __uvc_ctrl_get
  16. __uvc_query_v4l2_ctrl
  17. uvc_query_v4l2_ctrl
  18. uvc_query_v4l2_menu
  19. uvc_ctrl_fill_event
  20. uvc_ctrl_send_event
  21. uvc_ctrl_send_slave_event
  22. uvc_ctrl_status_event_work
  23. uvc_ctrl_status_event
  24. uvc_ctrl_xctrls_has_control
  25. uvc_ctrl_send_events
  26. uvc_ctrl_add_event
  27. uvc_ctrl_del_event
  28. uvc_ctrl_begin
  29. uvc_ctrl_commit_entity
  30. __uvc_ctrl_commit
  31. uvc_ctrl_get
  32. uvc_ctrl_set
  33. uvc_ctrl_get_flags
  34. uvc_ctrl_fixup_xu_info
  35. uvc_ctrl_fill_xu_info
  36. uvc_ctrl_init_xu_ctrl
  37. uvc_xu_ctrl_query
  38. uvc_ctrl_restore_values
  39. uvc_ctrl_add_info
  40. __uvc_ctrl_add_mapping
  41. uvc_ctrl_add_mapping
  42. uvc_ctrl_prune_entity
  43. uvc_ctrl_init_ctrl
  44. uvc_ctrl_init_device
  45. uvc_ctrl_cleanup_mappings
  46. uvc_ctrl_cleanup_device

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *      uvc_ctrl.c  --  USB Video Class driver - Controls
   4  *
   5  *      Copyright (C) 2005-2010
   6  *          Laurent Pinchart (laurent.pinchart@ideasonboard.com)
   7  */
   8 
   9 #include <linux/kernel.h>
  10 #include <linux/list.h>
  11 #include <linux/module.h>
  12 #include <linux/slab.h>
  13 #include <linux/uaccess.h>
  14 #include <linux/usb.h>
  15 #include <linux/videodev2.h>
  16 #include <linux/vmalloc.h>
  17 #include <linux/wait.h>
  18 #include <linux/workqueue.h>
  19 #include <linux/atomic.h>
  20 #include <media/v4l2-ctrls.h>
  21 
  22 #include "uvcvideo.h"
  23 
  24 #define UVC_CTRL_DATA_CURRENT   0
  25 #define UVC_CTRL_DATA_BACKUP    1
  26 #define UVC_CTRL_DATA_MIN       2
  27 #define UVC_CTRL_DATA_MAX       3
  28 #define UVC_CTRL_DATA_RES       4
  29 #define UVC_CTRL_DATA_DEF       5
  30 #define UVC_CTRL_DATA_LAST      6
  31 
  32 /* ------------------------------------------------------------------------
  33  * Controls
  34  */
  35 
  36 static const struct uvc_control_info uvc_ctrls[] = {
  37         {
  38                 .entity         = UVC_GUID_UVC_PROCESSING,
  39                 .selector       = UVC_PU_BRIGHTNESS_CONTROL,
  40                 .index          = 0,
  41                 .size           = 2,
  42                 .flags          = UVC_CTRL_FLAG_SET_CUR
  43                                 | UVC_CTRL_FLAG_GET_RANGE
  44                                 | UVC_CTRL_FLAG_RESTORE,
  45         },
  46         {
  47                 .entity         = UVC_GUID_UVC_PROCESSING,
  48                 .selector       = UVC_PU_CONTRAST_CONTROL,
  49                 .index          = 1,
  50                 .size           = 2,
  51                 .flags          = UVC_CTRL_FLAG_SET_CUR
  52                                 | UVC_CTRL_FLAG_GET_RANGE
  53                                 | UVC_CTRL_FLAG_RESTORE,
  54         },
  55         {
  56                 .entity         = UVC_GUID_UVC_PROCESSING,
  57                 .selector       = UVC_PU_HUE_CONTROL,
  58                 .index          = 2,
  59                 .size           = 2,
  60                 .flags          = UVC_CTRL_FLAG_SET_CUR
  61                                 | UVC_CTRL_FLAG_GET_RANGE
  62                                 | UVC_CTRL_FLAG_RESTORE
  63                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
  64         },
  65         {
  66                 .entity         = UVC_GUID_UVC_PROCESSING,
  67                 .selector       = UVC_PU_SATURATION_CONTROL,
  68                 .index          = 3,
  69                 .size           = 2,
  70                 .flags          = UVC_CTRL_FLAG_SET_CUR
  71                                 | UVC_CTRL_FLAG_GET_RANGE
  72                                 | UVC_CTRL_FLAG_RESTORE,
  73         },
  74         {
  75                 .entity         = UVC_GUID_UVC_PROCESSING,
  76                 .selector       = UVC_PU_SHARPNESS_CONTROL,
  77                 .index          = 4,
  78                 .size           = 2,
  79                 .flags          = UVC_CTRL_FLAG_SET_CUR
  80                                 | UVC_CTRL_FLAG_GET_RANGE
  81                                 | UVC_CTRL_FLAG_RESTORE,
  82         },
  83         {
  84                 .entity         = UVC_GUID_UVC_PROCESSING,
  85                 .selector       = UVC_PU_GAMMA_CONTROL,
  86                 .index          = 5,
  87                 .size           = 2,
  88                 .flags          = UVC_CTRL_FLAG_SET_CUR
  89                                 | UVC_CTRL_FLAG_GET_RANGE
  90                                 | UVC_CTRL_FLAG_RESTORE,
  91         },
  92         {
  93                 .entity         = UVC_GUID_UVC_PROCESSING,
  94                 .selector       = UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL,
  95                 .index          = 6,
  96                 .size           = 2,
  97                 .flags          = UVC_CTRL_FLAG_SET_CUR
  98                                 | UVC_CTRL_FLAG_GET_RANGE
  99                                 | UVC_CTRL_FLAG_RESTORE
 100                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 101         },
 102         {
 103                 .entity         = UVC_GUID_UVC_PROCESSING,
 104                 .selector       = UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL,
 105                 .index          = 7,
 106                 .size           = 4,
 107                 .flags          = UVC_CTRL_FLAG_SET_CUR
 108                                 | UVC_CTRL_FLAG_GET_RANGE
 109                                 | UVC_CTRL_FLAG_RESTORE
 110                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 111         },
 112         {
 113                 .entity         = UVC_GUID_UVC_PROCESSING,
 114                 .selector       = UVC_PU_BACKLIGHT_COMPENSATION_CONTROL,
 115                 .index          = 8,
 116                 .size           = 2,
 117                 .flags          = UVC_CTRL_FLAG_SET_CUR
 118                                 | UVC_CTRL_FLAG_GET_RANGE
 119                                 | UVC_CTRL_FLAG_RESTORE,
 120         },
 121         {
 122                 .entity         = UVC_GUID_UVC_PROCESSING,
 123                 .selector       = UVC_PU_GAIN_CONTROL,
 124                 .index          = 9,
 125                 .size           = 2,
 126                 .flags          = UVC_CTRL_FLAG_SET_CUR
 127                                 | UVC_CTRL_FLAG_GET_RANGE
 128                                 | UVC_CTRL_FLAG_RESTORE,
 129         },
 130         {
 131                 .entity         = UVC_GUID_UVC_PROCESSING,
 132                 .selector       = UVC_PU_POWER_LINE_FREQUENCY_CONTROL,
 133                 .index          = 10,
 134                 .size           = 1,
 135                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 136                                 | UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_RESTORE,
 137         },
 138         {
 139                 .entity         = UVC_GUID_UVC_PROCESSING,
 140                 .selector       = UVC_PU_HUE_AUTO_CONTROL,
 141                 .index          = 11,
 142                 .size           = 1,
 143                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 144                                 | UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_RESTORE,
 145         },
 146         {
 147                 .entity         = UVC_GUID_UVC_PROCESSING,
 148                 .selector       = UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL,
 149                 .index          = 12,
 150                 .size           = 1,
 151                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 152                                 | UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_RESTORE,
 153         },
 154         {
 155                 .entity         = UVC_GUID_UVC_PROCESSING,
 156                 .selector       = UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL,
 157                 .index          = 13,
 158                 .size           = 1,
 159                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 160                                 | UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_RESTORE,
 161         },
 162         {
 163                 .entity         = UVC_GUID_UVC_PROCESSING,
 164                 .selector       = UVC_PU_DIGITAL_MULTIPLIER_CONTROL,
 165                 .index          = 14,
 166                 .size           = 2,
 167                 .flags          = UVC_CTRL_FLAG_SET_CUR
 168                                 | UVC_CTRL_FLAG_GET_RANGE
 169                                 | UVC_CTRL_FLAG_RESTORE,
 170         },
 171         {
 172                 .entity         = UVC_GUID_UVC_PROCESSING,
 173                 .selector       = UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL,
 174                 .index          = 15,
 175                 .size           = 2,
 176                 .flags          = UVC_CTRL_FLAG_SET_CUR
 177                                 | UVC_CTRL_FLAG_GET_RANGE
 178                                 | UVC_CTRL_FLAG_RESTORE,
 179         },
 180         {
 181                 .entity         = UVC_GUID_UVC_PROCESSING,
 182                 .selector       = UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL,
 183                 .index          = 16,
 184                 .size           = 1,
 185                 .flags          = UVC_CTRL_FLAG_GET_CUR,
 186         },
 187         {
 188                 .entity         = UVC_GUID_UVC_PROCESSING,
 189                 .selector       = UVC_PU_ANALOG_LOCK_STATUS_CONTROL,
 190                 .index          = 17,
 191                 .size           = 1,
 192                 .flags          = UVC_CTRL_FLAG_GET_CUR,
 193         },
 194         {
 195                 .entity         = UVC_GUID_UVC_CAMERA,
 196                 .selector       = UVC_CT_SCANNING_MODE_CONTROL,
 197                 .index          = 0,
 198                 .size           = 1,
 199                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 200                                 | UVC_CTRL_FLAG_RESTORE,
 201         },
 202         {
 203                 .entity         = UVC_GUID_UVC_CAMERA,
 204                 .selector       = UVC_CT_AE_MODE_CONTROL,
 205                 .index          = 1,
 206                 .size           = 1,
 207                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 208                                 | UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_GET_RES
 209                                 | UVC_CTRL_FLAG_RESTORE,
 210         },
 211         {
 212                 .entity         = UVC_GUID_UVC_CAMERA,
 213                 .selector       = UVC_CT_AE_PRIORITY_CONTROL,
 214                 .index          = 2,
 215                 .size           = 1,
 216                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 217                                 | UVC_CTRL_FLAG_RESTORE,
 218         },
 219         {
 220                 .entity         = UVC_GUID_UVC_CAMERA,
 221                 .selector       = UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL,
 222                 .index          = 3,
 223                 .size           = 4,
 224                 .flags          = UVC_CTRL_FLAG_SET_CUR
 225                                 | UVC_CTRL_FLAG_GET_RANGE
 226                                 | UVC_CTRL_FLAG_RESTORE
 227                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 228         },
 229         {
 230                 .entity         = UVC_GUID_UVC_CAMERA,
 231                 .selector       = UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL,
 232                 .index          = 4,
 233                 .size           = 1,
 234                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_RESTORE,
 235         },
 236         {
 237                 .entity         = UVC_GUID_UVC_CAMERA,
 238                 .selector       = UVC_CT_FOCUS_ABSOLUTE_CONTROL,
 239                 .index          = 5,
 240                 .size           = 2,
 241                 .flags          = UVC_CTRL_FLAG_SET_CUR
 242                                 | UVC_CTRL_FLAG_GET_RANGE
 243                                 | UVC_CTRL_FLAG_RESTORE
 244                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 245         },
 246         {
 247                 .entity         = UVC_GUID_UVC_CAMERA,
 248                 .selector       = UVC_CT_FOCUS_RELATIVE_CONTROL,
 249                 .index          = 6,
 250                 .size           = 2,
 251                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_MIN
 252                                 | UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_RES
 253                                 | UVC_CTRL_FLAG_GET_DEF
 254                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 255         },
 256         {
 257                 .entity         = UVC_GUID_UVC_CAMERA,
 258                 .selector       = UVC_CT_IRIS_ABSOLUTE_CONTROL,
 259                 .index          = 7,
 260                 .size           = 2,
 261                 .flags          = UVC_CTRL_FLAG_SET_CUR
 262                                 | UVC_CTRL_FLAG_GET_RANGE
 263                                 | UVC_CTRL_FLAG_RESTORE
 264                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 265         },
 266         {
 267                 .entity         = UVC_GUID_UVC_CAMERA,
 268                 .selector       = UVC_CT_IRIS_RELATIVE_CONTROL,
 269                 .index          = 8,
 270                 .size           = 1,
 271                 .flags          = UVC_CTRL_FLAG_SET_CUR
 272                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 273         },
 274         {
 275                 .entity         = UVC_GUID_UVC_CAMERA,
 276                 .selector       = UVC_CT_ZOOM_ABSOLUTE_CONTROL,
 277                 .index          = 9,
 278                 .size           = 2,
 279                 .flags          = UVC_CTRL_FLAG_SET_CUR
 280                                 | UVC_CTRL_FLAG_GET_RANGE
 281                                 | UVC_CTRL_FLAG_RESTORE
 282                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 283         },
 284         {
 285                 .entity         = UVC_GUID_UVC_CAMERA,
 286                 .selector       = UVC_CT_ZOOM_RELATIVE_CONTROL,
 287                 .index          = 10,
 288                 .size           = 3,
 289                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_MIN
 290                                 | UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_RES
 291                                 | UVC_CTRL_FLAG_GET_DEF
 292                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 293         },
 294         {
 295                 .entity         = UVC_GUID_UVC_CAMERA,
 296                 .selector       = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
 297                 .index          = 11,
 298                 .size           = 8,
 299                 .flags          = UVC_CTRL_FLAG_SET_CUR
 300                                 | UVC_CTRL_FLAG_GET_RANGE
 301                                 | UVC_CTRL_FLAG_RESTORE
 302                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 303         },
 304         {
 305                 .entity         = UVC_GUID_UVC_CAMERA,
 306                 .selector       = UVC_CT_PANTILT_RELATIVE_CONTROL,
 307                 .index          = 12,
 308                 .size           = 4,
 309                 .flags          = UVC_CTRL_FLAG_SET_CUR
 310                                 | UVC_CTRL_FLAG_GET_RANGE
 311                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 312         },
 313         {
 314                 .entity         = UVC_GUID_UVC_CAMERA,
 315                 .selector       = UVC_CT_ROLL_ABSOLUTE_CONTROL,
 316                 .index          = 13,
 317                 .size           = 2,
 318                 .flags          = UVC_CTRL_FLAG_SET_CUR
 319                                 | UVC_CTRL_FLAG_GET_RANGE
 320                                 | UVC_CTRL_FLAG_RESTORE
 321                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 322         },
 323         {
 324                 .entity         = UVC_GUID_UVC_CAMERA,
 325                 .selector       = UVC_CT_ROLL_RELATIVE_CONTROL,
 326                 .index          = 14,
 327                 .size           = 2,
 328                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_MIN
 329                                 | UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_RES
 330                                 | UVC_CTRL_FLAG_GET_DEF
 331                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 332         },
 333         {
 334                 .entity         = UVC_GUID_UVC_CAMERA,
 335                 .selector       = UVC_CT_FOCUS_AUTO_CONTROL,
 336                 .index          = 17,
 337                 .size           = 1,
 338                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 339                                 | UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_RESTORE,
 340         },
 341         {
 342                 .entity         = UVC_GUID_UVC_CAMERA,
 343                 .selector       = UVC_CT_PRIVACY_CONTROL,
 344                 .index          = 18,
 345                 .size           = 1,
 346                 .flags          = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR
 347                                 | UVC_CTRL_FLAG_RESTORE
 348                                 | UVC_CTRL_FLAG_AUTO_UPDATE,
 349         },
 350 };
 351 
 352 static const struct uvc_menu_info power_line_frequency_controls[] = {
 353         { 0, "Disabled" },
 354         { 1, "50 Hz" },
 355         { 2, "60 Hz" },
 356 };
 357 
 358 static const struct uvc_menu_info exposure_auto_controls[] = {
 359         { 2, "Auto Mode" },
 360         { 1, "Manual Mode" },
 361         { 4, "Shutter Priority Mode" },
 362         { 8, "Aperture Priority Mode" },
 363 };
 364 
 365 static s32 uvc_ctrl_get_zoom(struct uvc_control_mapping *mapping,
 366         u8 query, const u8 *data)
 367 {
 368         s8 zoom = (s8)data[0];
 369 
 370         switch (query) {
 371         case UVC_GET_CUR:
 372                 return (zoom == 0) ? 0 : (zoom > 0 ? data[2] : -data[2]);
 373 
 374         case UVC_GET_MIN:
 375         case UVC_GET_MAX:
 376         case UVC_GET_RES:
 377         case UVC_GET_DEF:
 378         default:
 379                 return data[2];
 380         }
 381 }
 382 
 383 static void uvc_ctrl_set_zoom(struct uvc_control_mapping *mapping,
 384         s32 value, u8 *data)
 385 {
 386         data[0] = value == 0 ? 0 : (value > 0) ? 1 : 0xff;
 387         data[2] = min((int)abs(value), 0xff);
 388 }
 389 
 390 static s32 uvc_ctrl_get_rel_speed(struct uvc_control_mapping *mapping,
 391         u8 query, const u8 *data)
 392 {
 393         unsigned int first = mapping->offset / 8;
 394         s8 rel = (s8)data[first];
 395 
 396         switch (query) {
 397         case UVC_GET_CUR:
 398                 return (rel == 0) ? 0 : (rel > 0 ? data[first+1]
 399                                                  : -data[first+1]);
 400         case UVC_GET_MIN:
 401                 return -data[first+1];
 402         case UVC_GET_MAX:
 403         case UVC_GET_RES:
 404         case UVC_GET_DEF:
 405         default:
 406                 return data[first+1];
 407         }
 408 }
 409 
 410 static void uvc_ctrl_set_rel_speed(struct uvc_control_mapping *mapping,
 411         s32 value, u8 *data)
 412 {
 413         unsigned int first = mapping->offset / 8;
 414 
 415         data[first] = value == 0 ? 0 : (value > 0) ? 1 : 0xff;
 416         data[first+1] = min_t(int, abs(value), 0xff);
 417 }
 418 
 419 static const struct uvc_control_mapping uvc_ctrl_mappings[] = {
 420         {
 421                 .id             = V4L2_CID_BRIGHTNESS,
 422                 .name           = "Brightness",
 423                 .entity         = UVC_GUID_UVC_PROCESSING,
 424                 .selector       = UVC_PU_BRIGHTNESS_CONTROL,
 425                 .size           = 16,
 426                 .offset         = 0,
 427                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 428                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 429         },
 430         {
 431                 .id             = V4L2_CID_CONTRAST,
 432                 .name           = "Contrast",
 433                 .entity         = UVC_GUID_UVC_PROCESSING,
 434                 .selector       = UVC_PU_CONTRAST_CONTROL,
 435                 .size           = 16,
 436                 .offset         = 0,
 437                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 438                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 439         },
 440         {
 441                 .id             = V4L2_CID_HUE,
 442                 .name           = "Hue",
 443                 .entity         = UVC_GUID_UVC_PROCESSING,
 444                 .selector       = UVC_PU_HUE_CONTROL,
 445                 .size           = 16,
 446                 .offset         = 0,
 447                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 448                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 449                 .master_id      = V4L2_CID_HUE_AUTO,
 450                 .master_manual  = 0,
 451         },
 452         {
 453                 .id             = V4L2_CID_SATURATION,
 454                 .name           = "Saturation",
 455                 .entity         = UVC_GUID_UVC_PROCESSING,
 456                 .selector       = UVC_PU_SATURATION_CONTROL,
 457                 .size           = 16,
 458                 .offset         = 0,
 459                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 460                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 461         },
 462         {
 463                 .id             = V4L2_CID_SHARPNESS,
 464                 .name           = "Sharpness",
 465                 .entity         = UVC_GUID_UVC_PROCESSING,
 466                 .selector       = UVC_PU_SHARPNESS_CONTROL,
 467                 .size           = 16,
 468                 .offset         = 0,
 469                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 470                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 471         },
 472         {
 473                 .id             = V4L2_CID_GAMMA,
 474                 .name           = "Gamma",
 475                 .entity         = UVC_GUID_UVC_PROCESSING,
 476                 .selector       = UVC_PU_GAMMA_CONTROL,
 477                 .size           = 16,
 478                 .offset         = 0,
 479                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 480                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 481         },
 482         {
 483                 .id             = V4L2_CID_BACKLIGHT_COMPENSATION,
 484                 .name           = "Backlight Compensation",
 485                 .entity         = UVC_GUID_UVC_PROCESSING,
 486                 .selector       = UVC_PU_BACKLIGHT_COMPENSATION_CONTROL,
 487                 .size           = 16,
 488                 .offset         = 0,
 489                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 490                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 491         },
 492         {
 493                 .id             = V4L2_CID_GAIN,
 494                 .name           = "Gain",
 495                 .entity         = UVC_GUID_UVC_PROCESSING,
 496                 .selector       = UVC_PU_GAIN_CONTROL,
 497                 .size           = 16,
 498                 .offset         = 0,
 499                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 500                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 501         },
 502         {
 503                 .id             = V4L2_CID_POWER_LINE_FREQUENCY,
 504                 .name           = "Power Line Frequency",
 505                 .entity         = UVC_GUID_UVC_PROCESSING,
 506                 .selector       = UVC_PU_POWER_LINE_FREQUENCY_CONTROL,
 507                 .size           = 2,
 508                 .offset         = 0,
 509                 .v4l2_type      = V4L2_CTRL_TYPE_MENU,
 510                 .data_type      = UVC_CTRL_DATA_TYPE_ENUM,
 511                 .menu_info      = power_line_frequency_controls,
 512                 .menu_count     = ARRAY_SIZE(power_line_frequency_controls),
 513         },
 514         {
 515                 .id             = V4L2_CID_HUE_AUTO,
 516                 .name           = "Hue, Auto",
 517                 .entity         = UVC_GUID_UVC_PROCESSING,
 518                 .selector       = UVC_PU_HUE_AUTO_CONTROL,
 519                 .size           = 1,
 520                 .offset         = 0,
 521                 .v4l2_type      = V4L2_CTRL_TYPE_BOOLEAN,
 522                 .data_type      = UVC_CTRL_DATA_TYPE_BOOLEAN,
 523                 .slave_ids      = { V4L2_CID_HUE, },
 524         },
 525         {
 526                 .id             = V4L2_CID_EXPOSURE_AUTO,
 527                 .name           = "Exposure, Auto",
 528                 .entity         = UVC_GUID_UVC_CAMERA,
 529                 .selector       = UVC_CT_AE_MODE_CONTROL,
 530                 .size           = 4,
 531                 .offset         = 0,
 532                 .v4l2_type      = V4L2_CTRL_TYPE_MENU,
 533                 .data_type      = UVC_CTRL_DATA_TYPE_BITMASK,
 534                 .menu_info      = exposure_auto_controls,
 535                 .menu_count     = ARRAY_SIZE(exposure_auto_controls),
 536                 .slave_ids      = { V4L2_CID_EXPOSURE_ABSOLUTE, },
 537         },
 538         {
 539                 .id             = V4L2_CID_EXPOSURE_AUTO_PRIORITY,
 540                 .name           = "Exposure, Auto Priority",
 541                 .entity         = UVC_GUID_UVC_CAMERA,
 542                 .selector       = UVC_CT_AE_PRIORITY_CONTROL,
 543                 .size           = 1,
 544                 .offset         = 0,
 545                 .v4l2_type      = V4L2_CTRL_TYPE_BOOLEAN,
 546                 .data_type      = UVC_CTRL_DATA_TYPE_BOOLEAN,
 547         },
 548         {
 549                 .id             = V4L2_CID_EXPOSURE_ABSOLUTE,
 550                 .name           = "Exposure (Absolute)",
 551                 .entity         = UVC_GUID_UVC_CAMERA,
 552                 .selector       = UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL,
 553                 .size           = 32,
 554                 .offset         = 0,
 555                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 556                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 557                 .master_id      = V4L2_CID_EXPOSURE_AUTO,
 558                 .master_manual  = V4L2_EXPOSURE_MANUAL,
 559         },
 560         {
 561                 .id             = V4L2_CID_AUTO_WHITE_BALANCE,
 562                 .name           = "White Balance Temperature, Auto",
 563                 .entity         = UVC_GUID_UVC_PROCESSING,
 564                 .selector       = UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL,
 565                 .size           = 1,
 566                 .offset         = 0,
 567                 .v4l2_type      = V4L2_CTRL_TYPE_BOOLEAN,
 568                 .data_type      = UVC_CTRL_DATA_TYPE_BOOLEAN,
 569                 .slave_ids      = { V4L2_CID_WHITE_BALANCE_TEMPERATURE, },
 570         },
 571         {
 572                 .id             = V4L2_CID_WHITE_BALANCE_TEMPERATURE,
 573                 .name           = "White Balance Temperature",
 574                 .entity         = UVC_GUID_UVC_PROCESSING,
 575                 .selector       = UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL,
 576                 .size           = 16,
 577                 .offset         = 0,
 578                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 579                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 580                 .master_id      = V4L2_CID_AUTO_WHITE_BALANCE,
 581                 .master_manual  = 0,
 582         },
 583         {
 584                 .id             = V4L2_CID_AUTO_WHITE_BALANCE,
 585                 .name           = "White Balance Component, Auto",
 586                 .entity         = UVC_GUID_UVC_PROCESSING,
 587                 .selector       = UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL,
 588                 .size           = 1,
 589                 .offset         = 0,
 590                 .v4l2_type      = V4L2_CTRL_TYPE_BOOLEAN,
 591                 .data_type      = UVC_CTRL_DATA_TYPE_BOOLEAN,
 592                 .slave_ids      = { V4L2_CID_BLUE_BALANCE,
 593                                     V4L2_CID_RED_BALANCE },
 594         },
 595         {
 596                 .id             = V4L2_CID_BLUE_BALANCE,
 597                 .name           = "White Balance Blue Component",
 598                 .entity         = UVC_GUID_UVC_PROCESSING,
 599                 .selector       = UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL,
 600                 .size           = 16,
 601                 .offset         = 0,
 602                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 603                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 604                 .master_id      = V4L2_CID_AUTO_WHITE_BALANCE,
 605                 .master_manual  = 0,
 606         },
 607         {
 608                 .id             = V4L2_CID_RED_BALANCE,
 609                 .name           = "White Balance Red Component",
 610                 .entity         = UVC_GUID_UVC_PROCESSING,
 611                 .selector       = UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL,
 612                 .size           = 16,
 613                 .offset         = 16,
 614                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 615                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 616                 .master_id      = V4L2_CID_AUTO_WHITE_BALANCE,
 617                 .master_manual  = 0,
 618         },
 619         {
 620                 .id             = V4L2_CID_FOCUS_ABSOLUTE,
 621                 .name           = "Focus (absolute)",
 622                 .entity         = UVC_GUID_UVC_CAMERA,
 623                 .selector       = UVC_CT_FOCUS_ABSOLUTE_CONTROL,
 624                 .size           = 16,
 625                 .offset         = 0,
 626                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 627                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 628                 .master_id      = V4L2_CID_FOCUS_AUTO,
 629                 .master_manual  = 0,
 630         },
 631         {
 632                 .id             = V4L2_CID_FOCUS_AUTO,
 633                 .name           = "Focus, Auto",
 634                 .entity         = UVC_GUID_UVC_CAMERA,
 635                 .selector       = UVC_CT_FOCUS_AUTO_CONTROL,
 636                 .size           = 1,
 637                 .offset         = 0,
 638                 .v4l2_type      = V4L2_CTRL_TYPE_BOOLEAN,
 639                 .data_type      = UVC_CTRL_DATA_TYPE_BOOLEAN,
 640                 .slave_ids      = { V4L2_CID_FOCUS_ABSOLUTE, },
 641         },
 642         {
 643                 .id             = V4L2_CID_IRIS_ABSOLUTE,
 644                 .name           = "Iris, Absolute",
 645                 .entity         = UVC_GUID_UVC_CAMERA,
 646                 .selector       = UVC_CT_IRIS_ABSOLUTE_CONTROL,
 647                 .size           = 16,
 648                 .offset         = 0,
 649                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 650                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 651         },
 652         {
 653                 .id             = V4L2_CID_IRIS_RELATIVE,
 654                 .name           = "Iris, Relative",
 655                 .entity         = UVC_GUID_UVC_CAMERA,
 656                 .selector       = UVC_CT_IRIS_RELATIVE_CONTROL,
 657                 .size           = 8,
 658                 .offset         = 0,
 659                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 660                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 661         },
 662         {
 663                 .id             = V4L2_CID_ZOOM_ABSOLUTE,
 664                 .name           = "Zoom, Absolute",
 665                 .entity         = UVC_GUID_UVC_CAMERA,
 666                 .selector       = UVC_CT_ZOOM_ABSOLUTE_CONTROL,
 667                 .size           = 16,
 668                 .offset         = 0,
 669                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 670                 .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
 671         },
 672         {
 673                 .id             = V4L2_CID_ZOOM_CONTINUOUS,
 674                 .name           = "Zoom, Continuous",
 675                 .entity         = UVC_GUID_UVC_CAMERA,
 676                 .selector       = UVC_CT_ZOOM_RELATIVE_CONTROL,
 677                 .size           = 0,
 678                 .offset         = 0,
 679                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 680                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 681                 .get            = uvc_ctrl_get_zoom,
 682                 .set            = uvc_ctrl_set_zoom,
 683         },
 684         {
 685                 .id             = V4L2_CID_PAN_ABSOLUTE,
 686                 .name           = "Pan (Absolute)",
 687                 .entity         = UVC_GUID_UVC_CAMERA,
 688                 .selector       = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
 689                 .size           = 32,
 690                 .offset         = 0,
 691                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 692                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 693         },
 694         {
 695                 .id             = V4L2_CID_TILT_ABSOLUTE,
 696                 .name           = "Tilt (Absolute)",
 697                 .entity         = UVC_GUID_UVC_CAMERA,
 698                 .selector       = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
 699                 .size           = 32,
 700                 .offset         = 32,
 701                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 702                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 703         },
 704         {
 705                 .id             = V4L2_CID_PAN_SPEED,
 706                 .name           = "Pan (Speed)",
 707                 .entity         = UVC_GUID_UVC_CAMERA,
 708                 .selector       = UVC_CT_PANTILT_RELATIVE_CONTROL,
 709                 .size           = 16,
 710                 .offset         = 0,
 711                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 712                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 713                 .get            = uvc_ctrl_get_rel_speed,
 714                 .set            = uvc_ctrl_set_rel_speed,
 715         },
 716         {
 717                 .id             = V4L2_CID_TILT_SPEED,
 718                 .name           = "Tilt (Speed)",
 719                 .entity         = UVC_GUID_UVC_CAMERA,
 720                 .selector       = UVC_CT_PANTILT_RELATIVE_CONTROL,
 721                 .size           = 16,
 722                 .offset         = 16,
 723                 .v4l2_type      = V4L2_CTRL_TYPE_INTEGER,
 724                 .data_type      = UVC_CTRL_DATA_TYPE_SIGNED,
 725                 .get            = uvc_ctrl_get_rel_speed,
 726                 .set            = uvc_ctrl_set_rel_speed,
 727         },
 728         {
 729                 .id             = V4L2_CID_PRIVACY,
 730                 .name           = "Privacy",
 731                 .entity         = UVC_GUID_UVC_CAMERA,
 732                 .selector       = UVC_CT_PRIVACY_CONTROL,
 733                 .size           = 1,
 734                 .offset         = 0,
 735                 .v4l2_type      = V4L2_CTRL_TYPE_BOOLEAN,
 736                 .data_type      = UVC_CTRL_DATA_TYPE_BOOLEAN,
 737         },
 738 };
 739 
 740 /* ------------------------------------------------------------------------
 741  * Utility functions
 742  */
 743 
 744 static inline u8 *uvc_ctrl_data(struct uvc_control *ctrl, int id)
 745 {
 746         return ctrl->uvc_data + id * ctrl->info.size;
 747 }
 748 
 749 static inline int uvc_test_bit(const u8 *data, int bit)
 750 {
 751         return (data[bit >> 3] >> (bit & 7)) & 1;
 752 }
 753 
 754 static inline void uvc_clear_bit(u8 *data, int bit)
 755 {
 756         data[bit >> 3] &= ~(1 << (bit & 7));
 757 }
 758 
 759 /* Extract the bit string specified by mapping->offset and mapping->size
 760  * from the little-endian data stored at 'data' and return the result as
 761  * a signed 32bit integer. Sign extension will be performed if the mapping
 762  * references a signed data type.
 763  */
 764 static s32 uvc_get_le_value(struct uvc_control_mapping *mapping,
 765         u8 query, const u8 *data)
 766 {
 767         int bits = mapping->size;
 768         int offset = mapping->offset;
 769         s32 value = 0;
 770         u8 mask;
 771 
 772         data += offset / 8;
 773         offset &= 7;
 774         mask = ((1LL << bits) - 1) << offset;
 775 
 776         for (; bits > 0; data++) {
 777                 u8 byte = *data & mask;
 778                 value |= offset > 0 ? (byte >> offset) : (byte << (-offset));
 779                 bits -= 8 - (offset > 0 ? offset : 0);
 780                 offset -= 8;
 781                 mask = (1 << bits) - 1;
 782         }
 783 
 784         /* Sign-extend the value if needed. */
 785         if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED)
 786                 value |= -(value & (1 << (mapping->size - 1)));
 787 
 788         return value;
 789 }
 790 
 791 /* Set the bit string specified by mapping->offset and mapping->size
 792  * in the little-endian data stored at 'data' to the value 'value'.
 793  */
 794 static void uvc_set_le_value(struct uvc_control_mapping *mapping,
 795         s32 value, u8 *data)
 796 {
 797         int bits = mapping->size;
 798         int offset = mapping->offset;
 799         u8 mask;
 800 
 801         /* According to the v4l2 spec, writing any value to a button control
 802          * should result in the action belonging to the button control being
 803          * triggered. UVC devices however want to see a 1 written -> override
 804          * value.
 805          */
 806         if (mapping->v4l2_type == V4L2_CTRL_TYPE_BUTTON)
 807                 value = -1;
 808 
 809         data += offset / 8;
 810         offset &= 7;
 811 
 812         for (; bits > 0; data++) {
 813                 mask = ((1LL << bits) - 1) << offset;
 814                 *data = (*data & ~mask) | ((value << offset) & mask);
 815                 value >>= offset ? offset : 8;
 816                 bits -= 8 - offset;
 817                 offset = 0;
 818         }
 819 }
 820 
 821 /* ------------------------------------------------------------------------
 822  * Terminal and unit management
 823  */
 824 
 825 static const u8 uvc_processing_guid[16] = UVC_GUID_UVC_PROCESSING;
 826 static const u8 uvc_camera_guid[16] = UVC_GUID_UVC_CAMERA;
 827 static const u8 uvc_media_transport_input_guid[16] =
 828         UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT;
 829 
 830 static int uvc_entity_match_guid(const struct uvc_entity *entity,
 831         const u8 guid[16])
 832 {
 833         switch (UVC_ENTITY_TYPE(entity)) {
 834         case UVC_ITT_CAMERA:
 835                 return memcmp(uvc_camera_guid, guid, 16) == 0;
 836 
 837         case UVC_ITT_MEDIA_TRANSPORT_INPUT:
 838                 return memcmp(uvc_media_transport_input_guid, guid, 16) == 0;
 839 
 840         case UVC_VC_PROCESSING_UNIT:
 841                 return memcmp(uvc_processing_guid, guid, 16) == 0;
 842 
 843         case UVC_VC_EXTENSION_UNIT:
 844                 return memcmp(entity->extension.guidExtensionCode,
 845                               guid, 16) == 0;
 846 
 847         default:
 848                 return 0;
 849         }
 850 }
 851 
 852 /* ------------------------------------------------------------------------
 853  * UVC Controls
 854  */
 855 
 856 static void __uvc_find_control(struct uvc_entity *entity, u32 v4l2_id,
 857         struct uvc_control_mapping **mapping, struct uvc_control **control,
 858         int next)
 859 {
 860         struct uvc_control *ctrl;
 861         struct uvc_control_mapping *map;
 862         unsigned int i;
 863 
 864         if (entity == NULL)
 865                 return;
 866 
 867         for (i = 0; i < entity->ncontrols; ++i) {
 868                 ctrl = &entity->controls[i];
 869                 if (!ctrl->initialized)
 870                         continue;
 871 
 872                 list_for_each_entry(map, &ctrl->info.mappings, list) {
 873                         if ((map->id == v4l2_id) && !next) {
 874                                 *control = ctrl;
 875                                 *mapping = map;
 876                                 return;
 877                         }
 878 
 879                         if ((*mapping == NULL || (*mapping)->id > map->id) &&
 880                             (map->id > v4l2_id) && next) {
 881                                 *control = ctrl;
 882                                 *mapping = map;
 883                         }
 884                 }
 885         }
 886 }
 887 
 888 static struct uvc_control *uvc_find_control(struct uvc_video_chain *chain,
 889         u32 v4l2_id, struct uvc_control_mapping **mapping)
 890 {
 891         struct uvc_control *ctrl = NULL;
 892         struct uvc_entity *entity;
 893         int next = v4l2_id & V4L2_CTRL_FLAG_NEXT_CTRL;
 894 
 895         *mapping = NULL;
 896 
 897         /* Mask the query flags. */
 898         v4l2_id &= V4L2_CTRL_ID_MASK;
 899 
 900         /* Find the control. */
 901         list_for_each_entry(entity, &chain->entities, chain) {
 902                 __uvc_find_control(entity, v4l2_id, mapping, &ctrl, next);
 903                 if (ctrl && !next)
 904                         return ctrl;
 905         }
 906 
 907         if (ctrl == NULL && !next)
 908                 uvc_trace(UVC_TRACE_CONTROL, "Control 0x%08x not found.\n",
 909                                 v4l2_id);
 910 
 911         return ctrl;
 912 }
 913 
 914 static int uvc_ctrl_populate_cache(struct uvc_video_chain *chain,
 915         struct uvc_control *ctrl)
 916 {
 917         int ret;
 918 
 919         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF) {
 920                 ret = uvc_query_ctrl(chain->dev, UVC_GET_DEF, ctrl->entity->id,
 921                                      chain->dev->intfnum, ctrl->info.selector,
 922                                      uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF),
 923                                      ctrl->info.size);
 924                 if (ret < 0)
 925                         return ret;
 926         }
 927 
 928         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) {
 929                 ret = uvc_query_ctrl(chain->dev, UVC_GET_MIN, ctrl->entity->id,
 930                                      chain->dev->intfnum, ctrl->info.selector,
 931                                      uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN),
 932                                      ctrl->info.size);
 933                 if (ret < 0)
 934                         return ret;
 935         }
 936         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) {
 937                 ret = uvc_query_ctrl(chain->dev, UVC_GET_MAX, ctrl->entity->id,
 938                                      chain->dev->intfnum, ctrl->info.selector,
 939                                      uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX),
 940                                      ctrl->info.size);
 941                 if (ret < 0)
 942                         return ret;
 943         }
 944         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) {
 945                 ret = uvc_query_ctrl(chain->dev, UVC_GET_RES, ctrl->entity->id,
 946                                      chain->dev->intfnum, ctrl->info.selector,
 947                                      uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES),
 948                                      ctrl->info.size);
 949                 if (ret < 0) {
 950                         if (UVC_ENTITY_TYPE(ctrl->entity) !=
 951                             UVC_VC_EXTENSION_UNIT)
 952                                 return ret;
 953 
 954                         /* GET_RES is mandatory for XU controls, but some
 955                          * cameras still choke on it. Ignore errors and set the
 956                          * resolution value to zero.
 957                          */
 958                         uvc_warn_once(chain->dev, UVC_WARN_XU_GET_RES,
 959                                       "UVC non compliance - GET_RES failed on "
 960                                       "an XU control. Enabling workaround.\n");
 961                         memset(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES), 0,
 962                                ctrl->info.size);
 963                 }
 964         }
 965 
 966         ctrl->cached = 1;
 967         return 0;
 968 }
 969 
 970 static s32 __uvc_ctrl_get_value(struct uvc_control_mapping *mapping,
 971                                 const u8 *data)
 972 {
 973         s32 value = mapping->get(mapping, UVC_GET_CUR, data);
 974 
 975         if (mapping->v4l2_type == V4L2_CTRL_TYPE_MENU) {
 976                 const struct uvc_menu_info *menu = mapping->menu_info;
 977                 unsigned int i;
 978 
 979                 for (i = 0; i < mapping->menu_count; ++i, ++menu) {
 980                         if (menu->value == value) {
 981                                 value = i;
 982                                 break;
 983                         }
 984                 }
 985         }
 986 
 987         return value;
 988 }
 989 
 990 static int __uvc_ctrl_get(struct uvc_video_chain *chain,
 991         struct uvc_control *ctrl, struct uvc_control_mapping *mapping,
 992         s32 *value)
 993 {
 994         int ret;
 995 
 996         if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0)
 997                 return -EACCES;
 998 
 999         if (!ctrl->loaded) {
1000                 ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, ctrl->entity->id,
1001                                 chain->dev->intfnum, ctrl->info.selector,
1002                                 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT),
1003                                 ctrl->info.size);
1004                 if (ret < 0)
1005                         return ret;
1006 
1007                 ctrl->loaded = 1;
1008         }
1009 
1010         *value = __uvc_ctrl_get_value(mapping,
1011                                 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT));
1012 
1013         return 0;
1014 }
1015 
1016 static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
1017         struct uvc_control *ctrl,
1018         struct uvc_control_mapping *mapping,
1019         struct v4l2_queryctrl *v4l2_ctrl)
1020 {
1021         struct uvc_control_mapping *master_map = NULL;
1022         struct uvc_control *master_ctrl = NULL;
1023         const struct uvc_menu_info *menu;
1024         unsigned int i;
1025 
1026         memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl));
1027         v4l2_ctrl->id = mapping->id;
1028         v4l2_ctrl->type = mapping->v4l2_type;
1029         strscpy(v4l2_ctrl->name, mapping->name, sizeof(v4l2_ctrl->name));
1030         v4l2_ctrl->flags = 0;
1031 
1032         if (!(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR))
1033                 v4l2_ctrl->flags |= V4L2_CTRL_FLAG_WRITE_ONLY;
1034         if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR))
1035                 v4l2_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1036 
1037         if (mapping->master_id)
1038                 __uvc_find_control(ctrl->entity, mapping->master_id,
1039                                    &master_map, &master_ctrl, 0);
1040         if (master_ctrl && (master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) {
1041                 s32 val;
1042                 int ret = __uvc_ctrl_get(chain, master_ctrl, master_map, &val);
1043                 if (ret < 0)
1044                         return ret;
1045 
1046                 if (val != mapping->master_manual)
1047                                 v4l2_ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
1048         }
1049 
1050         if (!ctrl->cached) {
1051                 int ret = uvc_ctrl_populate_cache(chain, ctrl);
1052                 if (ret < 0)
1053                         return ret;
1054         }
1055 
1056         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF) {
1057                 v4l2_ctrl->default_value = mapping->get(mapping, UVC_GET_DEF,
1058                                 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_DEF));
1059         }
1060 
1061         switch (mapping->v4l2_type) {
1062         case V4L2_CTRL_TYPE_MENU:
1063                 v4l2_ctrl->minimum = 0;
1064                 v4l2_ctrl->maximum = mapping->menu_count - 1;
1065                 v4l2_ctrl->step = 1;
1066 
1067                 menu = mapping->menu_info;
1068                 for (i = 0; i < mapping->menu_count; ++i, ++menu) {
1069                         if (menu->value == v4l2_ctrl->default_value) {
1070                                 v4l2_ctrl->default_value = i;
1071                                 break;
1072                         }
1073                 }
1074 
1075                 return 0;
1076 
1077         case V4L2_CTRL_TYPE_BOOLEAN:
1078                 v4l2_ctrl->minimum = 0;
1079                 v4l2_ctrl->maximum = 1;
1080                 v4l2_ctrl->step = 1;
1081                 return 0;
1082 
1083         case V4L2_CTRL_TYPE_BUTTON:
1084                 v4l2_ctrl->minimum = 0;
1085                 v4l2_ctrl->maximum = 0;
1086                 v4l2_ctrl->step = 0;
1087                 return 0;
1088 
1089         default:
1090                 break;
1091         }
1092 
1093         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN)
1094                 v4l2_ctrl->minimum = mapping->get(mapping, UVC_GET_MIN,
1095                                      uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN));
1096 
1097         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX)
1098                 v4l2_ctrl->maximum = mapping->get(mapping, UVC_GET_MAX,
1099                                      uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX));
1100 
1101         if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)
1102                 v4l2_ctrl->step = mapping->get(mapping, UVC_GET_RES,
1103                                   uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES));
1104 
1105         return 0;
1106 }
1107 
1108 int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
1109         struct v4l2_queryctrl *v4l2_ctrl)
1110 {
1111         struct uvc_control *ctrl;
1112         struct uvc_control_mapping *mapping;
1113         int ret;
1114 
1115         ret = mutex_lock_interruptible(&chain->ctrl_mutex);
1116         if (ret < 0)
1117                 return -ERESTARTSYS;
1118 
1119         ctrl = uvc_find_control(chain, v4l2_ctrl->id, &mapping);
1120         if (ctrl == NULL) {
1121                 ret = -EINVAL;
1122                 goto done;
1123         }
1124 
1125         ret = __uvc_query_v4l2_ctrl(chain, ctrl, mapping, v4l2_ctrl);
1126 done:
1127         mutex_unlock(&chain->ctrl_mutex);
1128         return ret;
1129 }
1130 
1131 /*
1132  * Mapping V4L2 controls to UVC controls can be straightforward if done well.
1133  * Most of the UVC controls exist in V4L2, and can be mapped directly. Some
1134  * must be grouped (for instance the Red Balance, Blue Balance and Do White
1135  * Balance V4L2 controls use the White Balance Component UVC control) or
1136  * otherwise translated. The approach we take here is to use a translation
1137  * table for the controls that can be mapped directly, and handle the others
1138  * manually.
1139  */
1140 int uvc_query_v4l2_menu(struct uvc_video_chain *chain,
1141         struct v4l2_querymenu *query_menu)
1142 {
1143         const struct uvc_menu_info *menu_info;
1144         struct uvc_control_mapping *mapping;
1145         struct uvc_control *ctrl;
1146         u32 index = query_menu->index;
1147         u32 id = query_menu->id;
1148         int ret;
1149 
1150         memset(query_menu, 0, sizeof(*query_menu));
1151         query_menu->id = id;
1152         query_menu->index = index;
1153 
1154         ret = mutex_lock_interruptible(&chain->ctrl_mutex);
1155         if (ret < 0)
1156                 return -ERESTARTSYS;
1157 
1158         ctrl = uvc_find_control(chain, query_menu->id, &mapping);
1159         if (ctrl == NULL || mapping->v4l2_type != V4L2_CTRL_TYPE_MENU) {
1160                 ret = -EINVAL;
1161                 goto done;
1162         }
1163 
1164         if (query_menu->index >= mapping->menu_count) {
1165                 ret = -EINVAL;
1166                 goto done;
1167         }
1168 
1169         menu_info = &mapping->menu_info[query_menu->index];
1170 
1171         if (mapping->data_type == UVC_CTRL_DATA_TYPE_BITMASK &&
1172             (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) {
1173                 s32 bitmap;
1174 
1175                 if (!ctrl->cached) {
1176                         ret = uvc_ctrl_populate_cache(chain, ctrl);
1177                         if (ret < 0)
1178                                 goto done;
1179                 }
1180 
1181                 bitmap = mapping->get(mapping, UVC_GET_RES,
1182                                       uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES));
1183                 if (!(bitmap & menu_info->value)) {
1184                         ret = -EINVAL;
1185                         goto done;
1186                 }
1187         }
1188 
1189         strscpy(query_menu->name, menu_info->name, sizeof(query_menu->name));
1190 
1191 done:
1192         mutex_unlock(&chain->ctrl_mutex);
1193         return ret;
1194 }
1195 
1196 /* --------------------------------------------------------------------------
1197  * Ctrl event handling
1198  */
1199 
1200 static void uvc_ctrl_fill_event(struct uvc_video_chain *chain,
1201         struct v4l2_event *ev,
1202         struct uvc_control *ctrl,
1203         struct uvc_control_mapping *mapping,
1204         s32 value, u32 changes)
1205 {
1206         struct v4l2_queryctrl v4l2_ctrl;
1207 
1208         __uvc_query_v4l2_ctrl(chain, ctrl, mapping, &v4l2_ctrl);
1209 
1210         memset(ev, 0, sizeof(*ev));
1211         ev->type = V4L2_EVENT_CTRL;
1212         ev->id = v4l2_ctrl.id;
1213         ev->u.ctrl.value = value;
1214         ev->u.ctrl.changes = changes;
1215         ev->u.ctrl.type = v4l2_ctrl.type;
1216         ev->u.ctrl.flags = v4l2_ctrl.flags;
1217         ev->u.ctrl.minimum = v4l2_ctrl.minimum;
1218         ev->u.ctrl.maximum = v4l2_ctrl.maximum;
1219         ev->u.ctrl.step = v4l2_ctrl.step;
1220         ev->u.ctrl.default_value = v4l2_ctrl.default_value;
1221 }
1222 
1223 /*
1224  * Send control change events to all subscribers for the @ctrl control. By
1225  * default the subscriber that generated the event, as identified by @handle,
1226  * is not notified unless it has set the V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK flag.
1227  * @handle can be NULL for asynchronous events related to auto-update controls,
1228  * in which case all subscribers are notified.
1229  */
1230 static void uvc_ctrl_send_event(struct uvc_video_chain *chain,
1231         struct uvc_fh *handle, struct uvc_control *ctrl,
1232         struct uvc_control_mapping *mapping, s32 value, u32 changes)
1233 {
1234         struct v4l2_fh *originator = handle ? &handle->vfh : NULL;
1235         struct v4l2_subscribed_event *sev;
1236         struct v4l2_event ev;
1237 
1238         if (list_empty(&mapping->ev_subs))
1239                 return;
1240 
1241         uvc_ctrl_fill_event(chain, &ev, ctrl, mapping, value, changes);
1242 
1243         list_for_each_entry(sev, &mapping->ev_subs, node) {
1244                 if (sev->fh != originator ||
1245                     (sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK) ||
1246                     (changes & V4L2_EVENT_CTRL_CH_FLAGS))
1247                         v4l2_event_queue_fh(sev->fh, &ev);
1248         }
1249 }
1250 
1251 /*
1252  * Send control change events for the slave of the @master control identified
1253  * by the V4L2 ID @slave_id. The @handle identifies the event subscriber that
1254  * generated the event and may be NULL for auto-update events.
1255  */
1256 static void uvc_ctrl_send_slave_event(struct uvc_video_chain *chain,
1257         struct uvc_fh *handle, struct uvc_control *master, u32 slave_id)
1258 {
1259         struct uvc_control_mapping *mapping = NULL;
1260         struct uvc_control *ctrl = NULL;
1261         u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
1262         s32 val = 0;
1263 
1264         __uvc_find_control(master->entity, slave_id, &mapping, &ctrl, 0);
1265         if (ctrl == NULL)
1266                 return;
1267 
1268         if (__uvc_ctrl_get(chain, ctrl, mapping, &val) == 0)
1269                 changes |= V4L2_EVENT_CTRL_CH_VALUE;
1270 
1271         uvc_ctrl_send_event(chain, handle, ctrl, mapping, val, changes);
1272 }
1273 
1274 static void uvc_ctrl_status_event_work(struct work_struct *work)
1275 {
1276         struct uvc_device *dev = container_of(work, struct uvc_device,
1277                                               async_ctrl.work);
1278         struct uvc_ctrl_work *w = &dev->async_ctrl;
1279         struct uvc_video_chain *chain = w->chain;
1280         struct uvc_control_mapping *mapping;
1281         struct uvc_control *ctrl = w->ctrl;
1282         struct uvc_fh *handle;
1283         unsigned int i;
1284         int ret;
1285 
1286         mutex_lock(&chain->ctrl_mutex);
1287 
1288         handle = ctrl->handle;
1289         ctrl->handle = NULL;
1290 
1291         list_for_each_entry(mapping, &ctrl->info.mappings, list) {
1292                 s32 value = __uvc_ctrl_get_value(mapping, w->data);
1293 
1294                 /*
1295                  * handle may be NULL here if the device sends auto-update
1296                  * events without a prior related control set from userspace.
1297                  */
1298                 for (i = 0; i < ARRAY_SIZE(mapping->slave_ids); ++i) {
1299                         if (!mapping->slave_ids[i])
1300                                 break;
1301 
1302                         uvc_ctrl_send_slave_event(chain, handle, ctrl,
1303                                                   mapping->slave_ids[i]);
1304                 }
1305 
1306                 uvc_ctrl_send_event(chain, handle, ctrl, mapping, value,
1307                                     V4L2_EVENT_CTRL_CH_VALUE);
1308         }
1309 
1310         mutex_unlock(&chain->ctrl_mutex);
1311 
1312         /* Resubmit the URB. */
1313         w->urb->interval = dev->int_ep->desc.bInterval;
1314         ret = usb_submit_urb(w->urb, GFP_KERNEL);
1315         if (ret < 0)
1316                 uvc_printk(KERN_ERR, "Failed to resubmit status URB (%d).\n",
1317                            ret);
1318 }
1319 
1320 bool uvc_ctrl_status_event(struct urb *urb, struct uvc_video_chain *chain,
1321                            struct uvc_control *ctrl, const u8 *data)
1322 {
1323         struct uvc_device *dev = chain->dev;
1324         struct uvc_ctrl_work *w = &dev->async_ctrl;
1325 
1326         if (list_empty(&ctrl->info.mappings)) {
1327                 ctrl->handle = NULL;
1328                 return false;
1329         }
1330 
1331         w->data = data;
1332         w->urb = urb;
1333         w->chain = chain;
1334         w->ctrl = ctrl;
1335 
1336         schedule_work(&w->work);
1337 
1338         return true;
1339 }
1340 
1341 static bool uvc_ctrl_xctrls_has_control(const struct v4l2_ext_control *xctrls,
1342                                         unsigned int xctrls_count, u32 id)
1343 {
1344         unsigned int i;
1345 
1346         for (i = 0; i < xctrls_count; ++i) {
1347                 if (xctrls[i].id == id)
1348                         return true;
1349         }
1350 
1351         return false;
1352 }
1353 
1354 static void uvc_ctrl_send_events(struct uvc_fh *handle,
1355         const struct v4l2_ext_control *xctrls, unsigned int xctrls_count)
1356 {
1357         struct uvc_control_mapping *mapping;
1358         struct uvc_control *ctrl;
1359         u32 changes = V4L2_EVENT_CTRL_CH_VALUE;
1360         unsigned int i;
1361         unsigned int j;
1362 
1363         for (i = 0; i < xctrls_count; ++i) {
1364                 ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping);
1365 
1366                 if (ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS)
1367                         /* Notification will be sent from an Interrupt event. */
1368                         continue;
1369 
1370                 for (j = 0; j < ARRAY_SIZE(mapping->slave_ids); ++j) {
1371                         u32 slave_id = mapping->slave_ids[j];
1372 
1373                         if (!slave_id)
1374                                 break;
1375 
1376                         /*
1377                          * We can skip sending an event for the slave if the
1378                          * slave is being modified in the same transaction.
1379                          */
1380                         if (uvc_ctrl_xctrls_has_control(xctrls, xctrls_count,
1381                                                         slave_id))
1382                                 continue;
1383 
1384                         uvc_ctrl_send_slave_event(handle->chain, handle, ctrl,
1385                                                   slave_id);
1386                 }
1387 
1388                 /*
1389                  * If the master is being modified in the same transaction
1390                  * flags may change too.
1391                  */
1392                 if (mapping->master_id &&
1393                     uvc_ctrl_xctrls_has_control(xctrls, xctrls_count,
1394                                                 mapping->master_id))
1395                         changes |= V4L2_EVENT_CTRL_CH_FLAGS;
1396 
1397                 uvc_ctrl_send_event(handle->chain, handle, ctrl, mapping,
1398                                     xctrls[i].value, changes);
1399         }
1400 }
1401 
1402 static int uvc_ctrl_add_event(struct v4l2_subscribed_event *sev, unsigned elems)
1403 {
1404         struct uvc_fh *handle = container_of(sev->fh, struct uvc_fh, vfh);
1405         struct uvc_control_mapping *mapping;
1406         struct uvc_control *ctrl;
1407         int ret;
1408 
1409         ret = mutex_lock_interruptible(&handle->chain->ctrl_mutex);
1410         if (ret < 0)
1411                 return -ERESTARTSYS;
1412 
1413         ctrl = uvc_find_control(handle->chain, sev->id, &mapping);
1414         if (ctrl == NULL) {
1415                 ret = -EINVAL;
1416                 goto done;
1417         }
1418 
1419         list_add_tail(&sev->node, &mapping->ev_subs);
1420         if (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL) {
1421                 struct v4l2_event ev;
1422                 u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;
1423                 s32 val = 0;
1424 
1425                 if (__uvc_ctrl_get(handle->chain, ctrl, mapping, &val) == 0)
1426                         changes |= V4L2_EVENT_CTRL_CH_VALUE;
1427 
1428                 uvc_ctrl_fill_event(handle->chain, &ev, ctrl, mapping, val,
1429                                     changes);
1430                 /* Mark the queue as active, allowing this initial
1431                    event to be accepted. */
1432                 sev->elems = elems;
1433                 v4l2_event_queue_fh(sev->fh, &ev);
1434         }
1435 
1436 done:
1437         mutex_unlock(&handle->chain->ctrl_mutex);
1438         return ret;
1439 }
1440 
1441 static void uvc_ctrl_del_event(struct v4l2_subscribed_event *sev)
1442 {
1443         struct uvc_fh *handle = container_of(sev->fh, struct uvc_fh, vfh);
1444 
1445         mutex_lock(&handle->chain->ctrl_mutex);
1446         list_del(&sev->node);
1447         mutex_unlock(&handle->chain->ctrl_mutex);
1448 }
1449 
1450 const struct v4l2_subscribed_event_ops uvc_ctrl_sub_ev_ops = {
1451         .add = uvc_ctrl_add_event,
1452         .del = uvc_ctrl_del_event,
1453         .replace = v4l2_ctrl_replace,
1454         .merge = v4l2_ctrl_merge,
1455 };
1456 
1457 /* --------------------------------------------------------------------------
1458  * Control transactions
1459  *
1460  * To make extended set operations as atomic as the hardware allows, controls
1461  * are handled using begin/commit/rollback operations.
1462  *
1463  * At the beginning of a set request, uvc_ctrl_begin should be called to
1464  * initialize the request. This function acquires the control lock.
1465  *
1466  * When setting a control, the new value is stored in the control data field
1467  * at position UVC_CTRL_DATA_CURRENT. The control is then marked as dirty for
1468  * later processing. If the UVC and V4L2 control sizes differ, the current
1469  * value is loaded from the hardware before storing the new value in the data
1470  * field.
1471  *
1472  * After processing all controls in the transaction, uvc_ctrl_commit or
1473  * uvc_ctrl_rollback must be called to apply the pending changes to the
1474  * hardware or revert them. When applying changes, all controls marked as
1475  * dirty will be modified in the UVC device, and the dirty flag will be
1476  * cleared. When reverting controls, the control data field
1477  * UVC_CTRL_DATA_CURRENT is reverted to its previous value
1478  * (UVC_CTRL_DATA_BACKUP) for all dirty controls. Both functions release the
1479  * control lock.
1480  */
1481 int uvc_ctrl_begin(struct uvc_video_chain *chain)
1482 {
1483         return mutex_lock_interruptible(&chain->ctrl_mutex) ? -ERESTARTSYS : 0;
1484 }
1485 
1486 static int uvc_ctrl_commit_entity(struct uvc_device *dev,
1487         struct uvc_entity *entity, int rollback)
1488 {
1489         struct uvc_control *ctrl;
1490         unsigned int i;
1491         int ret;
1492 
1493         if (entity == NULL)
1494                 return 0;
1495 
1496         for (i = 0; i < entity->ncontrols; ++i) {
1497                 ctrl = &entity->controls[i];
1498                 if (!ctrl->initialized)
1499                         continue;
1500 
1501                 /* Reset the loaded flag for auto-update controls that were
1502                  * marked as loaded in uvc_ctrl_get/uvc_ctrl_set to prevent
1503                  * uvc_ctrl_get from using the cached value, and for write-only
1504                  * controls to prevent uvc_ctrl_set from setting bits not
1505                  * explicitly set by the user.
1506                  */
1507                 if (ctrl->info.flags & UVC_CTRL_FLAG_AUTO_UPDATE ||
1508                     !(ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR))
1509                         ctrl->loaded = 0;
1510 
1511                 if (!ctrl->dirty)
1512                         continue;
1513 
1514                 if (!rollback)
1515                         ret = uvc_query_ctrl(dev, UVC_SET_CUR, ctrl->entity->id,
1516                                 dev->intfnum, ctrl->info.selector,
1517                                 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT),
1518                                 ctrl->info.size);
1519                 else
1520                         ret = 0;
1521 
1522                 if (rollback || ret < 0)
1523                         memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT),
1524                                uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP),
1525                                ctrl->info.size);
1526 
1527                 ctrl->dirty = 0;
1528 
1529                 if (ret < 0)
1530                         return ret;
1531         }
1532 
1533         return 0;
1534 }
1535 
1536 int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback,
1537                       const struct v4l2_ext_control *xctrls,
1538                       unsigned int xctrls_count)
1539 {
1540         struct uvc_video_chain *chain = handle->chain;
1541         struct uvc_entity *entity;
1542         int ret = 0;
1543 
1544         /* Find the control. */
1545         list_for_each_entry(entity, &chain->entities, chain) {
1546                 ret = uvc_ctrl_commit_entity(chain->dev, entity, rollback);
1547                 if (ret < 0)
1548                         goto done;
1549         }
1550 
1551         if (!rollback)
1552                 uvc_ctrl_send_events(handle, xctrls, xctrls_count);
1553 done:
1554         mutex_unlock(&chain->ctrl_mutex);
1555         return ret;
1556 }
1557 
1558 int uvc_ctrl_get(struct uvc_video_chain *chain,
1559         struct v4l2_ext_control *xctrl)
1560 {
1561         struct uvc_control *ctrl;
1562         struct uvc_control_mapping *mapping;
1563 
1564         ctrl = uvc_find_control(chain, xctrl->id, &mapping);
1565         if (ctrl == NULL)
1566                 return -EINVAL;
1567 
1568         return __uvc_ctrl_get(chain, ctrl, mapping, &xctrl->value);
1569 }
1570 
1571 int uvc_ctrl_set(struct uvc_fh *handle,
1572         struct v4l2_ext_control *xctrl)
1573 {
1574         struct uvc_video_chain *chain = handle->chain;
1575         struct uvc_control *ctrl;
1576         struct uvc_control_mapping *mapping;
1577         s32 value;
1578         u32 step;
1579         s32 min;
1580         s32 max;
1581         int ret;
1582 
1583         ctrl = uvc_find_control(chain, xctrl->id, &mapping);
1584         if (ctrl == NULL)
1585                 return -EINVAL;
1586         if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR))
1587                 return -EACCES;
1588 
1589         /* Clamp out of range values. */
1590         switch (mapping->v4l2_type) {
1591         case V4L2_CTRL_TYPE_INTEGER:
1592                 if (!ctrl->cached) {
1593                         ret = uvc_ctrl_populate_cache(chain, ctrl);
1594                         if (ret < 0)
1595                                 return ret;
1596                 }
1597 
1598                 min = mapping->get(mapping, UVC_GET_MIN,
1599                                    uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN));
1600                 max = mapping->get(mapping, UVC_GET_MAX,
1601                                    uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX));
1602                 step = mapping->get(mapping, UVC_GET_RES,
1603                                     uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES));
1604                 if (step == 0)
1605                         step = 1;
1606 
1607                 xctrl->value = min + ((u32)(xctrl->value - min) + step / 2)
1608                              / step * step;
1609                 if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED)
1610                         xctrl->value = clamp(xctrl->value, min, max);
1611                 else
1612                         xctrl->value = clamp_t(u32, xctrl->value, min, max);
1613                 value = xctrl->value;
1614                 break;
1615 
1616         case V4L2_CTRL_TYPE_BOOLEAN:
1617                 xctrl->value = clamp(xctrl->value, 0, 1);
1618                 value = xctrl->value;
1619                 break;
1620 
1621         case V4L2_CTRL_TYPE_MENU:
1622                 if (xctrl->value < 0 || xctrl->value >= mapping->menu_count)
1623                         return -ERANGE;
1624                 value = mapping->menu_info[xctrl->value].value;
1625 
1626                 /* Valid menu indices are reported by the GET_RES request for
1627                  * UVC controls that support it.
1628                  */
1629                 if (mapping->data_type == UVC_CTRL_DATA_TYPE_BITMASK &&
1630                     (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) {
1631                         if (!ctrl->cached) {
1632                                 ret = uvc_ctrl_populate_cache(chain, ctrl);
1633                                 if (ret < 0)
1634                                         return ret;
1635                         }
1636 
1637                         step = mapping->get(mapping, UVC_GET_RES,
1638                                         uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES));
1639                         if (!(step & value))
1640                                 return -EINVAL;
1641                 }
1642 
1643                 break;
1644 
1645         default:
1646                 value = xctrl->value;
1647                 break;
1648         }
1649 
1650         /* If the mapping doesn't span the whole UVC control, the current value
1651          * needs to be loaded from the device to perform the read-modify-write
1652          * operation.
1653          */
1654         if (!ctrl->loaded && (ctrl->info.size * 8) != mapping->size) {
1655                 if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0) {
1656                         memset(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT),
1657                                 0, ctrl->info.size);
1658                 } else {
1659                         ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR,
1660                                 ctrl->entity->id, chain->dev->intfnum,
1661                                 ctrl->info.selector,
1662                                 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT),
1663                                 ctrl->info.size);
1664                         if (ret < 0)
1665                                 return ret;
1666                 }
1667 
1668                 ctrl->loaded = 1;
1669         }
1670 
1671         /* Backup the current value in case we need to rollback later. */
1672         if (!ctrl->dirty) {
1673                 memcpy(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_BACKUP),
1674                        uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT),
1675                        ctrl->info.size);
1676         }
1677 
1678         mapping->set(mapping, value,
1679                 uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT));
1680 
1681         if (ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS)
1682                 ctrl->handle = handle;
1683 
1684         ctrl->dirty = 1;
1685         ctrl->modified = 1;
1686         return 0;
1687 }
1688 
1689 /* --------------------------------------------------------------------------
1690  * Dynamic controls
1691  */
1692 
1693 /*
1694  * Retrieve flags for a given control
1695  */
1696 static int uvc_ctrl_get_flags(struct uvc_device *dev,
1697                               const struct uvc_control *ctrl,
1698                               struct uvc_control_info *info)
1699 {
1700         u8 *data;
1701         int ret;
1702 
1703         data = kmalloc(1, GFP_KERNEL);
1704         if (data == NULL)
1705                 return -ENOMEM;
1706 
1707         ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum,
1708                              info->selector, data, 1);
1709         if (!ret)
1710                 info->flags |= (data[0] & UVC_CONTROL_CAP_GET ?
1711                                 UVC_CTRL_FLAG_GET_CUR : 0)
1712                             |  (data[0] & UVC_CONTROL_CAP_SET ?
1713                                 UVC_CTRL_FLAG_SET_CUR : 0)
1714                             |  (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ?
1715                                 UVC_CTRL_FLAG_AUTO_UPDATE : 0)
1716                             |  (data[0] & UVC_CONTROL_CAP_ASYNCHRONOUS ?
1717                                 UVC_CTRL_FLAG_ASYNCHRONOUS : 0);
1718 
1719         kfree(data);
1720         return ret;
1721 }
1722 
1723 static void uvc_ctrl_fixup_xu_info(struct uvc_device *dev,
1724         const struct uvc_control *ctrl, struct uvc_control_info *info)
1725 {
1726         struct uvc_ctrl_fixup {
1727                 struct usb_device_id id;
1728                 u8 entity;
1729                 u8 selector;
1730                 u8 flags;
1731         };
1732 
1733         static const struct uvc_ctrl_fixup fixups[] = {
1734                 { { USB_DEVICE(0x046d, 0x08c2) }, 9, 1,
1735                         UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX |
1736                         UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_SET_CUR |
1737                         UVC_CTRL_FLAG_AUTO_UPDATE },
1738                 { { USB_DEVICE(0x046d, 0x08cc) }, 9, 1,
1739                         UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX |
1740                         UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_SET_CUR |
1741                         UVC_CTRL_FLAG_AUTO_UPDATE },
1742                 { { USB_DEVICE(0x046d, 0x0994) }, 9, 1,
1743                         UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX |
1744                         UVC_CTRL_FLAG_GET_DEF | UVC_CTRL_FLAG_SET_CUR |
1745                         UVC_CTRL_FLAG_AUTO_UPDATE },
1746         };
1747 
1748         unsigned int i;
1749 
1750         for (i = 0; i < ARRAY_SIZE(fixups); ++i) {
1751                 if (!usb_match_one_id(dev->intf, &fixups[i].id))
1752                         continue;
1753 
1754                 if (fixups[i].entity == ctrl->entity->id &&
1755                     fixups[i].selector == info->selector) {
1756                         info->flags = fixups[i].flags;
1757                         return;
1758                 }
1759         }
1760 }
1761 
1762 /*
1763  * Query control information (size and flags) for XU controls.
1764  */
1765 static int uvc_ctrl_fill_xu_info(struct uvc_device *dev,
1766         const struct uvc_control *ctrl, struct uvc_control_info *info)
1767 {
1768         u8 *data;
1769         int ret;
1770 
1771         data = kmalloc(2, GFP_KERNEL);
1772         if (data == NULL)
1773                 return -ENOMEM;
1774 
1775         memcpy(info->entity, ctrl->entity->extension.guidExtensionCode,
1776                sizeof(info->entity));
1777         info->index = ctrl->index;
1778         info->selector = ctrl->index + 1;
1779 
1780         /* Query and verify the control length (GET_LEN) */
1781         ret = uvc_query_ctrl(dev, UVC_GET_LEN, ctrl->entity->id, dev->intfnum,
1782                              info->selector, data, 2);
1783         if (ret < 0) {
1784                 uvc_trace(UVC_TRACE_CONTROL,
1785                           "GET_LEN failed on control %pUl/%u (%d).\n",
1786                            info->entity, info->selector, ret);
1787                 goto done;
1788         }
1789 
1790         info->size = le16_to_cpup((__le16 *)data);
1791 
1792         info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX
1793                     | UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF;
1794 
1795         ret = uvc_ctrl_get_flags(dev, ctrl, info);
1796         if (ret < 0) {
1797                 uvc_trace(UVC_TRACE_CONTROL,
1798                           "Failed to get flags for control %pUl/%u (%d).\n",
1799                           info->entity, info->selector, ret);
1800                 goto done;
1801         }
1802 
1803         uvc_ctrl_fixup_xu_info(dev, ctrl, info);
1804 
1805         uvc_trace(UVC_TRACE_CONTROL, "XU control %pUl/%u queried: len %u, "
1806                   "flags { get %u set %u auto %u }.\n",
1807                   info->entity, info->selector, info->size,
1808                   (info->flags & UVC_CTRL_FLAG_GET_CUR) ? 1 : 0,
1809                   (info->flags & UVC_CTRL_FLAG_SET_CUR) ? 1 : 0,
1810                   (info->flags & UVC_CTRL_FLAG_AUTO_UPDATE) ? 1 : 0);
1811 
1812 done:
1813         kfree(data);
1814         return ret;
1815 }
1816 
1817 static int uvc_ctrl_add_info(struct uvc_device *dev, struct uvc_control *ctrl,
1818         const struct uvc_control_info *info);
1819 
1820 static int uvc_ctrl_init_xu_ctrl(struct uvc_device *dev,
1821         struct uvc_control *ctrl)
1822 {
1823         struct uvc_control_info info;
1824         int ret;
1825 
1826         if (ctrl->initialized)
1827                 return 0;
1828 
1829         ret = uvc_ctrl_fill_xu_info(dev, ctrl, &info);
1830         if (ret < 0)
1831                 return ret;
1832 
1833         ret = uvc_ctrl_add_info(dev, ctrl, &info);
1834         if (ret < 0)
1835                 uvc_trace(UVC_TRACE_CONTROL, "Failed to initialize control "
1836                           "%pUl/%u on device %s entity %u\n", info.entity,
1837                           info.selector, dev->udev->devpath, ctrl->entity->id);
1838 
1839         return ret;
1840 }
1841 
1842 int uvc_xu_ctrl_query(struct uvc_video_chain *chain,
1843         struct uvc_xu_control_query *xqry)
1844 {
1845         struct uvc_entity *entity;
1846         struct uvc_control *ctrl;
1847         unsigned int i, found = 0;
1848         u32 reqflags;
1849         u16 size;
1850         u8 *data = NULL;
1851         int ret;
1852 
1853         /* Find the extension unit. */
1854         list_for_each_entry(entity, &chain->entities, chain) {
1855                 if (UVC_ENTITY_TYPE(entity) == UVC_VC_EXTENSION_UNIT &&
1856                     entity->id == xqry->unit)
1857                         break;
1858         }
1859 
1860         if (entity->id != xqry->unit) {
1861                 uvc_trace(UVC_TRACE_CONTROL, "Extension unit %u not found.\n",
1862                         xqry->unit);
1863                 return -ENOENT;
1864         }
1865 
1866         /* Find the control and perform delayed initialization if needed. */
1867         for (i = 0; i < entity->ncontrols; ++i) {
1868                 ctrl = &entity->controls[i];
1869                 if (ctrl->index == xqry->selector - 1) {
1870                         found = 1;
1871                         break;
1872                 }
1873         }
1874 
1875         if (!found) {
1876                 uvc_trace(UVC_TRACE_CONTROL, "Control %pUl/%u not found.\n",
1877                         entity->extension.guidExtensionCode, xqry->selector);
1878                 return -ENOENT;
1879         }
1880 
1881         if (mutex_lock_interruptible(&chain->ctrl_mutex))
1882                 return -ERESTARTSYS;
1883 
1884         ret = uvc_ctrl_init_xu_ctrl(chain->dev, ctrl);
1885         if (ret < 0) {
1886                 ret = -ENOENT;
1887                 goto done;
1888         }
1889 
1890         /* Validate the required buffer size and flags for the request */
1891         reqflags = 0;
1892         size = ctrl->info.size;
1893 
1894         switch (xqry->query) {
1895         case UVC_GET_CUR:
1896                 reqflags = UVC_CTRL_FLAG_GET_CUR;
1897                 break;
1898         case UVC_GET_MIN:
1899                 reqflags = UVC_CTRL_FLAG_GET_MIN;
1900                 break;
1901         case UVC_GET_MAX:
1902                 reqflags = UVC_CTRL_FLAG_GET_MAX;
1903                 break;
1904         case UVC_GET_DEF:
1905                 reqflags = UVC_CTRL_FLAG_GET_DEF;
1906                 break;
1907         case UVC_GET_RES:
1908                 reqflags = UVC_CTRL_FLAG_GET_RES;
1909                 break;
1910         case UVC_SET_CUR:
1911                 reqflags = UVC_CTRL_FLAG_SET_CUR;
1912                 break;
1913         case UVC_GET_LEN:
1914                 size = 2;
1915                 break;
1916         case UVC_GET_INFO:
1917                 size = 1;
1918                 break;
1919         default:
1920                 ret = -EINVAL;
1921                 goto done;
1922         }
1923 
1924         if (size != xqry->size) {
1925                 ret = -ENOBUFS;
1926                 goto done;
1927         }
1928 
1929         if (reqflags && !(ctrl->info.flags & reqflags)) {
1930                 ret = -EBADRQC;
1931                 goto done;
1932         }
1933 
1934         data = kmalloc(size, GFP_KERNEL);
1935         if (data == NULL) {
1936                 ret = -ENOMEM;
1937                 goto done;
1938         }
1939 
1940         if (xqry->query == UVC_SET_CUR &&
1941             copy_from_user(data, xqry->data, size)) {
1942                 ret = -EFAULT;
1943                 goto done;
1944         }
1945 
1946         ret = uvc_query_ctrl(chain->dev, xqry->query, xqry->unit,
1947                              chain->dev->intfnum, xqry->selector, data, size);
1948         if (ret < 0)
1949                 goto done;
1950 
1951         if (xqry->query != UVC_SET_CUR &&
1952             copy_to_user(xqry->data, data, size))
1953                 ret = -EFAULT;
1954 done:
1955         kfree(data);
1956         mutex_unlock(&chain->ctrl_mutex);
1957         return ret;
1958 }
1959 
1960 /* --------------------------------------------------------------------------
1961  * Suspend/resume
1962  */
1963 
1964 /*
1965  * Restore control values after resume, skipping controls that haven't been
1966  * changed.
1967  *
1968  * TODO
1969  * - Don't restore modified controls that are back to their default value.
1970  * - Handle restore order (Auto-Exposure Mode should be restored before
1971  *   Exposure Time).
1972  */
1973 int uvc_ctrl_restore_values(struct uvc_device *dev)
1974 {
1975         struct uvc_control *ctrl;
1976         struct uvc_entity *entity;
1977         unsigned int i;
1978         int ret;
1979 
1980         /* Walk the entities list and restore controls when possible. */
1981         list_for_each_entry(entity, &dev->entities, list) {
1982 
1983                 for (i = 0; i < entity->ncontrols; ++i) {
1984                         ctrl = &entity->controls[i];
1985 
1986                         if (!ctrl->initialized || !ctrl->modified ||
1987                             (ctrl->info.flags & UVC_CTRL_FLAG_RESTORE) == 0)
1988                                 continue;
1989 
1990                         printk(KERN_INFO "restoring control %pUl/%u/%u\n",
1991                                 ctrl->info.entity, ctrl->info.index,
1992                                 ctrl->info.selector);
1993                         ctrl->dirty = 1;
1994                 }
1995 
1996                 ret = uvc_ctrl_commit_entity(dev, entity, 0);
1997                 if (ret < 0)
1998                         return ret;
1999         }
2000 
2001         return 0;
2002 }
2003 
2004 /* --------------------------------------------------------------------------
2005  * Control and mapping handling
2006  */
2007 
2008 /*
2009  * Add control information to a given control.
2010  */
2011 static int uvc_ctrl_add_info(struct uvc_device *dev, struct uvc_control *ctrl,
2012         const struct uvc_control_info *info)
2013 {
2014         int ret = 0;
2015 
2016         ctrl->info = *info;
2017         INIT_LIST_HEAD(&ctrl->info.mappings);
2018 
2019         /* Allocate an array to save control values (cur, def, max, etc.) */
2020         ctrl->uvc_data = kzalloc(ctrl->info.size * UVC_CTRL_DATA_LAST + 1,
2021                                  GFP_KERNEL);
2022         if (ctrl->uvc_data == NULL) {
2023                 ret = -ENOMEM;
2024                 goto done;
2025         }
2026 
2027         /*
2028          * Retrieve control flags from the device. Ignore errors and work with
2029          * default flag values from the uvc_ctrl array when the device doesn't
2030          * properly implement GET_INFO on standard controls.
2031          */
2032         uvc_ctrl_get_flags(dev, ctrl, &ctrl->info);
2033 
2034         ctrl->initialized = 1;
2035 
2036         uvc_trace(UVC_TRACE_CONTROL, "Added control %pUl/%u to device %s "
2037                 "entity %u\n", ctrl->info.entity, ctrl->info.selector,
2038                 dev->udev->devpath, ctrl->entity->id);
2039 
2040 done:
2041         if (ret < 0)
2042                 kfree(ctrl->uvc_data);
2043         return ret;
2044 }
2045 
2046 /*
2047  * Add a control mapping to a given control.
2048  */
2049 static int __uvc_ctrl_add_mapping(struct uvc_device *dev,
2050         struct uvc_control *ctrl, const struct uvc_control_mapping *mapping)
2051 {
2052         struct uvc_control_mapping *map;
2053         unsigned int size;
2054 
2055         /* Most mappings come from static kernel data and need to be duplicated.
2056          * Mappings that come from userspace will be unnecessarily duplicated,
2057          * this could be optimized.
2058          */
2059         map = kmemdup(mapping, sizeof(*mapping), GFP_KERNEL);
2060         if (map == NULL)
2061                 return -ENOMEM;
2062 
2063         INIT_LIST_HEAD(&map->ev_subs);
2064 
2065         size = sizeof(*mapping->menu_info) * mapping->menu_count;
2066         map->menu_info = kmemdup(mapping->menu_info, size, GFP_KERNEL);
2067         if (map->menu_info == NULL) {
2068                 kfree(map);
2069                 return -ENOMEM;
2070         }
2071 
2072         if (map->get == NULL)
2073                 map->get = uvc_get_le_value;
2074         if (map->set == NULL)
2075                 map->set = uvc_set_le_value;
2076 
2077         list_add_tail(&map->list, &ctrl->info.mappings);
2078         uvc_trace(UVC_TRACE_CONTROL,
2079                 "Adding mapping '%s' to control %pUl/%u.\n",
2080                 map->name, ctrl->info.entity, ctrl->info.selector);
2081 
2082         return 0;
2083 }
2084 
2085 int uvc_ctrl_add_mapping(struct uvc_video_chain *chain,
2086         const struct uvc_control_mapping *mapping)
2087 {
2088         struct uvc_device *dev = chain->dev;
2089         struct uvc_control_mapping *map;
2090         struct uvc_entity *entity;
2091         struct uvc_control *ctrl;
2092         int found = 0;
2093         int ret;
2094 
2095         if (mapping->id & ~V4L2_CTRL_ID_MASK) {
2096                 uvc_trace(UVC_TRACE_CONTROL, "Can't add mapping '%s', control "
2097                         "id 0x%08x is invalid.\n", mapping->name,
2098                         mapping->id);
2099                 return -EINVAL;
2100         }
2101 
2102         /* Search for the matching (GUID/CS) control on the current chain */
2103         list_for_each_entry(entity, &chain->entities, chain) {
2104                 unsigned int i;
2105 
2106                 if (UVC_ENTITY_TYPE(entity) != UVC_VC_EXTENSION_UNIT ||
2107                     !uvc_entity_match_guid(entity, mapping->entity))
2108                         continue;
2109 
2110                 for (i = 0; i < entity->ncontrols; ++i) {
2111                         ctrl = &entity->controls[i];
2112                         if (ctrl->index == mapping->selector - 1) {
2113                                 found = 1;
2114                                 break;
2115                         }
2116                 }
2117 
2118                 if (found)
2119                         break;
2120         }
2121         if (!found)
2122                 return -ENOENT;
2123 
2124         if (mutex_lock_interruptible(&chain->ctrl_mutex))
2125                 return -ERESTARTSYS;
2126 
2127         /* Perform delayed initialization of XU controls */
2128         ret = uvc_ctrl_init_xu_ctrl(dev, ctrl);
2129         if (ret < 0) {
2130                 ret = -ENOENT;
2131                 goto done;
2132         }
2133 
2134         /* Validate the user-provided bit-size and offset */
2135         if (mapping->size > 32 ||
2136             mapping->offset + mapping->size > ctrl->info.size * 8) {
2137                 ret = -EINVAL;
2138                 goto done;
2139         }
2140 
2141         list_for_each_entry(map, &ctrl->info.mappings, list) {
2142                 if (mapping->id == map->id) {
2143                         uvc_trace(UVC_TRACE_CONTROL, "Can't add mapping '%s', "
2144                                 "control id 0x%08x already exists.\n",
2145                                 mapping->name, mapping->id);
2146                         ret = -EEXIST;
2147                         goto done;
2148                 }
2149         }
2150 
2151         /* Prevent excess memory consumption */
2152         if (atomic_inc_return(&dev->nmappings) > UVC_MAX_CONTROL_MAPPINGS) {
2153                 atomic_dec(&dev->nmappings);
2154                 uvc_trace(UVC_TRACE_CONTROL, "Can't add mapping '%s', maximum "
2155                         "mappings count (%u) exceeded.\n", mapping->name,
2156                         UVC_MAX_CONTROL_MAPPINGS);
2157                 ret = -ENOMEM;
2158                 goto done;
2159         }
2160 
2161         ret = __uvc_ctrl_add_mapping(dev, ctrl, mapping);
2162         if (ret < 0)
2163                 atomic_dec(&dev->nmappings);
2164 
2165 done:
2166         mutex_unlock(&chain->ctrl_mutex);
2167         return ret;
2168 }
2169 
2170 /*
2171  * Prune an entity of its bogus controls using a blacklist. Bogus controls
2172  * are currently the ones that crash the camera or unconditionally return an
2173  * error when queried.
2174  */
2175 static void uvc_ctrl_prune_entity(struct uvc_device *dev,
2176         struct uvc_entity *entity)
2177 {
2178         struct uvc_ctrl_blacklist {
2179                 struct usb_device_id id;
2180                 u8 index;
2181         };
2182 
2183         static const struct uvc_ctrl_blacklist processing_blacklist[] = {
2184                 { { USB_DEVICE(0x13d3, 0x509b) }, 9 }, /* Gain */
2185                 { { USB_DEVICE(0x1c4f, 0x3000) }, 6 }, /* WB Temperature */
2186                 { { USB_DEVICE(0x5986, 0x0241) }, 2 }, /* Hue */
2187         };
2188         static const struct uvc_ctrl_blacklist camera_blacklist[] = {
2189                 { { USB_DEVICE(0x06f8, 0x3005) }, 9 }, /* Zoom, Absolute */
2190         };
2191 
2192         const struct uvc_ctrl_blacklist *blacklist;
2193         unsigned int size;
2194         unsigned int count;
2195         unsigned int i;
2196         u8 *controls;
2197 
2198         switch (UVC_ENTITY_TYPE(entity)) {
2199         case UVC_VC_PROCESSING_UNIT:
2200                 blacklist = processing_blacklist;
2201                 count = ARRAY_SIZE(processing_blacklist);
2202                 controls = entity->processing.bmControls;
2203                 size = entity->processing.bControlSize;
2204                 break;
2205 
2206         case UVC_ITT_CAMERA:
2207                 blacklist = camera_blacklist;
2208                 count = ARRAY_SIZE(camera_blacklist);
2209                 controls = entity->camera.bmControls;
2210                 size = entity->camera.bControlSize;
2211                 break;
2212 
2213         default:
2214                 return;
2215         }
2216 
2217         for (i = 0; i < count; ++i) {
2218                 if (!usb_match_one_id(dev->intf, &blacklist[i].id))
2219                         continue;
2220 
2221                 if (blacklist[i].index >= 8 * size ||
2222                     !uvc_test_bit(controls, blacklist[i].index))
2223                         continue;
2224 
2225                 uvc_trace(UVC_TRACE_CONTROL, "%u/%u control is black listed, "
2226                         "removing it.\n", entity->id, blacklist[i].index);
2227 
2228                 uvc_clear_bit(controls, blacklist[i].index);
2229         }
2230 }
2231 
2232 /*
2233  * Add control information and hardcoded stock control mappings to the given
2234  * device.
2235  */
2236 static void uvc_ctrl_init_ctrl(struct uvc_device *dev, struct uvc_control *ctrl)
2237 {
2238         const struct uvc_control_info *info = uvc_ctrls;
2239         const struct uvc_control_info *iend = info + ARRAY_SIZE(uvc_ctrls);
2240         const struct uvc_control_mapping *mapping = uvc_ctrl_mappings;
2241         const struct uvc_control_mapping *mend =
2242                 mapping + ARRAY_SIZE(uvc_ctrl_mappings);
2243 
2244         /* XU controls initialization requires querying the device for control
2245          * information. As some buggy UVC devices will crash when queried
2246          * repeatedly in a tight loop, delay XU controls initialization until
2247          * first use.
2248          */
2249         if (UVC_ENTITY_TYPE(ctrl->entity) == UVC_VC_EXTENSION_UNIT)
2250                 return;
2251 
2252         for (; info < iend; ++info) {
2253                 if (uvc_entity_match_guid(ctrl->entity, info->entity) &&
2254                     ctrl->index == info->index) {
2255                         uvc_ctrl_add_info(dev, ctrl, info);
2256                         break;
2257                  }
2258         }
2259 
2260         if (!ctrl->initialized)
2261                 return;
2262 
2263         for (; mapping < mend; ++mapping) {
2264                 if (uvc_entity_match_guid(ctrl->entity, mapping->entity) &&
2265                     ctrl->info.selector == mapping->selector)
2266                         __uvc_ctrl_add_mapping(dev, ctrl, mapping);
2267         }
2268 }
2269 
2270 /*
2271  * Initialize device controls.
2272  */
2273 int uvc_ctrl_init_device(struct uvc_device *dev)
2274 {
2275         struct uvc_entity *entity;
2276         unsigned int i;
2277 
2278         INIT_WORK(&dev->async_ctrl.work, uvc_ctrl_status_event_work);
2279 
2280         /* Walk the entities list and instantiate controls */
2281         list_for_each_entry(entity, &dev->entities, list) {
2282                 struct uvc_control *ctrl;
2283                 unsigned int bControlSize = 0, ncontrols;
2284                 u8 *bmControls = NULL;
2285 
2286                 if (UVC_ENTITY_TYPE(entity) == UVC_VC_EXTENSION_UNIT) {
2287                         bmControls = entity->extension.bmControls;
2288                         bControlSize = entity->extension.bControlSize;
2289                 } else if (UVC_ENTITY_TYPE(entity) == UVC_VC_PROCESSING_UNIT) {
2290                         bmControls = entity->processing.bmControls;
2291                         bControlSize = entity->processing.bControlSize;
2292                 } else if (UVC_ENTITY_TYPE(entity) == UVC_ITT_CAMERA) {
2293                         bmControls = entity->camera.bmControls;
2294                         bControlSize = entity->camera.bControlSize;
2295                 }
2296 
2297                 /* Remove bogus/blacklisted controls */
2298                 uvc_ctrl_prune_entity(dev, entity);
2299 
2300                 /* Count supported controls and allocate the controls array */
2301                 ncontrols = memweight(bmControls, bControlSize);
2302                 if (ncontrols == 0)
2303                         continue;
2304 
2305                 entity->controls = kcalloc(ncontrols, sizeof(*ctrl),
2306                                            GFP_KERNEL);
2307                 if (entity->controls == NULL)
2308                         return -ENOMEM;
2309                 entity->ncontrols = ncontrols;
2310 
2311                 /* Initialize all supported controls */
2312                 ctrl = entity->controls;
2313                 for (i = 0; i < bControlSize * 8; ++i) {
2314                         if (uvc_test_bit(bmControls, i) == 0)
2315                                 continue;
2316 
2317                         ctrl->entity = entity;
2318                         ctrl->index = i;
2319 
2320                         uvc_ctrl_init_ctrl(dev, ctrl);
2321                         ctrl++;
2322                 }
2323         }
2324 
2325         return 0;
2326 }
2327 
2328 /*
2329  * Cleanup device controls.
2330  */
2331 static void uvc_ctrl_cleanup_mappings(struct uvc_device *dev,
2332         struct uvc_control *ctrl)
2333 {
2334         struct uvc_control_mapping *mapping, *nm;
2335 
2336         list_for_each_entry_safe(mapping, nm, &ctrl->info.mappings, list) {
2337                 list_del(&mapping->list);
2338                 kfree(mapping->menu_info);
2339                 kfree(mapping);
2340         }
2341 }
2342 
2343 void uvc_ctrl_cleanup_device(struct uvc_device *dev)
2344 {
2345         struct uvc_entity *entity;
2346         unsigned int i;
2347 
2348         /* Can be uninitialized if we are aborting on probe error. */
2349         if (dev->async_ctrl.work.func)
2350                 cancel_work_sync(&dev->async_ctrl.work);
2351 
2352         /* Free controls and control mappings for all entities. */
2353         list_for_each_entry(entity, &dev->entities, list) {
2354                 for (i = 0; i < entity->ncontrols; ++i) {
2355                         struct uvc_control *ctrl = &entity->controls[i];
2356 
2357                         if (!ctrl->initialized)
2358                                 continue;
2359 
2360                         uvc_ctrl_cleanup_mappings(dev, ctrl);
2361                         kfree(ctrl->uvc_data);
2362                 }
2363 
2364                 kfree(entity->controls);
2365         }
2366 }

/* [<][>][^][v][top][bottom][index][help] */