Showing error 751

User: Jiri Slaby
Error type: Invalid Pointer Dereference
Error type description: A pointer which is invalid is being dereferenced
File location: drivers/media/video/v4l1-compat.c
Line in file: 203
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2011-11-07 22:22:22 UTC


Source:

   1/*
   2 *
   3 *        Video for Linux Two
   4 *        Backward Compatibility Layer
   5 *
   6 *        Support subroutines for providing V4L2 drivers with backward
   7 *        compatibility with applications using the old API.
   8 *
   9 *        This program is free software; you can redistribute it and/or
  10 *        modify it under the terms of the GNU General Public License
  11 *        as published by the Free Software Foundation; either version
  12 *        2 of the License, or (at your option) any later version.
  13 *
  14 * Author:        Bill Dirks <bill@thedirks.org>
  15 *                et al.
  16 *
  17 */
  18
  19
  20#include <linux/init.h>
  21#include <linux/module.h>
  22#include <linux/types.h>
  23#include <linux/kernel.h>
  24#include <linux/sched.h>
  25#include <linux/mm.h>
  26#include <linux/fs.h>
  27#include <linux/file.h>
  28#include <linux/string.h>
  29#include <linux/errno.h>
  30#include <linux/slab.h>
  31#include <linux/videodev.h>
  32#include <media/v4l2-common.h>
  33#include <media/v4l2-ioctl.h>
  34
  35#include <asm/uaccess.h>
  36#include <asm/system.h>
  37#include <asm/pgtable.h>
  38
  39static unsigned int debug;
  40module_param(debug, int, 0644);
  41MODULE_PARM_DESC(debug, "enable debug messages");
  42MODULE_AUTHOR("Bill Dirks");
  43MODULE_DESCRIPTION("v4l(1) compatibility layer for v4l2 drivers.");
  44MODULE_LICENSE("GPL");
  45
  46#define dprintk(fmt, arg...) \
  47        do { \
  48                if (debug) \
  49                        printk(KERN_DEBUG "v4l1-compat: " fmt , ## arg);\
  50        } while (0)
  51
  52/*
  53 *        I O C T L   T R A N S L A T I O N
  54 *
  55 *        From here on down is the code for translating the numerous
  56 *        ioctl commands from the old API to the new API.
  57 */
  58
  59static int
  60get_v4l_control(struct file             *file,
  61                int                        cid,
  62                v4l2_kioctl             drv)
  63{
  64        struct v4l2_queryctrl        qctrl2;
  65        struct v4l2_control        ctrl2;
  66        int                        err;
  67
  68        qctrl2.id = cid;
  69        err = drv(file, VIDIOC_QUERYCTRL, &qctrl2);
  70        if (err < 0)
  71                dprintk("VIDIOC_QUERYCTRL: %d\n", err);
  72        if (err == 0 && !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED)) {
  73                ctrl2.id = qctrl2.id;
  74                err = drv(file, VIDIOC_G_CTRL, &ctrl2);
  75                if (err < 0) {
  76                        dprintk("VIDIOC_G_CTRL: %d\n", err);
  77                        return 0;
  78                }
  79                return ((ctrl2.value - qctrl2.minimum) * 65535
  80                         + (qctrl2.maximum - qctrl2.minimum) / 2)
  81                        / (qctrl2.maximum - qctrl2.minimum);
  82        }
  83        return 0;
  84}
  85
  86static int
  87set_v4l_control(struct file             *file,
  88                int                        cid,
  89                int                        value,
  90                v4l2_kioctl             drv)
  91{
  92        struct v4l2_queryctrl        qctrl2;
  93        struct v4l2_control        ctrl2;
  94        int                        err;
  95
  96        qctrl2.id = cid;
  97        err = drv(file, VIDIOC_QUERYCTRL, &qctrl2);
  98        if (err < 0)
  99                dprintk("VIDIOC_QUERYCTRL: %d\n", err);
 100        if (err == 0 &&
 101            !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED) &&
 102            !(qctrl2.flags & V4L2_CTRL_FLAG_GRABBED)) {
 103                if (value < 0)
 104                        value = 0;
 105                if (value > 65535)
 106                        value = 65535;
 107                if (value && qctrl2.type == V4L2_CTRL_TYPE_BOOLEAN)
 108                        value = 65535;
 109                ctrl2.id = qctrl2.id;
 110                ctrl2.value =
 111                        (value * (qctrl2.maximum - qctrl2.minimum)
 112                         + 32767)
 113                        / 65535;
 114                ctrl2.value += qctrl2.minimum;
 115                err = drv(file, VIDIOC_S_CTRL, &ctrl2);
 116                if (err < 0)
 117                        dprintk("VIDIOC_S_CTRL: %d\n", err);
 118        }
 119        return 0;
 120}
 121
 122/* ----------------------------------------------------------------- */
 123
 124static const unsigned int palette2pixelformat[] = {
 125        [VIDEO_PALETTE_GREY]    = V4L2_PIX_FMT_GREY,
 126        [VIDEO_PALETTE_RGB555]  = V4L2_PIX_FMT_RGB555,
 127        [VIDEO_PALETTE_RGB565]  = V4L2_PIX_FMT_RGB565,
 128        [VIDEO_PALETTE_RGB24]   = V4L2_PIX_FMT_BGR24,
 129        [VIDEO_PALETTE_RGB32]   = V4L2_PIX_FMT_BGR32,
 130        /* yuv packed pixel */
 131        [VIDEO_PALETTE_YUYV]    = V4L2_PIX_FMT_YUYV,
 132        [VIDEO_PALETTE_YUV422]  = V4L2_PIX_FMT_YUYV,
 133        [VIDEO_PALETTE_UYVY]    = V4L2_PIX_FMT_UYVY,
 134        /* yuv planar */
 135        [VIDEO_PALETTE_YUV410P] = V4L2_PIX_FMT_YUV410,
 136        [VIDEO_PALETTE_YUV420]  = V4L2_PIX_FMT_YUV420,
 137        [VIDEO_PALETTE_YUV420P] = V4L2_PIX_FMT_YUV420,
 138        [VIDEO_PALETTE_YUV411P] = V4L2_PIX_FMT_YUV411P,
 139        [VIDEO_PALETTE_YUV422P] = V4L2_PIX_FMT_YUV422P,
 140};
 141
 142static unsigned int __pure
 143palette_to_pixelformat(unsigned int palette)
 144{
 145        if (palette < ARRAY_SIZE(palette2pixelformat))
 146                return palette2pixelformat[palette];
 147        else
 148                return 0;
 149}
 150
 151static unsigned int __attribute_const__
 152pixelformat_to_palette(unsigned int pixelformat)
 153{
 154        int        palette = 0;
 155        switch (pixelformat) {
 156        case V4L2_PIX_FMT_GREY:
 157                palette = VIDEO_PALETTE_GREY;
 158                break;
 159        case V4L2_PIX_FMT_RGB555:
 160                palette = VIDEO_PALETTE_RGB555;
 161                break;
 162        case V4L2_PIX_FMT_RGB565:
 163                palette = VIDEO_PALETTE_RGB565;
 164                break;
 165        case V4L2_PIX_FMT_BGR24:
 166                palette = VIDEO_PALETTE_RGB24;
 167                break;
 168        case V4L2_PIX_FMT_BGR32:
 169                palette = VIDEO_PALETTE_RGB32;
 170                break;
 171        /* yuv packed pixel */
 172        case V4L2_PIX_FMT_YUYV:
 173                palette = VIDEO_PALETTE_YUYV;
 174                break;
 175        case V4L2_PIX_FMT_UYVY:
 176                palette = VIDEO_PALETTE_UYVY;
 177                break;
 178        /* yuv planar */
 179        case V4L2_PIX_FMT_YUV410:
 180                palette = VIDEO_PALETTE_YUV420;
 181                break;
 182        case V4L2_PIX_FMT_YUV420:
 183                palette = VIDEO_PALETTE_YUV420;
 184                break;
 185        case V4L2_PIX_FMT_YUV411P:
 186                palette = VIDEO_PALETTE_YUV411P;
 187                break;
 188        case V4L2_PIX_FMT_YUV422P:
 189                palette = VIDEO_PALETTE_YUV422P;
 190                break;
 191        }
 192        return palette;
 193}
 194
 195/* ----------------------------------------------------------------- */
 196
 197static int poll_one(struct file *file, struct poll_wqueues *pwq)
 198{
 199        int retval = 1;
 200        poll_table *table;
 201
 202        poll_initwait(pwq);
 203        table = &pwq->pt;
 204        for (;;) {
 205                int mask;
 206                set_current_state(TASK_INTERRUPTIBLE);
 207                mask = file->f_op->poll(file, table);
 208                if (mask & POLLIN)
 209                        break;
 210                table = NULL;
 211                if (signal_pending(current)) {
 212                        retval = -ERESTARTSYS;
 213                        break;
 214                }
 215                schedule();
 216        }
 217        set_current_state(TASK_RUNNING);
 218        poll_freewait(pwq);
 219        return retval;
 220}
 221
 222static int count_inputs(
 223                        struct file *file,
 224                        v4l2_kioctl drv)
 225{
 226        struct v4l2_input input2;
 227        int i;
 228
 229        for (i = 0;; i++) {
 230                memset(&input2, 0, sizeof(input2));
 231                input2.index = i;
 232                if (0 != drv(file, VIDIOC_ENUMINPUT, &input2))
 233                        break;
 234        }
 235        return i;
 236}
 237
 238static int check_size(
 239                struct file *file,
 240                v4l2_kioctl drv,
 241                int *maxw,
 242                int *maxh)
 243{
 244        struct v4l2_fmtdesc desc2;
 245        struct v4l2_format  fmt2;
 246
 247        memset(&desc2, 0, sizeof(desc2));
 248        memset(&fmt2, 0, sizeof(fmt2));
 249
 250        desc2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 251        if (0 != drv(file, VIDIOC_ENUM_FMT, &desc2))
 252                goto done;
 253
 254        fmt2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 255        fmt2.fmt.pix.width       = 10000;
 256        fmt2.fmt.pix.height      = 10000;
 257        fmt2.fmt.pix.pixelformat = desc2.pixelformat;
 258        if (0 != drv(file, VIDIOC_TRY_FMT, &fmt2))
 259                goto done;
 260
 261        *maxw = fmt2.fmt.pix.width;
 262        *maxh = fmt2.fmt.pix.height;
 263
 264done:
 265        return 0;
 266}
 267
 268/* ----------------------------------------------------------------- */
 269
 270static noinline int v4l1_compat_get_capabilities(
 271                                        struct video_capability *cap,
 272                                        struct file *file,
 273                                        v4l2_kioctl drv)
 274{
 275        int err;
 276        struct v4l2_framebuffer fbuf;
 277        struct v4l2_capability *cap2;
 278
 279        cap2 = kzalloc(sizeof(*cap2), GFP_KERNEL);
 280        if (!cap2) {
 281                err = -ENOMEM;
 282                return err;
 283        }
 284        memset(cap, 0, sizeof(*cap));
 285        memset(&fbuf, 0, sizeof(fbuf));
 286
 287        err = drv(file, VIDIOC_QUERYCAP, cap2);
 288        if (err < 0) {
 289                dprintk("VIDIOCGCAP / VIDIOC_QUERYCAP: %d\n", err);
 290                goto done;
 291        }
 292        if (cap2->capabilities & V4L2_CAP_VIDEO_OVERLAY) {
 293                err = drv(file, VIDIOC_G_FBUF, &fbuf);
 294                if (err < 0) {
 295                        dprintk("VIDIOCGCAP / VIDIOC_G_FBUF: %d\n", err);
 296                        memset(&fbuf, 0, sizeof(fbuf));
 297                }
 298                err = 0;
 299        }
 300
 301        memcpy(cap->name, cap2->card,
 302               min(sizeof(cap->name), sizeof(cap2->card)));
 303        cap->name[sizeof(cap->name) - 1] = 0;
 304        if (cap2->capabilities & V4L2_CAP_VIDEO_CAPTURE)
 305                cap->type |= VID_TYPE_CAPTURE;
 306        if (cap2->capabilities & V4L2_CAP_TUNER)
 307                cap->type |= VID_TYPE_TUNER;
 308        if (cap2->capabilities & V4L2_CAP_VBI_CAPTURE)
 309                cap->type |= VID_TYPE_TELETEXT;
 310        if (cap2->capabilities & V4L2_CAP_VIDEO_OVERLAY)
 311                cap->type |= VID_TYPE_OVERLAY;
 312        if (fbuf.capability & V4L2_FBUF_CAP_LIST_CLIPPING)
 313                cap->type |= VID_TYPE_CLIPPING;
 314
 315        cap->channels  = count_inputs(file, drv);
 316        check_size(file, drv,
 317                   &cap->maxwidth, &cap->maxheight);
 318        cap->audios    =  0; /* FIXME */
 319        cap->minwidth  = 48; /* FIXME */
 320        cap->minheight = 32; /* FIXME */
 321
 322done:
 323        kfree(cap2);
 324        return err;
 325}
 326
 327static noinline int v4l1_compat_get_frame_buffer(
 328                                        struct video_buffer *buffer,
 329                                        struct file *file,
 330                                        v4l2_kioctl drv)
 331{
 332        int err;
 333        struct v4l2_framebuffer fbuf;
 334
 335        memset(buffer, 0, sizeof(*buffer));
 336        memset(&fbuf, 0, sizeof(fbuf));
 337
 338        err = drv(file, VIDIOC_G_FBUF, &fbuf);
 339        if (err < 0) {
 340                dprintk("VIDIOCGFBUF / VIDIOC_G_FBUF: %d\n", err);
 341                goto done;
 342        }
 343        buffer->base   = fbuf.base;
 344        buffer->height = fbuf.fmt.height;
 345        buffer->width  = fbuf.fmt.width;
 346
 347        switch (fbuf.fmt.pixelformat) {
 348        case V4L2_PIX_FMT_RGB332:
 349                buffer->depth = 8;
 350                break;
 351        case V4L2_PIX_FMT_RGB555:
 352                buffer->depth = 15;
 353                break;
 354        case V4L2_PIX_FMT_RGB565:
 355                buffer->depth = 16;
 356                break;
 357        case V4L2_PIX_FMT_BGR24:
 358                buffer->depth = 24;
 359                break;
 360        case V4L2_PIX_FMT_BGR32:
 361                buffer->depth = 32;
 362                break;
 363        default:
 364                buffer->depth = 0;
 365        }
 366        if (fbuf.fmt.bytesperline) {
 367                buffer->bytesperline = fbuf.fmt.bytesperline;
 368                if (!buffer->depth && buffer->width)
 369                        buffer->depth   = ((fbuf.fmt.bytesperline<<3)
 370                                          + (buffer->width-1))
 371                                          / buffer->width;
 372        } else {
 373                buffer->bytesperline =
 374                        (buffer->width * buffer->depth + 7) & 7;
 375                buffer->bytesperline >>= 3;
 376        }
 377done:
 378        return err;
 379}
 380
 381static noinline int v4l1_compat_set_frame_buffer(
 382                                        struct video_buffer *buffer,
 383                                        struct file *file,
 384                                        v4l2_kioctl drv)
 385{
 386        int err;
 387        struct v4l2_framebuffer fbuf;
 388
 389        memset(&fbuf, 0, sizeof(fbuf));
 390        fbuf.base       = buffer->base;
 391        fbuf.fmt.height = buffer->height;
 392        fbuf.fmt.width  = buffer->width;
 393        switch (buffer->depth) {
 394        case 8:
 395                fbuf.fmt.pixelformat = V4L2_PIX_FMT_RGB332;
 396                break;
 397        case 15:
 398                fbuf.fmt.pixelformat = V4L2_PIX_FMT_RGB555;
 399                break;
 400        case 16:
 401                fbuf.fmt.pixelformat = V4L2_PIX_FMT_RGB565;
 402                break;
 403        case 24:
 404                fbuf.fmt.pixelformat = V4L2_PIX_FMT_BGR24;
 405                break;
 406        case 32:
 407                fbuf.fmt.pixelformat = V4L2_PIX_FMT_BGR32;
 408                break;
 409        }
 410        fbuf.fmt.bytesperline = buffer->bytesperline;
 411        err = drv(file, VIDIOC_S_FBUF, &fbuf);
 412        if (err < 0)
 413                dprintk("VIDIOCSFBUF / VIDIOC_S_FBUF: %d\n", err);
 414        return err;
 415}
 416
 417static noinline int v4l1_compat_get_win_cap_dimensions(
 418                                        struct video_window *win,
 419                                        struct file *file,
 420                                        v4l2_kioctl drv)
 421{
 422        int err;
 423        struct v4l2_format *fmt;
 424
 425        fmt = kzalloc(sizeof(*fmt), GFP_KERNEL);
 426        if (!fmt) {
 427                err = -ENOMEM;
 428                return err;
 429        }
 430        memset(win, 0, sizeof(*win));
 431
 432        fmt->type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
 433        err = drv(file, VIDIOC_G_FMT, fmt);
 434        if (err < 0)
 435                dprintk("VIDIOCGWIN / VIDIOC_G_WIN: %d\n", err);
 436        if (err == 0) {
 437                win->x         = fmt->fmt.win.w.left;
 438                win->y         = fmt->fmt.win.w.top;
 439                win->width     = fmt->fmt.win.w.width;
 440                win->height    = fmt->fmt.win.w.height;
 441                win->chromakey = fmt->fmt.win.chromakey;
 442                win->clips     = NULL;
 443                win->clipcount = 0;
 444                goto done;
 445        }
 446
 447        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 448        err = drv(file, VIDIOC_G_FMT, fmt);
 449        if (err < 0) {
 450                dprintk("VIDIOCGWIN / VIDIOC_G_FMT: %d\n", err);
 451                goto done;
 452        }
 453        win->x         = 0;
 454        win->y         = 0;
 455        win->width     = fmt->fmt.pix.width;
 456        win->height    = fmt->fmt.pix.height;
 457        win->chromakey = 0;
 458        win->clips     = NULL;
 459        win->clipcount = 0;
 460done:
 461        kfree(fmt);
 462        return err;
 463}
 464
 465static noinline int v4l1_compat_set_win_cap_dimensions(
 466                                        struct video_window *win,
 467                                        struct file *file,
 468                                        v4l2_kioctl drv)
 469{
 470        int err, err1, err2;
 471        struct v4l2_format *fmt;
 472
 473        fmt = kzalloc(sizeof(*fmt), GFP_KERNEL);
 474        if (!fmt) {
 475                err = -ENOMEM;
 476                return err;
 477        }
 478        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 479        drv(file, VIDIOC_STREAMOFF, &fmt->type);
 480        err1 = drv(file, VIDIOC_G_FMT, fmt);
 481        if (err1 < 0)
 482                dprintk("VIDIOCSWIN / VIDIOC_G_FMT: %d\n", err1);
 483        if (err1 == 0) {
 484                fmt->fmt.pix.width  = win->width;
 485                fmt->fmt.pix.height = win->height;
 486                fmt->fmt.pix.field  = V4L2_FIELD_ANY;
 487                fmt->fmt.pix.bytesperline = 0;
 488                err = drv(file, VIDIOC_S_FMT, fmt);
 489                if (err < 0)
 490                        dprintk("VIDIOCSWIN / VIDIOC_S_FMT #1: %d\n",
 491                                err);
 492                win->width  = fmt->fmt.pix.width;
 493                win->height = fmt->fmt.pix.height;
 494        }
 495
 496        memset(fmt, 0, sizeof(*fmt));
 497        fmt->type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
 498        fmt->fmt.win.w.left    = win->x;
 499        fmt->fmt.win.w.top     = win->y;
 500        fmt->fmt.win.w.width   = win->width;
 501        fmt->fmt.win.w.height  = win->height;
 502        fmt->fmt.win.chromakey = win->chromakey;
 503        fmt->fmt.win.clips     = (void __user *)win->clips;
 504        fmt->fmt.win.clipcount = win->clipcount;
 505        err2 = drv(file, VIDIOC_S_FMT, fmt);
 506        if (err2 < 0)
 507                dprintk("VIDIOCSWIN / VIDIOC_S_FMT #2: %d\n", err2);
 508
 509        if (err1 != 0 && err2 != 0)
 510                err = err1;
 511        else
 512                err = 0;
 513        kfree(fmt);
 514        return err;
 515}
 516
 517static noinline int v4l1_compat_turn_preview_on_off(
 518                                        int *on,
 519                                        struct file *file,
 520                                        v4l2_kioctl drv)
 521{
 522        int err;
 523        enum v4l2_buf_type captype = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 524
 525        if (0 == *on) {
 526                /* dirty hack time.  But v4l1 has no STREAMOFF
 527                 * equivalent in the API, and this one at
 528                 * least comes close ... */
 529                drv(file, VIDIOC_STREAMOFF, &captype);
 530        }
 531        err = drv(file, VIDIOC_OVERLAY, on);
 532        if (err < 0)
 533                dprintk("VIDIOCCAPTURE / VIDIOC_PREVIEW: %d\n", err);
 534        return err;
 535}
 536
 537static noinline int v4l1_compat_get_input_info(
 538                                        struct video_channel *chan,
 539                                        struct file *file,
 540                                        v4l2_kioctl drv)
 541{
 542        int err;
 543        struct v4l2_input        input2;
 544        v4l2_std_id                    sid;
 545
 546        memset(&input2, 0, sizeof(input2));
 547        input2.index = chan->channel;
 548        err = drv(file, VIDIOC_ENUMINPUT, &input2);
 549        if (err < 0) {
 550                dprintk("VIDIOCGCHAN / VIDIOC_ENUMINPUT: "
 551                        "channel=%d err=%d\n", chan->channel, err);
 552                goto done;
 553        }
 554        chan->channel = input2.index;
 555        memcpy(chan->name, input2.name,
 556               min(sizeof(chan->name), sizeof(input2.name)));
 557        chan->name[sizeof(chan->name) - 1] = 0;
 558        chan->tuners = (input2.type == V4L2_INPUT_TYPE_TUNER) ? 1 : 0;
 559        chan->flags = (chan->tuners) ? VIDEO_VC_TUNER : 0;
 560        switch (input2.type) {
 561        case V4L2_INPUT_TYPE_TUNER:
 562                chan->type = VIDEO_TYPE_TV;
 563                break;
 564        default:
 565        case V4L2_INPUT_TYPE_CAMERA:
 566                chan->type = VIDEO_TYPE_CAMERA;
 567                break;
 568        }
 569        chan->norm = 0;
 570        err = drv(file, VIDIOC_G_STD, &sid);
 571        if (err < 0)
 572                dprintk("VIDIOCGCHAN / VIDIOC_G_STD: %d\n", err);
 573        if (err == 0) {
 574                if (sid & V4L2_STD_PAL)
 575                        chan->norm = VIDEO_MODE_PAL;
 576                if (sid & V4L2_STD_NTSC)
 577                        chan->norm = VIDEO_MODE_NTSC;
 578                if (sid & V4L2_STD_SECAM)
 579                        chan->norm = VIDEO_MODE_SECAM;
 580        }
 581done:
 582        return err;
 583}
 584
 585static noinline int v4l1_compat_set_input(
 586                                        struct video_channel *chan,
 587                                        struct file *file,
 588                                        v4l2_kioctl drv)
 589{
 590        int err;
 591        v4l2_std_id sid = 0;
 592
 593        err = drv(file, VIDIOC_S_INPUT, &chan->channel);
 594        if (err < 0)
 595                dprintk("VIDIOCSCHAN / VIDIOC_S_INPUT: %d\n", err);
 596        switch (chan->norm) {
 597        case VIDEO_MODE_PAL:
 598                sid = V4L2_STD_PAL;
 599                break;
 600        case VIDEO_MODE_NTSC:
 601                sid = V4L2_STD_NTSC;
 602                break;
 603        case VIDEO_MODE_SECAM:
 604                sid = V4L2_STD_SECAM;
 605                break;
 606        }
 607        if (0 != sid) {
 608                err = drv(file, VIDIOC_S_STD, &sid);
 609                if (err < 0)
 610                        dprintk("VIDIOCSCHAN / VIDIOC_S_STD: %d\n", err);
 611        }
 612        return err;
 613}
 614
 615static noinline int v4l1_compat_get_picture(
 616                                        struct video_picture *pict,
 617                                        struct file *file,
 618                                        v4l2_kioctl drv)
 619{
 620        int err;
 621        struct v4l2_format *fmt;
 622
 623        fmt = kzalloc(sizeof(*fmt), GFP_KERNEL);
 624        if (!fmt) {
 625                err = -ENOMEM;
 626                return err;
 627        }
 628
 629        pict->brightness = get_v4l_control(file,
 630                                           V4L2_CID_BRIGHTNESS, drv);
 631        pict->hue = get_v4l_control(file,
 632                                    V4L2_CID_HUE, drv);
 633        pict->contrast = get_v4l_control(file,
 634                                         V4L2_CID_CONTRAST, drv);
 635        pict->colour = get_v4l_control(file,
 636                                       V4L2_CID_SATURATION, drv);
 637        pict->whiteness = get_v4l_control(file,
 638                                          V4L2_CID_WHITENESS, drv);
 639
 640        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 641        err = drv(file, VIDIOC_G_FMT, fmt);
 642        if (err < 0) {
 643                dprintk("VIDIOCGPICT / VIDIOC_G_FMT: %d\n", err);
 644                goto done;
 645        }
 646
 647        pict->depth   = ((fmt->fmt.pix.bytesperline << 3)
 648                         + (fmt->fmt.pix.width - 1))
 649                         / fmt->fmt.pix.width;
 650        pict->palette = pixelformat_to_palette(
 651                fmt->fmt.pix.pixelformat);
 652done:
 653        kfree(fmt);
 654        return err;
 655}
 656
 657static noinline int v4l1_compat_set_picture(
 658                                        struct video_picture *pict,
 659                                        struct file *file,
 660                                        v4l2_kioctl drv)
 661{
 662        int err;
 663        struct v4l2_framebuffer fbuf;
 664        int mem_err = 0, ovl_err = 0;
 665        struct v4l2_format *fmt;
 666
 667        fmt = kzalloc(sizeof(*fmt), GFP_KERNEL);
 668        if (!fmt) {
 669                err = -ENOMEM;
 670                return err;
 671        }
 672        memset(&fbuf, 0, sizeof(fbuf));
 673
 674        set_v4l_control(file,
 675                        V4L2_CID_BRIGHTNESS, pict->brightness, drv);
 676        set_v4l_control(file,
 677                        V4L2_CID_HUE, pict->hue, drv);
 678        set_v4l_control(file,
 679                        V4L2_CID_CONTRAST, pict->contrast, drv);
 680        set_v4l_control(file,
 681                        V4L2_CID_SATURATION, pict->colour, drv);
 682        set_v4l_control(file,
 683                        V4L2_CID_WHITENESS, pict->whiteness, drv);
 684        /*
 685         * V4L1 uses this ioctl to set both memory capture and overlay
 686         * pixel format, while V4L2 has two different ioctls for this.
 687         * Some cards may not support one or the other, and may support
 688         * different pixel formats for memory vs overlay.
 689         */
 690
 691        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 692        err = drv(file, VIDIOC_G_FMT, fmt);
 693        /* If VIDIOC_G_FMT failed, then the driver likely doesn't
 694           support memory capture.  Trying to set the memory capture
 695           parameters would be pointless.  */
 696        if (err < 0) {
 697                dprintk("VIDIOCSPICT / VIDIOC_G_FMT: %d\n", err);
 698                mem_err = -1000;  /* didn't even try */
 699        } else if (fmt->fmt.pix.pixelformat !=
 700                 palette_to_pixelformat(pict->palette)) {
 701                fmt->fmt.pix.pixelformat = palette_to_pixelformat(
 702                        pict->palette);
 703                mem_err = drv(file, VIDIOC_S_FMT, fmt);
 704                if (mem_err < 0)
 705                        dprintk("VIDIOCSPICT / VIDIOC_S_FMT: %d\n",
 706                                mem_err);
 707        }
 708
 709        err = drv(file, VIDIOC_G_FBUF, &fbuf);
 710        /* If VIDIOC_G_FBUF failed, then the driver likely doesn't
 711           support overlay.  Trying to set the overlay parameters
 712           would be quite pointless.  */
 713        if (err < 0) {
 714                dprintk("VIDIOCSPICT / VIDIOC_G_FBUF: %d\n", err);
 715                ovl_err = -1000;  /* didn't even try */
 716        } else if (fbuf.fmt.pixelformat !=
 717                 palette_to_pixelformat(pict->palette)) {
 718                fbuf.fmt.pixelformat = palette_to_pixelformat(
 719                        pict->palette);
 720                ovl_err = drv(file, VIDIOC_S_FBUF, &fbuf);
 721                if (ovl_err < 0)
 722                        dprintk("VIDIOCSPICT / VIDIOC_S_FBUF: %d\n",
 723                                ovl_err);
 724        }
 725        if (ovl_err < 0 && mem_err < 0) {
 726                /* ioctl failed, couldn't set either parameter */
 727                if (mem_err != -1000)
 728                        err = mem_err;
 729                else if (ovl_err == -EPERM)
 730                        err = 0;
 731                else
 732                        err = ovl_err;
 733        } else
 734                err = 0;
 735        kfree(fmt);
 736        return err;
 737}
 738
 739static noinline int v4l1_compat_get_tuner(
 740                                        struct video_tuner *tun,
 741                                        struct file *file,
 742                                        v4l2_kioctl drv)
 743{
 744        int err, i;
 745        struct v4l2_tuner        tun2;
 746        struct v4l2_standard        std2;
 747        v4l2_std_id                    sid;
 748
 749        memset(&tun2, 0, sizeof(tun2));
 750        err = drv(file, VIDIOC_G_TUNER, &tun2);
 751        if (err < 0) {
 752                dprintk("VIDIOCGTUNER / VIDIOC_G_TUNER: %d\n", err);
 753                goto done;
 754        }
 755        memcpy(tun->name, tun2.name,
 756               min(sizeof(tun->name), sizeof(tun2.name)));
 757        tun->name[sizeof(tun->name) - 1] = 0;
 758        tun->rangelow = tun2.rangelow;
 759        tun->rangehigh = tun2.rangehigh;
 760        tun->flags = 0;
 761        tun->mode = VIDEO_MODE_AUTO;
 762
 763        for (i = 0; i < 64; i++) {
 764                memset(&std2, 0, sizeof(std2));
 765                std2.index = i;
 766                if (0 != drv(file, VIDIOC_ENUMSTD, &std2))
 767                        break;
 768                if (std2.id & V4L2_STD_PAL)
 769                        tun->flags |= VIDEO_TUNER_PAL;
 770                if (std2.id & V4L2_STD_NTSC)
 771                        tun->flags |= VIDEO_TUNER_NTSC;
 772                if (std2.id & V4L2_STD_SECAM)
 773                        tun->flags |= VIDEO_TUNER_SECAM;
 774        }
 775
 776        err = drv(file, VIDIOC_G_STD, &sid);
 777        if (err < 0)
 778                dprintk("VIDIOCGTUNER / VIDIOC_G_STD: %d\n", err);
 779        if (err == 0) {
 780                if (sid & V4L2_STD_PAL)
 781                        tun->mode = VIDEO_MODE_PAL;
 782                if (sid & V4L2_STD_NTSC)
 783                        tun->mode = VIDEO_MODE_NTSC;
 784                if (sid & V4L2_STD_SECAM)
 785                        tun->mode = VIDEO_MODE_SECAM;
 786        }
 787
 788        if (tun2.capability & V4L2_TUNER_CAP_LOW)
 789                tun->flags |= VIDEO_TUNER_LOW;
 790        if (tun2.rxsubchans & V4L2_TUNER_SUB_STEREO)
 791                tun->flags |= VIDEO_TUNER_STEREO_ON;
 792        tun->signal = tun2.signal;
 793done:
 794        return err;
 795}
 796
 797static noinline int v4l1_compat_select_tuner(
 798                                        struct video_tuner *tun,
 799                                        struct file *file,
 800                                        v4l2_kioctl drv)
 801{
 802        int err;
 803        struct v4l2_tuner        t;/*84 bytes on x86_64*/
 804        memset(&t, 0, sizeof(t));
 805
 806        t.index = tun->tuner;
 807
 808        err = drv(file, VIDIOC_S_INPUT, &t);
 809        if (err < 0)
 810                dprintk("VIDIOCSTUNER / VIDIOC_S_INPUT: %d\n", err);
 811        return err;
 812}
 813
 814static noinline int v4l1_compat_get_frequency(
 815                                        unsigned long *freq,
 816                                        struct file *file,
 817                                        v4l2_kioctl drv)
 818{
 819        int err;
 820        struct v4l2_frequency   freq2;
 821        memset(&freq2, 0, sizeof(freq2));
 822
 823        freq2.tuner = 0;
 824        err = drv(file, VIDIOC_G_FREQUENCY, &freq2);
 825        if (err < 0)
 826                dprintk("VIDIOCGFREQ / VIDIOC_G_FREQUENCY: %d\n", err);
 827        if (0 == err)
 828                *freq = freq2.frequency;
 829        return err;
 830}
 831
 832static noinline int v4l1_compat_set_frequency(
 833                                        unsigned long *freq,
 834                                        struct file *file,
 835                                        v4l2_kioctl drv)
 836{
 837        int err;
 838        struct v4l2_frequency   freq2;
 839        memset(&freq2, 0, sizeof(freq2));
 840
 841        drv(file, VIDIOC_G_FREQUENCY, &freq2);
 842        freq2.frequency = *freq;
 843        err = drv(file, VIDIOC_S_FREQUENCY, &freq2);
 844        if (err < 0)
 845                dprintk("VIDIOCSFREQ / VIDIOC_S_FREQUENCY: %d\n", err);
 846        return err;
 847}
 848
 849static noinline int v4l1_compat_get_audio(
 850                                        struct video_audio *aud,
 851                                        struct file *file,
 852                                        v4l2_kioctl drv)
 853{
 854        int err, i;
 855        struct v4l2_queryctrl        qctrl2;
 856        struct v4l2_audio        aud2;
 857        struct v4l2_tuner        tun2;
 858        memset(&aud2, 0, sizeof(aud2));
 859
 860        err = drv(file, VIDIOC_G_AUDIO, &aud2);
 861        if (err < 0) {
 862                dprintk("VIDIOCGAUDIO / VIDIOC_G_AUDIO: %d\n", err);
 863                goto done;
 864        }
 865        memcpy(aud->name, aud2.name,
 866               min(sizeof(aud->name), sizeof(aud2.name)));
 867        aud->name[sizeof(aud->name) - 1] = 0;
 868        aud->audio = aud2.index;
 869        aud->flags = 0;
 870        i = get_v4l_control(file, V4L2_CID_AUDIO_VOLUME, drv);
 871        if (i >= 0) {
 872                aud->volume = i;
 873                aud->flags |= VIDEO_AUDIO_VOLUME;
 874        }
 875        i = get_v4l_control(file, V4L2_CID_AUDIO_BASS, drv);
 876        if (i >= 0) {
 877                aud->bass = i;
 878                aud->flags |= VIDEO_AUDIO_BASS;
 879        }
 880        i = get_v4l_control(file, V4L2_CID_AUDIO_TREBLE, drv);
 881        if (i >= 0) {
 882                aud->treble = i;
 883                aud->flags |= VIDEO_AUDIO_TREBLE;
 884        }
 885        i = get_v4l_control(file, V4L2_CID_AUDIO_BALANCE, drv);
 886        if (i >= 0) {
 887                aud->balance = i;
 888                aud->flags |= VIDEO_AUDIO_BALANCE;
 889        }
 890        i = get_v4l_control(file, V4L2_CID_AUDIO_MUTE, drv);
 891        if (i >= 0) {
 892                if (i)
 893                        aud->flags |= VIDEO_AUDIO_MUTE;
 894                aud->flags |= VIDEO_AUDIO_MUTABLE;
 895        }
 896        aud->step = 1;
 897        qctrl2.id = V4L2_CID_AUDIO_VOLUME;
 898        if (drv(file, VIDIOC_QUERYCTRL, &qctrl2) == 0 &&
 899            !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED))
 900                aud->step = qctrl2.step;
 901        aud->mode = 0;
 902
 903        memset(&tun2, 0, sizeof(tun2));
 904        err = drv(file, VIDIOC_G_TUNER, &tun2);
 905        if (err < 0) {
 906                dprintk("VIDIOCGAUDIO / VIDIOC_G_TUNER: %d\n", err);
 907                err = 0;
 908                goto done;
 909        }
 910
 911        if (tun2.rxsubchans & V4L2_TUNER_SUB_LANG2)
 912                aud->mode = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
 913        else if (tun2.rxsubchans & V4L2_TUNER_SUB_STEREO)
 914                aud->mode = VIDEO_SOUND_STEREO;
 915        else if (tun2.rxsubchans & V4L2_TUNER_SUB_MONO)
 916                aud->mode = VIDEO_SOUND_MONO;
 917done:
 918        return err;
 919}
 920
 921static noinline int v4l1_compat_set_audio(
 922                                        struct video_audio *aud,
 923                                        struct file *file,
 924                                        v4l2_kioctl drv)
 925{
 926        int err;
 927        struct v4l2_audio        aud2;
 928        struct v4l2_tuner        tun2;
 929
 930        memset(&aud2, 0, sizeof(aud2));
 931        memset(&tun2, 0, sizeof(tun2));
 932
 933        aud2.index = aud->audio;
 934        err = drv(file, VIDIOC_S_AUDIO, &aud2);
 935        if (err < 0) {
 936                dprintk("VIDIOCSAUDIO / VIDIOC_S_AUDIO: %d\n", err);
 937                goto done;
 938        }
 939
 940        set_v4l_control(file, V4L2_CID_AUDIO_VOLUME,
 941                        aud->volume, drv);
 942        set_v4l_control(file, V4L2_CID_AUDIO_BASS,
 943                        aud->bass, drv);
 944        set_v4l_control(file, V4L2_CID_AUDIO_TREBLE,
 945                        aud->treble, drv);
 946        set_v4l_control(file, V4L2_CID_AUDIO_BALANCE,
 947                        aud->balance, drv);
 948        set_v4l_control(file, V4L2_CID_AUDIO_MUTE,
 949                        !!(aud->flags & VIDEO_AUDIO_MUTE), drv);
 950
 951        err = drv(file, VIDIOC_G_TUNER, &tun2);
 952        if (err < 0)
 953                dprintk("VIDIOCSAUDIO / VIDIOC_G_TUNER: %d\n", err);
 954        if (err == 0) {
 955                switch (aud->mode) {
 956                default:
 957                case VIDEO_SOUND_MONO:
 958                case VIDEO_SOUND_LANG1:
 959                        tun2.audmode = V4L2_TUNER_MODE_MONO;
 960                        break;
 961                case VIDEO_SOUND_STEREO:
 962                        tun2.audmode = V4L2_TUNER_MODE_STEREO;
 963                        break;
 964                case VIDEO_SOUND_LANG2:
 965                        tun2.audmode = V4L2_TUNER_MODE_LANG2;
 966                        break;
 967                }
 968                err = drv(file, VIDIOC_S_TUNER, &tun2);
 969                if (err < 0)
 970                        dprintk("VIDIOCSAUDIO / VIDIOC_S_TUNER: %d\n", err);
 971        }
 972        err = 0;
 973done:
 974        return err;
 975}
 976
 977static noinline int v4l1_compat_capture_frame(
 978                                        struct video_mmap *mm,
 979                                        struct file *file,
 980                                        v4l2_kioctl drv)
 981{
 982        int err;
 983        enum v4l2_buf_type      captype = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 984        struct v4l2_buffer        buf;
 985        struct v4l2_format        *fmt;
 986
 987        fmt = kzalloc(sizeof(*fmt), GFP_KERNEL);
 988        if (!fmt) {
 989                err = -ENOMEM;
 990                return err;
 991        }
 992        memset(&buf, 0, sizeof(buf));
 993
 994        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 995        err = drv(file, VIDIOC_G_FMT, fmt);
 996        if (err < 0) {
 997                dprintk("VIDIOCMCAPTURE / VIDIOC_G_FMT: %d\n", err);
 998                goto done;
 999        }
1000        if (mm->width   != fmt->fmt.pix.width  ||
1001            mm->height  != fmt->fmt.pix.height ||
1002            palette_to_pixelformat(mm->format) !=
1003            fmt->fmt.pix.pixelformat) {
1004                /* New capture format...  */
1005                fmt->fmt.pix.width = mm->width;
1006                fmt->fmt.pix.height = mm->height;
1007                fmt->fmt.pix.pixelformat =
1008                        palette_to_pixelformat(mm->format);
1009                fmt->fmt.pix.field = V4L2_FIELD_ANY;
1010                fmt->fmt.pix.bytesperline = 0;
1011                err = drv(file, VIDIOC_S_FMT, fmt);
1012                if (err < 0) {
1013                        dprintk("VIDIOCMCAPTURE / VIDIOC_S_FMT: %d\n", err);
1014                        goto done;
1015                }
1016        }
1017        buf.index = mm->frame;
1018        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1019        err = drv(file, VIDIOC_QUERYBUF, &buf);
1020        if (err < 0) {
1021                dprintk("VIDIOCMCAPTURE / VIDIOC_QUERYBUF: %d\n", err);
1022                goto done;
1023        }
1024        err = drv(file, VIDIOC_QBUF, &buf);
1025        if (err < 0) {
1026                dprintk("VIDIOCMCAPTURE / VIDIOC_QBUF: %d\n", err);
1027                goto done;
1028        }
1029        err = drv(file, VIDIOC_STREAMON, &captype);
1030        if (err < 0)
1031                dprintk("VIDIOCMCAPTURE / VIDIOC_STREAMON: %d\n", err);
1032done:
1033        kfree(fmt);
1034        return err;
1035}
1036
1037static noinline int v4l1_compat_sync(
1038                                int *i,
1039                                struct file *file,
1040                                v4l2_kioctl drv)
1041{
1042        int err;
1043        enum v4l2_buf_type captype = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1044        struct v4l2_buffer buf;
1045        struct poll_wqueues *pwq;
1046
1047        memset(&buf, 0, sizeof(buf));
1048        buf.index = *i;
1049        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1050        err = drv(file, VIDIOC_QUERYBUF, &buf);
1051        if (err < 0) {
1052                /*  No such buffer */
1053                dprintk("VIDIOCSYNC / VIDIOC_QUERYBUF: %d\n", err);
1054                goto done;
1055        }
1056        if (!(buf.flags & V4L2_BUF_FLAG_MAPPED)) {
1057                /* Buffer is not mapped  */
1058                err = -EINVAL;
1059                goto done;
1060        }
1061
1062        /* make sure capture actually runs so we don't block forever */
1063        err = drv(file, VIDIOC_STREAMON, &captype);
1064        if (err < 0) {
1065                dprintk("VIDIOCSYNC / VIDIOC_STREAMON: %d\n", err);
1066                goto done;
1067        }
1068
1069        pwq = kmalloc(sizeof(*pwq), GFP_KERNEL);
1070        /*  Loop as long as the buffer is queued, but not done  */
1071        while ((buf.flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))
1072                                                == V4L2_BUF_FLAG_QUEUED) {
1073                err = poll_one(file, pwq);
1074                if (err < 0 ||        /* error or sleep was interrupted  */
1075                    err == 0)        /* timeout? Shouldn't occur.  */
1076                        break;
1077                err = drv(file, VIDIOC_QUERYBUF, &buf);
1078                if (err < 0)
1079                        dprintk("VIDIOCSYNC / VIDIOC_QUERYBUF: %d\n", err);
1080        }
1081        kfree(pwq);
1082        if (!(buf.flags & V4L2_BUF_FLAG_DONE)) /* not done */
1083                goto done;
1084        do {
1085                err = drv(file, VIDIOC_DQBUF, &buf);
1086                if (err < 0)
1087                        dprintk("VIDIOCSYNC / VIDIOC_DQBUF: %d\n", err);
1088        } while (err == 0 && buf.index != *i);
1089done:
1090        return err;
1091}
1092
1093static noinline int v4l1_compat_get_vbi_format(
1094                                struct vbi_format *fmt,
1095                                struct file *file,
1096                                v4l2_kioctl drv)
1097{
1098        int err;
1099        struct v4l2_format *fmt2;
1100
1101        fmt2 = kzalloc(sizeof(*fmt2), GFP_KERNEL);
1102        if (!fmt2) {
1103                err = -ENOMEM;
1104                return err;
1105        }
1106        fmt2->type = V4L2_BUF_TYPE_VBI_CAPTURE;
1107
1108        err = drv(file, VIDIOC_G_FMT, fmt2);
1109        if (err < 0) {
1110                dprintk("VIDIOCGVBIFMT / VIDIOC_G_FMT: %d\n", err);
1111                goto done;
1112        }
1113        if (fmt2->fmt.vbi.sample_format != V4L2_PIX_FMT_GREY) {
1114                err = -EINVAL;
1115                goto done;
1116        }
1117        memset(fmt, 0, sizeof(*fmt));
1118        fmt->samples_per_line = fmt2->fmt.vbi.samples_per_line;
1119        fmt->sampling_rate    = fmt2->fmt.vbi.sampling_rate;
1120        fmt->sample_format    = VIDEO_PALETTE_RAW;
1121        fmt->start[0]         = fmt2->fmt.vbi.start[0];
1122        fmt->count[0]         = fmt2->fmt.vbi.count[0];
1123        fmt->start[1]         = fmt2->fmt.vbi.start[1];
1124        fmt->count[1]         = fmt2->fmt.vbi.count[1];
1125        fmt->flags            = fmt2->fmt.vbi.flags & 0x03;
1126done:
1127        kfree(fmt2);
1128        return err;
1129}
1130
1131static noinline int v4l1_compat_set_vbi_format(
1132                                struct vbi_format *fmt,
1133                                struct file *file,
1134                                v4l2_kioctl drv)
1135{
1136        int err;
1137        struct v4l2_format        *fmt2 = NULL;
1138
1139        if (VIDEO_PALETTE_RAW != fmt->sample_format) {
1140                err = -EINVAL;
1141                return err;
1142        }
1143
1144        fmt2 = kzalloc(sizeof(*fmt2), GFP_KERNEL);
1145        if (!fmt2) {
1146                err = -ENOMEM;
1147                return err;
1148        }
1149        fmt2->type = V4L2_BUF_TYPE_VBI_CAPTURE;
1150        fmt2->fmt.vbi.samples_per_line = fmt->samples_per_line;
1151        fmt2->fmt.vbi.sampling_rate    = fmt->sampling_rate;
1152        fmt2->fmt.vbi.sample_format    = V4L2_PIX_FMT_GREY;
1153        fmt2->fmt.vbi.start[0]         = fmt->start[0];
1154        fmt2->fmt.vbi.count[0]         = fmt->count[0];
1155        fmt2->fmt.vbi.start[1]         = fmt->start[1];
1156        fmt2->fmt.vbi.count[1]         = fmt->count[1];
1157        fmt2->fmt.vbi.flags            = fmt->flags;
1158        err = drv(file, VIDIOC_TRY_FMT, fmt2);
1159        if (err < 0) {
1160                dprintk("VIDIOCSVBIFMT / VIDIOC_TRY_FMT: %d\n", err);
1161                goto done;
1162        }
1163
1164        if (fmt2->fmt.vbi.samples_per_line != fmt->samples_per_line ||
1165            fmt2->fmt.vbi.sampling_rate    != fmt->sampling_rate    ||
1166            fmt2->fmt.vbi.sample_format    != V4L2_PIX_FMT_GREY     ||
1167            fmt2->fmt.vbi.start[0]         != fmt->start[0]         ||
1168            fmt2->fmt.vbi.count[0]         != fmt->count[0]         ||
1169            fmt2->fmt.vbi.start[1]         != fmt->start[1]         ||
1170            fmt2->fmt.vbi.count[1]         != fmt->count[1]         ||
1171            fmt2->fmt.vbi.flags            != fmt->flags) {
1172                err = -EINVAL;
1173                goto done;
1174        }
1175        err = drv(file, VIDIOC_S_FMT, fmt2);
1176        if (err < 0)
1177                dprintk("VIDIOCSVBIFMT / VIDIOC_S_FMT: %d\n", err);
1178done:
1179        kfree(fmt2);
1180        return err;
1181}
1182
1183/*
1184 *        This function is exported.
1185 */
1186int
1187v4l_compat_translate_ioctl(struct file                *file,
1188                           int                        cmd,
1189                           void                        *arg,
1190                           v4l2_kioctl          drv)
1191{
1192        int err;
1193
1194        switch (cmd) {
1195        case VIDIOCGCAP:        /* capability */
1196                err = v4l1_compat_get_capabilities(arg, file, drv);
1197                break;
1198        case VIDIOCGFBUF: /*  get frame buffer  */
1199                err = v4l1_compat_get_frame_buffer(arg, file, drv);
1200                break;
1201        case VIDIOCSFBUF: /*  set frame buffer  */
1202                err = v4l1_compat_set_frame_buffer(arg, file, drv);
1203                break;
1204        case VIDIOCGWIN: /*  get window or capture dimensions  */
1205                err = v4l1_compat_get_win_cap_dimensions(arg, file, drv);
1206                break;
1207        case VIDIOCSWIN: /*  set window and/or capture dimensions  */
1208                err = v4l1_compat_set_win_cap_dimensions(arg, file, drv);
1209                break;
1210        case VIDIOCCAPTURE: /*  turn on/off preview  */
1211                err = v4l1_compat_turn_preview_on_off(arg, file, drv);
1212                break;
1213        case VIDIOCGCHAN: /*  get input information  */
1214                err = v4l1_compat_get_input_info(arg, file, drv);
1215                break;
1216        case VIDIOCSCHAN: /*  set input  */
1217                err = v4l1_compat_set_input(arg, file, drv);
1218                break;
1219        case VIDIOCGPICT: /*  get tone controls & partial capture format  */
1220                err = v4l1_compat_get_picture(arg, file, drv);
1221                break;
1222        case VIDIOCSPICT: /*  set tone controls & partial capture format  */
1223                err = v4l1_compat_set_picture(arg, file, drv);
1224                break;
1225        case VIDIOCGTUNER: /*  get tuner information  */
1226                err = v4l1_compat_get_tuner(arg, file, drv);
1227                break;
1228        case VIDIOCSTUNER: /*  select a tuner input  */
1229                err = v4l1_compat_select_tuner(arg, file, drv);
1230                break;
1231        case VIDIOCGFREQ: /*  get frequency  */
1232                err = v4l1_compat_get_frequency(arg, file, drv);
1233                break;
1234        case VIDIOCSFREQ: /*  set frequency  */
1235                err = v4l1_compat_set_frequency(arg, file, drv);
1236                break;
1237        case VIDIOCGAUDIO: /*  get audio properties/controls  */
1238                err = v4l1_compat_get_audio(arg, file, drv);
1239                break;
1240        case VIDIOCSAUDIO: /*  set audio controls  */
1241                err = v4l1_compat_set_audio(arg, file, drv);
1242                break;
1243        case VIDIOCMCAPTURE: /*  capture a frame  */
1244                err = v4l1_compat_capture_frame(arg, file, drv);
1245                break;
1246        case VIDIOCSYNC: /*  wait for a frame  */
1247                err = v4l1_compat_sync(arg, file, drv);
1248                break;
1249        case VIDIOCGVBIFMT: /* query VBI data capture format */
1250                err = v4l1_compat_get_vbi_format(arg, file, drv);
1251                break;
1252        case VIDIOCSVBIFMT:
1253                err = v4l1_compat_set_vbi_format(arg, file, drv);
1254                break;
1255        default:
1256                err = -ENOIOCTLCMD;
1257                break;
1258        }
1259
1260        return err;
1261}
1262EXPORT_SYMBOL(v4l_compat_translate_ioctl);
1263
1264/*
1265 * Local variables:
1266 * c-basic-offset: 8
1267 * End:
1268 */