2 * uvc_ctrl.c -- USB Video Class driver - Controls
4 * Copyright (C) 2005-2009
5 * Laurent Pinchart (laurent.pinchart@skynet.be)
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
14 #include <linux/kernel.h>
15 #include <linux/list.h>
16 #include <linux/module.h>
17 #include <linux/uaccess.h>
18 #include <linux/usb.h>
19 #include <linux/videodev2.h>
20 #include <linux/vmalloc.h>
21 #include <linux/wait.h>
22 #include <asm/atomic.h>
26 #define UVC_CTRL_NDATA 2
27 #define UVC_CTRL_DATA_CURRENT 0
28 #define UVC_CTRL_DATA_BACKUP 1
30 /* ------------------------------------------------------------------------
34 static struct uvc_control_info uvc_ctrls
[] = {
36 .entity
= UVC_GUID_UVC_PROCESSING
,
37 .selector
= PU_BRIGHTNESS_CONTROL
,
40 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
41 | UVC_CONTROL_RESTORE
,
44 .entity
= UVC_GUID_UVC_PROCESSING
,
45 .selector
= PU_CONTRAST_CONTROL
,
48 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
49 | UVC_CONTROL_RESTORE
,
52 .entity
= UVC_GUID_UVC_PROCESSING
,
53 .selector
= PU_HUE_CONTROL
,
56 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
57 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
60 .entity
= UVC_GUID_UVC_PROCESSING
,
61 .selector
= PU_SATURATION_CONTROL
,
64 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
65 | UVC_CONTROL_RESTORE
,
68 .entity
= UVC_GUID_UVC_PROCESSING
,
69 .selector
= PU_SHARPNESS_CONTROL
,
72 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
73 | UVC_CONTROL_RESTORE
,
76 .entity
= UVC_GUID_UVC_PROCESSING
,
77 .selector
= PU_GAMMA_CONTROL
,
80 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
81 | UVC_CONTROL_RESTORE
,
84 .entity
= UVC_GUID_UVC_PROCESSING
,
85 .selector
= PU_WHITE_BALANCE_TEMPERATURE_CONTROL
,
88 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
89 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
92 .entity
= UVC_GUID_UVC_PROCESSING
,
93 .selector
= PU_WHITE_BALANCE_COMPONENT_CONTROL
,
96 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
97 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
100 .entity
= UVC_GUID_UVC_PROCESSING
,
101 .selector
= PU_BACKLIGHT_COMPENSATION_CONTROL
,
104 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
105 | UVC_CONTROL_RESTORE
,
108 .entity
= UVC_GUID_UVC_PROCESSING
,
109 .selector
= PU_GAIN_CONTROL
,
112 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
113 | UVC_CONTROL_RESTORE
,
116 .entity
= UVC_GUID_UVC_PROCESSING
,
117 .selector
= PU_POWER_LINE_FREQUENCY_CONTROL
,
120 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
121 | UVC_CONTROL_RESTORE
,
124 .entity
= UVC_GUID_UVC_PROCESSING
,
125 .selector
= PU_HUE_AUTO_CONTROL
,
128 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
129 | UVC_CONTROL_GET_DEF
| UVC_CONTROL_RESTORE
,
132 .entity
= UVC_GUID_UVC_PROCESSING
,
133 .selector
= PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL
,
136 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
137 | UVC_CONTROL_GET_DEF
| UVC_CONTROL_RESTORE
,
140 .entity
= UVC_GUID_UVC_PROCESSING
,
141 .selector
= PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL
,
144 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
145 | UVC_CONTROL_GET_DEF
| UVC_CONTROL_RESTORE
,
148 .entity
= UVC_GUID_UVC_PROCESSING
,
149 .selector
= PU_DIGITAL_MULTIPLIER_CONTROL
,
152 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
153 | UVC_CONTROL_RESTORE
,
156 .entity
= UVC_GUID_UVC_PROCESSING
,
157 .selector
= PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL
,
160 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
161 | UVC_CONTROL_RESTORE
,
164 .entity
= UVC_GUID_UVC_PROCESSING
,
165 .selector
= PU_ANALOG_VIDEO_STANDARD_CONTROL
,
168 .flags
= UVC_CONTROL_GET_CUR
,
171 .entity
= UVC_GUID_UVC_PROCESSING
,
172 .selector
= PU_ANALOG_LOCK_STATUS_CONTROL
,
175 .flags
= UVC_CONTROL_GET_CUR
,
178 .entity
= UVC_GUID_UVC_CAMERA
,
179 .selector
= CT_SCANNING_MODE_CONTROL
,
182 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
183 | UVC_CONTROL_RESTORE
,
186 .entity
= UVC_GUID_UVC_CAMERA
,
187 .selector
= CT_AE_MODE_CONTROL
,
190 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
191 | UVC_CONTROL_GET_DEF
| UVC_CONTROL_GET_RES
192 | UVC_CONTROL_RESTORE
,
195 .entity
= UVC_GUID_UVC_CAMERA
,
196 .selector
= CT_AE_PRIORITY_CONTROL
,
199 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
200 | UVC_CONTROL_RESTORE
,
203 .entity
= UVC_GUID_UVC_CAMERA
,
204 .selector
= CT_EXPOSURE_TIME_ABSOLUTE_CONTROL
,
207 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
208 | UVC_CONTROL_RESTORE
,
211 .entity
= UVC_GUID_UVC_CAMERA
,
212 .selector
= CT_EXPOSURE_TIME_RELATIVE_CONTROL
,
215 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
216 | UVC_CONTROL_RESTORE
,
219 .entity
= UVC_GUID_UVC_CAMERA
,
220 .selector
= CT_FOCUS_ABSOLUTE_CONTROL
,
223 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
224 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
227 .entity
= UVC_GUID_UVC_CAMERA
,
228 .selector
= CT_FOCUS_RELATIVE_CONTROL
,
231 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
232 | UVC_CONTROL_AUTO_UPDATE
,
235 .entity
= UVC_GUID_UVC_CAMERA
,
236 .selector
= CT_IRIS_ABSOLUTE_CONTROL
,
239 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
240 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
243 .entity
= UVC_GUID_UVC_CAMERA
,
244 .selector
= CT_IRIS_RELATIVE_CONTROL
,
247 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
248 | UVC_CONTROL_AUTO_UPDATE
,
251 .entity
= UVC_GUID_UVC_CAMERA
,
252 .selector
= CT_ZOOM_ABSOLUTE_CONTROL
,
255 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
256 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
259 .entity
= UVC_GUID_UVC_CAMERA
,
260 .selector
= CT_ZOOM_RELATIVE_CONTROL
,
263 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
264 | UVC_CONTROL_AUTO_UPDATE
,
267 .entity
= UVC_GUID_UVC_CAMERA
,
268 .selector
= CT_PANTILT_ABSOLUTE_CONTROL
,
271 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
272 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
275 .entity
= UVC_GUID_UVC_CAMERA
,
276 .selector
= CT_PANTILT_RELATIVE_CONTROL
,
279 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
280 | UVC_CONTROL_AUTO_UPDATE
,
283 .entity
= UVC_GUID_UVC_CAMERA
,
284 .selector
= CT_ROLL_ABSOLUTE_CONTROL
,
287 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
288 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
291 .entity
= UVC_GUID_UVC_CAMERA
,
292 .selector
= CT_ROLL_RELATIVE_CONTROL
,
295 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_RANGE
296 | UVC_CONTROL_AUTO_UPDATE
,
299 .entity
= UVC_GUID_UVC_CAMERA
,
300 .selector
= CT_FOCUS_AUTO_CONTROL
,
303 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
304 | UVC_CONTROL_GET_DEF
| UVC_CONTROL_RESTORE
,
307 .entity
= UVC_GUID_UVC_CAMERA
,
308 .selector
= CT_PRIVACY_CONTROL
,
311 .flags
= UVC_CONTROL_SET_CUR
| UVC_CONTROL_GET_CUR
312 | UVC_CONTROL_RESTORE
| UVC_CONTROL_AUTO_UPDATE
,
316 static struct uvc_menu_info power_line_frequency_controls
[] = {
322 static struct uvc_menu_info exposure_auto_controls
[] = {
324 { 1, "Manual Mode" },
325 { 4, "Shutter Priority Mode" },
326 { 8, "Aperture Priority Mode" },
329 static __s32
uvc_ctrl_get_zoom(struct uvc_control_mapping
*mapping
,
330 __u8 query
, const __u8
*data
)
332 __s8 zoom
= (__s8
)data
[0];
336 return (zoom
== 0) ? 0 : (zoom
> 0 ? data
[2] : -data
[2]);
347 static void uvc_ctrl_set_zoom(struct uvc_control_mapping
*mapping
,
348 __s32 value
, __u8
*data
)
350 data
[0] = value
== 0 ? 0 : (value
> 0) ? 1 : 0xff;
351 data
[2] = min(abs(value
), 0xff);
354 static struct uvc_control_mapping uvc_ctrl_mappings
[] = {
356 .id
= V4L2_CID_BRIGHTNESS
,
357 .name
= "Brightness",
358 .entity
= UVC_GUID_UVC_PROCESSING
,
359 .selector
= PU_BRIGHTNESS_CONTROL
,
362 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
363 .data_type
= UVC_CTRL_DATA_TYPE_SIGNED
,
366 .id
= V4L2_CID_CONTRAST
,
368 .entity
= UVC_GUID_UVC_PROCESSING
,
369 .selector
= PU_CONTRAST_CONTROL
,
372 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
373 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
378 .entity
= UVC_GUID_UVC_PROCESSING
,
379 .selector
= PU_HUE_CONTROL
,
382 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
383 .data_type
= UVC_CTRL_DATA_TYPE_SIGNED
,
386 .id
= V4L2_CID_SATURATION
,
387 .name
= "Saturation",
388 .entity
= UVC_GUID_UVC_PROCESSING
,
389 .selector
= PU_SATURATION_CONTROL
,
392 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
393 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
396 .id
= V4L2_CID_SHARPNESS
,
398 .entity
= UVC_GUID_UVC_PROCESSING
,
399 .selector
= PU_SHARPNESS_CONTROL
,
402 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
403 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
406 .id
= V4L2_CID_GAMMA
,
408 .entity
= UVC_GUID_UVC_PROCESSING
,
409 .selector
= PU_GAMMA_CONTROL
,
412 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
413 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
416 .id
= V4L2_CID_BACKLIGHT_COMPENSATION
,
417 .name
= "Backlight Compensation",
418 .entity
= UVC_GUID_UVC_PROCESSING
,
419 .selector
= PU_BACKLIGHT_COMPENSATION_CONTROL
,
422 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
423 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
428 .entity
= UVC_GUID_UVC_PROCESSING
,
429 .selector
= PU_GAIN_CONTROL
,
432 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
433 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
436 .id
= V4L2_CID_POWER_LINE_FREQUENCY
,
437 .name
= "Power Line Frequency",
438 .entity
= UVC_GUID_UVC_PROCESSING
,
439 .selector
= PU_POWER_LINE_FREQUENCY_CONTROL
,
442 .v4l2_type
= V4L2_CTRL_TYPE_MENU
,
443 .data_type
= UVC_CTRL_DATA_TYPE_ENUM
,
444 .menu_info
= power_line_frequency_controls
,
445 .menu_count
= ARRAY_SIZE(power_line_frequency_controls
),
448 .id
= V4L2_CID_HUE_AUTO
,
450 .entity
= UVC_GUID_UVC_PROCESSING
,
451 .selector
= PU_HUE_AUTO_CONTROL
,
454 .v4l2_type
= V4L2_CTRL_TYPE_BOOLEAN
,
455 .data_type
= UVC_CTRL_DATA_TYPE_BOOLEAN
,
458 .id
= V4L2_CID_EXPOSURE_AUTO
,
459 .name
= "Exposure, Auto",
460 .entity
= UVC_GUID_UVC_CAMERA
,
461 .selector
= CT_AE_MODE_CONTROL
,
464 .v4l2_type
= V4L2_CTRL_TYPE_MENU
,
465 .data_type
= UVC_CTRL_DATA_TYPE_BITMASK
,
466 .menu_info
= exposure_auto_controls
,
467 .menu_count
= ARRAY_SIZE(exposure_auto_controls
),
470 .id
= V4L2_CID_EXPOSURE_AUTO_PRIORITY
,
471 .name
= "Exposure, Auto Priority",
472 .entity
= UVC_GUID_UVC_CAMERA
,
473 .selector
= CT_AE_PRIORITY_CONTROL
,
476 .v4l2_type
= V4L2_CTRL_TYPE_BOOLEAN
,
477 .data_type
= UVC_CTRL_DATA_TYPE_BOOLEAN
,
480 .id
= V4L2_CID_EXPOSURE_ABSOLUTE
,
481 .name
= "Exposure (Absolute)",
482 .entity
= UVC_GUID_UVC_CAMERA
,
483 .selector
= CT_EXPOSURE_TIME_ABSOLUTE_CONTROL
,
486 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
487 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
490 .id
= V4L2_CID_AUTO_WHITE_BALANCE
,
491 .name
= "White Balance Temperature, Auto",
492 .entity
= UVC_GUID_UVC_PROCESSING
,
493 .selector
= PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL
,
496 .v4l2_type
= V4L2_CTRL_TYPE_BOOLEAN
,
497 .data_type
= UVC_CTRL_DATA_TYPE_BOOLEAN
,
500 .id
= V4L2_CID_WHITE_BALANCE_TEMPERATURE
,
501 .name
= "White Balance Temperature",
502 .entity
= UVC_GUID_UVC_PROCESSING
,
503 .selector
= PU_WHITE_BALANCE_TEMPERATURE_CONTROL
,
506 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
507 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
510 .id
= V4L2_CID_AUTO_WHITE_BALANCE
,
511 .name
= "White Balance Component, Auto",
512 .entity
= UVC_GUID_UVC_PROCESSING
,
513 .selector
= PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL
,
516 .v4l2_type
= V4L2_CTRL_TYPE_BOOLEAN
,
517 .data_type
= UVC_CTRL_DATA_TYPE_BOOLEAN
,
520 .id
= V4L2_CID_BLUE_BALANCE
,
521 .name
= "White Balance Blue Component",
522 .entity
= UVC_GUID_UVC_PROCESSING
,
523 .selector
= PU_WHITE_BALANCE_COMPONENT_CONTROL
,
526 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
527 .data_type
= UVC_CTRL_DATA_TYPE_SIGNED
,
530 .id
= V4L2_CID_RED_BALANCE
,
531 .name
= "White Balance Red Component",
532 .entity
= UVC_GUID_UVC_PROCESSING
,
533 .selector
= PU_WHITE_BALANCE_COMPONENT_CONTROL
,
536 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
537 .data_type
= UVC_CTRL_DATA_TYPE_SIGNED
,
540 .id
= V4L2_CID_FOCUS_ABSOLUTE
,
541 .name
= "Focus (absolute)",
542 .entity
= UVC_GUID_UVC_CAMERA
,
543 .selector
= CT_FOCUS_ABSOLUTE_CONTROL
,
546 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
547 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
550 .id
= V4L2_CID_FOCUS_AUTO
,
551 .name
= "Focus, Auto",
552 .entity
= UVC_GUID_UVC_CAMERA
,
553 .selector
= CT_FOCUS_AUTO_CONTROL
,
556 .v4l2_type
= V4L2_CTRL_TYPE_BOOLEAN
,
557 .data_type
= UVC_CTRL_DATA_TYPE_BOOLEAN
,
560 .id
= V4L2_CID_ZOOM_ABSOLUTE
,
561 .name
= "Zoom, Absolute",
562 .entity
= UVC_GUID_UVC_CAMERA
,
563 .selector
= CT_ZOOM_ABSOLUTE_CONTROL
,
566 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
567 .data_type
= UVC_CTRL_DATA_TYPE_UNSIGNED
,
570 .id
= V4L2_CID_ZOOM_CONTINUOUS
,
571 .name
= "Zoom, Continuous",
572 .entity
= UVC_GUID_UVC_CAMERA
,
573 .selector
= CT_ZOOM_RELATIVE_CONTROL
,
576 .v4l2_type
= V4L2_CTRL_TYPE_INTEGER
,
577 .data_type
= UVC_CTRL_DATA_TYPE_SIGNED
,
578 .get
= uvc_ctrl_get_zoom
,
579 .set
= uvc_ctrl_set_zoom
,
582 .id
= V4L2_CID_PRIVACY
,
584 .entity
= UVC_GUID_UVC_CAMERA
,
585 .selector
= CT_PRIVACY_CONTROL
,
588 .v4l2_type
= V4L2_CTRL_TYPE_BOOLEAN
,
589 .data_type
= UVC_CTRL_DATA_TYPE_BOOLEAN
,
593 /* ------------------------------------------------------------------------
597 static inline __u8
*uvc_ctrl_data(struct uvc_control
*ctrl
, int id
)
599 return ctrl
->data
+ id
* ctrl
->info
->size
;
602 static inline int uvc_test_bit(const __u8
*data
, int bit
)
604 return (data
[bit
>> 3] >> (bit
& 7)) & 1;
607 static inline void uvc_clear_bit(__u8
*data
, int bit
)
609 data
[bit
>> 3] &= ~(1 << (bit
& 7));
612 /* Extract the bit string specified by mapping->offset and mapping->size
613 * from the little-endian data stored at 'data' and return the result as
614 * a signed 32bit integer. Sign extension will be performed if the mapping
615 * references a signed data type.
617 static __s32
uvc_get_le_value(struct uvc_control_mapping
*mapping
,
618 __u8 query
, const __u8
*data
)
620 int bits
= mapping
->size
;
621 int offset
= mapping
->offset
;
627 mask
= ((1LL << bits
) - 1) << offset
;
629 for (; bits
> 0; data
++) {
630 __u8 byte
= *data
& mask
;
631 value
|= offset
> 0 ? (byte
>> offset
) : (byte
<< (-offset
));
632 bits
-= 8 - (offset
> 0 ? offset
: 0);
634 mask
= (1 << bits
) - 1;
637 /* Sign-extend the value if needed. */
638 if (mapping
->data_type
== UVC_CTRL_DATA_TYPE_SIGNED
)
639 value
|= -(value
& (1 << (mapping
->size
- 1)));
644 /* Set the bit string specified by mapping->offset and mapping->size
645 * in the little-endian data stored at 'data' to the value 'value'.
647 static void uvc_set_le_value(struct uvc_control_mapping
*mapping
,
648 __s32 value
, __u8
*data
)
650 int bits
= mapping
->size
;
651 int offset
= mapping
->offset
;
657 for (; bits
> 0; data
++) {
658 mask
= ((1LL << bits
) - 1) << offset
;
659 *data
= (*data
& ~mask
) | ((value
<< offset
) & mask
);
660 value
>>= offset
? offset
: 8;
666 /* ------------------------------------------------------------------------
667 * Terminal and unit management
670 static const __u8 uvc_processing_guid
[16] = UVC_GUID_UVC_PROCESSING
;
671 static const __u8 uvc_camera_guid
[16] = UVC_GUID_UVC_CAMERA
;
672 static const __u8 uvc_media_transport_input_guid
[16] =
673 UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT
;
675 static int uvc_entity_match_guid(struct uvc_entity
*entity
, __u8 guid
[16])
677 switch (UVC_ENTITY_TYPE(entity
)) {
679 return memcmp(uvc_camera_guid
, guid
, 16) == 0;
681 case ITT_MEDIA_TRANSPORT_INPUT
:
682 return memcmp(uvc_media_transport_input_guid
, guid
, 16) == 0;
684 case VC_PROCESSING_UNIT
:
685 return memcmp(uvc_processing_guid
, guid
, 16) == 0;
687 case VC_EXTENSION_UNIT
:
688 return memcmp(entity
->extension
.guidExtensionCode
,
696 /* ------------------------------------------------------------------------
700 static void __uvc_find_control(struct uvc_entity
*entity
, __u32 v4l2_id
,
701 struct uvc_control_mapping
**mapping
, struct uvc_control
**control
,
704 struct uvc_control
*ctrl
;
705 struct uvc_control_mapping
*map
;
711 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
712 ctrl
= &entity
->controls
[i
];
713 if (ctrl
->info
== NULL
)
716 list_for_each_entry(map
, &ctrl
->info
->mappings
, list
) {
717 if ((map
->id
== v4l2_id
) && !next
) {
723 if ((*mapping
== NULL
|| (*mapping
)->id
> map
->id
) &&
724 (map
->id
> v4l2_id
) && next
) {
732 struct uvc_control
*uvc_find_control(struct uvc_video_device
*video
,
733 __u32 v4l2_id
, struct uvc_control_mapping
**mapping
)
735 struct uvc_control
*ctrl
= NULL
;
736 struct uvc_entity
*entity
;
737 int next
= v4l2_id
& V4L2_CTRL_FLAG_NEXT_CTRL
;
741 /* Mask the query flags. */
742 v4l2_id
&= V4L2_CTRL_ID_MASK
;
744 /* Find the control. */
745 __uvc_find_control(video
->processing
, v4l2_id
, mapping
, &ctrl
, next
);
749 list_for_each_entry(entity
, &video
->iterms
, chain
) {
750 __uvc_find_control(entity
, v4l2_id
, mapping
, &ctrl
, next
);
755 list_for_each_entry(entity
, &video
->extensions
, chain
) {
756 __uvc_find_control(entity
, v4l2_id
, mapping
, &ctrl
, next
);
761 if (ctrl
== NULL
&& !next
)
762 uvc_trace(UVC_TRACE_CONTROL
, "Control 0x%08x not found.\n",
768 int uvc_query_v4l2_ctrl(struct uvc_video_device
*video
,
769 struct v4l2_queryctrl
*v4l2_ctrl
)
771 struct uvc_control
*ctrl
;
772 struct uvc_control_mapping
*mapping
;
773 struct uvc_menu_info
*menu
;
778 ctrl
= uvc_find_control(video
, v4l2_ctrl
->id
, &mapping
);
782 data
= kmalloc(ctrl
->info
->size
, GFP_KERNEL
);
786 memset(v4l2_ctrl
, 0, sizeof *v4l2_ctrl
);
787 v4l2_ctrl
->id
= mapping
->id
;
788 v4l2_ctrl
->type
= mapping
->v4l2_type
;
789 strlcpy(v4l2_ctrl
->name
, mapping
->name
, sizeof v4l2_ctrl
->name
);
790 v4l2_ctrl
->flags
= 0;
792 if (!(ctrl
->info
->flags
& UVC_CONTROL_SET_CUR
))
793 v4l2_ctrl
->flags
|= V4L2_CTRL_FLAG_READ_ONLY
;
795 if (ctrl
->info
->flags
& UVC_CONTROL_GET_DEF
) {
796 if ((ret
= uvc_query_ctrl(video
->dev
, GET_DEF
, ctrl
->entity
->id
,
797 video
->dev
->intfnum
, ctrl
->info
->selector
,
798 data
, ctrl
->info
->size
)) < 0)
800 v4l2_ctrl
->default_value
= mapping
->get(mapping
, GET_DEF
, data
);
803 switch (mapping
->v4l2_type
) {
804 case V4L2_CTRL_TYPE_MENU
:
805 v4l2_ctrl
->minimum
= 0;
806 v4l2_ctrl
->maximum
= mapping
->menu_count
- 1;
809 menu
= mapping
->menu_info
;
810 for (i
= 0; i
< mapping
->menu_count
; ++i
, ++menu
) {
811 if (menu
->value
== v4l2_ctrl
->default_value
) {
812 v4l2_ctrl
->default_value
= i
;
820 case V4L2_CTRL_TYPE_BOOLEAN
:
821 v4l2_ctrl
->minimum
= 0;
822 v4l2_ctrl
->maximum
= 1;
831 if (ctrl
->info
->flags
& UVC_CONTROL_GET_MIN
) {
832 if ((ret
= uvc_query_ctrl(video
->dev
, GET_MIN
, ctrl
->entity
->id
,
833 video
->dev
->intfnum
, ctrl
->info
->selector
,
834 data
, ctrl
->info
->size
)) < 0)
836 v4l2_ctrl
->minimum
= mapping
->get(mapping
, GET_MIN
, data
);
838 if (ctrl
->info
->flags
& UVC_CONTROL_GET_MAX
) {
839 if ((ret
= uvc_query_ctrl(video
->dev
, GET_MAX
, ctrl
->entity
->id
,
840 video
->dev
->intfnum
, ctrl
->info
->selector
,
841 data
, ctrl
->info
->size
)) < 0)
843 v4l2_ctrl
->maximum
= mapping
->get(mapping
, GET_MAX
, data
);
845 if (ctrl
->info
->flags
& UVC_CONTROL_GET_RES
) {
846 if ((ret
= uvc_query_ctrl(video
->dev
, GET_RES
, ctrl
->entity
->id
,
847 video
->dev
->intfnum
, ctrl
->info
->selector
,
848 data
, ctrl
->info
->size
)) < 0)
850 v4l2_ctrl
->step
= mapping
->get(mapping
, GET_RES
, data
);
860 /* --------------------------------------------------------------------------
861 * Control transactions
863 * To make extended set operations as atomic as the hardware allows, controls
864 * are handled using begin/commit/rollback operations.
866 * At the beginning of a set request, uvc_ctrl_begin should be called to
867 * initialize the request. This function acquires the control lock.
869 * When setting a control, the new value is stored in the control data field
870 * at position UVC_CTRL_DATA_CURRENT. The control is then marked as dirty for
871 * later processing. If the UVC and V4L2 control sizes differ, the current
872 * value is loaded from the hardware before storing the new value in the data
875 * After processing all controls in the transaction, uvc_ctrl_commit or
876 * uvc_ctrl_rollback must be called to apply the pending changes to the
877 * hardware or revert them. When applying changes, all controls marked as
878 * dirty will be modified in the UVC device, and the dirty flag will be
879 * cleared. When reverting controls, the control data field
880 * UVC_CTRL_DATA_CURRENT is reverted to its previous value
881 * (UVC_CTRL_DATA_BACKUP) for all dirty controls. Both functions release the
884 int uvc_ctrl_begin(struct uvc_video_device
*video
)
886 return mutex_lock_interruptible(&video
->ctrl_mutex
) ? -ERESTARTSYS
: 0;
889 static int uvc_ctrl_commit_entity(struct uvc_device
*dev
,
890 struct uvc_entity
*entity
, int rollback
)
892 struct uvc_control
*ctrl
;
899 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
900 ctrl
= &entity
->controls
[i
];
901 if (ctrl
->info
== NULL
)
904 /* Reset the loaded flag for auto-update controls that were
905 * marked as loaded in uvc_ctrl_get/uvc_ctrl_set to prevent
906 * uvc_ctrl_get from using the cached value.
908 if (ctrl
->info
->flags
& UVC_CONTROL_AUTO_UPDATE
)
915 ret
= uvc_query_ctrl(dev
, SET_CUR
, ctrl
->entity
->id
,
916 dev
->intfnum
, ctrl
->info
->selector
,
917 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
922 if (rollback
|| ret
< 0)
923 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
924 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
936 int __uvc_ctrl_commit(struct uvc_video_device
*video
, int rollback
)
938 struct uvc_entity
*entity
;
941 /* Find the control. */
942 ret
= uvc_ctrl_commit_entity(video
->dev
, video
->processing
, rollback
);
946 list_for_each_entry(entity
, &video
->iterms
, chain
) {
947 ret
= uvc_ctrl_commit_entity(video
->dev
, entity
, rollback
);
952 list_for_each_entry(entity
, &video
->extensions
, chain
) {
953 ret
= uvc_ctrl_commit_entity(video
->dev
, entity
, rollback
);
959 mutex_unlock(&video
->ctrl_mutex
);
963 int uvc_ctrl_get(struct uvc_video_device
*video
,
964 struct v4l2_ext_control
*xctrl
)
966 struct uvc_control
*ctrl
;
967 struct uvc_control_mapping
*mapping
;
968 struct uvc_menu_info
*menu
;
972 ctrl
= uvc_find_control(video
, xctrl
->id
, &mapping
);
973 if (ctrl
== NULL
|| (ctrl
->info
->flags
& UVC_CONTROL_GET_CUR
) == 0)
977 ret
= uvc_query_ctrl(video
->dev
, GET_CUR
, ctrl
->entity
->id
,
978 video
->dev
->intfnum
, ctrl
->info
->selector
,
979 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
987 xctrl
->value
= mapping
->get(mapping
, GET_CUR
,
988 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
));
990 if (mapping
->v4l2_type
== V4L2_CTRL_TYPE_MENU
) {
991 menu
= mapping
->menu_info
;
992 for (i
= 0; i
< mapping
->menu_count
; ++i
, ++menu
) {
993 if (menu
->value
== xctrl
->value
) {
1003 int uvc_ctrl_set(struct uvc_video_device
*video
,
1004 struct v4l2_ext_control
*xctrl
)
1006 struct uvc_control
*ctrl
;
1007 struct uvc_control_mapping
*mapping
;
1008 s32 value
= xctrl
->value
;
1011 ctrl
= uvc_find_control(video
, xctrl
->id
, &mapping
);
1012 if (ctrl
== NULL
|| (ctrl
->info
->flags
& UVC_CONTROL_SET_CUR
) == 0)
1015 if (mapping
->v4l2_type
== V4L2_CTRL_TYPE_MENU
) {
1016 if (value
< 0 || value
>= mapping
->menu_count
)
1018 value
= mapping
->menu_info
[value
].value
;
1021 if (!ctrl
->loaded
&& (ctrl
->info
->size
* 8) != mapping
->size
) {
1022 if ((ctrl
->info
->flags
& UVC_CONTROL_GET_CUR
) == 0) {
1023 memset(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1024 0, ctrl
->info
->size
);
1026 ret
= uvc_query_ctrl(video
->dev
, GET_CUR
,
1027 ctrl
->entity
->id
, video
->dev
->intfnum
,
1028 ctrl
->info
->selector
,
1029 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1039 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
1040 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1044 mapping
->set(mapping
, value
,
1045 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
));
1052 /* --------------------------------------------------------------------------
1056 int uvc_xu_ctrl_query(struct uvc_video_device
*video
,
1057 struct uvc_xu_control
*xctrl
, int set
)
1059 struct uvc_entity
*entity
;
1060 struct uvc_control
*ctrl
= NULL
;
1061 unsigned int i
, found
= 0;
1065 /* Find the extension unit. */
1066 list_for_each_entry(entity
, &video
->extensions
, chain
) {
1067 if (entity
->id
== xctrl
->unit
)
1071 if (entity
->id
!= xctrl
->unit
) {
1072 uvc_trace(UVC_TRACE_CONTROL
, "Extension unit %u not found.\n",
1077 /* Find the control. */
1078 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
1079 ctrl
= &entity
->controls
[i
];
1080 if (ctrl
->info
== NULL
)
1083 if (ctrl
->info
->selector
== xctrl
->selector
) {
1090 uvc_trace(UVC_TRACE_CONTROL
,
1091 "Control " UVC_GUID_FORMAT
"/%u not found.\n",
1092 UVC_GUID_ARGS(entity
->extension
.guidExtensionCode
),
1097 /* Validate control data size. */
1098 if (ctrl
->info
->size
!= xctrl
->size
)
1101 if ((set
&& !(ctrl
->info
->flags
& UVC_CONTROL_SET_CUR
)) ||
1102 (!set
&& !(ctrl
->info
->flags
& UVC_CONTROL_GET_CUR
)))
1105 if (mutex_lock_interruptible(&video
->ctrl_mutex
))
1106 return -ERESTARTSYS
;
1108 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
1109 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1111 data
= uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
);
1113 if (set
&& copy_from_user(data
, xctrl
->data
, xctrl
->size
)) {
1118 ret
= uvc_query_ctrl(video
->dev
, set
? SET_CUR
: GET_CUR
, xctrl
->unit
,
1119 video
->dev
->intfnum
, xctrl
->selector
, data
,
1124 if (!set
&& copy_to_user(xctrl
->data
, data
, xctrl
->size
)) {
1131 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1132 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
1135 mutex_unlock(&video
->ctrl_mutex
);
1139 /* --------------------------------------------------------------------------
1144 * Restore control values after resume, skipping controls that haven't been
1148 * - Don't restore modified controls that are back to their default value.
1149 * - Handle restore order (Auto-Exposure Mode should be restored before
1152 int uvc_ctrl_resume_device(struct uvc_device
*dev
)
1154 struct uvc_control
*ctrl
;
1155 struct uvc_entity
*entity
;
1159 /* Walk the entities list and restore controls when possible. */
1160 list_for_each_entry(entity
, &dev
->entities
, list
) {
1162 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
1163 ctrl
= &entity
->controls
[i
];
1165 if (ctrl
->info
== NULL
|| !ctrl
->modified
||
1166 (ctrl
->info
->flags
& UVC_CONTROL_RESTORE
) == 0)
1169 printk(KERN_INFO
"restoring control " UVC_GUID_FORMAT
1170 "/%u/%u\n", UVC_GUID_ARGS(ctrl
->info
->entity
),
1171 ctrl
->info
->index
, ctrl
->info
->selector
);
1175 ret
= uvc_ctrl_commit_entity(dev
, entity
, 0);
1183 /* --------------------------------------------------------------------------
1184 * Control and mapping handling
1187 static void uvc_ctrl_add_ctrl(struct uvc_device
*dev
,
1188 struct uvc_control_info
*info
)
1190 struct uvc_entity
*entity
;
1191 struct uvc_control
*ctrl
= NULL
;
1195 list_for_each_entry(entity
, &dev
->entities
, list
) {
1196 if (!uvc_entity_match_guid(entity
, info
->entity
))
1199 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
1200 ctrl
= &entity
->controls
[i
];
1201 if (ctrl
->index
== info
->index
) {
1214 if (UVC_ENTITY_TYPE(entity
) == VC_EXTENSION_UNIT
) {
1215 /* Check if the device control information and length match
1216 * the user supplied information.
1222 if ((ret
= uvc_query_ctrl(dev
, GET_LEN
, ctrl
->entity
->id
,
1223 dev
->intfnum
, info
->selector
, (__u8
*)&size
, 2)) < 0) {
1224 uvc_trace(UVC_TRACE_CONTROL
, "GET_LEN failed on "
1225 "control " UVC_GUID_FORMAT
"/%u (%d).\n",
1226 UVC_GUID_ARGS(info
->entity
), info
->selector
,
1231 if (info
->size
!= le16_to_cpu(size
)) {
1232 uvc_trace(UVC_TRACE_CONTROL
, "Control " UVC_GUID_FORMAT
1233 "/%u size doesn't match user supplied "
1234 "value.\n", UVC_GUID_ARGS(info
->entity
),
1239 if ((ret
= uvc_query_ctrl(dev
, GET_INFO
, ctrl
->entity
->id
,
1240 dev
->intfnum
, info
->selector
, &inf
, 1)) < 0) {
1241 uvc_trace(UVC_TRACE_CONTROL
, "GET_INFO failed on "
1242 "control " UVC_GUID_FORMAT
"/%u (%d).\n",
1243 UVC_GUID_ARGS(info
->entity
), info
->selector
,
1248 flags
= info
->flags
;
1249 if (((flags
& UVC_CONTROL_GET_CUR
) && !(inf
& (1 << 0))) ||
1250 ((flags
& UVC_CONTROL_SET_CUR
) && !(inf
& (1 << 1)))) {
1251 uvc_trace(UVC_TRACE_CONTROL
, "Control "
1252 UVC_GUID_FORMAT
"/%u flags don't match "
1253 "supported operations.\n",
1254 UVC_GUID_ARGS(info
->entity
), info
->selector
);
1260 ctrl
->data
= kmalloc(ctrl
->info
->size
* UVC_CTRL_NDATA
, GFP_KERNEL
);
1261 uvc_trace(UVC_TRACE_CONTROL
, "Added control " UVC_GUID_FORMAT
"/%u "
1262 "to device %s entity %u\n", UVC_GUID_ARGS(ctrl
->info
->entity
),
1263 ctrl
->info
->selector
, dev
->udev
->devpath
, entity
->id
);
1267 * Add an item to the UVC control information list, and instantiate a control
1268 * structure for each device that supports the control.
1270 int uvc_ctrl_add_info(struct uvc_control_info
*info
)
1272 struct uvc_control_info
*ctrl
;
1273 struct uvc_device
*dev
;
1276 /* Find matching controls by walking the devices, entities and
1279 mutex_lock(&uvc_driver
.ctrl_mutex
);
1281 /* First check if the list contains a control matching the new one.
1282 * Bail out if it does.
1284 list_for_each_entry(ctrl
, &uvc_driver
.controls
, list
) {
1285 if (memcmp(ctrl
->entity
, info
->entity
, 16))
1288 if (ctrl
->selector
== info
->selector
) {
1289 uvc_trace(UVC_TRACE_CONTROL
, "Control "
1290 UVC_GUID_FORMAT
"/%u is already defined.\n",
1291 UVC_GUID_ARGS(info
->entity
), info
->selector
);
1295 if (ctrl
->index
== info
->index
) {
1296 uvc_trace(UVC_TRACE_CONTROL
, "Control "
1297 UVC_GUID_FORMAT
"/%u would overwrite index "
1298 "%d.\n", UVC_GUID_ARGS(info
->entity
),
1299 info
->selector
, info
->index
);
1305 list_for_each_entry(dev
, &uvc_driver
.devices
, list
)
1306 uvc_ctrl_add_ctrl(dev
, info
);
1308 INIT_LIST_HEAD(&info
->mappings
);
1309 list_add_tail(&info
->list
, &uvc_driver
.controls
);
1311 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1315 int uvc_ctrl_add_mapping(struct uvc_control_mapping
*mapping
)
1317 struct uvc_control_info
*info
;
1318 struct uvc_control_mapping
*map
;
1321 if (mapping
->get
== NULL
)
1322 mapping
->get
= uvc_get_le_value
;
1323 if (mapping
->set
== NULL
)
1324 mapping
->set
= uvc_set_le_value
;
1326 if (mapping
->id
& ~V4L2_CTRL_ID_MASK
) {
1327 uvc_trace(UVC_TRACE_CONTROL
, "Can't add mapping '%s' with "
1328 "invalid control id 0x%08x\n", mapping
->name
,
1333 mutex_lock(&uvc_driver
.ctrl_mutex
);
1334 list_for_each_entry(info
, &uvc_driver
.controls
, list
) {
1335 if (memcmp(info
->entity
, mapping
->entity
, 16) ||
1336 info
->selector
!= mapping
->selector
)
1339 if (info
->size
* 8 < mapping
->size
+ mapping
->offset
) {
1340 uvc_trace(UVC_TRACE_CONTROL
, "Mapping '%s' would "
1341 "overflow control " UVC_GUID_FORMAT
"/%u\n",
1342 mapping
->name
, UVC_GUID_ARGS(info
->entity
),
1348 /* Check if the list contains a mapping matching the new one.
1349 * Bail out if it does.
1351 list_for_each_entry(map
, &info
->mappings
, list
) {
1352 if (map
->id
== mapping
->id
) {
1353 uvc_trace(UVC_TRACE_CONTROL
, "Mapping '%s' is "
1354 "already defined.\n", mapping
->name
);
1360 mapping
->ctrl
= info
;
1361 list_add_tail(&mapping
->list
, &info
->mappings
);
1362 uvc_trace(UVC_TRACE_CONTROL
, "Adding mapping %s to control "
1363 UVC_GUID_FORMAT
"/%u.\n", mapping
->name
,
1364 UVC_GUID_ARGS(info
->entity
), info
->selector
);
1370 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1375 * Prune an entity of its bogus controls using a blacklist. Bogus controls
1376 * are currently the ones that crash the camera or unconditionally return an
1377 * error when queried.
1380 uvc_ctrl_prune_entity(struct uvc_device
*dev
, struct uvc_entity
*entity
)
1382 static const struct {
1383 struct usb_device_id id
;
1386 { { USB_DEVICE(0x1c4f, 0x3000) }, 6 }, /* WB Temperature */
1387 { { USB_DEVICE(0x5986, 0x0241) }, 2 }, /* Hue */
1394 if (UVC_ENTITY_TYPE(entity
) != VC_PROCESSING_UNIT
)
1397 controls
= entity
->processing
.bmControls
;
1398 size
= entity
->processing
.bControlSize
;
1400 for (i
= 0; i
< ARRAY_SIZE(blacklist
); ++i
) {
1401 if (!usb_match_id(dev
->intf
, &blacklist
[i
].id
))
1404 if (blacklist
[i
].index
>= 8 * size
||
1405 !uvc_test_bit(controls
, blacklist
[i
].index
))
1408 uvc_trace(UVC_TRACE_CONTROL
, "%u/%u control is black listed, "
1409 "removing it.\n", entity
->id
, blacklist
[i
].index
);
1411 uvc_clear_bit(controls
, blacklist
[i
].index
);
1416 * Initialize device controls.
1418 int uvc_ctrl_init_device(struct uvc_device
*dev
)
1420 struct uvc_control_info
*info
;
1421 struct uvc_control
*ctrl
;
1422 struct uvc_entity
*entity
;
1425 /* Walk the entities list and instantiate controls */
1426 list_for_each_entry(entity
, &dev
->entities
, list
) {
1427 unsigned int bControlSize
= 0, ncontrols
= 0;
1428 __u8
*bmControls
= NULL
;
1430 if (UVC_ENTITY_TYPE(entity
) == VC_EXTENSION_UNIT
) {
1431 bmControls
= entity
->extension
.bmControls
;
1432 bControlSize
= entity
->extension
.bControlSize
;
1433 } else if (UVC_ENTITY_TYPE(entity
) == VC_PROCESSING_UNIT
) {
1434 bmControls
= entity
->processing
.bmControls
;
1435 bControlSize
= entity
->processing
.bControlSize
;
1436 } else if (UVC_ENTITY_TYPE(entity
) == ITT_CAMERA
) {
1437 bmControls
= entity
->camera
.bmControls
;
1438 bControlSize
= entity
->camera
.bControlSize
;
1441 uvc_ctrl_prune_entity(dev
, entity
);
1443 for (i
= 0; i
< bControlSize
; ++i
)
1444 ncontrols
+= hweight8(bmControls
[i
]);
1449 entity
->controls
= kzalloc(ncontrols
*sizeof *ctrl
, GFP_KERNEL
);
1450 if (entity
->controls
== NULL
)
1453 entity
->ncontrols
= ncontrols
;
1455 ctrl
= entity
->controls
;
1456 for (i
= 0; i
< bControlSize
* 8; ++i
) {
1457 if (uvc_test_bit(bmControls
, i
) == 0)
1460 ctrl
->entity
= entity
;
1466 /* Walk the controls info list and associate them with the device
1467 * controls, then add the device to the global device list. This has
1468 * to be done while holding the controls lock, to make sure
1469 * uvc_ctrl_add_info() will not get called in-between.
1471 mutex_lock(&uvc_driver
.ctrl_mutex
);
1472 list_for_each_entry(info
, &uvc_driver
.controls
, list
)
1473 uvc_ctrl_add_ctrl(dev
, info
);
1475 list_add_tail(&dev
->list
, &uvc_driver
.devices
);
1476 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1482 * Cleanup device controls.
1484 void uvc_ctrl_cleanup_device(struct uvc_device
*dev
)
1486 struct uvc_entity
*entity
;
1489 /* Remove the device from the global devices list */
1490 mutex_lock(&uvc_driver
.ctrl_mutex
);
1491 if (dev
->list
.next
!= NULL
)
1492 list_del(&dev
->list
);
1493 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1495 list_for_each_entry(entity
, &dev
->entities
, list
) {
1496 for (i
= 0; i
< entity
->ncontrols
; ++i
)
1497 kfree(entity
->controls
[i
].data
);
1499 kfree(entity
->controls
);
1503 void uvc_ctrl_init(void)
1505 struct uvc_control_info
*ctrl
= uvc_ctrls
;
1506 struct uvc_control_info
*cend
= ctrl
+ ARRAY_SIZE(uvc_ctrls
);
1507 struct uvc_control_mapping
*mapping
= uvc_ctrl_mappings
;
1508 struct uvc_control_mapping
*mend
=
1509 mapping
+ ARRAY_SIZE(uvc_ctrl_mappings
);
1511 for (; ctrl
< cend
; ++ctrl
)
1512 uvc_ctrl_add_info(ctrl
);
1514 for (; mapping
< mend
; ++mapping
)
1515 uvc_ctrl_add_mapping(mapping
);