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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL
,
168 .flags
= UVC_CONTROL_GET_CUR
,
171 .entity
= UVC_GUID_UVC_PROCESSING
,
172 .selector
= UVC_PU_ANALOG_LOCK_STATUS_CONTROL
,
175 .flags
= UVC_CONTROL_GET_CUR
,
178 .entity
= UVC_GUID_UVC_CAMERA
,
179 .selector
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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((int)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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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
= UVC_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 UVC_ITT_MEDIA_TRANSPORT_INPUT
:
682 return memcmp(uvc_media_transport_input_guid
, guid
, 16) == 0;
684 case UVC_VC_PROCESSING_UNIT
:
685 return memcmp(uvc_processing_guid
, guid
, 16) == 0;
687 case UVC_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_chain
*chain
,
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(chain
->processing
, v4l2_id
, mapping
, &ctrl
, next
);
749 list_for_each_entry(entity
, &chain
->iterms
, chain
) {
750 __uvc_find_control(entity
, v4l2_id
, mapping
, &ctrl
, next
);
755 list_for_each_entry(entity
, &chain
->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_chain
*chain
,
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(chain
, 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 ret
= uvc_query_ctrl(chain
->dev
, UVC_GET_DEF
, ctrl
->entity
->id
,
797 chain
->dev
->intfnum
, ctrl
->info
->selector
,
798 data
, ctrl
->info
->size
);
801 v4l2_ctrl
->default_value
=
802 mapping
->get(mapping
, UVC_GET_DEF
, data
);
805 switch (mapping
->v4l2_type
) {
806 case V4L2_CTRL_TYPE_MENU
:
807 v4l2_ctrl
->minimum
= 0;
808 v4l2_ctrl
->maximum
= mapping
->menu_count
- 1;
811 menu
= mapping
->menu_info
;
812 for (i
= 0; i
< mapping
->menu_count
; ++i
, ++menu
) {
813 if (menu
->value
== v4l2_ctrl
->default_value
) {
814 v4l2_ctrl
->default_value
= i
;
822 case V4L2_CTRL_TYPE_BOOLEAN
:
823 v4l2_ctrl
->minimum
= 0;
824 v4l2_ctrl
->maximum
= 1;
829 case V4L2_CTRL_TYPE_BUTTON
:
830 v4l2_ctrl
->minimum
= 0;
831 v4l2_ctrl
->maximum
= 0;
840 if (ctrl
->info
->flags
& UVC_CONTROL_GET_MIN
) {
841 ret
= uvc_query_ctrl(chain
->dev
, UVC_GET_MIN
, ctrl
->entity
->id
,
842 chain
->dev
->intfnum
, ctrl
->info
->selector
,
843 data
, ctrl
->info
->size
);
846 v4l2_ctrl
->minimum
= mapping
->get(mapping
, UVC_GET_MIN
, data
);
848 if (ctrl
->info
->flags
& UVC_CONTROL_GET_MAX
) {
849 ret
= uvc_query_ctrl(chain
->dev
, UVC_GET_MAX
, ctrl
->entity
->id
,
850 chain
->dev
->intfnum
, ctrl
->info
->selector
,
851 data
, ctrl
->info
->size
);
854 v4l2_ctrl
->maximum
= mapping
->get(mapping
, UVC_GET_MAX
, data
);
856 if (ctrl
->info
->flags
& UVC_CONTROL_GET_RES
) {
857 ret
= uvc_query_ctrl(chain
->dev
, UVC_GET_RES
, ctrl
->entity
->id
,
858 chain
->dev
->intfnum
, ctrl
->info
->selector
,
859 data
, ctrl
->info
->size
);
862 v4l2_ctrl
->step
= mapping
->get(mapping
, UVC_GET_RES
, data
);
872 /* --------------------------------------------------------------------------
873 * Control transactions
875 * To make extended set operations as atomic as the hardware allows, controls
876 * are handled using begin/commit/rollback operations.
878 * At the beginning of a set request, uvc_ctrl_begin should be called to
879 * initialize the request. This function acquires the control lock.
881 * When setting a control, the new value is stored in the control data field
882 * at position UVC_CTRL_DATA_CURRENT. The control is then marked as dirty for
883 * later processing. If the UVC and V4L2 control sizes differ, the current
884 * value is loaded from the hardware before storing the new value in the data
887 * After processing all controls in the transaction, uvc_ctrl_commit or
888 * uvc_ctrl_rollback must be called to apply the pending changes to the
889 * hardware or revert them. When applying changes, all controls marked as
890 * dirty will be modified in the UVC device, and the dirty flag will be
891 * cleared. When reverting controls, the control data field
892 * UVC_CTRL_DATA_CURRENT is reverted to its previous value
893 * (UVC_CTRL_DATA_BACKUP) for all dirty controls. Both functions release the
896 int uvc_ctrl_begin(struct uvc_video_chain
*chain
)
898 return mutex_lock_interruptible(&chain
->ctrl_mutex
) ? -ERESTARTSYS
: 0;
901 static int uvc_ctrl_commit_entity(struct uvc_device
*dev
,
902 struct uvc_entity
*entity
, int rollback
)
904 struct uvc_control
*ctrl
;
911 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
912 ctrl
= &entity
->controls
[i
];
913 if (ctrl
->info
== NULL
)
916 /* Reset the loaded flag for auto-update controls that were
917 * marked as loaded in uvc_ctrl_get/uvc_ctrl_set to prevent
918 * uvc_ctrl_get from using the cached value.
920 if (ctrl
->info
->flags
& UVC_CONTROL_AUTO_UPDATE
)
927 ret
= uvc_query_ctrl(dev
, UVC_SET_CUR
, ctrl
->entity
->id
,
928 dev
->intfnum
, ctrl
->info
->selector
,
929 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
934 if (rollback
|| ret
< 0)
935 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
936 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
948 int __uvc_ctrl_commit(struct uvc_video_chain
*chain
, int rollback
)
950 struct uvc_entity
*entity
;
953 /* Find the control. */
954 ret
= uvc_ctrl_commit_entity(chain
->dev
, chain
->processing
, rollback
);
958 list_for_each_entry(entity
, &chain
->iterms
, chain
) {
959 ret
= uvc_ctrl_commit_entity(chain
->dev
, entity
, rollback
);
964 list_for_each_entry(entity
, &chain
->extensions
, chain
) {
965 ret
= uvc_ctrl_commit_entity(chain
->dev
, entity
, rollback
);
971 mutex_unlock(&chain
->ctrl_mutex
);
975 int uvc_ctrl_get(struct uvc_video_chain
*chain
,
976 struct v4l2_ext_control
*xctrl
)
978 struct uvc_control
*ctrl
;
979 struct uvc_control_mapping
*mapping
;
980 struct uvc_menu_info
*menu
;
984 ctrl
= uvc_find_control(chain
, xctrl
->id
, &mapping
);
985 if (ctrl
== NULL
|| (ctrl
->info
->flags
& UVC_CONTROL_GET_CUR
) == 0)
989 ret
= uvc_query_ctrl(chain
->dev
, UVC_GET_CUR
, ctrl
->entity
->id
,
990 chain
->dev
->intfnum
, ctrl
->info
->selector
,
991 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
999 xctrl
->value
= mapping
->get(mapping
, UVC_GET_CUR
,
1000 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
));
1002 if (mapping
->v4l2_type
== V4L2_CTRL_TYPE_MENU
) {
1003 menu
= mapping
->menu_info
;
1004 for (i
= 0; i
< mapping
->menu_count
; ++i
, ++menu
) {
1005 if (menu
->value
== xctrl
->value
) {
1015 int uvc_ctrl_set(struct uvc_video_chain
*chain
,
1016 struct v4l2_ext_control
*xctrl
)
1018 struct uvc_control
*ctrl
;
1019 struct uvc_control_mapping
*mapping
;
1020 s32 value
= xctrl
->value
;
1023 ctrl
= uvc_find_control(chain
, xctrl
->id
, &mapping
);
1024 if (ctrl
== NULL
|| (ctrl
->info
->flags
& UVC_CONTROL_SET_CUR
) == 0)
1027 if (mapping
->v4l2_type
== V4L2_CTRL_TYPE_MENU
) {
1028 if (value
< 0 || value
>= mapping
->menu_count
)
1030 value
= mapping
->menu_info
[value
].value
;
1033 if (!ctrl
->loaded
&& (ctrl
->info
->size
* 8) != mapping
->size
) {
1034 if ((ctrl
->info
->flags
& UVC_CONTROL_GET_CUR
) == 0) {
1035 memset(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1036 0, ctrl
->info
->size
);
1038 ret
= uvc_query_ctrl(chain
->dev
, UVC_GET_CUR
,
1039 ctrl
->entity
->id
, chain
->dev
->intfnum
,
1040 ctrl
->info
->selector
,
1041 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1051 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
1052 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1056 mapping
->set(mapping
, value
,
1057 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
));
1064 /* --------------------------------------------------------------------------
1068 int uvc_xu_ctrl_query(struct uvc_video_chain
*chain
,
1069 struct uvc_xu_control
*xctrl
, int set
)
1071 struct uvc_entity
*entity
;
1072 struct uvc_control
*ctrl
= NULL
;
1073 unsigned int i
, found
= 0;
1077 /* Find the extension unit. */
1078 list_for_each_entry(entity
, &chain
->extensions
, chain
) {
1079 if (entity
->id
== xctrl
->unit
)
1083 if (entity
->id
!= xctrl
->unit
) {
1084 uvc_trace(UVC_TRACE_CONTROL
, "Extension unit %u not found.\n",
1089 /* Find the control. */
1090 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
1091 ctrl
= &entity
->controls
[i
];
1092 if (ctrl
->info
== NULL
)
1095 if (ctrl
->info
->selector
== xctrl
->selector
) {
1102 uvc_trace(UVC_TRACE_CONTROL
,
1103 "Control " UVC_GUID_FORMAT
"/%u not found.\n",
1104 UVC_GUID_ARGS(entity
->extension
.guidExtensionCode
),
1109 /* Validate control data size. */
1110 if (ctrl
->info
->size
!= xctrl
->size
)
1113 if ((set
&& !(ctrl
->info
->flags
& UVC_CONTROL_SET_CUR
)) ||
1114 (!set
&& !(ctrl
->info
->flags
& UVC_CONTROL_GET_CUR
)))
1117 if (mutex_lock_interruptible(&chain
->ctrl_mutex
))
1118 return -ERESTARTSYS
;
1120 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
1121 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1123 data
= uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
);
1125 if (set
&& copy_from_user(data
, xctrl
->data
, xctrl
->size
)) {
1130 ret
= uvc_query_ctrl(chain
->dev
, set
? UVC_SET_CUR
: UVC_GET_CUR
,
1131 xctrl
->unit
, chain
->dev
->intfnum
, xctrl
->selector
,
1136 if (!set
&& copy_to_user(xctrl
->data
, data
, xctrl
->size
)) {
1143 memcpy(uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_CURRENT
),
1144 uvc_ctrl_data(ctrl
, UVC_CTRL_DATA_BACKUP
),
1147 mutex_unlock(&chain
->ctrl_mutex
);
1151 /* --------------------------------------------------------------------------
1156 * Restore control values after resume, skipping controls that haven't been
1160 * - Don't restore modified controls that are back to their default value.
1161 * - Handle restore order (Auto-Exposure Mode should be restored before
1164 int uvc_ctrl_resume_device(struct uvc_device
*dev
)
1166 struct uvc_control
*ctrl
;
1167 struct uvc_entity
*entity
;
1171 /* Walk the entities list and restore controls when possible. */
1172 list_for_each_entry(entity
, &dev
->entities
, list
) {
1174 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
1175 ctrl
= &entity
->controls
[i
];
1177 if (ctrl
->info
== NULL
|| !ctrl
->modified
||
1178 (ctrl
->info
->flags
& UVC_CONTROL_RESTORE
) == 0)
1181 printk(KERN_INFO
"restoring control " UVC_GUID_FORMAT
1182 "/%u/%u\n", UVC_GUID_ARGS(ctrl
->info
->entity
),
1183 ctrl
->info
->index
, ctrl
->info
->selector
);
1187 ret
= uvc_ctrl_commit_entity(dev
, entity
, 0);
1195 /* --------------------------------------------------------------------------
1196 * Control and mapping handling
1199 static void uvc_ctrl_add_ctrl(struct uvc_device
*dev
,
1200 struct uvc_control_info
*info
)
1202 struct uvc_entity
*entity
;
1203 struct uvc_control
*ctrl
= NULL
;
1207 list_for_each_entry(entity
, &dev
->entities
, list
) {
1208 if (!uvc_entity_match_guid(entity
, info
->entity
))
1211 for (i
= 0; i
< entity
->ncontrols
; ++i
) {
1212 ctrl
= &entity
->controls
[i
];
1213 if (ctrl
->index
== info
->index
) {
1226 if (UVC_ENTITY_TYPE(entity
) == UVC_VC_EXTENSION_UNIT
) {
1227 /* Check if the device control information and length match
1228 * the user supplied information.
1234 ret
= uvc_query_ctrl(dev
, UVC_GET_LEN
, ctrl
->entity
->id
,
1235 dev
->intfnum
, info
->selector
, (__u8
*)&size
, 2);
1237 uvc_trace(UVC_TRACE_CONTROL
, "GET_LEN failed on "
1238 "control " UVC_GUID_FORMAT
"/%u (%d).\n",
1239 UVC_GUID_ARGS(info
->entity
), info
->selector
,
1244 if (info
->size
!= le16_to_cpu(size
)) {
1245 uvc_trace(UVC_TRACE_CONTROL
, "Control " UVC_GUID_FORMAT
1246 "/%u size doesn't match user supplied "
1247 "value.\n", UVC_GUID_ARGS(info
->entity
),
1252 ret
= uvc_query_ctrl(dev
, UVC_GET_INFO
, ctrl
->entity
->id
,
1253 dev
->intfnum
, info
->selector
, &inf
, 1);
1255 uvc_trace(UVC_TRACE_CONTROL
, "GET_INFO failed on "
1256 "control " UVC_GUID_FORMAT
"/%u (%d).\n",
1257 UVC_GUID_ARGS(info
->entity
), info
->selector
,
1262 flags
= info
->flags
;
1263 if (((flags
& UVC_CONTROL_GET_CUR
) && !(inf
& (1 << 0))) ||
1264 ((flags
& UVC_CONTROL_SET_CUR
) && !(inf
& (1 << 1)))) {
1265 uvc_trace(UVC_TRACE_CONTROL
, "Control "
1266 UVC_GUID_FORMAT
"/%u flags don't match "
1267 "supported operations.\n",
1268 UVC_GUID_ARGS(info
->entity
), info
->selector
);
1274 ctrl
->data
= kmalloc(ctrl
->info
->size
* UVC_CTRL_NDATA
, GFP_KERNEL
);
1275 uvc_trace(UVC_TRACE_CONTROL
, "Added control " UVC_GUID_FORMAT
"/%u "
1276 "to device %s entity %u\n", UVC_GUID_ARGS(ctrl
->info
->entity
),
1277 ctrl
->info
->selector
, dev
->udev
->devpath
, entity
->id
);
1281 * Add an item to the UVC control information list, and instantiate a control
1282 * structure for each device that supports the control.
1284 int uvc_ctrl_add_info(struct uvc_control_info
*info
)
1286 struct uvc_control_info
*ctrl
;
1287 struct uvc_device
*dev
;
1290 /* Find matching controls by walking the devices, entities and
1293 mutex_lock(&uvc_driver
.ctrl_mutex
);
1295 /* First check if the list contains a control matching the new one.
1296 * Bail out if it does.
1298 list_for_each_entry(ctrl
, &uvc_driver
.controls
, list
) {
1299 if (memcmp(ctrl
->entity
, info
->entity
, 16))
1302 if (ctrl
->selector
== info
->selector
) {
1303 uvc_trace(UVC_TRACE_CONTROL
, "Control "
1304 UVC_GUID_FORMAT
"/%u is already defined.\n",
1305 UVC_GUID_ARGS(info
->entity
), info
->selector
);
1309 if (ctrl
->index
== info
->index
) {
1310 uvc_trace(UVC_TRACE_CONTROL
, "Control "
1311 UVC_GUID_FORMAT
"/%u would overwrite index "
1312 "%d.\n", UVC_GUID_ARGS(info
->entity
),
1313 info
->selector
, info
->index
);
1319 list_for_each_entry(dev
, &uvc_driver
.devices
, list
)
1320 uvc_ctrl_add_ctrl(dev
, info
);
1322 INIT_LIST_HEAD(&info
->mappings
);
1323 list_add_tail(&info
->list
, &uvc_driver
.controls
);
1325 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1329 int uvc_ctrl_add_mapping(struct uvc_control_mapping
*mapping
)
1331 struct uvc_control_info
*info
;
1332 struct uvc_control_mapping
*map
;
1335 if (mapping
->get
== NULL
)
1336 mapping
->get
= uvc_get_le_value
;
1337 if (mapping
->set
== NULL
)
1338 mapping
->set
= uvc_set_le_value
;
1340 if (mapping
->id
& ~V4L2_CTRL_ID_MASK
) {
1341 uvc_trace(UVC_TRACE_CONTROL
, "Can't add mapping '%s' with "
1342 "invalid control id 0x%08x\n", mapping
->name
,
1347 mutex_lock(&uvc_driver
.ctrl_mutex
);
1348 list_for_each_entry(info
, &uvc_driver
.controls
, list
) {
1349 if (memcmp(info
->entity
, mapping
->entity
, 16) ||
1350 info
->selector
!= mapping
->selector
)
1353 if (info
->size
* 8 < mapping
->size
+ mapping
->offset
) {
1354 uvc_trace(UVC_TRACE_CONTROL
, "Mapping '%s' would "
1355 "overflow control " UVC_GUID_FORMAT
"/%u\n",
1356 mapping
->name
, UVC_GUID_ARGS(info
->entity
),
1362 /* Check if the list contains a mapping matching the new one.
1363 * Bail out if it does.
1365 list_for_each_entry(map
, &info
->mappings
, list
) {
1366 if (map
->id
== mapping
->id
) {
1367 uvc_trace(UVC_TRACE_CONTROL
, "Mapping '%s' is "
1368 "already defined.\n", mapping
->name
);
1374 mapping
->ctrl
= info
;
1375 list_add_tail(&mapping
->list
, &info
->mappings
);
1376 uvc_trace(UVC_TRACE_CONTROL
, "Adding mapping %s to control "
1377 UVC_GUID_FORMAT
"/%u.\n", mapping
->name
,
1378 UVC_GUID_ARGS(info
->entity
), info
->selector
);
1384 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1389 * Prune an entity of its bogus controls using a blacklist. Bogus controls
1390 * are currently the ones that crash the camera or unconditionally return an
1391 * error when queried.
1394 uvc_ctrl_prune_entity(struct uvc_device
*dev
, struct uvc_entity
*entity
)
1396 static const struct {
1397 struct usb_device_id id
;
1400 { { USB_DEVICE(0x1c4f, 0x3000) }, 6 }, /* WB Temperature */
1401 { { USB_DEVICE(0x5986, 0x0241) }, 2 }, /* Hue */
1408 if (UVC_ENTITY_TYPE(entity
) != UVC_VC_PROCESSING_UNIT
)
1411 controls
= entity
->processing
.bmControls
;
1412 size
= entity
->processing
.bControlSize
;
1414 for (i
= 0; i
< ARRAY_SIZE(blacklist
); ++i
) {
1415 if (!usb_match_one_id(dev
->intf
, &blacklist
[i
].id
))
1418 if (blacklist
[i
].index
>= 8 * size
||
1419 !uvc_test_bit(controls
, blacklist
[i
].index
))
1422 uvc_trace(UVC_TRACE_CONTROL
, "%u/%u control is black listed, "
1423 "removing it.\n", entity
->id
, blacklist
[i
].index
);
1425 uvc_clear_bit(controls
, blacklist
[i
].index
);
1430 * Initialize device controls.
1432 int uvc_ctrl_init_device(struct uvc_device
*dev
)
1434 struct uvc_control_info
*info
;
1435 struct uvc_control
*ctrl
;
1436 struct uvc_entity
*entity
;
1439 /* Walk the entities list and instantiate controls */
1440 list_for_each_entry(entity
, &dev
->entities
, list
) {
1441 unsigned int bControlSize
= 0, ncontrols
= 0;
1442 __u8
*bmControls
= NULL
;
1444 if (UVC_ENTITY_TYPE(entity
) == UVC_VC_EXTENSION_UNIT
) {
1445 bmControls
= entity
->extension
.bmControls
;
1446 bControlSize
= entity
->extension
.bControlSize
;
1447 } else if (UVC_ENTITY_TYPE(entity
) == UVC_VC_PROCESSING_UNIT
) {
1448 bmControls
= entity
->processing
.bmControls
;
1449 bControlSize
= entity
->processing
.bControlSize
;
1450 } else if (UVC_ENTITY_TYPE(entity
) == UVC_ITT_CAMERA
) {
1451 bmControls
= entity
->camera
.bmControls
;
1452 bControlSize
= entity
->camera
.bControlSize
;
1455 uvc_ctrl_prune_entity(dev
, entity
);
1457 for (i
= 0; i
< bControlSize
; ++i
)
1458 ncontrols
+= hweight8(bmControls
[i
]);
1463 entity
->controls
= kzalloc(ncontrols
*sizeof *ctrl
, GFP_KERNEL
);
1464 if (entity
->controls
== NULL
)
1467 entity
->ncontrols
= ncontrols
;
1469 ctrl
= entity
->controls
;
1470 for (i
= 0; i
< bControlSize
* 8; ++i
) {
1471 if (uvc_test_bit(bmControls
, i
) == 0)
1474 ctrl
->entity
= entity
;
1480 /* Walk the controls info list and associate them with the device
1481 * controls, then add the device to the global device list. This has
1482 * to be done while holding the controls lock, to make sure
1483 * uvc_ctrl_add_info() will not get called in-between.
1485 mutex_lock(&uvc_driver
.ctrl_mutex
);
1486 list_for_each_entry(info
, &uvc_driver
.controls
, list
)
1487 uvc_ctrl_add_ctrl(dev
, info
);
1489 list_add_tail(&dev
->list
, &uvc_driver
.devices
);
1490 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1496 * Cleanup device controls.
1498 void uvc_ctrl_cleanup_device(struct uvc_device
*dev
)
1500 struct uvc_entity
*entity
;
1503 /* Remove the device from the global devices list */
1504 mutex_lock(&uvc_driver
.ctrl_mutex
);
1505 if (dev
->list
.next
!= NULL
)
1506 list_del(&dev
->list
);
1507 mutex_unlock(&uvc_driver
.ctrl_mutex
);
1509 list_for_each_entry(entity
, &dev
->entities
, list
) {
1510 for (i
= 0; i
< entity
->ncontrols
; ++i
)
1511 kfree(entity
->controls
[i
].data
);
1513 kfree(entity
->controls
);
1517 void uvc_ctrl_init(void)
1519 struct uvc_control_info
*ctrl
= uvc_ctrls
;
1520 struct uvc_control_info
*cend
= ctrl
+ ARRAY_SIZE(uvc_ctrls
);
1521 struct uvc_control_mapping
*mapping
= uvc_ctrl_mappings
;
1522 struct uvc_control_mapping
*mend
=
1523 mapping
+ ARRAY_SIZE(uvc_ctrl_mappings
);
1525 for (; ctrl
< cend
; ++ctrl
)
1526 uvc_ctrl_add_info(ctrl
);
1528 for (; mapping
< mend
; ++mapping
)
1529 uvc_ctrl_add_mapping(mapping
);