1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * uvc_v4l2.c -- USB Video Class driver - V4L2 API
5 * Copyright (C) 2005-2010
6 * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
9 #include <linux/compat.h>
10 #include <linux/kernel.h>
11 #include <linux/list.h>
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/usb.h>
15 #include <linux/videodev2.h>
16 #include <linux/vmalloc.h>
18 #include <linux/wait.h>
19 #include <linux/atomic.h>
21 #include <media/v4l2-common.h>
22 #include <media/v4l2-ctrls.h>
23 #include <media/v4l2-event.h>
24 #include <media/v4l2-ioctl.h>
28 /* ------------------------------------------------------------------------
31 static int uvc_ioctl_ctrl_map(struct uvc_video_chain
*chain
,
32 struct uvc_xu_control_mapping
*xmap
)
34 struct uvc_control_mapping
*map
;
38 map
= kzalloc(sizeof(*map
), GFP_KERNEL
);
43 memcpy(map
->name
, xmap
->name
, sizeof(map
->name
));
44 memcpy(map
->entity
, xmap
->entity
, sizeof(map
->entity
));
45 map
->selector
= xmap
->selector
;
46 map
->size
= xmap
->size
;
47 map
->offset
= xmap
->offset
;
48 map
->v4l2_type
= xmap
->v4l2_type
;
49 map
->data_type
= xmap
->data_type
;
51 switch (xmap
->v4l2_type
) {
52 case V4L2_CTRL_TYPE_INTEGER
:
53 case V4L2_CTRL_TYPE_BOOLEAN
:
54 case V4L2_CTRL_TYPE_BUTTON
:
57 case V4L2_CTRL_TYPE_MENU
:
58 /* Prevent excessive memory consumption, as well as integer
61 if (xmap
->menu_count
== 0 ||
62 xmap
->menu_count
> UVC_MAX_CONTROL_MENU_ENTRIES
) {
67 size
= xmap
->menu_count
* sizeof(*map
->menu_info
);
68 map
->menu_info
= memdup_user(xmap
->menu_info
, size
);
69 if (IS_ERR(map
->menu_info
)) {
70 ret
= PTR_ERR(map
->menu_info
);
74 map
->menu_count
= xmap
->menu_count
;
78 uvc_trace(UVC_TRACE_CONTROL
, "Unsupported V4L2 control type "
79 "%u.\n", xmap
->v4l2_type
);
84 ret
= uvc_ctrl_add_mapping(chain
, map
);
86 kfree(map
->menu_info
);
93 /* ------------------------------------------------------------------------
98 * Find the frame interval closest to the requested frame interval for the
99 * given frame format and size. This should be done by the device as part of
100 * the Video Probe and Commit negotiation, but some hardware don't implement
103 static u32
uvc_try_frame_interval(struct uvc_frame
*frame
, u32 interval
)
107 if (frame
->bFrameIntervalType
) {
110 for (i
= 0; i
< frame
->bFrameIntervalType
; ++i
) {
111 dist
= interval
> frame
->dwFrameInterval
[i
]
112 ? interval
- frame
->dwFrameInterval
[i
]
113 : frame
->dwFrameInterval
[i
] - interval
;
121 interval
= frame
->dwFrameInterval
[i
-1];
123 const u32 min
= frame
->dwFrameInterval
[0];
124 const u32 max
= frame
->dwFrameInterval
[1];
125 const u32 step
= frame
->dwFrameInterval
[2];
127 interval
= min
+ (interval
- min
+ step
/2) / step
* step
;
135 static u32
uvc_v4l2_get_bytesperline(const struct uvc_format
*format
,
136 const struct uvc_frame
*frame
)
138 switch (format
->fcc
) {
139 case V4L2_PIX_FMT_NV12
:
140 case V4L2_PIX_FMT_YVU420
:
141 case V4L2_PIX_FMT_YUV420
:
142 case V4L2_PIX_FMT_M420
:
143 return frame
->wWidth
;
146 return format
->bpp
* frame
->wWidth
/ 8;
150 static int uvc_v4l2_try_format(struct uvc_streaming
*stream
,
151 struct v4l2_format
*fmt
, struct uvc_streaming_control
*probe
,
152 struct uvc_format
**uvc_format
, struct uvc_frame
**uvc_frame
)
154 struct uvc_format
*format
= NULL
;
155 struct uvc_frame
*frame
= NULL
;
157 unsigned int d
, maxd
;
163 if (fmt
->type
!= stream
->type
)
166 fcc
= (u8
*)&fmt
->fmt
.pix
.pixelformat
;
167 uvc_trace(UVC_TRACE_FORMAT
, "Trying format 0x%08x (%c%c%c%c): %ux%u.\n",
168 fmt
->fmt
.pix
.pixelformat
,
169 fcc
[0], fcc
[1], fcc
[2], fcc
[3],
170 fmt
->fmt
.pix
.width
, fmt
->fmt
.pix
.height
);
172 /* Check if the hardware supports the requested format, use the default
175 for (i
= 0; i
< stream
->nformats
; ++i
) {
176 format
= &stream
->format
[i
];
177 if (format
->fcc
== fmt
->fmt
.pix
.pixelformat
)
181 if (i
== stream
->nformats
) {
182 format
= stream
->def_format
;
183 fmt
->fmt
.pix
.pixelformat
= format
->fcc
;
186 /* Find the closest image size. The distance between image sizes is
187 * the size in pixels of the non-overlapping regions between the
188 * requested size and the frame-specified size.
190 rw
= fmt
->fmt
.pix
.width
;
191 rh
= fmt
->fmt
.pix
.height
;
192 maxd
= (unsigned int)-1;
194 for (i
= 0; i
< format
->nframes
; ++i
) {
195 u16 w
= format
->frame
[i
].wWidth
;
196 u16 h
= format
->frame
[i
].wHeight
;
198 d
= min(w
, rw
) * min(h
, rh
);
199 d
= w
*h
+ rw
*rh
- 2*d
;
202 frame
= &format
->frame
[i
];
210 uvc_trace(UVC_TRACE_FORMAT
, "Unsupported size %ux%u.\n",
211 fmt
->fmt
.pix
.width
, fmt
->fmt
.pix
.height
);
215 /* Use the default frame interval. */
216 interval
= frame
->dwDefaultFrameInterval
;
217 uvc_trace(UVC_TRACE_FORMAT
, "Using default frame interval %u.%u us "
218 "(%u.%u fps).\n", interval
/10, interval
%10, 10000000/interval
,
219 (100000000/interval
)%10);
221 /* Set the format index, frame index and frame interval. */
222 memset(probe
, 0, sizeof(*probe
));
223 probe
->bmHint
= 1; /* dwFrameInterval */
224 probe
->bFormatIndex
= format
->index
;
225 probe
->bFrameIndex
= frame
->bFrameIndex
;
226 probe
->dwFrameInterval
= uvc_try_frame_interval(frame
, interval
);
227 /* Some webcams stall the probe control set request when the
228 * dwMaxVideoFrameSize field is set to zero. The UVC specification
229 * clearly states that the field is read-only from the host, so this
230 * is a webcam bug. Set dwMaxVideoFrameSize to the value reported by
231 * the webcam to work around the problem.
233 * The workaround could probably be enabled for all webcams, so the
234 * quirk can be removed if needed. It's currently useful to detect
235 * webcam bugs and fix them before they hit the market (providing
236 * developers test their webcams with the Linux driver as well as with
237 * the Windows driver).
239 mutex_lock(&stream
->mutex
);
240 if (stream
->dev
->quirks
& UVC_QUIRK_PROBE_EXTRAFIELDS
)
241 probe
->dwMaxVideoFrameSize
=
242 stream
->ctrl
.dwMaxVideoFrameSize
;
244 /* Probe the device. */
245 ret
= uvc_probe_video(stream
, probe
);
246 mutex_unlock(&stream
->mutex
);
250 /* After the probe, update fmt with the values returned from
251 * negotiation with the device.
253 for (i
= 0; i
< stream
->nformats
; ++i
) {
254 if (probe
->bFormatIndex
== stream
->format
[i
].index
) {
255 format
= &stream
->format
[i
];
260 if (i
== stream
->nformats
) {
261 uvc_trace(UVC_TRACE_FORMAT
, "Unknown bFormatIndex %u\n",
262 probe
->bFormatIndex
);
266 for (i
= 0; i
< format
->nframes
; ++i
) {
267 if (probe
->bFrameIndex
== format
->frame
[i
].bFrameIndex
) {
268 frame
= &format
->frame
[i
];
273 if (i
== format
->nframes
) {
274 uvc_trace(UVC_TRACE_FORMAT
, "Unknown bFrameIndex %u\n",
279 fmt
->fmt
.pix
.width
= frame
->wWidth
;
280 fmt
->fmt
.pix
.height
= frame
->wHeight
;
281 fmt
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
282 fmt
->fmt
.pix
.bytesperline
= uvc_v4l2_get_bytesperline(format
, frame
);
283 fmt
->fmt
.pix
.sizeimage
= probe
->dwMaxVideoFrameSize
;
284 fmt
->fmt
.pix
.pixelformat
= format
->fcc
;
285 fmt
->fmt
.pix
.colorspace
= format
->colorspace
;
286 fmt
->fmt
.pix
.xfer_func
= format
->xfer_func
;
287 fmt
->fmt
.pix
.ycbcr_enc
= format
->ycbcr_enc
;
289 if (uvc_format
!= NULL
)
290 *uvc_format
= format
;
291 if (uvc_frame
!= NULL
)
298 static int uvc_v4l2_get_format(struct uvc_streaming
*stream
,
299 struct v4l2_format
*fmt
)
301 struct uvc_format
*format
;
302 struct uvc_frame
*frame
;
305 if (fmt
->type
!= stream
->type
)
308 mutex_lock(&stream
->mutex
);
309 format
= stream
->cur_format
;
310 frame
= stream
->cur_frame
;
312 if (format
== NULL
|| frame
== NULL
) {
317 fmt
->fmt
.pix
.pixelformat
= format
->fcc
;
318 fmt
->fmt
.pix
.width
= frame
->wWidth
;
319 fmt
->fmt
.pix
.height
= frame
->wHeight
;
320 fmt
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
321 fmt
->fmt
.pix
.bytesperline
= uvc_v4l2_get_bytesperline(format
, frame
);
322 fmt
->fmt
.pix
.sizeimage
= stream
->ctrl
.dwMaxVideoFrameSize
;
323 fmt
->fmt
.pix
.colorspace
= format
->colorspace
;
324 fmt
->fmt
.pix
.xfer_func
= format
->xfer_func
;
325 fmt
->fmt
.pix
.ycbcr_enc
= format
->ycbcr_enc
;
328 mutex_unlock(&stream
->mutex
);
332 static int uvc_v4l2_set_format(struct uvc_streaming
*stream
,
333 struct v4l2_format
*fmt
)
335 struct uvc_streaming_control probe
;
336 struct uvc_format
*format
;
337 struct uvc_frame
*frame
;
340 if (fmt
->type
!= stream
->type
)
343 ret
= uvc_v4l2_try_format(stream
, fmt
, &probe
, &format
, &frame
);
347 mutex_lock(&stream
->mutex
);
349 if (uvc_queue_allocated(&stream
->queue
)) {
354 stream
->ctrl
= probe
;
355 stream
->cur_format
= format
;
356 stream
->cur_frame
= frame
;
359 mutex_unlock(&stream
->mutex
);
363 static int uvc_v4l2_get_streamparm(struct uvc_streaming
*stream
,
364 struct v4l2_streamparm
*parm
)
366 u32 numerator
, denominator
;
368 if (parm
->type
!= stream
->type
)
371 mutex_lock(&stream
->mutex
);
372 numerator
= stream
->ctrl
.dwFrameInterval
;
373 mutex_unlock(&stream
->mutex
);
375 denominator
= 10000000;
376 uvc_simplify_fraction(&numerator
, &denominator
, 8, 333);
378 memset(parm
, 0, sizeof(*parm
));
379 parm
->type
= stream
->type
;
381 if (stream
->type
== V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
382 parm
->parm
.capture
.capability
= V4L2_CAP_TIMEPERFRAME
;
383 parm
->parm
.capture
.capturemode
= 0;
384 parm
->parm
.capture
.timeperframe
.numerator
= numerator
;
385 parm
->parm
.capture
.timeperframe
.denominator
= denominator
;
386 parm
->parm
.capture
.extendedmode
= 0;
387 parm
->parm
.capture
.readbuffers
= 0;
389 parm
->parm
.output
.capability
= V4L2_CAP_TIMEPERFRAME
;
390 parm
->parm
.output
.outputmode
= 0;
391 parm
->parm
.output
.timeperframe
.numerator
= numerator
;
392 parm
->parm
.output
.timeperframe
.denominator
= denominator
;
398 static int uvc_v4l2_set_streamparm(struct uvc_streaming
*stream
,
399 struct v4l2_streamparm
*parm
)
401 struct uvc_streaming_control probe
;
402 struct v4l2_fract timeperframe
;
403 struct uvc_format
*format
;
404 struct uvc_frame
*frame
;
409 if (parm
->type
!= stream
->type
)
412 if (parm
->type
== V4L2_BUF_TYPE_VIDEO_CAPTURE
)
413 timeperframe
= parm
->parm
.capture
.timeperframe
;
415 timeperframe
= parm
->parm
.output
.timeperframe
;
417 interval
= uvc_fraction_to_interval(timeperframe
.numerator
,
418 timeperframe
.denominator
);
419 uvc_trace(UVC_TRACE_FORMAT
, "Setting frame interval to %u/%u (%u).\n",
420 timeperframe
.numerator
, timeperframe
.denominator
, interval
);
422 mutex_lock(&stream
->mutex
);
424 if (uvc_queue_streaming(&stream
->queue
)) {
425 mutex_unlock(&stream
->mutex
);
429 format
= stream
->cur_format
;
430 frame
= stream
->cur_frame
;
431 probe
= stream
->ctrl
;
432 probe
.dwFrameInterval
= uvc_try_frame_interval(frame
, interval
);
433 maxd
= abs((s32
)probe
.dwFrameInterval
- interval
);
435 /* Try frames with matching size to find the best frame interval. */
436 for (i
= 0; i
< format
->nframes
&& maxd
!= 0; i
++) {
439 if (&format
->frame
[i
] == stream
->cur_frame
)
442 if (format
->frame
[i
].wWidth
!= stream
->cur_frame
->wWidth
||
443 format
->frame
[i
].wHeight
!= stream
->cur_frame
->wHeight
)
446 ival
= uvc_try_frame_interval(&format
->frame
[i
], interval
);
447 d
= abs((s32
)ival
- interval
);
451 frame
= &format
->frame
[i
];
452 probe
.bFrameIndex
= frame
->bFrameIndex
;
453 probe
.dwFrameInterval
= ival
;
457 /* Probe the device with the new settings. */
458 ret
= uvc_probe_video(stream
, &probe
);
460 mutex_unlock(&stream
->mutex
);
464 stream
->ctrl
= probe
;
465 stream
->cur_frame
= frame
;
466 mutex_unlock(&stream
->mutex
);
468 /* Return the actual frame period. */
469 timeperframe
.numerator
= probe
.dwFrameInterval
;
470 timeperframe
.denominator
= 10000000;
471 uvc_simplify_fraction(&timeperframe
.numerator
,
472 &timeperframe
.denominator
, 8, 333);
474 if (parm
->type
== V4L2_BUF_TYPE_VIDEO_CAPTURE
)
475 parm
->parm
.capture
.timeperframe
= timeperframe
;
477 parm
->parm
.output
.timeperframe
= timeperframe
;
482 /* ------------------------------------------------------------------------
483 * Privilege management
487 * Privilege management is the multiple-open implementation basis. The current
488 * implementation is completely transparent for the end-user and doesn't
489 * require explicit use of the VIDIOC_G_PRIORITY and VIDIOC_S_PRIORITY ioctls.
490 * Those ioctls enable finer control on the device (by making possible for a
491 * user to request exclusive access to a device), but are not mature yet.
492 * Switching to the V4L2 priority mechanism might be considered in the future
493 * if this situation changes.
495 * Each open instance of a UVC device can either be in a privileged or
496 * unprivileged state. Only a single instance can be in a privileged state at
497 * a given time. Trying to perform an operation that requires privileges will
498 * automatically acquire the required privileges if possible, or return -EBUSY
499 * otherwise. Privileges are dismissed when closing the instance or when
500 * freeing the video buffers using VIDIOC_REQBUFS.
502 * Operations that require privileges are:
509 static int uvc_acquire_privileges(struct uvc_fh
*handle
)
511 /* Always succeed if the handle is already privileged. */
512 if (handle
->state
== UVC_HANDLE_ACTIVE
)
515 /* Check if the device already has a privileged handle. */
516 if (atomic_inc_return(&handle
->stream
->active
) != 1) {
517 atomic_dec(&handle
->stream
->active
);
521 handle
->state
= UVC_HANDLE_ACTIVE
;
525 static void uvc_dismiss_privileges(struct uvc_fh
*handle
)
527 if (handle
->state
== UVC_HANDLE_ACTIVE
)
528 atomic_dec(&handle
->stream
->active
);
530 handle
->state
= UVC_HANDLE_PASSIVE
;
533 static int uvc_has_privileges(struct uvc_fh
*handle
)
535 return handle
->state
== UVC_HANDLE_ACTIVE
;
538 /* ------------------------------------------------------------------------
539 * V4L2 file operations
542 static int uvc_v4l2_open(struct file
*file
)
544 struct uvc_streaming
*stream
;
545 struct uvc_fh
*handle
;
548 uvc_trace(UVC_TRACE_CALLS
, "uvc_v4l2_open\n");
549 stream
= video_drvdata(file
);
551 ret
= usb_autopm_get_interface(stream
->dev
->intf
);
555 /* Create the device handle. */
556 handle
= kzalloc(sizeof(*handle
), GFP_KERNEL
);
557 if (handle
== NULL
) {
558 usb_autopm_put_interface(stream
->dev
->intf
);
562 mutex_lock(&stream
->dev
->lock
);
563 if (stream
->dev
->users
== 0) {
564 ret
= uvc_status_start(stream
->dev
, GFP_KERNEL
);
566 mutex_unlock(&stream
->dev
->lock
);
567 usb_autopm_put_interface(stream
->dev
->intf
);
573 stream
->dev
->users
++;
574 mutex_unlock(&stream
->dev
->lock
);
576 v4l2_fh_init(&handle
->vfh
, &stream
->vdev
);
577 v4l2_fh_add(&handle
->vfh
);
578 handle
->chain
= stream
->chain
;
579 handle
->stream
= stream
;
580 handle
->state
= UVC_HANDLE_PASSIVE
;
581 file
->private_data
= handle
;
586 static int uvc_v4l2_release(struct file
*file
)
588 struct uvc_fh
*handle
= file
->private_data
;
589 struct uvc_streaming
*stream
= handle
->stream
;
591 uvc_trace(UVC_TRACE_CALLS
, "uvc_v4l2_release\n");
593 /* Only free resources if this is a privileged handle. */
594 if (uvc_has_privileges(handle
))
595 uvc_queue_release(&stream
->queue
);
597 /* Release the file handle. */
598 uvc_dismiss_privileges(handle
);
599 v4l2_fh_del(&handle
->vfh
);
600 v4l2_fh_exit(&handle
->vfh
);
602 file
->private_data
= NULL
;
604 mutex_lock(&stream
->dev
->lock
);
605 if (--stream
->dev
->users
== 0)
606 uvc_status_stop(stream
->dev
);
607 mutex_unlock(&stream
->dev
->lock
);
609 usb_autopm_put_interface(stream
->dev
->intf
);
613 static int uvc_ioctl_querycap(struct file
*file
, void *fh
,
614 struct v4l2_capability
*cap
)
616 struct video_device
*vdev
= video_devdata(file
);
617 struct uvc_fh
*handle
= file
->private_data
;
618 struct uvc_video_chain
*chain
= handle
->chain
;
619 struct uvc_streaming
*stream
= handle
->stream
;
621 strscpy(cap
->driver
, "uvcvideo", sizeof(cap
->driver
));
622 strscpy(cap
->card
, vdev
->name
, sizeof(cap
->card
));
623 usb_make_path(stream
->dev
->udev
, cap
->bus_info
, sizeof(cap
->bus_info
));
624 cap
->capabilities
= V4L2_CAP_DEVICE_CAPS
| V4L2_CAP_STREAMING
630 static int uvc_ioctl_enum_fmt(struct uvc_streaming
*stream
,
631 struct v4l2_fmtdesc
*fmt
)
633 struct uvc_format
*format
;
634 enum v4l2_buf_type type
= fmt
->type
;
635 u32 index
= fmt
->index
;
637 if (fmt
->type
!= stream
->type
|| fmt
->index
>= stream
->nformats
)
640 memset(fmt
, 0, sizeof(*fmt
));
644 format
= &stream
->format
[fmt
->index
];
646 if (format
->flags
& UVC_FMT_FLAG_COMPRESSED
)
647 fmt
->flags
|= V4L2_FMT_FLAG_COMPRESSED
;
648 strscpy(fmt
->description
, format
->name
, sizeof(fmt
->description
));
649 fmt
->description
[sizeof(fmt
->description
) - 1] = 0;
650 fmt
->pixelformat
= format
->fcc
;
654 static int uvc_ioctl_enum_fmt_vid_cap(struct file
*file
, void *fh
,
655 struct v4l2_fmtdesc
*fmt
)
657 struct uvc_fh
*handle
= fh
;
658 struct uvc_streaming
*stream
= handle
->stream
;
660 return uvc_ioctl_enum_fmt(stream
, fmt
);
663 static int uvc_ioctl_enum_fmt_vid_out(struct file
*file
, void *fh
,
664 struct v4l2_fmtdesc
*fmt
)
666 struct uvc_fh
*handle
= fh
;
667 struct uvc_streaming
*stream
= handle
->stream
;
669 return uvc_ioctl_enum_fmt(stream
, fmt
);
672 static int uvc_ioctl_g_fmt_vid_cap(struct file
*file
, void *fh
,
673 struct v4l2_format
*fmt
)
675 struct uvc_fh
*handle
= fh
;
676 struct uvc_streaming
*stream
= handle
->stream
;
678 return uvc_v4l2_get_format(stream
, fmt
);
681 static int uvc_ioctl_g_fmt_vid_out(struct file
*file
, void *fh
,
682 struct v4l2_format
*fmt
)
684 struct uvc_fh
*handle
= fh
;
685 struct uvc_streaming
*stream
= handle
->stream
;
687 return uvc_v4l2_get_format(stream
, fmt
);
690 static int uvc_ioctl_s_fmt_vid_cap(struct file
*file
, void *fh
,
691 struct v4l2_format
*fmt
)
693 struct uvc_fh
*handle
= fh
;
694 struct uvc_streaming
*stream
= handle
->stream
;
697 ret
= uvc_acquire_privileges(handle
);
701 return uvc_v4l2_set_format(stream
, fmt
);
704 static int uvc_ioctl_s_fmt_vid_out(struct file
*file
, void *fh
,
705 struct v4l2_format
*fmt
)
707 struct uvc_fh
*handle
= fh
;
708 struct uvc_streaming
*stream
= handle
->stream
;
711 ret
= uvc_acquire_privileges(handle
);
715 return uvc_v4l2_set_format(stream
, fmt
);
718 static int uvc_ioctl_try_fmt_vid_cap(struct file
*file
, void *fh
,
719 struct v4l2_format
*fmt
)
721 struct uvc_fh
*handle
= fh
;
722 struct uvc_streaming
*stream
= handle
->stream
;
723 struct uvc_streaming_control probe
;
725 return uvc_v4l2_try_format(stream
, fmt
, &probe
, NULL
, NULL
);
728 static int uvc_ioctl_try_fmt_vid_out(struct file
*file
, void *fh
,
729 struct v4l2_format
*fmt
)
731 struct uvc_fh
*handle
= fh
;
732 struct uvc_streaming
*stream
= handle
->stream
;
733 struct uvc_streaming_control probe
;
735 return uvc_v4l2_try_format(stream
, fmt
, &probe
, NULL
, NULL
);
738 static int uvc_ioctl_reqbufs(struct file
*file
, void *fh
,
739 struct v4l2_requestbuffers
*rb
)
741 struct uvc_fh
*handle
= fh
;
742 struct uvc_streaming
*stream
= handle
->stream
;
745 ret
= uvc_acquire_privileges(handle
);
749 mutex_lock(&stream
->mutex
);
750 ret
= uvc_request_buffers(&stream
->queue
, rb
);
751 mutex_unlock(&stream
->mutex
);
756 uvc_dismiss_privileges(handle
);
761 static int uvc_ioctl_querybuf(struct file
*file
, void *fh
,
762 struct v4l2_buffer
*buf
)
764 struct uvc_fh
*handle
= fh
;
765 struct uvc_streaming
*stream
= handle
->stream
;
767 if (!uvc_has_privileges(handle
))
770 return uvc_query_buffer(&stream
->queue
, buf
);
773 static int uvc_ioctl_qbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
775 struct uvc_fh
*handle
= fh
;
776 struct uvc_streaming
*stream
= handle
->stream
;
778 if (!uvc_has_privileges(handle
))
781 return uvc_queue_buffer(&stream
->queue
,
782 stream
->vdev
.v4l2_dev
->mdev
, buf
);
785 static int uvc_ioctl_expbuf(struct file
*file
, void *fh
,
786 struct v4l2_exportbuffer
*exp
)
788 struct uvc_fh
*handle
= fh
;
789 struct uvc_streaming
*stream
= handle
->stream
;
791 if (!uvc_has_privileges(handle
))
794 return uvc_export_buffer(&stream
->queue
, exp
);
797 static int uvc_ioctl_dqbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
799 struct uvc_fh
*handle
= fh
;
800 struct uvc_streaming
*stream
= handle
->stream
;
802 if (!uvc_has_privileges(handle
))
805 return uvc_dequeue_buffer(&stream
->queue
, buf
,
806 file
->f_flags
& O_NONBLOCK
);
809 static int uvc_ioctl_create_bufs(struct file
*file
, void *fh
,
810 struct v4l2_create_buffers
*cb
)
812 struct uvc_fh
*handle
= fh
;
813 struct uvc_streaming
*stream
= handle
->stream
;
816 ret
= uvc_acquire_privileges(handle
);
820 return uvc_create_buffers(&stream
->queue
, cb
);
823 static int uvc_ioctl_streamon(struct file
*file
, void *fh
,
824 enum v4l2_buf_type type
)
826 struct uvc_fh
*handle
= fh
;
827 struct uvc_streaming
*stream
= handle
->stream
;
830 if (!uvc_has_privileges(handle
))
833 mutex_lock(&stream
->mutex
);
834 ret
= uvc_queue_streamon(&stream
->queue
, type
);
835 mutex_unlock(&stream
->mutex
);
840 static int uvc_ioctl_streamoff(struct file
*file
, void *fh
,
841 enum v4l2_buf_type type
)
843 struct uvc_fh
*handle
= fh
;
844 struct uvc_streaming
*stream
= handle
->stream
;
846 if (!uvc_has_privileges(handle
))
849 mutex_lock(&stream
->mutex
);
850 uvc_queue_streamoff(&stream
->queue
, type
);
851 mutex_unlock(&stream
->mutex
);
856 static int uvc_ioctl_enum_input(struct file
*file
, void *fh
,
857 struct v4l2_input
*input
)
859 struct uvc_fh
*handle
= fh
;
860 struct uvc_video_chain
*chain
= handle
->chain
;
861 const struct uvc_entity
*selector
= chain
->selector
;
862 struct uvc_entity
*iterm
= NULL
;
863 u32 index
= input
->index
;
866 if (selector
== NULL
||
867 (chain
->dev
->quirks
& UVC_QUIRK_IGNORE_SELECTOR_UNIT
)) {
870 list_for_each_entry(iterm
, &chain
->entities
, chain
) {
871 if (UVC_ENTITY_IS_ITERM(iterm
))
875 } else if (index
< selector
->bNrInPins
) {
876 pin
= selector
->baSourceID
[index
];
877 list_for_each_entry(iterm
, &chain
->entities
, chain
) {
878 if (!UVC_ENTITY_IS_ITERM(iterm
))
880 if (iterm
->id
== pin
)
885 if (iterm
== NULL
|| iterm
->id
!= pin
)
888 memset(input
, 0, sizeof(*input
));
889 input
->index
= index
;
890 strscpy(input
->name
, iterm
->name
, sizeof(input
->name
));
891 if (UVC_ENTITY_TYPE(iterm
) == UVC_ITT_CAMERA
)
892 input
->type
= V4L2_INPUT_TYPE_CAMERA
;
897 static int uvc_ioctl_g_input(struct file
*file
, void *fh
, unsigned int *input
)
899 struct uvc_fh
*handle
= fh
;
900 struct uvc_video_chain
*chain
= handle
->chain
;
904 if (chain
->selector
== NULL
||
905 (chain
->dev
->quirks
& UVC_QUIRK_IGNORE_SELECTOR_UNIT
)) {
910 ret
= uvc_query_ctrl(chain
->dev
, UVC_GET_CUR
, chain
->selector
->id
,
911 chain
->dev
->intfnum
, UVC_SU_INPUT_SELECT_CONTROL
,
920 static int uvc_ioctl_s_input(struct file
*file
, void *fh
, unsigned int input
)
922 struct uvc_fh
*handle
= fh
;
923 struct uvc_video_chain
*chain
= handle
->chain
;
927 ret
= uvc_acquire_privileges(handle
);
931 if (chain
->selector
== NULL
||
932 (chain
->dev
->quirks
& UVC_QUIRK_IGNORE_SELECTOR_UNIT
)) {
938 if (input
>= chain
->selector
->bNrInPins
)
942 return uvc_query_ctrl(chain
->dev
, UVC_SET_CUR
, chain
->selector
->id
,
943 chain
->dev
->intfnum
, UVC_SU_INPUT_SELECT_CONTROL
,
947 static int uvc_ioctl_queryctrl(struct file
*file
, void *fh
,
948 struct v4l2_queryctrl
*qc
)
950 struct uvc_fh
*handle
= fh
;
951 struct uvc_video_chain
*chain
= handle
->chain
;
953 return uvc_query_v4l2_ctrl(chain
, qc
);
956 static int uvc_ioctl_query_ext_ctrl(struct file
*file
, void *fh
,
957 struct v4l2_query_ext_ctrl
*qec
)
959 struct uvc_fh
*handle
= fh
;
960 struct uvc_video_chain
*chain
= handle
->chain
;
961 struct v4l2_queryctrl qc
= { qec
->id
};
964 ret
= uvc_query_v4l2_ctrl(chain
, &qc
);
970 strscpy(qec
->name
, qc
.name
, sizeof(qec
->name
));
971 qec
->minimum
= qc
.minimum
;
972 qec
->maximum
= qc
.maximum
;
974 qec
->default_value
= qc
.default_value
;
975 qec
->flags
= qc
.flags
;
979 memset(qec
->dims
, 0, sizeof(qec
->dims
));
980 memset(qec
->reserved
, 0, sizeof(qec
->reserved
));
985 static int uvc_ioctl_g_ctrl(struct file
*file
, void *fh
,
986 struct v4l2_control
*ctrl
)
988 struct uvc_fh
*handle
= fh
;
989 struct uvc_video_chain
*chain
= handle
->chain
;
990 struct v4l2_ext_control xctrl
;
993 memset(&xctrl
, 0, sizeof(xctrl
));
996 ret
= uvc_ctrl_begin(chain
);
1000 ret
= uvc_ctrl_get(chain
, &xctrl
);
1001 uvc_ctrl_rollback(handle
);
1005 ctrl
->value
= xctrl
.value
;
1009 static int uvc_ioctl_s_ctrl(struct file
*file
, void *fh
,
1010 struct v4l2_control
*ctrl
)
1012 struct uvc_fh
*handle
= fh
;
1013 struct uvc_video_chain
*chain
= handle
->chain
;
1014 struct v4l2_ext_control xctrl
;
1017 memset(&xctrl
, 0, sizeof(xctrl
));
1018 xctrl
.id
= ctrl
->id
;
1019 xctrl
.value
= ctrl
->value
;
1021 ret
= uvc_ctrl_begin(chain
);
1025 ret
= uvc_ctrl_set(handle
, &xctrl
);
1027 uvc_ctrl_rollback(handle
);
1031 ret
= uvc_ctrl_commit(handle
, &xctrl
, 1);
1035 ctrl
->value
= xctrl
.value
;
1039 static int uvc_ioctl_g_ext_ctrls(struct file
*file
, void *fh
,
1040 struct v4l2_ext_controls
*ctrls
)
1042 struct uvc_fh
*handle
= fh
;
1043 struct uvc_video_chain
*chain
= handle
->chain
;
1044 struct v4l2_ext_control
*ctrl
= ctrls
->controls
;
1048 if (ctrls
->which
== V4L2_CTRL_WHICH_DEF_VAL
) {
1049 for (i
= 0; i
< ctrls
->count
; ++ctrl
, ++i
) {
1050 struct v4l2_queryctrl qc
= { .id
= ctrl
->id
};
1052 ret
= uvc_query_v4l2_ctrl(chain
, &qc
);
1054 ctrls
->error_idx
= i
;
1058 ctrl
->value
= qc
.default_value
;
1064 ret
= uvc_ctrl_begin(chain
);
1068 for (i
= 0; i
< ctrls
->count
; ++ctrl
, ++i
) {
1069 ret
= uvc_ctrl_get(chain
, ctrl
);
1071 uvc_ctrl_rollback(handle
);
1072 ctrls
->error_idx
= i
;
1077 ctrls
->error_idx
= 0;
1079 return uvc_ctrl_rollback(handle
);
1082 static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh
*handle
,
1083 struct v4l2_ext_controls
*ctrls
,
1086 struct v4l2_ext_control
*ctrl
= ctrls
->controls
;
1087 struct uvc_video_chain
*chain
= handle
->chain
;
1091 /* Default value cannot be changed */
1092 if (ctrls
->which
== V4L2_CTRL_WHICH_DEF_VAL
)
1095 ret
= uvc_ctrl_begin(chain
);
1099 for (i
= 0; i
< ctrls
->count
; ++ctrl
, ++i
) {
1100 ret
= uvc_ctrl_set(handle
, ctrl
);
1102 uvc_ctrl_rollback(handle
);
1103 ctrls
->error_idx
= commit
? ctrls
->count
: i
;
1108 ctrls
->error_idx
= 0;
1111 return uvc_ctrl_commit(handle
, ctrls
->controls
, ctrls
->count
);
1113 return uvc_ctrl_rollback(handle
);
1116 static int uvc_ioctl_s_ext_ctrls(struct file
*file
, void *fh
,
1117 struct v4l2_ext_controls
*ctrls
)
1119 struct uvc_fh
*handle
= fh
;
1121 return uvc_ioctl_s_try_ext_ctrls(handle
, ctrls
, true);
1124 static int uvc_ioctl_try_ext_ctrls(struct file
*file
, void *fh
,
1125 struct v4l2_ext_controls
*ctrls
)
1127 struct uvc_fh
*handle
= fh
;
1129 return uvc_ioctl_s_try_ext_ctrls(handle
, ctrls
, false);
1132 static int uvc_ioctl_querymenu(struct file
*file
, void *fh
,
1133 struct v4l2_querymenu
*qm
)
1135 struct uvc_fh
*handle
= fh
;
1136 struct uvc_video_chain
*chain
= handle
->chain
;
1138 return uvc_query_v4l2_menu(chain
, qm
);
1141 static int uvc_ioctl_g_selection(struct file
*file
, void *fh
,
1142 struct v4l2_selection
*sel
)
1144 struct uvc_fh
*handle
= fh
;
1145 struct uvc_streaming
*stream
= handle
->stream
;
1147 if (sel
->type
!= stream
->type
)
1150 switch (sel
->target
) {
1151 case V4L2_SEL_TGT_CROP_DEFAULT
:
1152 case V4L2_SEL_TGT_CROP_BOUNDS
:
1153 if (stream
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1156 case V4L2_SEL_TGT_COMPOSE_DEFAULT
:
1157 case V4L2_SEL_TGT_COMPOSE_BOUNDS
:
1158 if (stream
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
1167 mutex_lock(&stream
->mutex
);
1168 sel
->r
.width
= stream
->cur_frame
->wWidth
;
1169 sel
->r
.height
= stream
->cur_frame
->wHeight
;
1170 mutex_unlock(&stream
->mutex
);
1175 static int uvc_ioctl_g_parm(struct file
*file
, void *fh
,
1176 struct v4l2_streamparm
*parm
)
1178 struct uvc_fh
*handle
= fh
;
1179 struct uvc_streaming
*stream
= handle
->stream
;
1181 return uvc_v4l2_get_streamparm(stream
, parm
);
1184 static int uvc_ioctl_s_parm(struct file
*file
, void *fh
,
1185 struct v4l2_streamparm
*parm
)
1187 struct uvc_fh
*handle
= fh
;
1188 struct uvc_streaming
*stream
= handle
->stream
;
1191 ret
= uvc_acquire_privileges(handle
);
1195 return uvc_v4l2_set_streamparm(stream
, parm
);
1198 static int uvc_ioctl_enum_framesizes(struct file
*file
, void *fh
,
1199 struct v4l2_frmsizeenum
*fsize
)
1201 struct uvc_fh
*handle
= fh
;
1202 struct uvc_streaming
*stream
= handle
->stream
;
1203 struct uvc_format
*format
= NULL
;
1204 struct uvc_frame
*frame
= NULL
;
1208 /* Look for the given pixel format */
1209 for (i
= 0; i
< stream
->nformats
; i
++) {
1210 if (stream
->format
[i
].fcc
== fsize
->pixel_format
) {
1211 format
= &stream
->format
[i
];
1218 /* Skip duplicate frame sizes */
1219 for (i
= 0, index
= 0; i
< format
->nframes
; i
++) {
1220 if (frame
&& frame
->wWidth
== format
->frame
[i
].wWidth
&&
1221 frame
->wHeight
== format
->frame
[i
].wHeight
)
1223 frame
= &format
->frame
[i
];
1224 if (index
== fsize
->index
)
1229 if (i
== format
->nframes
)
1232 fsize
->type
= V4L2_FRMSIZE_TYPE_DISCRETE
;
1233 fsize
->discrete
.width
= frame
->wWidth
;
1234 fsize
->discrete
.height
= frame
->wHeight
;
1238 static int uvc_ioctl_enum_frameintervals(struct file
*file
, void *fh
,
1239 struct v4l2_frmivalenum
*fival
)
1241 struct uvc_fh
*handle
= fh
;
1242 struct uvc_streaming
*stream
= handle
->stream
;
1243 struct uvc_format
*format
= NULL
;
1244 struct uvc_frame
*frame
= NULL
;
1245 unsigned int nintervals
;
1249 /* Look for the given pixel format and frame size */
1250 for (i
= 0; i
< stream
->nformats
; i
++) {
1251 if (stream
->format
[i
].fcc
== fival
->pixel_format
) {
1252 format
= &stream
->format
[i
];
1259 index
= fival
->index
;
1260 for (i
= 0; i
< format
->nframes
; i
++) {
1261 if (format
->frame
[i
].wWidth
== fival
->width
&&
1262 format
->frame
[i
].wHeight
== fival
->height
) {
1263 frame
= &format
->frame
[i
];
1264 nintervals
= frame
->bFrameIntervalType
?: 1;
1265 if (index
< nintervals
)
1267 index
-= nintervals
;
1270 if (i
== format
->nframes
)
1273 if (frame
->bFrameIntervalType
) {
1274 fival
->type
= V4L2_FRMIVAL_TYPE_DISCRETE
;
1275 fival
->discrete
.numerator
=
1276 frame
->dwFrameInterval
[index
];
1277 fival
->discrete
.denominator
= 10000000;
1278 uvc_simplify_fraction(&fival
->discrete
.numerator
,
1279 &fival
->discrete
.denominator
, 8, 333);
1281 fival
->type
= V4L2_FRMIVAL_TYPE_STEPWISE
;
1282 fival
->stepwise
.min
.numerator
= frame
->dwFrameInterval
[0];
1283 fival
->stepwise
.min
.denominator
= 10000000;
1284 fival
->stepwise
.max
.numerator
= frame
->dwFrameInterval
[1];
1285 fival
->stepwise
.max
.denominator
= 10000000;
1286 fival
->stepwise
.step
.numerator
= frame
->dwFrameInterval
[2];
1287 fival
->stepwise
.step
.denominator
= 10000000;
1288 uvc_simplify_fraction(&fival
->stepwise
.min
.numerator
,
1289 &fival
->stepwise
.min
.denominator
, 8, 333);
1290 uvc_simplify_fraction(&fival
->stepwise
.max
.numerator
,
1291 &fival
->stepwise
.max
.denominator
, 8, 333);
1292 uvc_simplify_fraction(&fival
->stepwise
.step
.numerator
,
1293 &fival
->stepwise
.step
.denominator
, 8, 333);
1299 static int uvc_ioctl_subscribe_event(struct v4l2_fh
*fh
,
1300 const struct v4l2_event_subscription
*sub
)
1302 switch (sub
->type
) {
1303 case V4L2_EVENT_CTRL
:
1304 return v4l2_event_subscribe(fh
, sub
, 0, &uvc_ctrl_sub_ev_ops
);
1310 static long uvc_ioctl_default(struct file
*file
, void *fh
, bool valid_prio
,
1311 unsigned int cmd
, void *arg
)
1313 struct uvc_fh
*handle
= fh
;
1314 struct uvc_video_chain
*chain
= handle
->chain
;
1317 /* Dynamic controls. */
1318 case UVCIOC_CTRL_MAP
:
1319 return uvc_ioctl_ctrl_map(chain
, arg
);
1321 case UVCIOC_CTRL_QUERY
:
1322 return uvc_xu_ctrl_query(chain
, arg
);
1329 #ifdef CONFIG_COMPAT
1330 struct uvc_xu_control_mapping32
{
1341 compat_caddr_t menu_info
;
1347 static int uvc_v4l2_get_xu_mapping(struct uvc_xu_control_mapping
*kp
,
1348 const struct uvc_xu_control_mapping32 __user
*up
)
1350 struct uvc_xu_control_mapping32
*p
= (void *)kp
;
1351 compat_caddr_t info
;
1354 if (copy_from_user(p
, up
, sizeof(*p
)))
1357 count
= p
->menu_count
;
1358 info
= p
->menu_info
;
1360 memset(kp
->reserved
, 0, sizeof(kp
->reserved
));
1361 kp
->menu_info
= count
? compat_ptr(info
) : NULL
;
1362 kp
->menu_count
= count
;
1366 static int uvc_v4l2_put_xu_mapping(const struct uvc_xu_control_mapping
*kp
,
1367 struct uvc_xu_control_mapping32 __user
*up
)
1369 if (copy_to_user(up
, kp
, offsetof(typeof(*up
), menu_info
)) ||
1370 put_user(kp
->menu_count
, &up
->menu_count
))
1373 if (clear_user(up
->reserved
, sizeof(up
->reserved
)))
1379 struct uvc_xu_control_query32
{
1384 compat_caddr_t data
;
1387 static int uvc_v4l2_get_xu_query(struct uvc_xu_control_query
*kp
,
1388 const struct uvc_xu_control_query32 __user
*up
)
1390 struct uvc_xu_control_query32 v
;
1392 if (copy_from_user(&v
, up
, sizeof(v
)))
1395 *kp
= (struct uvc_xu_control_query
){
1397 .selector
= v
.selector
,
1400 .data
= v
.size
? compat_ptr(v
.data
) : NULL
1405 static int uvc_v4l2_put_xu_query(const struct uvc_xu_control_query
*kp
,
1406 struct uvc_xu_control_query32 __user
*up
)
1408 if (copy_to_user(up
, kp
, offsetof(typeof(*up
), data
)))
1413 #define UVCIOC_CTRL_MAP32 _IOWR('u', 0x20, struct uvc_xu_control_mapping32)
1414 #define UVCIOC_CTRL_QUERY32 _IOWR('u', 0x21, struct uvc_xu_control_query32)
1416 static long uvc_v4l2_compat_ioctl32(struct file
*file
,
1417 unsigned int cmd
, unsigned long arg
)
1419 struct uvc_fh
*handle
= file
->private_data
;
1421 struct uvc_xu_control_mapping xmap
;
1422 struct uvc_xu_control_query xqry
;
1424 void __user
*up
= compat_ptr(arg
);
1428 case UVCIOC_CTRL_MAP32
:
1429 ret
= uvc_v4l2_get_xu_mapping(&karg
.xmap
, up
);
1432 ret
= uvc_ioctl_ctrl_map(handle
->chain
, &karg
.xmap
);
1435 ret
= uvc_v4l2_put_xu_mapping(&karg
.xmap
, up
);
1441 case UVCIOC_CTRL_QUERY32
:
1442 ret
= uvc_v4l2_get_xu_query(&karg
.xqry
, up
);
1445 ret
= uvc_xu_ctrl_query(handle
->chain
, &karg
.xqry
);
1448 ret
= uvc_v4l2_put_xu_query(&karg
.xqry
, up
);
1454 return -ENOIOCTLCMD
;
1461 static ssize_t
uvc_v4l2_read(struct file
*file
, char __user
*data
,
1462 size_t count
, loff_t
*ppos
)
1464 uvc_trace(UVC_TRACE_CALLS
, "uvc_v4l2_read: not implemented.\n");
1468 static int uvc_v4l2_mmap(struct file
*file
, struct vm_area_struct
*vma
)
1470 struct uvc_fh
*handle
= file
->private_data
;
1471 struct uvc_streaming
*stream
= handle
->stream
;
1473 uvc_trace(UVC_TRACE_CALLS
, "uvc_v4l2_mmap\n");
1475 return uvc_queue_mmap(&stream
->queue
, vma
);
1478 static __poll_t
uvc_v4l2_poll(struct file
*file
, poll_table
*wait
)
1480 struct uvc_fh
*handle
= file
->private_data
;
1481 struct uvc_streaming
*stream
= handle
->stream
;
1483 uvc_trace(UVC_TRACE_CALLS
, "uvc_v4l2_poll\n");
1485 return uvc_queue_poll(&stream
->queue
, file
, wait
);
1489 static unsigned long uvc_v4l2_get_unmapped_area(struct file
*file
,
1490 unsigned long addr
, unsigned long len
, unsigned long pgoff
,
1491 unsigned long flags
)
1493 struct uvc_fh
*handle
= file
->private_data
;
1494 struct uvc_streaming
*stream
= handle
->stream
;
1496 uvc_trace(UVC_TRACE_CALLS
, "uvc_v4l2_get_unmapped_area\n");
1498 return uvc_queue_get_unmapped_area(&stream
->queue
, pgoff
);
1502 const struct v4l2_ioctl_ops uvc_ioctl_ops
= {
1503 .vidioc_querycap
= uvc_ioctl_querycap
,
1504 .vidioc_enum_fmt_vid_cap
= uvc_ioctl_enum_fmt_vid_cap
,
1505 .vidioc_enum_fmt_vid_out
= uvc_ioctl_enum_fmt_vid_out
,
1506 .vidioc_g_fmt_vid_cap
= uvc_ioctl_g_fmt_vid_cap
,
1507 .vidioc_g_fmt_vid_out
= uvc_ioctl_g_fmt_vid_out
,
1508 .vidioc_s_fmt_vid_cap
= uvc_ioctl_s_fmt_vid_cap
,
1509 .vidioc_s_fmt_vid_out
= uvc_ioctl_s_fmt_vid_out
,
1510 .vidioc_try_fmt_vid_cap
= uvc_ioctl_try_fmt_vid_cap
,
1511 .vidioc_try_fmt_vid_out
= uvc_ioctl_try_fmt_vid_out
,
1512 .vidioc_reqbufs
= uvc_ioctl_reqbufs
,
1513 .vidioc_querybuf
= uvc_ioctl_querybuf
,
1514 .vidioc_qbuf
= uvc_ioctl_qbuf
,
1515 .vidioc_expbuf
= uvc_ioctl_expbuf
,
1516 .vidioc_dqbuf
= uvc_ioctl_dqbuf
,
1517 .vidioc_create_bufs
= uvc_ioctl_create_bufs
,
1518 .vidioc_streamon
= uvc_ioctl_streamon
,
1519 .vidioc_streamoff
= uvc_ioctl_streamoff
,
1520 .vidioc_enum_input
= uvc_ioctl_enum_input
,
1521 .vidioc_g_input
= uvc_ioctl_g_input
,
1522 .vidioc_s_input
= uvc_ioctl_s_input
,
1523 .vidioc_queryctrl
= uvc_ioctl_queryctrl
,
1524 .vidioc_query_ext_ctrl
= uvc_ioctl_query_ext_ctrl
,
1525 .vidioc_g_ctrl
= uvc_ioctl_g_ctrl
,
1526 .vidioc_s_ctrl
= uvc_ioctl_s_ctrl
,
1527 .vidioc_g_ext_ctrls
= uvc_ioctl_g_ext_ctrls
,
1528 .vidioc_s_ext_ctrls
= uvc_ioctl_s_ext_ctrls
,
1529 .vidioc_try_ext_ctrls
= uvc_ioctl_try_ext_ctrls
,
1530 .vidioc_querymenu
= uvc_ioctl_querymenu
,
1531 .vidioc_g_selection
= uvc_ioctl_g_selection
,
1532 .vidioc_g_parm
= uvc_ioctl_g_parm
,
1533 .vidioc_s_parm
= uvc_ioctl_s_parm
,
1534 .vidioc_enum_framesizes
= uvc_ioctl_enum_framesizes
,
1535 .vidioc_enum_frameintervals
= uvc_ioctl_enum_frameintervals
,
1536 .vidioc_subscribe_event
= uvc_ioctl_subscribe_event
,
1537 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1538 .vidioc_default
= uvc_ioctl_default
,
1541 const struct v4l2_file_operations uvc_fops
= {
1542 .owner
= THIS_MODULE
,
1543 .open
= uvc_v4l2_open
,
1544 .release
= uvc_v4l2_release
,
1545 .unlocked_ioctl
= video_ioctl2
,
1546 #ifdef CONFIG_COMPAT
1547 .compat_ioctl32
= uvc_v4l2_compat_ioctl32
,
1549 .read
= uvc_v4l2_read
,
1550 .mmap
= uvc_v4l2_mmap
,
1551 .poll
= uvc_v4l2_poll
,
1553 .get_unmapped_area
= uvc_v4l2_get_unmapped_area
,