1 /*
2  *      uvc_v4l2.c  --  USB Video Class driver - V4L2 API
3  *
4  *      Copyright (C) 2005-2010
5  *          Laurent Pinchart (laurent.pinchart@ideasonboard.com)
6  *
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.
11  *
12  */
13 
14 #include <linux/compat.h>
15 #include <linux/kernel.h>
16 #include <linux/version.h>
17 #include <linux/list.h>
18 #include <linux/module.h>
19 #include <linux/slab.h>
20 #include <linux/usb.h>
21 #include <linux/videodev2.h>
22 #include <linux/vmalloc.h>
23 #include <linux/mm.h>
24 #include <linux/wait.h>
25 #include <linux/atomic.h>
26 
27 #include <media/v4l2-common.h>
28 #include <media/v4l2-ioctl.h>
29 
30 #include "uvcvideo.h"
31 
32 /* ------------------------------------------------------------------------
33  * UVC ioctls
34  */
uvc_ioctl_ctrl_map(struct uvc_video_chain * chain,struct uvc_xu_control_mapping * xmap)35 static int uvc_ioctl_ctrl_map(struct uvc_video_chain *chain,
36 	struct uvc_xu_control_mapping *xmap)
37 {
38 	struct uvc_control_mapping *map;
39 	unsigned int size;
40 	int ret;
41 
42 	map = kzalloc(sizeof *map, GFP_KERNEL);
43 	if (map == NULL)
44 		return -ENOMEM;
45 
46 	map->id = xmap->id;
47 	memcpy(map->name, xmap->name, sizeof map->name);
48 	memcpy(map->entity, xmap->entity, sizeof map->entity);
49 	map->selector = xmap->selector;
50 	map->size = xmap->size;
51 	map->offset = xmap->offset;
52 	map->v4l2_type = xmap->v4l2_type;
53 	map->data_type = xmap->data_type;
54 
55 	switch (xmap->v4l2_type) {
56 	case V4L2_CTRL_TYPE_INTEGER:
57 	case V4L2_CTRL_TYPE_BOOLEAN:
58 	case V4L2_CTRL_TYPE_BUTTON:
59 		break;
60 
61 	case V4L2_CTRL_TYPE_MENU:
62 		/* Prevent excessive memory consumption, as well as integer
63 		 * overflows.
64 		 */
65 		if (xmap->menu_count == 0 ||
66 		    xmap->menu_count > UVC_MAX_CONTROL_MENU_ENTRIES) {
67 			ret = -EINVAL;
68 			goto done;
69 		}
70 
71 		size = xmap->menu_count * sizeof(*map->menu_info);
72 		map->menu_info = kmalloc(size, GFP_KERNEL);
73 		if (map->menu_info == NULL) {
74 			ret = -ENOMEM;
75 			goto done;
76 		}
77 
78 		if (copy_from_user(map->menu_info, xmap->menu_info, size)) {
79 			ret = -EFAULT;
80 			goto done;
81 		}
82 
83 		map->menu_count = xmap->menu_count;
84 		break;
85 
86 	default:
87 		uvc_trace(UVC_TRACE_CONTROL, "Unsupported V4L2 control type "
88 			  "%u.\n", xmap->v4l2_type);
89 		ret = -ENOTTY;
90 		goto done;
91 	}
92 
93 	ret = uvc_ctrl_add_mapping(chain, map);
94 
95 done:
96 	kfree(map->menu_info);
97 	kfree(map);
98 
99 	return ret;
100 }
101 
102 /* ------------------------------------------------------------------------
103  * V4L2 interface
104  */
105 
106 /*
107  * Find the frame interval closest to the requested frame interval for the
108  * given frame format and size. This should be done by the device as part of
109  * the Video Probe and Commit negotiation, but some hardware don't implement
110  * that feature.
111  */
uvc_try_frame_interval(struct uvc_frame * frame,__u32 interval)112 static __u32 uvc_try_frame_interval(struct uvc_frame *frame, __u32 interval)
113 {
114 	unsigned int i;
115 
116 	if (frame->bFrameIntervalType) {
117 		__u32 best = -1, dist;
118 
119 		for (i = 0; i < frame->bFrameIntervalType; ++i) {
120 			dist = interval > frame->dwFrameInterval[i]
121 			     ? interval - frame->dwFrameInterval[i]
122 			     : frame->dwFrameInterval[i] - interval;
123 
124 			if (dist > best)
125 				break;
126 
127 			best = dist;
128 		}
129 
130 		interval = frame->dwFrameInterval[i-1];
131 	} else {
132 		const __u32 min = frame->dwFrameInterval[0];
133 		const __u32 max = frame->dwFrameInterval[1];
134 		const __u32 step = frame->dwFrameInterval[2];
135 
136 		interval = min + (interval - min + step/2) / step * step;
137 		if (interval > max)
138 			interval = max;
139 	}
140 
141 	return interval;
142 }
143 
uvc_v4l2_try_format(struct uvc_streaming * stream,struct v4l2_format * fmt,struct uvc_streaming_control * probe,struct uvc_format ** uvc_format,struct uvc_frame ** uvc_frame)144 static int uvc_v4l2_try_format(struct uvc_streaming *stream,
145 	struct v4l2_format *fmt, struct uvc_streaming_control *probe,
146 	struct uvc_format **uvc_format, struct uvc_frame **uvc_frame)
147 {
148 	struct uvc_format *format = NULL;
149 	struct uvc_frame *frame = NULL;
150 	__u16 rw, rh;
151 	unsigned int d, maxd;
152 	unsigned int i;
153 	__u32 interval;
154 	int ret = 0;
155 	__u8 *fcc;
156 
157 	if (fmt->type != stream->type)
158 		return -EINVAL;
159 
160 	fcc = (__u8 *)&fmt->fmt.pix.pixelformat;
161 	uvc_trace(UVC_TRACE_FORMAT, "Trying format 0x%08x (%c%c%c%c): %ux%u.\n",
162 			fmt->fmt.pix.pixelformat,
163 			fcc[0], fcc[1], fcc[2], fcc[3],
164 			fmt->fmt.pix.width, fmt->fmt.pix.height);
165 
166 	/* Check if the hardware supports the requested format. */
167 	for (i = 0; i < stream->nformats; ++i) {
168 		format = &stream->format[i];
169 		if (format->fcc == fmt->fmt.pix.pixelformat)
170 			break;
171 	}
172 
173 	if (format == NULL || format->fcc != fmt->fmt.pix.pixelformat) {
174 		uvc_trace(UVC_TRACE_FORMAT, "Unsupported format 0x%08x.\n",
175 				fmt->fmt.pix.pixelformat);
176 		return -EINVAL;
177 	}
178 
179 	/* Find the closest image size. The distance between image sizes is
180 	 * the size in pixels of the non-overlapping regions between the
181 	 * requested size and the frame-specified size.
182 	 */
183 	rw = fmt->fmt.pix.width;
184 	rh = fmt->fmt.pix.height;
185 	maxd = (unsigned int)-1;
186 
187 	for (i = 0; i < format->nframes; ++i) {
188 		__u16 w = format->frame[i].wWidth;
189 		__u16 h = format->frame[i].wHeight;
190 
191 		d = min(w, rw) * min(h, rh);
192 		d = w*h + rw*rh - 2*d;
193 		if (d < maxd) {
194 			maxd = d;
195 			frame = &format->frame[i];
196 		}
197 
198 		if (maxd == 0)
199 			break;
200 	}
201 
202 	if (frame == NULL) {
203 		uvc_trace(UVC_TRACE_FORMAT, "Unsupported size %ux%u.\n",
204 				fmt->fmt.pix.width, fmt->fmt.pix.height);
205 		return -EINVAL;
206 	}
207 
208 	/* Use the default frame interval. */
209 	interval = frame->dwDefaultFrameInterval;
210 	uvc_trace(UVC_TRACE_FORMAT, "Using default frame interval %u.%u us "
211 		"(%u.%u fps).\n", interval/10, interval%10, 10000000/interval,
212 		(100000000/interval)%10);
213 
214 	/* Set the format index, frame index and frame interval. */
215 	memset(probe, 0, sizeof *probe);
216 	probe->bmHint = 1;	/* dwFrameInterval */
217 	probe->bFormatIndex = format->index;
218 	probe->bFrameIndex = frame->bFrameIndex;
219 	probe->dwFrameInterval = uvc_try_frame_interval(frame, interval);
220 	/* Some webcams stall the probe control set request when the
221 	 * dwMaxVideoFrameSize field is set to zero. The UVC specification
222 	 * clearly states that the field is read-only from the host, so this
223 	 * is a webcam bug. Set dwMaxVideoFrameSize to the value reported by
224 	 * the webcam to work around the problem.
225 	 *
226 	 * The workaround could probably be enabled for all webcams, so the
227 	 * quirk can be removed if needed. It's currently useful to detect
228 	 * webcam bugs and fix them before they hit the market (providing
229 	 * developers test their webcams with the Linux driver as well as with
230 	 * the Windows driver).
231 	 */
232 	mutex_lock(&stream->mutex);
233 	if (stream->dev->quirks & UVC_QUIRK_PROBE_EXTRAFIELDS)
234 		probe->dwMaxVideoFrameSize =
235 			stream->ctrl.dwMaxVideoFrameSize;
236 
237 	/* Probe the device. */
238 	ret = uvc_probe_video(stream, probe);
239 	mutex_unlock(&stream->mutex);
240 	if (ret < 0)
241 		goto done;
242 
243 	fmt->fmt.pix.width = frame->wWidth;
244 	fmt->fmt.pix.height = frame->wHeight;
245 	fmt->fmt.pix.field = V4L2_FIELD_NONE;
246 	fmt->fmt.pix.bytesperline = format->bpp * frame->wWidth / 8;
247 	fmt->fmt.pix.sizeimage = probe->dwMaxVideoFrameSize;
248 	fmt->fmt.pix.colorspace = format->colorspace;
249 	fmt->fmt.pix.priv = 0;
250 
251 	if (uvc_format != NULL)
252 		*uvc_format = format;
253 	if (uvc_frame != NULL)
254 		*uvc_frame = frame;
255 
256 done:
257 	return ret;
258 }
259 
uvc_v4l2_get_format(struct uvc_streaming * stream,struct v4l2_format * fmt)260 static int uvc_v4l2_get_format(struct uvc_streaming *stream,
261 	struct v4l2_format *fmt)
262 {
263 	struct uvc_format *format;
264 	struct uvc_frame *frame;
265 	int ret = 0;
266 
267 	if (fmt->type != stream->type)
268 		return -EINVAL;
269 
270 	mutex_lock(&stream->mutex);
271 	format = stream->cur_format;
272 	frame = stream->cur_frame;
273 
274 	if (format == NULL || frame == NULL) {
275 		ret = -EINVAL;
276 		goto done;
277 	}
278 
279 	fmt->fmt.pix.pixelformat = format->fcc;
280 	fmt->fmt.pix.width = frame->wWidth;
281 	fmt->fmt.pix.height = frame->wHeight;
282 	fmt->fmt.pix.field = V4L2_FIELD_NONE;
283 	fmt->fmt.pix.bytesperline = format->bpp * frame->wWidth / 8;
284 	fmt->fmt.pix.sizeimage = stream->ctrl.dwMaxVideoFrameSize;
285 	fmt->fmt.pix.colorspace = format->colorspace;
286 	fmt->fmt.pix.priv = 0;
287 
288 done:
289 	mutex_unlock(&stream->mutex);
290 	return ret;
291 }
292 
uvc_v4l2_set_format(struct uvc_streaming * stream,struct v4l2_format * fmt)293 static int uvc_v4l2_set_format(struct uvc_streaming *stream,
294 	struct v4l2_format *fmt)
295 {
296 	struct uvc_streaming_control probe;
297 	struct uvc_format *format;
298 	struct uvc_frame *frame;
299 	int ret;
300 
301 	if (fmt->type != stream->type)
302 		return -EINVAL;
303 
304 	ret = uvc_v4l2_try_format(stream, fmt, &probe, &format, &frame);
305 	if (ret < 0)
306 		return ret;
307 
308 	mutex_lock(&stream->mutex);
309 
310 	if (uvc_queue_allocated(&stream->queue)) {
311 		ret = -EBUSY;
312 		goto done;
313 	}
314 
315 	memcpy(&stream->ctrl, &probe, sizeof probe);
316 	stream->cur_format = format;
317 	stream->cur_frame = frame;
318 
319 done:
320 	mutex_unlock(&stream->mutex);
321 	return ret;
322 }
323 
uvc_v4l2_get_streamparm(struct uvc_streaming * stream,struct v4l2_streamparm * parm)324 static int uvc_v4l2_get_streamparm(struct uvc_streaming *stream,
325 		struct v4l2_streamparm *parm)
326 {
327 	uint32_t numerator, denominator;
328 
329 	if (parm->type != stream->type)
330 		return -EINVAL;
331 
332 	mutex_lock(&stream->mutex);
333 	numerator = stream->ctrl.dwFrameInterval;
334 	mutex_unlock(&stream->mutex);
335 
336 	denominator = 10000000;
337 	uvc_simplify_fraction(&numerator, &denominator, 8, 333);
338 
339 	memset(parm, 0, sizeof *parm);
340 	parm->type = stream->type;
341 
342 	if (stream->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
343 		parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
344 		parm->parm.capture.capturemode = 0;
345 		parm->parm.capture.timeperframe.numerator = numerator;
346 		parm->parm.capture.timeperframe.denominator = denominator;
347 		parm->parm.capture.extendedmode = 0;
348 		parm->parm.capture.readbuffers = 0;
349 	} else {
350 		parm->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
351 		parm->parm.output.outputmode = 0;
352 		parm->parm.output.timeperframe.numerator = numerator;
353 		parm->parm.output.timeperframe.denominator = denominator;
354 	}
355 
356 	return 0;
357 }
358 
uvc_v4l2_set_streamparm(struct uvc_streaming * stream,struct v4l2_streamparm * parm)359 static int uvc_v4l2_set_streamparm(struct uvc_streaming *stream,
360 		struct v4l2_streamparm *parm)
361 {
362 	struct uvc_streaming_control probe;
363 	struct v4l2_fract timeperframe;
364 	uint32_t interval;
365 	int ret;
366 
367 	if (parm->type != stream->type)
368 		return -EINVAL;
369 
370 	if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
371 		timeperframe = parm->parm.capture.timeperframe;
372 	else
373 		timeperframe = parm->parm.output.timeperframe;
374 
375 	interval = uvc_fraction_to_interval(timeperframe.numerator,
376 		timeperframe.denominator);
377 	uvc_trace(UVC_TRACE_FORMAT, "Setting frame interval to %u/%u (%u).\n",
378 		timeperframe.numerator, timeperframe.denominator, interval);
379 
380 	mutex_lock(&stream->mutex);
381 
382 	if (uvc_queue_streaming(&stream->queue)) {
383 		mutex_unlock(&stream->mutex);
384 		return -EBUSY;
385 	}
386 
387 	memcpy(&probe, &stream->ctrl, sizeof probe);
388 	probe.dwFrameInterval =
389 		uvc_try_frame_interval(stream->cur_frame, interval);
390 
391 	/* Probe the device with the new settings. */
392 	ret = uvc_probe_video(stream, &probe);
393 	if (ret < 0) {
394 		mutex_unlock(&stream->mutex);
395 		return ret;
396 	}
397 
398 	memcpy(&stream->ctrl, &probe, sizeof probe);
399 	mutex_unlock(&stream->mutex);
400 
401 	/* Return the actual frame period. */
402 	timeperframe.numerator = probe.dwFrameInterval;
403 	timeperframe.denominator = 10000000;
404 	uvc_simplify_fraction(&timeperframe.numerator,
405 		&timeperframe.denominator, 8, 333);
406 
407 	if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
408 		parm->parm.capture.timeperframe = timeperframe;
409 	else
410 		parm->parm.output.timeperframe = timeperframe;
411 
412 	return 0;
413 }
414 
415 /* ------------------------------------------------------------------------
416  * Privilege management
417  */
418 
419 /*
420  * Privilege management is the multiple-open implementation basis. The current
421  * implementation is completely transparent for the end-user and doesn't
422  * require explicit use of the VIDIOC_G_PRIORITY and VIDIOC_S_PRIORITY ioctls.
423  * Those ioctls enable finer control on the device (by making possible for a
424  * user to request exclusive access to a device), but are not mature yet.
425  * Switching to the V4L2 priority mechanism might be considered in the future
426  * if this situation changes.
427  *
428  * Each open instance of a UVC device can either be in a privileged or
429  * unprivileged state. Only a single instance can be in a privileged state at
430  * a given time. Trying to perform an operation that requires privileges will
431  * automatically acquire the required privileges if possible, or return -EBUSY
432  * otherwise. Privileges are dismissed when closing the instance or when
433  * freeing the video buffers using VIDIOC_REQBUFS.
434  *
435  * Operations that require privileges are:
436  *
437  * - VIDIOC_S_INPUT
438  * - VIDIOC_S_PARM
439  * - VIDIOC_S_FMT
440  * - VIDIOC_REQBUFS
441  */
uvc_acquire_privileges(struct uvc_fh * handle)442 static int uvc_acquire_privileges(struct uvc_fh *handle)
443 {
444 	/* Always succeed if the handle is already privileged. */
445 	if (handle->state == UVC_HANDLE_ACTIVE)
446 		return 0;
447 
448 	/* Check if the device already has a privileged handle. */
449 	if (atomic_inc_return(&handle->stream->active) != 1) {
450 		atomic_dec(&handle->stream->active);
451 		return -EBUSY;
452 	}
453 
454 	handle->state = UVC_HANDLE_ACTIVE;
455 	return 0;
456 }
457 
uvc_dismiss_privileges(struct uvc_fh * handle)458 static void uvc_dismiss_privileges(struct uvc_fh *handle)
459 {
460 	if (handle->state == UVC_HANDLE_ACTIVE)
461 		atomic_dec(&handle->stream->active);
462 
463 	handle->state = UVC_HANDLE_PASSIVE;
464 }
465 
uvc_has_privileges(struct uvc_fh * handle)466 static int uvc_has_privileges(struct uvc_fh *handle)
467 {
468 	return handle->state == UVC_HANDLE_ACTIVE;
469 }
470 
471 /* ------------------------------------------------------------------------
472  * V4L2 file operations
473  */
474 
uvc_v4l2_open(struct file * file)475 static int uvc_v4l2_open(struct file *file)
476 {
477 	struct uvc_streaming *stream;
478 	struct uvc_fh *handle;
479 	int ret = 0;
480 
481 	uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_open\n");
482 	stream = video_drvdata(file);
483 
484 	if (stream->dev->state & UVC_DEV_DISCONNECTED)
485 		return -ENODEV;
486 
487 	ret = usb_autopm_get_interface(stream->dev->intf);
488 	if (ret < 0)
489 		return ret;
490 
491 	/* Create the device handle. */
492 	handle = kzalloc(sizeof *handle, GFP_KERNEL);
493 	if (handle == NULL) {
494 		usb_autopm_put_interface(stream->dev->intf);
495 		return -ENOMEM;
496 	}
497 
498 	if (atomic_inc_return(&stream->dev->users) == 1) {
499 		ret = uvc_status_start(stream->dev);
500 		if (ret < 0) {
501 			usb_autopm_put_interface(stream->dev->intf);
502 			atomic_dec(&stream->dev->users);
503 			kfree(handle);
504 			return ret;
505 		}
506 	}
507 
508 	handle->chain = stream->chain;
509 	handle->stream = stream;
510 	handle->state = UVC_HANDLE_PASSIVE;
511 	file->private_data = handle;
512 
513 	return 0;
514 }
515 
uvc_v4l2_release(struct file * file)516 static int uvc_v4l2_release(struct file *file)
517 {
518 	struct uvc_fh *handle = file->private_data;
519 	struct uvc_streaming *stream = handle->stream;
520 
521 	uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_release\n");
522 
523 	/* Only free resources if this is a privileged handle. */
524 	if (uvc_has_privileges(handle)) {
525 		uvc_video_enable(stream, 0);
526 		uvc_free_buffers(&stream->queue);
527 	}
528 
529 	/* Release the file handle. */
530 	uvc_dismiss_privileges(handle);
531 	kfree(handle);
532 	file->private_data = NULL;
533 
534 	if (atomic_dec_return(&stream->dev->users) == 0)
535 		uvc_status_stop(stream->dev);
536 
537 	usb_autopm_put_interface(stream->dev->intf);
538 	return 0;
539 }
540 
uvc_v4l2_do_ioctl(struct file * file,unsigned int cmd,void * arg)541 static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
542 {
543 	struct video_device *vdev = video_devdata(file);
544 	struct uvc_fh *handle = file->private_data;
545 	struct uvc_video_chain *chain = handle->chain;
546 	struct uvc_streaming *stream = handle->stream;
547 	long ret = 0;
548 
549 	switch (cmd) {
550 	/* Query capabilities */
551 	case VIDIOC_QUERYCAP:
552 	{
553 		struct v4l2_capability *cap = arg;
554 
555 		memset(cap, 0, sizeof *cap);
556 		strlcpy(cap->driver, "uvcvideo", sizeof cap->driver);
557 		strlcpy(cap->card, vdev->name, sizeof cap->card);
558 		usb_make_path(stream->dev->udev,
559 			      cap->bus_info, sizeof(cap->bus_info));
560 		cap->version = LINUX_VERSION_CODE;
561 		if (stream->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
562 			cap->capabilities = V4L2_CAP_VIDEO_CAPTURE
563 					  | V4L2_CAP_STREAMING;
564 		else
565 			cap->capabilities = V4L2_CAP_VIDEO_OUTPUT
566 					  | V4L2_CAP_STREAMING;
567 		break;
568 	}
569 
570 	/* Get, Set & Query control */
571 	case VIDIOC_QUERYCTRL:
572 		return uvc_query_v4l2_ctrl(chain, arg);
573 
574 	case VIDIOC_G_CTRL:
575 	{
576 		struct v4l2_control *ctrl = arg;
577 		struct v4l2_ext_control xctrl;
578 
579 		memset(&xctrl, 0, sizeof xctrl);
580 		xctrl.id = ctrl->id;
581 
582 		ret = uvc_ctrl_begin(chain);
583 		if (ret < 0)
584 			return ret;
585 
586 		ret = uvc_ctrl_get(chain, &xctrl);
587 		uvc_ctrl_rollback(chain);
588 		if (ret >= 0)
589 			ctrl->value = xctrl.value;
590 		break;
591 	}
592 
593 	case VIDIOC_S_CTRL:
594 	{
595 		struct v4l2_control *ctrl = arg;
596 		struct v4l2_ext_control xctrl;
597 
598 		memset(&xctrl, 0, sizeof xctrl);
599 		xctrl.id = ctrl->id;
600 		xctrl.value = ctrl->value;
601 
602 		ret = uvc_ctrl_begin(chain);
603 		if (ret < 0)
604 			return ret;
605 
606 		ret = uvc_ctrl_set(chain, &xctrl);
607 		if (ret < 0) {
608 			uvc_ctrl_rollback(chain);
609 			return ret;
610 		}
611 		ret = uvc_ctrl_commit(chain);
612 		if (ret == 0)
613 			ctrl->value = xctrl.value;
614 		break;
615 	}
616 
617 	case VIDIOC_QUERYMENU:
618 		return uvc_query_v4l2_menu(chain, arg);
619 
620 	case VIDIOC_G_EXT_CTRLS:
621 	{
622 		struct v4l2_ext_controls *ctrls = arg;
623 		struct v4l2_ext_control *ctrl = ctrls->controls;
624 		unsigned int i;
625 
626 		ret = uvc_ctrl_begin(chain);
627 		if (ret < 0)
628 			return ret;
629 
630 		for (i = 0; i < ctrls->count; ++ctrl, ++i) {
631 			ret = uvc_ctrl_get(chain, ctrl);
632 			if (ret < 0) {
633 				uvc_ctrl_rollback(chain);
634 				ctrls->error_idx = i;
635 				return ret;
636 			}
637 		}
638 		ctrls->error_idx = 0;
639 		ret = uvc_ctrl_rollback(chain);
640 		break;
641 	}
642 
643 	case VIDIOC_S_EXT_CTRLS:
644 	case VIDIOC_TRY_EXT_CTRLS:
645 	{
646 		struct v4l2_ext_controls *ctrls = arg;
647 		struct v4l2_ext_control *ctrl = ctrls->controls;
648 		unsigned int i;
649 
650 		ret = uvc_ctrl_begin(chain);
651 		if (ret < 0)
652 			return ret;
653 
654 		for (i = 0; i < ctrls->count; ++ctrl, ++i) {
655 			ret = uvc_ctrl_set(chain, ctrl);
656 			if (ret < 0) {
657 				uvc_ctrl_rollback(chain);
658 				ctrls->error_idx = i;
659 				return ret;
660 			}
661 		}
662 
663 		ctrls->error_idx = 0;
664 
665 		if (cmd == VIDIOC_S_EXT_CTRLS)
666 			ret = uvc_ctrl_commit(chain);
667 		else
668 			ret = uvc_ctrl_rollback(chain);
669 		break;
670 	}
671 
672 	/* Get, Set & Enum input */
673 	case VIDIOC_ENUMINPUT:
674 	{
675 		const struct uvc_entity *selector = chain->selector;
676 		struct v4l2_input *input = arg;
677 		struct uvc_entity *iterm = NULL;
678 		u32 index = input->index;
679 		int pin = 0;
680 
681 		if (selector == NULL ||
682 		    (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) {
683 			if (index != 0)
684 				return -EINVAL;
685 			list_for_each_entry(iterm, &chain->entities, chain) {
686 				if (UVC_ENTITY_IS_ITERM(iterm))
687 					break;
688 			}
689 			pin = iterm->id;
690 		} else if (index < selector->bNrInPins) {
691 			pin = selector->baSourceID[index];
692 			list_for_each_entry(iterm, &chain->entities, chain) {
693 				if (!UVC_ENTITY_IS_ITERM(iterm))
694 					continue;
695 				if (iterm->id == pin)
696 					break;
697 			}
698 		}
699 
700 		if (iterm == NULL || iterm->id != pin)
701 			return -EINVAL;
702 
703 		memset(input, 0, sizeof *input);
704 		input->index = index;
705 		strlcpy(input->name, iterm->name, sizeof input->name);
706 		if (UVC_ENTITY_TYPE(iterm) == UVC_ITT_CAMERA)
707 			input->type = V4L2_INPUT_TYPE_CAMERA;
708 		break;
709 	}
710 
711 	case VIDIOC_G_INPUT:
712 	{
713 		u8 input;
714 
715 		if (chain->selector == NULL ||
716 		    (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) {
717 			*(int *)arg = 0;
718 			break;
719 		}
720 
721 		ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR,
722 			chain->selector->id, chain->dev->intfnum,
723 			UVC_SU_INPUT_SELECT_CONTROL, &input, 1);
724 		if (ret < 0)
725 			return ret;
726 
727 		*(int *)arg = input - 1;
728 		break;
729 	}
730 
731 	case VIDIOC_S_INPUT:
732 	{
733 		u32 input = *(u32 *)arg + 1;
734 
735 		if ((ret = uvc_acquire_privileges(handle)) < 0)
736 			return ret;
737 
738 		if (chain->selector == NULL ||
739 		    (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) {
740 			if (input != 1)
741 				return -EINVAL;
742 			break;
743 		}
744 
745 		if (input == 0 || input > chain->selector->bNrInPins)
746 			return -EINVAL;
747 
748 		return uvc_query_ctrl(chain->dev, UVC_SET_CUR,
749 			chain->selector->id, chain->dev->intfnum,
750 			UVC_SU_INPUT_SELECT_CONTROL, &input, 1);
751 	}
752 
753 	/* Try, Get, Set & Enum format */
754 	case VIDIOC_ENUM_FMT:
755 	{
756 		struct v4l2_fmtdesc *fmt = arg;
757 		struct uvc_format *format;
758 		enum v4l2_buf_type type = fmt->type;
759 		__u32 index = fmt->index;
760 
761 		if (fmt->type != stream->type ||
762 		    fmt->index >= stream->nformats)
763 			return -EINVAL;
764 
765 		memset(fmt, 0, sizeof(*fmt));
766 		fmt->index = index;
767 		fmt->type = type;
768 
769 		format = &stream->format[fmt->index];
770 		fmt->flags = 0;
771 		if (format->flags & UVC_FMT_FLAG_COMPRESSED)
772 			fmt->flags |= V4L2_FMT_FLAG_COMPRESSED;
773 		strlcpy(fmt->description, format->name,
774 			sizeof fmt->description);
775 		fmt->description[sizeof fmt->description - 1] = 0;
776 		fmt->pixelformat = format->fcc;
777 		break;
778 	}
779 
780 	case VIDIOC_TRY_FMT:
781 	{
782 		struct uvc_streaming_control probe;
783 
784 		return uvc_v4l2_try_format(stream, arg, &probe, NULL, NULL);
785 	}
786 
787 	case VIDIOC_S_FMT:
788 		if ((ret = uvc_acquire_privileges(handle)) < 0)
789 			return ret;
790 
791 		return uvc_v4l2_set_format(stream, arg);
792 
793 	case VIDIOC_G_FMT:
794 		return uvc_v4l2_get_format(stream, arg);
795 
796 	/* Frame size enumeration */
797 	case VIDIOC_ENUM_FRAMESIZES:
798 	{
799 		struct v4l2_frmsizeenum *fsize = arg;
800 		struct uvc_format *format = NULL;
801 		struct uvc_frame *frame;
802 		int i;
803 
804 		/* Look for the given pixel format */
805 		for (i = 0; i < stream->nformats; i++) {
806 			if (stream->format[i].fcc ==
807 					fsize->pixel_format) {
808 				format = &stream->format[i];
809 				break;
810 			}
811 		}
812 		if (format == NULL)
813 			return -EINVAL;
814 
815 		if (fsize->index >= format->nframes)
816 			return -EINVAL;
817 
818 		frame = &format->frame[fsize->index];
819 		fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
820 		fsize->discrete.width = frame->wWidth;
821 		fsize->discrete.height = frame->wHeight;
822 		break;
823 	}
824 
825 	/* Frame interval enumeration */
826 	case VIDIOC_ENUM_FRAMEINTERVALS:
827 	{
828 		struct v4l2_frmivalenum *fival = arg;
829 		struct uvc_format *format = NULL;
830 		struct uvc_frame *frame = NULL;
831 		int i;
832 
833 		/* Look for the given pixel format and frame size */
834 		for (i = 0; i < stream->nformats; i++) {
835 			if (stream->format[i].fcc ==
836 					fival->pixel_format) {
837 				format = &stream->format[i];
838 				break;
839 			}
840 		}
841 		if (format == NULL)
842 			return -EINVAL;
843 
844 		for (i = 0; i < format->nframes; i++) {
845 			if (format->frame[i].wWidth == fival->width &&
846 			    format->frame[i].wHeight == fival->height) {
847 				frame = &format->frame[i];
848 				break;
849 			}
850 		}
851 		if (frame == NULL)
852 			return -EINVAL;
853 
854 		if (frame->bFrameIntervalType) {
855 			if (fival->index >= frame->bFrameIntervalType)
856 				return -EINVAL;
857 
858 			fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
859 			fival->discrete.numerator =
860 				frame->dwFrameInterval[fival->index];
861 			fival->discrete.denominator = 10000000;
862 			uvc_simplify_fraction(&fival->discrete.numerator,
863 				&fival->discrete.denominator, 8, 333);
864 		} else {
865 			fival->type = V4L2_FRMIVAL_TYPE_STEPWISE;
866 			fival->stepwise.min.numerator =
867 				frame->dwFrameInterval[0];
868 			fival->stepwise.min.denominator = 10000000;
869 			fival->stepwise.max.numerator =
870 				frame->dwFrameInterval[1];
871 			fival->stepwise.max.denominator = 10000000;
872 			fival->stepwise.step.numerator =
873 				frame->dwFrameInterval[2];
874 			fival->stepwise.step.denominator = 10000000;
875 			uvc_simplify_fraction(&fival->stepwise.min.numerator,
876 				&fival->stepwise.min.denominator, 8, 333);
877 			uvc_simplify_fraction(&fival->stepwise.max.numerator,
878 				&fival->stepwise.max.denominator, 8, 333);
879 			uvc_simplify_fraction(&fival->stepwise.step.numerator,
880 				&fival->stepwise.step.denominator, 8, 333);
881 		}
882 		break;
883 	}
884 
885 	/* Get & Set streaming parameters */
886 	case VIDIOC_G_PARM:
887 		return uvc_v4l2_get_streamparm(stream, arg);
888 
889 	case VIDIOC_S_PARM:
890 		if ((ret = uvc_acquire_privileges(handle)) < 0)
891 			return ret;
892 
893 		return uvc_v4l2_set_streamparm(stream, arg);
894 
895 	/* Cropping and scaling */
896 	case VIDIOC_CROPCAP:
897 	{
898 		struct v4l2_cropcap *ccap = arg;
899 
900 		if (ccap->type != stream->type)
901 			return -EINVAL;
902 
903 		ccap->bounds.left = 0;
904 		ccap->bounds.top = 0;
905 
906 		mutex_lock(&stream->mutex);
907 		ccap->bounds.width = stream->cur_frame->wWidth;
908 		ccap->bounds.height = stream->cur_frame->wHeight;
909 		mutex_unlock(&stream->mutex);
910 
911 		ccap->defrect = ccap->bounds;
912 
913 		ccap->pixelaspect.numerator = 1;
914 		ccap->pixelaspect.denominator = 1;
915 		break;
916 	}
917 
918 	case VIDIOC_G_CROP:
919 	case VIDIOC_S_CROP:
920 		return -EINVAL;
921 
922 	/* Buffers & streaming */
923 	case VIDIOC_REQBUFS:
924 		if ((ret = uvc_acquire_privileges(handle)) < 0)
925 			return ret;
926 
927 		mutex_lock(&stream->mutex);
928 		ret = uvc_alloc_buffers(&stream->queue, arg);
929 		mutex_unlock(&stream->mutex);
930 		if (ret < 0)
931 			return ret;
932 
933 		if (ret == 0)
934 			uvc_dismiss_privileges(handle);
935 
936 		ret = 0;
937 		break;
938 
939 	case VIDIOC_QUERYBUF:
940 	{
941 		struct v4l2_buffer *buf = arg;
942 
943 		if (!uvc_has_privileges(handle))
944 			return -EBUSY;
945 
946 		return uvc_query_buffer(&stream->queue, buf);
947 	}
948 
949 	case VIDIOC_QBUF:
950 		if (!uvc_has_privileges(handle))
951 			return -EBUSY;
952 
953 		return uvc_queue_buffer(&stream->queue, arg);
954 
955 	case VIDIOC_DQBUF:
956 		if (!uvc_has_privileges(handle))
957 			return -EBUSY;
958 
959 		return uvc_dequeue_buffer(&stream->queue, arg,
960 			file->f_flags & O_NONBLOCK);
961 
962 	case VIDIOC_STREAMON:
963 	{
964 		int *type = arg;
965 
966 		if (*type != stream->type)
967 			return -EINVAL;
968 
969 		if (!uvc_has_privileges(handle))
970 			return -EBUSY;
971 
972 		mutex_lock(&stream->mutex);
973 		ret = uvc_video_enable(stream, 1);
974 		mutex_unlock(&stream->mutex);
975 		if (ret < 0)
976 			return ret;
977 		break;
978 	}
979 
980 	case VIDIOC_STREAMOFF:
981 	{
982 		int *type = arg;
983 
984 		if (*type != stream->type)
985 			return -EINVAL;
986 
987 		if (!uvc_has_privileges(handle))
988 			return -EBUSY;
989 
990 		return uvc_video_enable(stream, 0);
991 	}
992 
993 	/* Analog video standards make no sense for digital cameras. */
994 	case VIDIOC_ENUMSTD:
995 	case VIDIOC_QUERYSTD:
996 	case VIDIOC_G_STD:
997 	case VIDIOC_S_STD:
998 
999 	case VIDIOC_OVERLAY:
1000 
1001 	case VIDIOC_ENUMAUDIO:
1002 	case VIDIOC_ENUMAUDOUT:
1003 
1004 	case VIDIOC_ENUMOUTPUT:
1005 		uvc_trace(UVC_TRACE_IOCTL, "Unsupported ioctl 0x%08x\n", cmd);
1006 		return -EINVAL;
1007 
1008 	case UVCIOC_CTRL_MAP:
1009 		return uvc_ioctl_ctrl_map(chain, arg);
1010 
1011 	case UVCIOC_CTRL_QUERY:
1012 		return uvc_xu_ctrl_query(chain, arg);
1013 
1014 	default:
1015 		uvc_trace(UVC_TRACE_IOCTL, "Unknown ioctl 0x%08x\n", cmd);
1016 		return -ENOTTY;
1017 	}
1018 
1019 	return ret;
1020 }
1021 
uvc_v4l2_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1022 static long uvc_v4l2_ioctl(struct file *file,
1023 		     unsigned int cmd, unsigned long arg)
1024 {
1025 	if (uvc_trace_param & UVC_TRACE_IOCTL) {
1026 		uvc_printk(KERN_DEBUG, "uvc_v4l2_ioctl(");
1027 		v4l_printk_ioctl(cmd);
1028 		printk(")\n");
1029 	}
1030 
1031 	return video_usercopy(file, cmd, arg, uvc_v4l2_do_ioctl);
1032 }
1033 
1034 #ifdef CONFIG_COMPAT
1035 struct uvc_xu_control_mapping32 {
1036 	__u32 id;
1037 	__u8 name[32];
1038 	__u8 entity[16];
1039 	__u8 selector;
1040 
1041 	__u8 size;
1042 	__u8 offset;
1043 	__u32 v4l2_type;
1044 	__u32 data_type;
1045 
1046 	compat_caddr_t menu_info;
1047 	__u32 menu_count;
1048 
1049 	__u32 reserved[4];
1050 };
1051 
uvc_v4l2_get_xu_mapping(struct uvc_xu_control_mapping * kp,const struct uvc_xu_control_mapping32 __user * up)1052 static int uvc_v4l2_get_xu_mapping(struct uvc_xu_control_mapping *kp,
1053 			const struct uvc_xu_control_mapping32 __user *up)
1054 {
1055 	struct uvc_menu_info __user *umenus;
1056 	struct uvc_menu_info __user *kmenus;
1057 	compat_caddr_t p;
1058 
1059 	if (!access_ok(VERIFY_READ, up, sizeof(*up)) ||
1060 	    __copy_from_user(kp, up, offsetof(typeof(*up), menu_info)) ||
1061 	    __get_user(kp->menu_count, &up->menu_count))
1062 		return -EFAULT;
1063 
1064 	memset(kp->reserved, 0, sizeof(kp->reserved));
1065 
1066 	if (kp->menu_count == 0) {
1067 		kp->menu_info = NULL;
1068 		return 0;
1069 	}
1070 
1071 	if (__get_user(p, &up->menu_info))
1072 		return -EFAULT;
1073 	umenus = compat_ptr(p);
1074 	if (!access_ok(VERIFY_READ, umenus, kp->menu_count * sizeof(*umenus)))
1075 		return -EFAULT;
1076 
1077 	kmenus = compat_alloc_user_space(kp->menu_count * sizeof(*kmenus));
1078 	if (kmenus == NULL)
1079 		return -EFAULT;
1080 	kp->menu_info = kmenus;
1081 
1082 	if (copy_in_user(kmenus, umenus, kp->menu_count * sizeof(*umenus)))
1083 		return -EFAULT;
1084 
1085 	return 0;
1086 }
1087 
uvc_v4l2_put_xu_mapping(const struct uvc_xu_control_mapping * kp,struct uvc_xu_control_mapping32 __user * up)1088 static int uvc_v4l2_put_xu_mapping(const struct uvc_xu_control_mapping *kp,
1089 			struct uvc_xu_control_mapping32 __user *up)
1090 {
1091 	struct uvc_menu_info __user *umenus;
1092 	struct uvc_menu_info __user *kmenus = kp->menu_info;
1093 	compat_caddr_t p;
1094 
1095 	if (!access_ok(VERIFY_WRITE, up, sizeof(*up)) ||
1096 	    __copy_to_user(up, kp, offsetof(typeof(*up), menu_info)) ||
1097 	    __put_user(kp->menu_count, &up->menu_count))
1098 		return -EFAULT;
1099 
1100 	__clear_user(up->reserved, sizeof(up->reserved));
1101 
1102 	if (kp->menu_count == 0)
1103 		return 0;
1104 
1105 	if (get_user(p, &up->menu_info))
1106 		return -EFAULT;
1107 	umenus = compat_ptr(p);
1108 	if (!access_ok(VERIFY_WRITE, umenus, kp->menu_count * sizeof(*umenus)))
1109 		return -EFAULT;
1110 
1111 	if (copy_in_user(umenus, kmenus, kp->menu_count * sizeof(*umenus)))
1112 		return -EFAULT;
1113 
1114 	return 0;
1115 }
1116 
1117 struct uvc_xu_control_query32 {
1118 	__u8 unit;
1119 	__u8 selector;
1120 	__u8 query;
1121 	__u16 size;
1122 	compat_caddr_t data;
1123 };
1124 
uvc_v4l2_get_xu_query(struct uvc_xu_control_query * kp,const struct uvc_xu_control_query32 __user * up)1125 static int uvc_v4l2_get_xu_query(struct uvc_xu_control_query *kp,
1126 			const struct uvc_xu_control_query32 __user *up)
1127 {
1128 	u8 __user *udata;
1129 	u8 __user *kdata;
1130 	compat_caddr_t p;
1131 
1132 	if (!access_ok(VERIFY_READ, up, sizeof(*up)) ||
1133 	    __copy_from_user(kp, up, offsetof(typeof(*up), data)))
1134 		return -EFAULT;
1135 
1136 	if (kp->size == 0) {
1137 		kp->data = NULL;
1138 		return 0;
1139 	}
1140 
1141 	if (__get_user(p, &up->data))
1142 		return -EFAULT;
1143 	udata = compat_ptr(p);
1144 	if (!access_ok(VERIFY_READ, udata, kp->size))
1145 		return -EFAULT;
1146 
1147 	kdata = compat_alloc_user_space(kp->size);
1148 	if (kdata == NULL)
1149 		return -EFAULT;
1150 	kp->data = kdata;
1151 
1152 	if (copy_in_user(kdata, udata, kp->size))
1153 		return -EFAULT;
1154 
1155 	return 0;
1156 }
1157 
uvc_v4l2_put_xu_query(const struct uvc_xu_control_query * kp,struct uvc_xu_control_query32 __user * up)1158 static int uvc_v4l2_put_xu_query(const struct uvc_xu_control_query *kp,
1159 			struct uvc_xu_control_query32 __user *up)
1160 {
1161 	u8 __user *udata;
1162 	u8 __user *kdata = kp->data;
1163 	compat_caddr_t p;
1164 
1165 	if (!access_ok(VERIFY_WRITE, up, sizeof(*up)) ||
1166 	    __copy_to_user(up, kp, offsetof(typeof(*up), data)))
1167 		return -EFAULT;
1168 
1169 	if (kp->size == 0)
1170 		return 0;
1171 
1172 	if (get_user(p, &up->data))
1173 		return -EFAULT;
1174 	udata = compat_ptr(p);
1175 	if (!access_ok(VERIFY_READ, udata, kp->size))
1176 		return -EFAULT;
1177 
1178 	if (copy_in_user(udata, kdata, kp->size))
1179 		return -EFAULT;
1180 
1181 	return 0;
1182 }
1183 
1184 #define UVCIOC_CTRL_MAP32	_IOWR('u', 0x20, struct uvc_xu_control_mapping32)
1185 #define UVCIOC_CTRL_QUERY32	_IOWR('u', 0x21, struct uvc_xu_control_query32)
1186 
uvc_v4l2_compat_ioctl32(struct file * file,unsigned int cmd,unsigned long arg)1187 static long uvc_v4l2_compat_ioctl32(struct file *file,
1188 		     unsigned int cmd, unsigned long arg)
1189 {
1190 	union {
1191 		struct uvc_xu_control_mapping xmap;
1192 		struct uvc_xu_control_query xqry;
1193 	} karg;
1194 	void __user *up = compat_ptr(arg);
1195 	mm_segment_t old_fs;
1196 	long ret;
1197 
1198 	switch (cmd) {
1199 	case UVCIOC_CTRL_MAP32:
1200 		cmd = UVCIOC_CTRL_MAP;
1201 		ret = uvc_v4l2_get_xu_mapping(&karg.xmap, up);
1202 		break;
1203 
1204 	case UVCIOC_CTRL_QUERY32:
1205 		cmd = UVCIOC_CTRL_QUERY;
1206 		ret = uvc_v4l2_get_xu_query(&karg.xqry, up);
1207 		break;
1208 
1209 	default:
1210 		return -ENOIOCTLCMD;
1211 	}
1212 
1213 	old_fs = get_fs();
1214 	set_fs(KERNEL_DS);
1215 	ret = uvc_v4l2_ioctl(file, cmd, (unsigned long)&karg);
1216 	set_fs(old_fs);
1217 
1218 	if (ret < 0)
1219 		return ret;
1220 
1221 	switch (cmd) {
1222 	case UVCIOC_CTRL_MAP:
1223 		ret = uvc_v4l2_put_xu_mapping(&karg.xmap, up);
1224 		break;
1225 
1226 	case UVCIOC_CTRL_QUERY:
1227 		ret = uvc_v4l2_put_xu_query(&karg.xqry, up);
1228 		break;
1229 	}
1230 
1231 	return ret;
1232 }
1233 #endif
1234 
uvc_v4l2_read(struct file * file,char __user * data,size_t count,loff_t * ppos)1235 static ssize_t uvc_v4l2_read(struct file *file, char __user *data,
1236 		    size_t count, loff_t *ppos)
1237 {
1238 	uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_read: not implemented.\n");
1239 	return -EINVAL;
1240 }
1241 
uvc_v4l2_mmap(struct file * file,struct vm_area_struct * vma)1242 static int uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
1243 {
1244 	struct uvc_fh *handle = file->private_data;
1245 	struct uvc_streaming *stream = handle->stream;
1246 
1247 	uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_mmap\n");
1248 
1249 	return uvc_queue_mmap(&stream->queue, vma);
1250 }
1251 
uvc_v4l2_poll(struct file * file,poll_table * wait)1252 static unsigned int uvc_v4l2_poll(struct file *file, poll_table *wait)
1253 {
1254 	struct uvc_fh *handle = file->private_data;
1255 	struct uvc_streaming *stream = handle->stream;
1256 
1257 	uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_poll\n");
1258 
1259 	return uvc_queue_poll(&stream->queue, file, wait);
1260 }
1261 
1262 #ifndef CONFIG_MMU
uvc_v4l2_get_unmapped_area(struct file * file,unsigned long addr,unsigned long len,unsigned long pgoff,unsigned long flags)1263 static unsigned long uvc_v4l2_get_unmapped_area(struct file *file,
1264 		unsigned long addr, unsigned long len, unsigned long pgoff,
1265 		unsigned long flags)
1266 {
1267 	struct uvc_fh *handle = file->private_data;
1268 	struct uvc_streaming *stream = handle->stream;
1269 
1270 	uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_get_unmapped_area\n");
1271 
1272 	return uvc_queue_get_unmapped_area(&stream->queue, pgoff);
1273 }
1274 #endif
1275 
1276 const struct v4l2_file_operations uvc_fops = {
1277 	.owner		= THIS_MODULE,
1278 	.open		= uvc_v4l2_open,
1279 	.release	= uvc_v4l2_release,
1280 	.unlocked_ioctl	= uvc_v4l2_ioctl,
1281 #ifdef CONFIG_COMPAT
1282 	.compat_ioctl32	= uvc_v4l2_compat_ioctl32,
1283 #endif
1284 	.read		= uvc_v4l2_read,
1285 	.mmap		= uvc_v4l2_mmap,
1286 	.poll		= uvc_v4l2_poll,
1287 #ifndef CONFIG_MMU
1288 	.get_unmapped_area = uvc_v4l2_get_unmapped_area,
1289 #endif
1290 };
1291 
1292