xref: /openbmc/linux/drivers/media/usb/uvc/uvc_ctrl.c (revision 55fd7e02)
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 }
2367