Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

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