linux/drivers/media/video/uvc/uvc_v4l2.c
<<
>>
Prefs
   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 */
  35static 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
  95done:
  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 */
 112static __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
 144static 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
 256done:
 257        return ret;
 258}
 259
 260static 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
 288done:
 289        mutex_unlock(&stream->mutex);
 290        return ret;
 291}
 292
 293static 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
 319done:
 320        mutex_unlock(&stream->mutex);
 321        return ret;
 322}
 323
 324static 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
 359static 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 */
 442static 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
 458static 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
 466static 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
 475static 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
 516static 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
 541static 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 (pin < 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
1022static 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
1035struct 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
1052static 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
1088static 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
1117struct uvc_xu_control_query32 {
1118        __u8 unit;
1119        __u8 selector;
1120        __u8 query;
1121        __u16 size;
1122        compat_caddr_t data;
1123};
1124
1125static 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
1158static 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
1187static 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
1235static 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
1242static 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
1252static 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
1263static 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
1276const 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