]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/media/video/compat_ioctl32.c
V4L/DVB (3120): Adds 32-bit compatibility for v4l2 framegrabber ioctls.
[net-next-2.6.git] / drivers / media / video / compat_ioctl32.c
CommitLineData
cf664a64
PDM
1/*
2 * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
3 * Separated from fs stuff by Arnd Bergmann <arnd@arndb.de>
4 *
5 * Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com)
6 * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
7 * Copyright (C) 2001,2002 Andi Kleen, SuSE Labs
8 * Copyright (C) 2003 Pavel Machek (pavel@suse.cz)
9 * Copyright (C) 2005 Philippe De Muyter (phdm@macqel.be)
10 *
11 * These routines maintain argument size conversion between 32bit and 64bit
12 * ioctls.
13 */
14
0d0fbf81
AB
15#include <linux/config.h>
16#include <linux/compat.h>
17#include <linux/videodev.h>
cf664a64 18#include <linux/videodev2.h>
133b7354 19#include <linux/module.h>
e8efb71d 20#include <linux/smp_lock.h>
0d0fbf81
AB
21
22#ifdef CONFIG_COMPAT
23struct video_tuner32 {
24 compat_int_t tuner;
25 char name[32];
26 compat_ulong_t rangelow, rangehigh;
27 u32 flags; /* It is really u32 in videodev.h */
28 u16 mode, signal;
29};
30
31static int get_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up)
32{
0d0fbf81
AB
33 if(get_user(kp->tuner, &up->tuner))
34 return -EFAULT;
cf664a64 35 __copy_from_user(kp->name, up->name, 32);
0d0fbf81
AB
36 __get_user(kp->rangelow, &up->rangelow);
37 __get_user(kp->rangehigh, &up->rangehigh);
38 __get_user(kp->flags, &up->flags);
39 __get_user(kp->mode, &up->mode);
40 __get_user(kp->signal, &up->signal);
41 return 0;
42}
43
44static int put_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up)
45{
0d0fbf81
AB
46 if(put_user(kp->tuner, &up->tuner))
47 return -EFAULT;
cf664a64 48 __copy_to_user(up->name, kp->name, 32);
0d0fbf81
AB
49 __put_user(kp->rangelow, &up->rangelow);
50 __put_user(kp->rangehigh, &up->rangehigh);
51 __put_user(kp->flags, &up->flags);
52 __put_user(kp->mode, &up->mode);
53 __put_user(kp->signal, &up->signal);
54 return 0;
55}
56
57struct video_buffer32 {
58 compat_caddr_t base;
59 compat_int_t height, width, depth, bytesperline;
60};
61
62static int get_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up)
63{
64 u32 tmp;
65
66 if (get_user(tmp, &up->base))
67 return -EFAULT;
68
69 /* This is actually a physical address stored
70 * as a void pointer.
71 */
72 kp->base = (void *)(unsigned long) tmp;
73
74 __get_user(kp->height, &up->height);
75 __get_user(kp->width, &up->width);
76 __get_user(kp->depth, &up->depth);
77 __get_user(kp->bytesperline, &up->bytesperline);
78 return 0;
79}
80
81static int put_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up)
82{
83 u32 tmp = (u32)((unsigned long)kp->base);
84
85 if(put_user(tmp, &up->base))
86 return -EFAULT;
87 __put_user(kp->height, &up->height);
88 __put_user(kp->width, &up->width);
89 __put_user(kp->depth, &up->depth);
90 __put_user(kp->bytesperline, &up->bytesperline);
91 return 0;
92}
93
94struct video_clip32 {
95 s32 x, y, width, height; /* Its really s32 in videodev.h */
96 compat_caddr_t next;
97};
98
99struct video_window32 {
100 u32 x, y, width, height, chromakey, flags;
101 compat_caddr_t clips;
102 compat_int_t clipcount;
103};
104
105static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
106{
107 int ret = -ENOIOCTLCMD;
108
109 if (file->f_ops->unlocked_ioctl)
110 ret = file->f_ops->unlocked_ioctl(file, cmd, arg);
111 else if (file->f_ops->ioctl) {
112 lock_kernel();
113 ret = file->f_ops->ioctl(file->f_dentry->d_inode, file, cmd, arg);
114 unlock_kernel();
115 }
116
117 return ret;
118}
119
120
121/* You get back everything except the clips... */
122static int put_video_window32(struct video_window *kp, struct video_window32 __user *up)
123{
124 if(put_user(kp->x, &up->x))
125 return -EFAULT;
126 __put_user(kp->y, &up->y);
127 __put_user(kp->width, &up->width);
128 __put_user(kp->height, &up->height);
129 __put_user(kp->chromakey, &up->chromakey);
130 __put_user(kp->flags, &up->flags);
131 __put_user(kp->clipcount, &up->clipcount);
132 return 0;
133}
134
cf664a64
PDM
135struct v4l2_clip32
136{
137 struct v4l2_rect c;
138 compat_caddr_t next;
139};
140
141struct v4l2_window32
142{
143 struct v4l2_rect w;
144 enum v4l2_field field;
145 __u32 chromakey;
146 compat_caddr_t clips; /* actually struct v4l2_clip32 * */
147 __u32 clipcount;
148 compat_caddr_t bitmap;
149};
150
151static int get_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user *up)
152{
153 if (copy_from_user(&kp->w, &up->w, sizeof(up->w)))
154 return -EFAULT;
155 __get_user(kp->field, &up->field);
156 __get_user(kp->chromakey, &up->chromakey);
157 __get_user(kp->clipcount, &up->clipcount);
158 if (kp->clipcount > 2048)
159 return -EINVAL;
160 if (kp->clipcount) {
161 struct v4l2_clip32 *uclips = compat_ptr(up->clips);
162 struct v4l2_clip *kclips;
163 int n = kp->clipcount;
164
165 kclips = compat_alloc_user_space(n * sizeof(struct v4l2_clip));
166 kp->clips = kclips;
167 while (--n >= 0) {
168 copy_from_user(&kclips->c, &uclips->c, sizeof(uclips->c));
169 kclips->next = n ? kclips + 1 : 0;
170 uclips += 1;
171 kclips += 1;
172 }
173 } else
174 kp->clips = 0;
175 return 0;
176}
177
178static int put_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user *up)
179{
180 if (copy_to_user(&up->w, &kp->w, sizeof(up->w)))
181 return -EFAULT;
182 __put_user(kp->field, &up->field);
183 __put_user(kp->chromakey, &up->chromakey);
184 __put_user(kp->clipcount, &up->clipcount);
185 return 0;
186}
187
188static inline int get_v4l2_pix_format(struct v4l2_pix_format *kp, struct v4l2_pix_format __user *up)
189{
190 return copy_from_user(kp, up, sizeof(struct v4l2_pix_format));
191}
192
193static inline int put_v4l2_pix_format(struct v4l2_pix_format *kp, struct v4l2_pix_format __user *up)
194{
195 return copy_to_user(up, kp, sizeof(struct v4l2_pix_format));
196}
197
198static inline int get_v4l2_vbi_format(struct v4l2_vbi_format *kp, struct v4l2_vbi_format __user *up)
199{
200 return copy_from_user(kp, up, sizeof(struct v4l2_vbi_format));
201}
202
203static inline int put_v4l2_vbi_format(struct v4l2_vbi_format *kp, struct v4l2_vbi_format __user *up)
204{
205 return copy_to_user(up, kp, sizeof(struct v4l2_vbi_format));
206}
207
208struct v4l2_format32
209{
210 enum v4l2_buf_type type;
211 union
212 {
213 struct v4l2_pix_format pix; // V4L2_BUF_TYPE_VIDEO_CAPTURE
214 struct v4l2_window32 win; // V4L2_BUF_TYPE_VIDEO_OVERLAY
215 struct v4l2_vbi_format vbi; // V4L2_BUF_TYPE_VBI_CAPTURE
216 __u8 raw_data[200]; // user-defined
217 } fmt;
218};
219
220static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
221{
222 if(get_user(kp->type, &up->type))
223 return -EFAULT;
224 switch (kp->type) {
225 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
226 return get_v4l2_pix_format(&kp->fmt.pix, &up->fmt.pix);
227 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
228 return get_v4l2_window32(&kp->fmt.win, &up->fmt.win);
229 case V4L2_BUF_TYPE_VBI_CAPTURE:
230 return get_v4l2_vbi_format(&kp->fmt.vbi, &up->fmt.vbi);
231 default:
232 printk("compat_ioctl : unexpected VIDIOC_FMT type %d\n",
233 kp->type);
234 return -ENXIO;
235 }
236}
237
238static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
239{
240 if(put_user(kp->type, &up->type))
241 return -EFAULT;
242 switch (kp->type) {
243 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
244 return put_v4l2_pix_format(&kp->fmt.pix, &up->fmt.pix);
245 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
246 return put_v4l2_window32(&kp->fmt.win, &up->fmt.win);
247 case V4L2_BUF_TYPE_VBI_CAPTURE:
248 return put_v4l2_vbi_format(&kp->fmt.vbi, &up->fmt.vbi);
249 default:
250 return -ENXIO;
251 }
252}
253
254struct v4l2_standard32
255{
256 __u32 index;
257 __u32 id[2]; /* __u64 would get the alignment wrong */
258 __u8 name[24];
259 struct v4l2_fract frameperiod; /* Frames, not fields */
260 __u32 framelines;
261 __u32 reserved[4];
262};
263
264static int get_v4l2_standard32(struct v4l2_standard *kp, struct v4l2_standard32 __user *up)
265{
266 /* other fields are not set by the user, nor used by the driver */
267 return get_user(kp->index, &up->index);
268}
269
270static int put_v4l2_standard32(struct v4l2_standard *kp, struct v4l2_standard32 __user *up)
271{
272 if(put_user(kp->index, &up->index))
273 return -EFAULT;
274 __copy_to_user(up->id, &kp->id, sizeof(__u64));
275 __copy_to_user(up->name, kp->name, 24);
276 __put_user(kp->frameperiod, &up->frameperiod);
277 __put_user(kp->framelines, &up->framelines);
278 __copy_to_user(up->reserved, kp->reserved, 4 * sizeof(__u32));
279 return 0;
280}
281
282struct v4l2_buffer32
283{
284 __u32 index;
285 enum v4l2_buf_type type;
286 __u32 bytesused;
287 __u32 flags;
288 enum v4l2_field field;
289 struct compat_timeval timestamp;
290 struct v4l2_timecode timecode;
291 __u32 sequence;
292
293 /* memory location */
294 enum v4l2_memory memory;
295 union {
296 __u32 offset;
297 compat_long_t userptr;
298 } m;
299 __u32 length;
300 __u32 input;
301 __u32 reserved;
302};
303
304static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user *up)
305{
306
307 if (get_user(kp->index, &up->index))
308 return -EFAULT;
309 __get_user(kp->type, &up->type);
310 __get_user(kp->flags, &up->flags);
311 __get_user(kp->memory, &up->memory);
312 __get_user(kp->input, &up->input);
313 switch(kp->memory) {
314 case V4L2_MEMORY_MMAP:
315 break;
316 case V4L2_MEMORY_USERPTR:
317 {
318 unsigned long tmp = (unsigned long)compat_ptr(up->m.userptr);
319
320 __get_user(kp->length, &up->length);
321 __get_user(kp->m.userptr, &tmp);
322 }
323 break;
324 case V4L2_MEMORY_OVERLAY:
325 __get_user(kp->m.offset, &up->m.offset);
326 break;
327 }
328 return 0;
329}
330
331static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user *up)
332{
333 if (put_user(kp->index, &up->index))
334 return -EFAULT;
335 __put_user(kp->type, &up->type);
336 __put_user(kp->flags, &up->flags);
337 __put_user(kp->memory, &up->memory);
338 __put_user(kp->input, &up->input);
339 switch(kp->memory) {
340 case V4L2_MEMORY_MMAP:
341 __put_user(kp->length, &up->length);
342 __put_user(kp->m.offset, &up->m.offset);
343 break;
344 case V4L2_MEMORY_USERPTR:
345 __put_user(kp->length, &up->length);
346 __put_user(kp->m.userptr, &up->m.userptr);
347 break;
348 case V4L2_MEMORY_OVERLAY:
349 __put_user(kp->m.offset, &up->m.offset);
350 break;
351 }
352 __put_user(kp->bytesused, &up->bytesused);
353 __put_user(kp->field, &up->field);
354 __put_user(kp->timestamp.tv_sec, &up->timestamp.tv_sec);
355 __put_user(kp->timestamp.tv_usec, &up->timestamp.tv_usec);
356 __copy_to_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode));
357 __put_user(kp->sequence, &up->sequence);
358 __put_user(kp->reserved, &up->reserved);
359 return 0;
360}
361
362struct v4l2_framebuffer32
363{
364 __u32 capability;
365 __u32 flags;
366 compat_caddr_t base;
367 struct v4l2_pix_format fmt;
368};
369
370static int put_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up)
371{
372 u32 tmp = (u32)((unsigned long)kp->base);
373
374 if(put_user(tmp, &up->base))
375 return -EFAULT;
376 __put_user(kp->capability, &up->capability);
377 __put_user(kp->flags, &up->flags);
378 put_v4l2_pix_format(&kp->fmt, &up->fmt);
379 return 0;
380}
381
382struct v4l2_input32 /* identical layout, but different size */
383{
384 __u32 index; /* Which input */
385 __u8 name[32]; /* Label */
386 __u32 type; /* Type of input */
387 __u32 audioset; /* Associated audios (bitfield) */
388 __u32 tuner; /* Associated tuner */
389 __u32 std[2]; /* __u64 would get the padding wrong */
390 __u32 status;
391 __u32 reserved[4];
392};
393
0d0fbf81
AB
394#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
395#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
396#define VIDIOCGWIN32 _IOR('v',9, struct video_window32)
397#define VIDIOCSWIN32 _IOW('v',10, struct video_window32)
398#define VIDIOCGFBUF32 _IOR('v',11, struct video_buffer32)
399#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
400#define VIDIOCGFREQ32 _IOR('v',14, u32)
401#define VIDIOCSFREQ32 _IOW('v',15, u32)
402
cf664a64
PDM
403#define VIDIOC_G_FMT32 _IOWR ('V', 4, struct v4l2_format32)
404#define VIDIOC_S_FMT32 _IOWR ('V', 5, struct v4l2_format32)
405#define VIDIOC_QUERYBUF32 _IOWR ('V', 9, struct v4l2_buffer32)
406#define VIDIOC_G_FBUF32 _IOR ('V', 10, struct v4l2_framebuffer32)
407/* VIDIOC_OVERLAY is now _IOW, but was _IOWR */
408#define VIDIOC_OVERLAY32 _IOWR ('V', 14, compat_int_t)
409#define VIDIOC_QBUF32 _IOWR ('V', 15, struct v4l2_buffer32)
410#define VIDIOC_DQBUF32 _IOWR ('V', 17, struct v4l2_buffer32)
411#define VIDIOC_STREAMON32 _IOW ('V', 18, compat_int_t)
412#define VIDIOC_STREAMOFF32 _IOW ('V', 19, compat_int_t)
413#define VIDIOC_ENUMSTD32 _IOWR ('V', 25, struct v4l2_standard32)
414#define VIDIOC_ENUMINPUT32 _IOWR ('V', 26, struct v4l2_input32)
415/* VIDIOC_S_CTRL is now _IOWR, but was _IOW */
416#define VIDIOC_S_CTRL32 _IOW ('V', 28, struct v4l2_control)
417#define VIDIOC_G_INPUT32 _IOR ('V', 38, compat_int_t)
418#define VIDIOC_S_INPUT32 _IOWR ('V', 39, compat_int_t)
419#define VIDIOC_TRY_FMT32 _IOWR ('V', 64, struct v4l2_format32)
420
0d0fbf81
AB
421enum {
422 MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip)
423};
424
425static int do_set_window(struct file *file, unsigned int cmd, unsigned long arg)
426{
427 struct video_window32 __user *up = compat_ptr(arg);
428 struct video_window __user *vw;
429 struct video_clip __user *p;
430 int nclips;
431 u32 n;
432
433 if (get_user(nclips, &up->clipcount))
434 return -EFAULT;
435
436 /* Peculiar interface... */
437 if (nclips < 0)
438 nclips = VIDEO_CLIPMAP_SIZE;
439
440 if (nclips > MaxClips)
441 return -ENOMEM;
442
443 vw = compat_alloc_user_space(sizeof(struct video_window) +
444 nclips * sizeof(struct video_clip));
445
446 p = nclips ? (struct video_clip __user *)(vw + 1) : NULL;
447
448 if (get_user(n, &up->x) || put_user(n, &vw->x) ||
449 get_user(n, &up->y) || put_user(n, &vw->y) ||
450 get_user(n, &up->width) || put_user(n, &vw->width) ||
451 get_user(n, &up->height) || put_user(n, &vw->height) ||
452 get_user(n, &up->chromakey) || put_user(n, &vw->chromakey) ||
453 get_user(n, &up->flags) || put_user(n, &vw->flags) ||
454 get_user(n, &up->clipcount) || put_user(n, &vw->clipcount) ||
455 get_user(n, &up->clips) || put_user(p, &vw->clips))
456 return -EFAULT;
457
458 if (nclips) {
459 struct video_clip32 __user *u = compat_ptr(n);
460 int i;
461 if (!u)
462 return -EINVAL;
463 for (i = 0; i < nclips; i++, u++, p++) {
464 s32 v;
465 if (get_user(v, &u->x) ||
466 put_user(v, &p->x) ||
467 get_user(v, &u->y) ||
468 put_user(v, &p->y) ||
469 get_user(v, &u->width) ||
470 put_user(v, &p->width) ||
471 get_user(v, &u->height) ||
472 put_user(v, &p->height) ||
473 put_user(NULL, &p->next))
474 return -EFAULT;
475 }
476 }
477
478 return native_ioctl(file, VIDIOCSWIN, (unsigned long)p);
479}
480
481static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
482{
483 union {
484 struct video_tuner vt;
485 struct video_buffer vb;
486 struct video_window vw;
cf664a64
PDM
487 struct v4l2_format v2f;
488 struct v4l2_buffer v2b;
489 struct v4l2_framebuffer v2fb;
490 struct v4l2_standard v2s;
0d0fbf81
AB
491 unsigned long vx;
492 } karg;
0d0fbf81 493 void __user *up = compat_ptr(arg);
cf664a64 494 int compatible_arg = 1;
0d0fbf81
AB
495 int err = 0;
496
497 /* First, convert the command. */
498 switch(cmd) {
499 case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break;
500 case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break;
501 case VIDIOCGWIN32: cmd = VIDIOCGWIN; break;
502 case VIDIOCGFBUF32: cmd = VIDIOCGFBUF; break;
503 case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break;
504 case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break;
505 case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break;
cf664a64
PDM
506 case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break;
507 case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break;
508 case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break;
509 case VIDIOC_QBUF32: cmd = VIDIOC_QBUF; break;
510 case VIDIOC_DQBUF32: cmd = VIDIOC_DQBUF; break;
511 case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break;
512 case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break;
513 case VIDIOC_G_FBUF32: cmd = VIDIOC_G_FBUF; break;
514 case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break;
515 case VIDIOC_ENUMSTD32: cmd = VIDIOC_ENUMSTD; break;
516 case VIDIOC_ENUMINPUT32: cmd = VIDIOC_ENUMINPUT; break;
517 case VIDIOC_S_CTRL32: cmd = VIDIOC_S_CTRL; break;
518 case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
519 case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
520 case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
0d0fbf81
AB
521 };
522
523 switch(cmd) {
524 case VIDIOCSTUNER:
525 case VIDIOCGTUNER:
526 err = get_video_tuner32(&karg.vt, up);
cf664a64
PDM
527 compatible_arg = 0;
528
0d0fbf81
AB
529 break;
530
531 case VIDIOCSFBUF:
532 err = get_video_buffer32(&karg.vb, up);
cf664a64 533 compatible_arg = 0;
0d0fbf81
AB
534 break;
535
536 case VIDIOCSFREQ:
cf664a64
PDM
537 case VIDIOC_S_INPUT:
538 case VIDIOC_OVERLAY:
0d0fbf81 539 err = get_user(karg.vx, (u32 __user *)up);
cf664a64 540 compatible_arg = 0;
0d0fbf81
AB
541 break;
542 };
cf664a64
PDM
543
544 case VIDIOC_G_FMT:
545 case VIDIOC_S_FMT:
546 case VIDIOC_TRY_FMT:
547 err = get_v4l2_format32(&karg.v2f, up);
548 compatible_arg = 0;
549 break;
550
551 case VIDIOC_QUERYBUF:
552 case VIDIOC_QBUF:
553 case VIDIOC_DQBUF:
554 err = get_v4l2_buffer32(&karg.v2b, up);
555 compatible_arg = 0;
556 break;
557
558 case VIDIOC_ENUMSTD:
559 err = get_v4l2_standard32(&karg.v2s, up);
560 compatible_arg = 0;
561 break;
562
563 case VIDIOCGWIN:
564 case VIDIOCGFBUF:
565 case VIDIOCGFREQ:
566 case VIDIOC_G_FBUF:
567 case VIDIOC_G_INPUT:
568 compatible_arg = 0;
569
0d0fbf81
AB
570 if(err)
571 goto out;
572
cf664a64
PDM
573 if(compatible_arg)
574 err = sys_ioctl(fd, cmd, (unsigned long)up);
575 else {
576 mm_segment_t old_fs = get_fs();
0d0fbf81 577
cf664a64
PDM
578 set_fs(KERNEL_DS);
579 err = sys_ioctl(fd, cmd, (unsigned long)&karg);
580 set_fs(old_fs);
581 }
0d0fbf81
AB
582 if(err == 0) {
583 switch(cmd) {
584 case VIDIOCGTUNER:
585 err = put_video_tuner32(&karg.vt, up);
586 break;
587
588 case VIDIOCGWIN:
589 err = put_video_window32(&karg.vw, up);
590 break;
591
592 case VIDIOCGFBUF:
593 err = put_video_buffer32(&karg.vb, up);
594 break;
595
cf664a64
PDM
596 case VIDIOC_G_FBUF:
597 err = put_v4l2_framebuffer32(&karg.v2fb, up);
598 break;
599
600 case VIDIOC_G_FMT:
601 case VIDIOC_S_FMT:
602 case VIDIOC_TRY_FMT:
603 err = put_v4l2_format32(&karg.v2f, up);
604 break;
605
606 case VIDIOC_QUERYBUF:
607 case VIDIOC_QBUF:
608 case VIDIOC_DQBUF:
609 err = put_v4l2_buffer32(&karg.v2b, up);
610 break;
611
612 case VIDIOC_ENUMSTD:
613 err = put_v4l2_standard32(&karg.v2s, up);
614 break;
615
0d0fbf81 616 case VIDIOCGFREQ:
cf664a64 617 case VIDIOC_G_INPUT:
0d0fbf81
AB
618 err = put_user(((u32)karg.vx), (u32 __user *)up);
619 break;
620 };
621 }
622out:
623 return err;
624}
625
626long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
627{
628 int ret = -ENOIOCTLCMD;
629
630 if (!file->f_ops->ioctl)
631 return ret;
632
633 switch (cmd) {
634 case VIDIOCSWIN32:
635 ret = do_set_window(file, cmd, arg);
636 break;
637 case VIDIOCGTUNER32:
638 case VIDIOCSTUNER32:
639 case VIDIOCGWIN32:
640 case VIDIOCGFBUF32:
641 case VIDIOCSFBUF32:
642 case VIDIOCGFREQ32:
133b7354 643 case VIDIOCSFREQ32:
0d0fbf81
AB
644 ret = do_video_ioctl(file, cmd, arg);
645 break;
646
647 /* Little v, the video4linux ioctls (conflict?) */
648 case VIDIOCGCAP:
649 case VIDIOCGCHAN:
650 case VIDIOCSCHAN:
651 case VIDIOCGPICT:
652 case VIDIOCSPICT:
653 case VIDIOCCAPTURE:
654 case VIDIOCKEY:
655 case VIDIOCGAUDIO:
656 case VIDIOCSAUDIO:
657 case VIDIOCSYNC:
658 case VIDIOCMCAPTURE:
659 case VIDIOCGMBUF:
660 case VIDIOCGUNIT:
661 case VIDIOCGCAPTURE:
662 case VIDIOCSCAPTURE:
663
664 /* BTTV specific... */
665 case _IOW('v', BASE_VIDIOCPRIVATE+0, char [256]):
666 case _IOR('v', BASE_VIDIOCPRIVATE+1, char [256]):
667 case _IOR('v' , BASE_VIDIOCPRIVATE+2, unsigned int):
668 case _IOW('v' , BASE_VIDIOCPRIVATE+3, char [16]): /* struct bttv_pll_info */
669 case _IOR('v' , BASE_VIDIOCPRIVATE+4, int):
670 case _IOR('v' , BASE_VIDIOCPRIVATE+5, int):
671 case _IOR('v' , BASE_VIDIOCPRIVATE+6, int):
672 case _IOR('v' , BASE_VIDIOCPRIVATE+7, int):
673 ret = native_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
674 break;