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