2 * Video capture interface for Linux version 2
4 * A generic video device interface for the LINUX operating system
5 * using a set of device structures/vectors for low level operations.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
12 * Authors: Alan Cox, <alan@redhat.com> (version 1)
13 * Mauro Carvalho Chehab <mchehab@infradead.org> (version 2)
15 * Fixes: 20000516 Claudio Matsuoka <claudio@conectiva.com>
16 * - Added procfs support
19 #define dbgarg(cmd, fmt, arg...) \
20 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { \
21 printk(KERN_DEBUG "%s: ", vfd->name); \
22 v4l_printk_ioctl(cmd); \
23 printk(" " fmt, ## arg); \
26 #define dbgarg2(fmt, arg...) \
27 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \
28 printk(KERN_DEBUG "%s: " fmt, vfd->name, ## arg);
30 #include <linux/module.h>
31 #include <linux/types.h>
32 #include <linux/kernel.h>
34 #include <linux/string.h>
35 #include <linux/errno.h>
36 #include <linux/init.h>
37 #include <linux/kmod.h>
38 #include <linux/slab.h>
39 #include <asm/uaccess.h>
40 #include <asm/system.h>
42 #define __OLD_VIDIOC_ /* To allow fixing old calls*/
43 #include <linux/videodev2.h>
45 #ifdef CONFIG_VIDEO_V4L1
46 #include <linux/videodev.h>
48 #include <media/v4l2-common.h>
49 #include <linux/video_decoder.h>
51 #define VIDEO_NUM_DEVICES 256
52 #define VIDEO_NAME "video4linux"
54 /* video4linux standard ID conversion to standard name
56 char *v4l2_norm_to_name(v4l2_std_id id
)
61 /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
62 64 bit comparations. So, on that architecture, with some gcc
63 variants, compilation fails. Currently, the max value is 30bit wide.
107 case V4L2_STD_PAL_Nc
:
110 case V4L2_STD_PAL_60
:
116 case V4L2_STD_NTSC_M
:
119 case V4L2_STD_NTSC_M_JP
:
122 case V4L2_STD_NTSC_443
:
125 case V4L2_STD_NTSC_M_KR
:
131 case V4L2_STD_SECAM_DK
:
134 case V4L2_STD_SECAM_B
:
137 case V4L2_STD_SECAM_D
:
140 case V4L2_STD_SECAM_G
:
143 case V4L2_STD_SECAM_H
:
146 case V4L2_STD_SECAM_K
:
149 case V4L2_STD_SECAM_K1
:
152 case V4L2_STD_SECAM_L
:
155 case V4L2_STD_SECAM_LC
:
165 EXPORT_SYMBOL(v4l2_norm_to_name
);
167 /* Fill in the fields of a v4l2_standard structure according to the
168 'id' and 'transmission' parameters. Returns negative on error. */
169 int v4l2_video_std_construct(struct v4l2_standard
*vs
,
172 u32 index
= vs
->index
;
174 memset(vs
, 0, sizeof(struct v4l2_standard
));
177 if (id
& V4L2_STD_525_60
) {
178 vs
->frameperiod
.numerator
= 1001;
179 vs
->frameperiod
.denominator
= 30000;
180 vs
->framelines
= 525;
182 vs
->frameperiod
.numerator
= 1;
183 vs
->frameperiod
.denominator
= 25;
184 vs
->framelines
= 625;
186 strlcpy(vs
->name
, name
, sizeof(vs
->name
));
189 EXPORT_SYMBOL(v4l2_video_std_construct
);
191 /* ----------------------------------------------------------------- */
192 /* some arrays for pretty-printing debug messages of enum types */
194 char *v4l2_field_names
[] = {
195 [V4L2_FIELD_ANY
] = "any",
196 [V4L2_FIELD_NONE
] = "none",
197 [V4L2_FIELD_TOP
] = "top",
198 [V4L2_FIELD_BOTTOM
] = "bottom",
199 [V4L2_FIELD_INTERLACED
] = "interlaced",
200 [V4L2_FIELD_SEQ_TB
] = "seq-tb",
201 [V4L2_FIELD_SEQ_BT
] = "seq-bt",
202 [V4L2_FIELD_ALTERNATE
] = "alternate",
203 [V4L2_FIELD_INTERLACED_TB
] = "interlaced-tb",
204 [V4L2_FIELD_INTERLACED_BT
] = "interlaced-bt",
206 EXPORT_SYMBOL(v4l2_field_names
);
208 char *v4l2_type_names
[] = {
209 [V4L2_BUF_TYPE_VIDEO_CAPTURE
] = "video-cap",
210 [V4L2_BUF_TYPE_VIDEO_OVERLAY
] = "video-over",
211 [V4L2_BUF_TYPE_VIDEO_OUTPUT
] = "video-out",
212 [V4L2_BUF_TYPE_VBI_CAPTURE
] = "vbi-cap",
213 [V4L2_BUF_TYPE_VBI_OUTPUT
] = "vbi-out",
214 [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
] = "sliced-vbi-cap",
215 [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
] = "sliced-vbi-out",
216 [V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
] = "video-out-over",
218 EXPORT_SYMBOL(v4l2_type_names
);
220 static char *v4l2_memory_names
[] = {
221 [V4L2_MEMORY_MMAP
] = "mmap",
222 [V4L2_MEMORY_USERPTR
] = "userptr",
223 [V4L2_MEMORY_OVERLAY
] = "overlay",
226 #define prt_names(a, arr) ((((a) >= 0) && ((a) < ARRAY_SIZE(arr))) ? \
229 /* ------------------------------------------------------------------ */
230 /* debug help functions */
232 #ifdef CONFIG_VIDEO_V4L1_COMPAT
233 static const char *v4l1_ioctls
[] = {
234 [_IOC_NR(VIDIOCGCAP
)] = "VIDIOCGCAP",
235 [_IOC_NR(VIDIOCGCHAN
)] = "VIDIOCGCHAN",
236 [_IOC_NR(VIDIOCSCHAN
)] = "VIDIOCSCHAN",
237 [_IOC_NR(VIDIOCGTUNER
)] = "VIDIOCGTUNER",
238 [_IOC_NR(VIDIOCSTUNER
)] = "VIDIOCSTUNER",
239 [_IOC_NR(VIDIOCGPICT
)] = "VIDIOCGPICT",
240 [_IOC_NR(VIDIOCSPICT
)] = "VIDIOCSPICT",
241 [_IOC_NR(VIDIOCCAPTURE
)] = "VIDIOCCAPTURE",
242 [_IOC_NR(VIDIOCGWIN
)] = "VIDIOCGWIN",
243 [_IOC_NR(VIDIOCSWIN
)] = "VIDIOCSWIN",
244 [_IOC_NR(VIDIOCGFBUF
)] = "VIDIOCGFBUF",
245 [_IOC_NR(VIDIOCSFBUF
)] = "VIDIOCSFBUF",
246 [_IOC_NR(VIDIOCKEY
)] = "VIDIOCKEY",
247 [_IOC_NR(VIDIOCGFREQ
)] = "VIDIOCGFREQ",
248 [_IOC_NR(VIDIOCSFREQ
)] = "VIDIOCSFREQ",
249 [_IOC_NR(VIDIOCGAUDIO
)] = "VIDIOCGAUDIO",
250 [_IOC_NR(VIDIOCSAUDIO
)] = "VIDIOCSAUDIO",
251 [_IOC_NR(VIDIOCSYNC
)] = "VIDIOCSYNC",
252 [_IOC_NR(VIDIOCMCAPTURE
)] = "VIDIOCMCAPTURE",
253 [_IOC_NR(VIDIOCGMBUF
)] = "VIDIOCGMBUF",
254 [_IOC_NR(VIDIOCGUNIT
)] = "VIDIOCGUNIT",
255 [_IOC_NR(VIDIOCGCAPTURE
)] = "VIDIOCGCAPTURE",
256 [_IOC_NR(VIDIOCSCAPTURE
)] = "VIDIOCSCAPTURE",
257 [_IOC_NR(VIDIOCSPLAYMODE
)] = "VIDIOCSPLAYMODE",
258 [_IOC_NR(VIDIOCSWRITEMODE
)] = "VIDIOCSWRITEMODE",
259 [_IOC_NR(VIDIOCGPLAYINFO
)] = "VIDIOCGPLAYINFO",
260 [_IOC_NR(VIDIOCSMICROCODE
)] = "VIDIOCSMICROCODE",
261 [_IOC_NR(VIDIOCGVBIFMT
)] = "VIDIOCGVBIFMT",
262 [_IOC_NR(VIDIOCSVBIFMT
)] = "VIDIOCSVBIFMT"
264 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
267 static const char *v4l2_ioctls
[] = {
268 [_IOC_NR(VIDIOC_QUERYCAP
)] = "VIDIOC_QUERYCAP",
269 [_IOC_NR(VIDIOC_RESERVED
)] = "VIDIOC_RESERVED",
270 [_IOC_NR(VIDIOC_ENUM_FMT
)] = "VIDIOC_ENUM_FMT",
271 [_IOC_NR(VIDIOC_G_FMT
)] = "VIDIOC_G_FMT",
272 [_IOC_NR(VIDIOC_S_FMT
)] = "VIDIOC_S_FMT",
273 [_IOC_NR(VIDIOC_REQBUFS
)] = "VIDIOC_REQBUFS",
274 [_IOC_NR(VIDIOC_QUERYBUF
)] = "VIDIOC_QUERYBUF",
275 [_IOC_NR(VIDIOC_G_FBUF
)] = "VIDIOC_G_FBUF",
276 [_IOC_NR(VIDIOC_S_FBUF
)] = "VIDIOC_S_FBUF",
277 [_IOC_NR(VIDIOC_OVERLAY
)] = "VIDIOC_OVERLAY",
278 [_IOC_NR(VIDIOC_QBUF
)] = "VIDIOC_QBUF",
279 [_IOC_NR(VIDIOC_DQBUF
)] = "VIDIOC_DQBUF",
280 [_IOC_NR(VIDIOC_STREAMON
)] = "VIDIOC_STREAMON",
281 [_IOC_NR(VIDIOC_STREAMOFF
)] = "VIDIOC_STREAMOFF",
282 [_IOC_NR(VIDIOC_G_PARM
)] = "VIDIOC_G_PARM",
283 [_IOC_NR(VIDIOC_S_PARM
)] = "VIDIOC_S_PARM",
284 [_IOC_NR(VIDIOC_G_STD
)] = "VIDIOC_G_STD",
285 [_IOC_NR(VIDIOC_S_STD
)] = "VIDIOC_S_STD",
286 [_IOC_NR(VIDIOC_ENUMSTD
)] = "VIDIOC_ENUMSTD",
287 [_IOC_NR(VIDIOC_ENUMINPUT
)] = "VIDIOC_ENUMINPUT",
288 [_IOC_NR(VIDIOC_G_CTRL
)] = "VIDIOC_G_CTRL",
289 [_IOC_NR(VIDIOC_S_CTRL
)] = "VIDIOC_S_CTRL",
290 [_IOC_NR(VIDIOC_G_TUNER
)] = "VIDIOC_G_TUNER",
291 [_IOC_NR(VIDIOC_S_TUNER
)] = "VIDIOC_S_TUNER",
292 [_IOC_NR(VIDIOC_G_AUDIO
)] = "VIDIOC_G_AUDIO",
293 [_IOC_NR(VIDIOC_S_AUDIO
)] = "VIDIOC_S_AUDIO",
294 [_IOC_NR(VIDIOC_QUERYCTRL
)] = "VIDIOC_QUERYCTRL",
295 [_IOC_NR(VIDIOC_QUERYMENU
)] = "VIDIOC_QUERYMENU",
296 [_IOC_NR(VIDIOC_G_INPUT
)] = "VIDIOC_G_INPUT",
297 [_IOC_NR(VIDIOC_S_INPUT
)] = "VIDIOC_S_INPUT",
298 [_IOC_NR(VIDIOC_G_OUTPUT
)] = "VIDIOC_G_OUTPUT",
299 [_IOC_NR(VIDIOC_S_OUTPUT
)] = "VIDIOC_S_OUTPUT",
300 [_IOC_NR(VIDIOC_ENUMOUTPUT
)] = "VIDIOC_ENUMOUTPUT",
301 [_IOC_NR(VIDIOC_G_AUDOUT
)] = "VIDIOC_G_AUDOUT",
302 [_IOC_NR(VIDIOC_S_AUDOUT
)] = "VIDIOC_S_AUDOUT",
303 [_IOC_NR(VIDIOC_G_MODULATOR
)] = "VIDIOC_G_MODULATOR",
304 [_IOC_NR(VIDIOC_S_MODULATOR
)] = "VIDIOC_S_MODULATOR",
305 [_IOC_NR(VIDIOC_G_FREQUENCY
)] = "VIDIOC_G_FREQUENCY",
306 [_IOC_NR(VIDIOC_S_FREQUENCY
)] = "VIDIOC_S_FREQUENCY",
307 [_IOC_NR(VIDIOC_CROPCAP
)] = "VIDIOC_CROPCAP",
308 [_IOC_NR(VIDIOC_G_CROP
)] = "VIDIOC_G_CROP",
309 [_IOC_NR(VIDIOC_S_CROP
)] = "VIDIOC_S_CROP",
310 [_IOC_NR(VIDIOC_G_JPEGCOMP
)] = "VIDIOC_G_JPEGCOMP",
311 [_IOC_NR(VIDIOC_S_JPEGCOMP
)] = "VIDIOC_S_JPEGCOMP",
312 [_IOC_NR(VIDIOC_QUERYSTD
)] = "VIDIOC_QUERYSTD",
313 [_IOC_NR(VIDIOC_TRY_FMT
)] = "VIDIOC_TRY_FMT",
314 [_IOC_NR(VIDIOC_ENUMAUDIO
)] = "VIDIOC_ENUMAUDIO",
315 [_IOC_NR(VIDIOC_ENUMAUDOUT
)] = "VIDIOC_ENUMAUDOUT",
316 [_IOC_NR(VIDIOC_G_PRIORITY
)] = "VIDIOC_G_PRIORITY",
317 [_IOC_NR(VIDIOC_S_PRIORITY
)] = "VIDIOC_S_PRIORITY",
318 [_IOC_NR(VIDIOC_G_SLICED_VBI_CAP
)] = "VIDIOC_G_SLICED_VBI_CAP",
319 [_IOC_NR(VIDIOC_LOG_STATUS
)] = "VIDIOC_LOG_STATUS",
320 [_IOC_NR(VIDIOC_G_EXT_CTRLS
)] = "VIDIOC_G_EXT_CTRLS",
321 [_IOC_NR(VIDIOC_S_EXT_CTRLS
)] = "VIDIOC_S_EXT_CTRLS",
322 [_IOC_NR(VIDIOC_TRY_EXT_CTRLS
)] = "VIDIOC_TRY_EXT_CTRLS",
324 [_IOC_NR(VIDIOC_ENUM_FRAMESIZES
)] = "VIDIOC_ENUM_FRAMESIZES",
325 [_IOC_NR(VIDIOC_ENUM_FRAMEINTERVALS
)] = "VIDIOC_ENUM_FRAMEINTERVALS",
326 [_IOC_NR(VIDIOC_G_ENC_INDEX
)] = "VIDIOC_G_ENC_INDEX",
327 [_IOC_NR(VIDIOC_ENCODER_CMD
)] = "VIDIOC_ENCODER_CMD",
328 [_IOC_NR(VIDIOC_TRY_ENCODER_CMD
)] = "VIDIOC_TRY_ENCODER_CMD",
330 [_IOC_NR(VIDIOC_DBG_S_REGISTER
)] = "VIDIOC_DBG_S_REGISTER",
331 [_IOC_NR(VIDIOC_DBG_G_REGISTER
)] = "VIDIOC_DBG_G_REGISTER",
333 [_IOC_NR(VIDIOC_G_CHIP_IDENT
)] = "VIDIOC_G_CHIP_IDENT",
336 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
338 static const char *v4l2_int_ioctls
[] = {
339 #ifdef CONFIG_VIDEO_V4L1_COMPAT
340 [_IOC_NR(DECODER_GET_CAPABILITIES
)] = "DECODER_GET_CAPABILITIES",
341 [_IOC_NR(DECODER_GET_STATUS
)] = "DECODER_GET_STATUS",
342 [_IOC_NR(DECODER_SET_NORM
)] = "DECODER_SET_NORM",
343 [_IOC_NR(DECODER_SET_INPUT
)] = "DECODER_SET_INPUT",
344 [_IOC_NR(DECODER_SET_OUTPUT
)] = "DECODER_SET_OUTPUT",
345 [_IOC_NR(DECODER_ENABLE_OUTPUT
)] = "DECODER_ENABLE_OUTPUT",
346 [_IOC_NR(DECODER_SET_PICTURE
)] = "DECODER_SET_PICTURE",
347 [_IOC_NR(DECODER_SET_GPIO
)] = "DECODER_SET_GPIO",
348 [_IOC_NR(DECODER_INIT
)] = "DECODER_INIT",
349 [_IOC_NR(DECODER_SET_VBI_BYPASS
)] = "DECODER_SET_VBI_BYPASS",
350 [_IOC_NR(DECODER_DUMP
)] = "DECODER_DUMP",
352 [_IOC_NR(AUDC_SET_RADIO
)] = "AUDC_SET_RADIO",
354 [_IOC_NR(TUNER_SET_TYPE_ADDR
)] = "TUNER_SET_TYPE_ADDR",
355 [_IOC_NR(TUNER_SET_STANDBY
)] = "TUNER_SET_STANDBY",
356 [_IOC_NR(TUNER_SET_CONFIG
)] = "TUNER_SET_CONFIG",
358 [_IOC_NR(VIDIOC_INT_S_TUNER_MODE
)] = "VIDIOC_INT_S_TUNER_MODE",
359 [_IOC_NR(VIDIOC_INT_RESET
)] = "VIDIOC_INT_RESET",
360 [_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ
)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",
361 [_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE
)] = "VIDIOC_INT_DECODE_VBI_LINE",
362 [_IOC_NR(VIDIOC_INT_S_VBI_DATA
)] = "VIDIOC_INT_S_VBI_DATA",
363 [_IOC_NR(VIDIOC_INT_G_VBI_DATA
)] = "VIDIOC_INT_G_VBI_DATA",
364 [_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ
)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
365 [_IOC_NR(VIDIOC_INT_S_STANDBY
)] = "VIDIOC_INT_S_STANDBY",
366 [_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING
)] = "VIDIOC_INT_S_AUDIO_ROUTING",
367 [_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING
)] = "VIDIOC_INT_G_AUDIO_ROUTING",
368 [_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING
)] = "VIDIOC_INT_S_VIDEO_ROUTING",
369 [_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING
)] = "VIDIOC_INT_G_VIDEO_ROUTING",
370 [_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ
)] = "VIDIOC_INT_S_CRYSTAL_FREQ",
371 [_IOC_NR(VIDIOC_INT_INIT
)] = "VIDIOC_INT_INIT",
372 [_IOC_NR(VIDIOC_INT_G_STD_OUTPUT
)] = "VIDIOC_INT_G_STD_OUTPUT",
373 [_IOC_NR(VIDIOC_INT_S_STD_OUTPUT
)] = "VIDIOC_INT_S_STD_OUTPUT",
375 #define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
377 /* Common ioctl debug function. This function can be used by
378 external ioctl messages as well as internal V4L ioctl */
379 void v4l_printk_ioctl(unsigned int cmd
)
383 switch (_IOC_TYPE(cmd
)) {
385 if (_IOC_NR(cmd
) >= V4L2_INT_IOCTLS
) {
389 printk("%s", v4l2_int_ioctls
[_IOC_NR(cmd
)]);
391 #ifdef CONFIG_VIDEO_V4L1_COMPAT
393 if (_IOC_NR(cmd
) >= V4L1_IOCTLS
) {
397 printk("%s", v4l1_ioctls
[_IOC_NR(cmd
)]);
401 if (_IOC_NR(cmd
) >= V4L2_IOCTLS
) {
405 printk("%s", v4l2_ioctls
[_IOC_NR(cmd
)]);
411 switch (_IOC_DIR(cmd
)) {
412 case _IOC_NONE
: dir
= "--"; break;
413 case _IOC_READ
: dir
= "r-"; break;
414 case _IOC_WRITE
: dir
= "-w"; break;
415 case _IOC_READ
| _IOC_WRITE
: dir
= "rw"; break;
416 default: dir
= "*ERR*"; break;
418 printk("%s ioctl '%c', dir=%s, #%d (0x%08x)",
419 type
, _IOC_TYPE(cmd
), dir
, _IOC_NR(cmd
), cmd
);
421 EXPORT_SYMBOL(v4l_printk_ioctl
);
427 static ssize_t
show_name(struct device
*cd
,
428 struct device_attribute
*attr
, char *buf
)
430 struct video_device
*vfd
= container_of(cd
, struct video_device
,
432 return sprintf(buf
, "%.*s\n", (int)sizeof(vfd
->name
), vfd
->name
);
435 struct video_device
*video_device_alloc(void)
437 struct video_device
*vfd
;
439 vfd
= kzalloc(sizeof(*vfd
),GFP_KERNEL
);
442 EXPORT_SYMBOL(video_device_alloc
);
444 void video_device_release(struct video_device
*vfd
)
448 EXPORT_SYMBOL(video_device_release
);
450 static void video_release(struct device
*cd
)
452 struct video_device
*vfd
= container_of(cd
, struct video_device
,
456 /* needed until all drivers are fixed */
463 static struct device_attribute video_device_attrs
[] = {
464 __ATTR(name
, S_IRUGO
, show_name
, NULL
),
468 static struct class video_class
= {
470 .dev_attrs
= video_device_attrs
,
471 .dev_release
= video_release
,
478 static struct video_device
*video_device
[VIDEO_NUM_DEVICES
];
479 static DEFINE_MUTEX(videodev_lock
);
481 struct video_device
* video_devdata(struct file
*file
)
483 return video_device
[iminor(file
->f_path
.dentry
->d_inode
)];
485 EXPORT_SYMBOL(video_devdata
);
488 * Open a video device - FIXME: Obsoleted
490 static int video_open(struct inode
*inode
, struct file
*file
)
492 unsigned int minor
= iminor(inode
);
494 struct video_device
*vfl
;
495 const struct file_operations
*old_fops
;
497 if(minor
>=VIDEO_NUM_DEVICES
)
499 mutex_lock(&videodev_lock
);
500 vfl
=video_device
[minor
];
502 mutex_unlock(&videodev_lock
);
503 request_module("char-major-%d-%d", VIDEO_MAJOR
, minor
);
504 mutex_lock(&videodev_lock
);
505 vfl
=video_device
[minor
];
507 mutex_unlock(&videodev_lock
);
511 old_fops
= file
->f_op
;
512 file
->f_op
= fops_get(vfl
->fops
);
514 err
= file
->f_op
->open(inode
,file
);
516 fops_put(file
->f_op
);
517 file
->f_op
= fops_get(old_fops
);
520 mutex_unlock(&videodev_lock
);
525 * helper function -- handles userspace copying for ioctl arguments
530 video_fix_command(unsigned int cmd
)
533 case VIDIOC_OVERLAY_OLD
:
534 cmd
= VIDIOC_OVERLAY
;
536 case VIDIOC_S_PARM_OLD
:
539 case VIDIOC_S_CTRL_OLD
:
542 case VIDIOC_G_AUDIO_OLD
:
543 cmd
= VIDIOC_G_AUDIO
;
545 case VIDIOC_G_AUDOUT_OLD
:
546 cmd
= VIDIOC_G_AUDOUT
;
548 case VIDIOC_CROPCAP_OLD
:
549 cmd
= VIDIOC_CROPCAP
;
557 * Obsolete usercopy function - Should be removed soon
560 video_usercopy(struct inode
*inode
, struct file
*file
,
561 unsigned int cmd
, unsigned long arg
,
562 int (*func
)(struct inode
*inode
, struct file
*file
,
563 unsigned int cmd
, void *arg
))
570 size_t ctrls_size
= 0;
571 void __user
*user_ptr
= NULL
;
574 cmd
= video_fix_command(cmd
);
576 is_ext_ctrl
= (cmd
== VIDIOC_S_EXT_CTRLS
|| cmd
== VIDIOC_G_EXT_CTRLS
||
577 cmd
== VIDIOC_TRY_EXT_CTRLS
);
579 /* Copy arguments into temp kernel buffer */
580 switch (_IOC_DIR(cmd
)) {
586 case (_IOC_WRITE
| _IOC_READ
):
587 if (_IOC_SIZE(cmd
) <= sizeof(sbuf
)) {
590 /* too big to allocate from stack */
591 mbuf
= kmalloc(_IOC_SIZE(cmd
),GFP_KERNEL
);
598 if (_IOC_DIR(cmd
) & _IOC_WRITE
)
599 if (copy_from_user(parg
, (void __user
*)arg
, _IOC_SIZE(cmd
)))
604 struct v4l2_ext_controls
*p
= parg
;
606 /* In case of an error, tell the caller that it wasn't
607 a specific control that caused it. */
608 p
->error_idx
= p
->count
;
609 user_ptr
= (void __user
*)p
->controls
;
611 ctrls_size
= sizeof(struct v4l2_ext_control
) * p
->count
;
612 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
613 mbuf
= kmalloc(ctrls_size
, GFP_KERNEL
);
618 if (copy_from_user(mbuf
, user_ptr
, ctrls_size
))
625 err
= func(inode
, file
, cmd
, parg
);
626 if (err
== -ENOIOCTLCMD
)
629 struct v4l2_ext_controls
*p
= parg
;
631 p
->controls
= (void *)user_ptr
;
632 if (p
->count
&& err
== 0 && copy_to_user(user_ptr
, mbuf
, ctrls_size
))
640 /* Copy results into user buffer */
641 switch (_IOC_DIR(cmd
))
644 case (_IOC_WRITE
| _IOC_READ
):
645 if (copy_to_user((void __user
*)arg
, parg
, _IOC_SIZE(cmd
)))
654 EXPORT_SYMBOL(video_usercopy
);
657 * open/release helper functions -- handle exclusive opens
658 * Should be removed soon
660 int video_exclusive_open(struct inode
*inode
, struct file
*file
)
662 struct video_device
*vfl
= video_devdata(file
);
665 mutex_lock(&vfl
->lock
);
671 mutex_unlock(&vfl
->lock
);
674 EXPORT_SYMBOL(video_exclusive_open
);
676 int video_exclusive_release(struct inode
*inode
, struct file
*file
)
678 struct video_device
*vfl
= video_devdata(file
);
683 EXPORT_SYMBOL(video_exclusive_release
);
685 static void dbgbuf(unsigned int cmd
, struct video_device
*vfd
,
686 struct v4l2_buffer
*p
)
688 struct v4l2_timecode
*tc
=&p
->timecode
;
690 dbgarg (cmd
, "%02ld:%02d:%02d.%08ld index=%d, type=%s, "
691 "bytesused=%d, flags=0x%08d, "
692 "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx, length=%d\n",
693 (p
->timestamp
.tv_sec
/3600),
694 (int)(p
->timestamp
.tv_sec
/60)%60,
695 (int)(p
->timestamp
.tv_sec
%60),
696 p
->timestamp
.tv_usec
,
698 prt_names(p
->type
, v4l2_type_names
),
699 p
->bytesused
, p
->flags
,
700 p
->field
, p
->sequence
,
701 prt_names(p
->memory
, v4l2_memory_names
),
702 p
->m
.userptr
, p
->length
);
703 dbgarg2 ("timecode= %02d:%02d:%02d type=%d, "
704 "flags=0x%08d, frames=%d, userbits=0x%08x\n",
705 tc
->hours
,tc
->minutes
,tc
->seconds
,
706 tc
->type
, tc
->flags
, tc
->frames
, *(__u32
*) tc
->userbits
);
709 static inline void dbgrect(struct video_device
*vfd
, char *s
,
712 dbgarg2 ("%sRect start at %dx%d, size= %dx%d\n", s
, r
->left
, r
->top
,
713 r
->width
, r
->height
);
716 static inline void v4l_print_pix_fmt (struct video_device
*vfd
,
717 struct v4l2_pix_format
*fmt
)
719 dbgarg2 ("width=%d, height=%d, format=%c%c%c%c, field=%s, "
720 "bytesperline=%d sizeimage=%d, colorspace=%d\n",
721 fmt
->width
,fmt
->height
,
722 (fmt
->pixelformat
& 0xff),
723 (fmt
->pixelformat
>> 8) & 0xff,
724 (fmt
->pixelformat
>> 16) & 0xff,
725 (fmt
->pixelformat
>> 24) & 0xff,
726 prt_names(fmt
->field
, v4l2_field_names
),
727 fmt
->bytesperline
, fmt
->sizeimage
, fmt
->colorspace
);
731 static int check_fmt (struct video_device
*vfd
, enum v4l2_buf_type type
)
734 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
735 if (vfd
->vidioc_try_fmt_cap
)
738 case V4L2_BUF_TYPE_VIDEO_OVERLAY
:
739 if (vfd
->vidioc_try_fmt_overlay
)
742 case V4L2_BUF_TYPE_VBI_CAPTURE
:
743 if (vfd
->vidioc_try_fmt_vbi
)
746 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
:
747 if (vfd
->vidioc_try_fmt_vbi_output
)
750 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
:
751 if (vfd
->vidioc_try_fmt_vbi_capture
)
754 case V4L2_BUF_TYPE_VIDEO_OUTPUT
:
755 if (vfd
->vidioc_try_fmt_video_output
)
758 case V4L2_BUF_TYPE_VBI_OUTPUT
:
759 if (vfd
->vidioc_try_fmt_vbi_output
)
762 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
:
763 if (vfd
->vidioc_try_fmt_output_overlay
)
766 case V4L2_BUF_TYPE_PRIVATE
:
767 if (vfd
->vidioc_try_fmt_type_private
)
774 static int __video_do_ioctl(struct inode
*inode
, struct file
*file
,
775 unsigned int cmd
, void *arg
)
777 struct video_device
*vfd
= video_devdata(file
);
778 void *fh
= file
->private_data
;
781 if ( (vfd
->debug
& V4L2_DEBUG_IOCTL
) &&
782 !(vfd
->debug
& V4L2_DEBUG_IOCTL_ARG
)) {
783 v4l_print_ioctl(vfd
->name
, cmd
);
787 #ifdef CONFIG_VIDEO_V4L1_COMPAT
788 /***********************************************************
789 Handles calls to the obsoleted V4L1 API
790 Due to the nature of VIDIOCGMBUF, each driver that supports
791 V4L1 should implement its own handler for this ioctl.
792 ***********************************************************/
794 /* --- streaming capture ------------------------------------- */
795 if (cmd
== VIDIOCGMBUF
) {
796 struct video_mbuf
*p
=arg
;
798 memset(p
, 0, sizeof(*p
));
800 if (!vfd
->vidiocgmbuf
)
802 ret
=vfd
->vidiocgmbuf(file
, fh
, p
);
804 dbgarg (cmd
, "size=%d, frames=%d, offsets=0x%08lx\n",
806 (unsigned long)p
->offsets
);
810 /********************************************************
811 All other V4L1 calls are handled by v4l1_compat module.
812 Those calls will be translated into V4L2 calls, and
813 __video_do_ioctl will be called again, with one or more
815 ********************************************************/
816 if (_IOC_TYPE(cmd
)=='v')
817 return v4l_compat_translate_ioctl(inode
,file
,cmd
,arg
,
822 /* --- capabilities ------------------------------------------ */
823 case VIDIOC_QUERYCAP
:
825 struct v4l2_capability
*cap
= (struct v4l2_capability
*)arg
;
826 memset(cap
, 0, sizeof(*cap
));
828 if (!vfd
->vidioc_querycap
)
831 ret
=vfd
->vidioc_querycap(file
, fh
, cap
);
833 dbgarg (cmd
, "driver=%s, card=%s, bus=%s, "
835 "capabilities=0x%08x\n",
836 cap
->driver
,cap
->card
,cap
->bus_info
,
842 /* --- priority ------------------------------------------ */
843 case VIDIOC_G_PRIORITY
:
845 enum v4l2_priority
*p
=arg
;
847 if (!vfd
->vidioc_g_priority
)
849 ret
=vfd
->vidioc_g_priority(file
, fh
, p
);
851 dbgarg(cmd
, "priority is %d\n", *p
);
854 case VIDIOC_S_PRIORITY
:
856 enum v4l2_priority
*p
=arg
;
858 if (!vfd
->vidioc_s_priority
)
860 dbgarg(cmd
, "setting priority to %d\n", *p
);
861 ret
=vfd
->vidioc_s_priority(file
, fh
, *p
);
865 /* --- capture ioctls ---------------------------------------- */
866 case VIDIOC_ENUM_FMT
:
868 struct v4l2_fmtdesc
*f
= arg
;
869 enum v4l2_buf_type type
;
874 memset(f
,0,sizeof(*f
));
879 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
880 if (vfd
->vidioc_enum_fmt_cap
)
881 ret
=vfd
->vidioc_enum_fmt_cap(file
, fh
, f
);
883 case V4L2_BUF_TYPE_VIDEO_OVERLAY
:
884 if (vfd
->vidioc_enum_fmt_overlay
)
885 ret
=vfd
->vidioc_enum_fmt_overlay(file
, fh
, f
);
887 case V4L2_BUF_TYPE_VBI_CAPTURE
:
888 if (vfd
->vidioc_enum_fmt_vbi
)
889 ret
=vfd
->vidioc_enum_fmt_vbi(file
, fh
, f
);
891 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
:
892 if (vfd
->vidioc_enum_fmt_vbi_output
)
893 ret
=vfd
->vidioc_enum_fmt_vbi_output(file
,
896 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
:
897 if (vfd
->vidioc_enum_fmt_vbi_capture
)
898 ret
=vfd
->vidioc_enum_fmt_vbi_capture(file
,
901 case V4L2_BUF_TYPE_VIDEO_OUTPUT
:
902 if (vfd
->vidioc_enum_fmt_video_output
)
903 ret
=vfd
->vidioc_enum_fmt_video_output(file
,
906 case V4L2_BUF_TYPE_VBI_OUTPUT
:
907 if (vfd
->vidioc_enum_fmt_vbi_output
)
908 ret
=vfd
->vidioc_enum_fmt_vbi_output(file
,
911 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
:
912 if (vfd
->vidioc_enum_fmt_output_overlay
)
913 ret
=vfd
->vidioc_enum_fmt_output_overlay(file
, fh
, f
);
915 case V4L2_BUF_TYPE_PRIVATE
:
916 if (vfd
->vidioc_enum_fmt_type_private
)
917 ret
=vfd
->vidioc_enum_fmt_type_private(file
,
922 dbgarg (cmd
, "index=%d, type=%d, flags=%d, "
923 "pixelformat=%c%c%c%c, description='%s'\n",
924 f
->index
, f
->type
, f
->flags
,
925 (f
->pixelformat
& 0xff),
926 (f
->pixelformat
>> 8) & 0xff,
927 (f
->pixelformat
>> 16) & 0xff,
928 (f
->pixelformat
>> 24) & 0xff,
934 struct v4l2_format
*f
= (struct v4l2_format
*)arg
;
935 enum v4l2_buf_type type
=f
->type
;
937 memset(&f
->fmt
.pix
,0,sizeof(f
->fmt
.pix
));
940 /* FIXME: Should be one dump per type */
941 dbgarg (cmd
, "type=%s\n", prt_names(type
,
945 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
946 if (vfd
->vidioc_g_fmt_cap
)
947 ret
=vfd
->vidioc_g_fmt_cap(file
, fh
, f
);
949 v4l_print_pix_fmt(vfd
,&f
->fmt
.pix
);
951 case V4L2_BUF_TYPE_VIDEO_OVERLAY
:
952 if (vfd
->vidioc_g_fmt_overlay
)
953 ret
=vfd
->vidioc_g_fmt_overlay(file
, fh
, f
);
955 case V4L2_BUF_TYPE_VBI_CAPTURE
:
956 if (vfd
->vidioc_g_fmt_vbi
)
957 ret
=vfd
->vidioc_g_fmt_vbi(file
, fh
, f
);
959 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
:
960 if (vfd
->vidioc_g_fmt_vbi_output
)
961 ret
=vfd
->vidioc_g_fmt_vbi_output(file
, fh
, f
);
963 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
:
964 if (vfd
->vidioc_g_fmt_vbi_capture
)
965 ret
=vfd
->vidioc_g_fmt_vbi_capture(file
, fh
, f
);
967 case V4L2_BUF_TYPE_VIDEO_OUTPUT
:
968 if (vfd
->vidioc_g_fmt_video_output
)
969 ret
=vfd
->vidioc_g_fmt_video_output(file
,
972 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
:
973 if (vfd
->vidioc_g_fmt_output_overlay
)
974 ret
=vfd
->vidioc_g_fmt_output_overlay(file
, fh
, f
);
976 case V4L2_BUF_TYPE_VBI_OUTPUT
:
977 if (vfd
->vidioc_g_fmt_vbi_output
)
978 ret
=vfd
->vidioc_g_fmt_vbi_output(file
, fh
, f
);
980 case V4L2_BUF_TYPE_PRIVATE
:
981 if (vfd
->vidioc_g_fmt_type_private
)
982 ret
=vfd
->vidioc_g_fmt_type_private(file
,
991 struct v4l2_format
*f
= (struct v4l2_format
*)arg
;
993 /* FIXME: Should be one dump per type */
994 dbgarg (cmd
, "type=%s\n", prt_names(f
->type
,
998 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
999 v4l_print_pix_fmt(vfd
,&f
->fmt
.pix
);
1000 if (vfd
->vidioc_s_fmt_cap
)
1001 ret
=vfd
->vidioc_s_fmt_cap(file
, fh
, f
);
1003 case V4L2_BUF_TYPE_VIDEO_OVERLAY
:
1004 if (vfd
->vidioc_s_fmt_overlay
)
1005 ret
=vfd
->vidioc_s_fmt_overlay(file
, fh
, f
);
1007 case V4L2_BUF_TYPE_VBI_CAPTURE
:
1008 if (vfd
->vidioc_s_fmt_vbi
)
1009 ret
=vfd
->vidioc_s_fmt_vbi(file
, fh
, f
);
1011 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
:
1012 if (vfd
->vidioc_s_fmt_vbi_output
)
1013 ret
=vfd
->vidioc_s_fmt_vbi_output(file
, fh
, f
);
1015 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
:
1016 if (vfd
->vidioc_s_fmt_vbi_capture
)
1017 ret
=vfd
->vidioc_s_fmt_vbi_capture(file
, fh
, f
);
1019 case V4L2_BUF_TYPE_VIDEO_OUTPUT
:
1020 if (vfd
->vidioc_s_fmt_video_output
)
1021 ret
=vfd
->vidioc_s_fmt_video_output(file
,
1024 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
:
1025 if (vfd
->vidioc_s_fmt_output_overlay
)
1026 ret
=vfd
->vidioc_s_fmt_output_overlay(file
, fh
, f
);
1028 case V4L2_BUF_TYPE_VBI_OUTPUT
:
1029 if (vfd
->vidioc_s_fmt_vbi_output
)
1030 ret
=vfd
->vidioc_s_fmt_vbi_output(file
,
1033 case V4L2_BUF_TYPE_PRIVATE
:
1034 if (vfd
->vidioc_s_fmt_type_private
)
1035 ret
=vfd
->vidioc_s_fmt_type_private(file
,
1041 case VIDIOC_TRY_FMT
:
1043 struct v4l2_format
*f
= (struct v4l2_format
*)arg
;
1045 /* FIXME: Should be one dump per type */
1046 dbgarg (cmd
, "type=%s\n", prt_names(f
->type
,
1049 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
1050 if (vfd
->vidioc_try_fmt_cap
)
1051 ret
=vfd
->vidioc_try_fmt_cap(file
, fh
, f
);
1053 v4l_print_pix_fmt(vfd
,&f
->fmt
.pix
);
1055 case V4L2_BUF_TYPE_VIDEO_OVERLAY
:
1056 if (vfd
->vidioc_try_fmt_overlay
)
1057 ret
=vfd
->vidioc_try_fmt_overlay(file
, fh
, f
);
1059 case V4L2_BUF_TYPE_VBI_CAPTURE
:
1060 if (vfd
->vidioc_try_fmt_vbi
)
1061 ret
=vfd
->vidioc_try_fmt_vbi(file
, fh
, f
);
1063 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
:
1064 if (vfd
->vidioc_try_fmt_vbi_output
)
1065 ret
=vfd
->vidioc_try_fmt_vbi_output(file
,
1068 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
:
1069 if (vfd
->vidioc_try_fmt_vbi_capture
)
1070 ret
=vfd
->vidioc_try_fmt_vbi_capture(file
,
1073 case V4L2_BUF_TYPE_VIDEO_OUTPUT
:
1074 if (vfd
->vidioc_try_fmt_video_output
)
1075 ret
=vfd
->vidioc_try_fmt_video_output(file
,
1078 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
:
1079 if (vfd
->vidioc_try_fmt_output_overlay
)
1080 ret
=vfd
->vidioc_try_fmt_output_overlay(file
, fh
, f
);
1082 case V4L2_BUF_TYPE_VBI_OUTPUT
:
1083 if (vfd
->vidioc_try_fmt_vbi_output
)
1084 ret
=vfd
->vidioc_try_fmt_vbi_output(file
,
1087 case V4L2_BUF_TYPE_PRIVATE
:
1088 if (vfd
->vidioc_try_fmt_type_private
)
1089 ret
=vfd
->vidioc_try_fmt_type_private(file
,
1096 /* FIXME: Those buf reqs could be handled here,
1097 with some changes on videobuf to allow its header to be included at
1098 videodev2.h or being merged at videodev2.
1100 case VIDIOC_REQBUFS
:
1102 struct v4l2_requestbuffers
*p
=arg
;
1104 if (!vfd
->vidioc_reqbufs
)
1106 ret
= check_fmt (vfd
, p
->type
);
1110 ret
=vfd
->vidioc_reqbufs(file
, fh
, p
);
1111 dbgarg (cmd
, "count=%d, type=%s, memory=%s\n",
1113 prt_names(p
->type
, v4l2_type_names
),
1114 prt_names(p
->memory
, v4l2_memory_names
));
1117 case VIDIOC_QUERYBUF
:
1119 struct v4l2_buffer
*p
=arg
;
1121 if (!vfd
->vidioc_querybuf
)
1123 ret
= check_fmt (vfd
, p
->type
);
1127 ret
=vfd
->vidioc_querybuf(file
, fh
, p
);
1134 struct v4l2_buffer
*p
=arg
;
1136 if (!vfd
->vidioc_qbuf
)
1138 ret
= check_fmt (vfd
, p
->type
);
1142 ret
=vfd
->vidioc_qbuf(file
, fh
, p
);
1149 struct v4l2_buffer
*p
=arg
;
1150 if (!vfd
->vidioc_dqbuf
)
1152 ret
= check_fmt (vfd
, p
->type
);
1156 ret
=vfd
->vidioc_dqbuf(file
, fh
, p
);
1161 case VIDIOC_OVERLAY
:
1165 if (!vfd
->vidioc_overlay
)
1167 dbgarg (cmd
, "value=%d\n",*i
);
1168 ret
=vfd
->vidioc_overlay(file
, fh
, *i
);
1173 struct v4l2_framebuffer
*p
=arg
;
1174 if (!vfd
->vidioc_g_fbuf
)
1176 ret
=vfd
->vidioc_g_fbuf(file
, fh
, arg
);
1178 dbgarg (cmd
, "capability=%d, flags=%d, base=0x%08lx\n",
1179 p
->capability
,p
->flags
,
1180 (unsigned long)p
->base
);
1181 v4l_print_pix_fmt (vfd
, &p
->fmt
);
1187 struct v4l2_framebuffer
*p
=arg
;
1188 if (!vfd
->vidioc_s_fbuf
)
1191 dbgarg (cmd
, "capability=%d, flags=%d, base=0x%08lx\n",
1192 p
->capability
,p
->flags
,(unsigned long)p
->base
);
1193 v4l_print_pix_fmt (vfd
, &p
->fmt
);
1194 ret
=vfd
->vidioc_s_fbuf(file
, fh
, arg
);
1198 case VIDIOC_STREAMON
:
1200 enum v4l2_buf_type i
= *(int *)arg
;
1201 if (!vfd
->vidioc_streamon
)
1203 dbgarg(cmd
, "type=%s\n", prt_names(i
, v4l2_type_names
));
1204 ret
=vfd
->vidioc_streamon(file
, fh
,i
);
1207 case VIDIOC_STREAMOFF
:
1209 enum v4l2_buf_type i
= *(int *)arg
;
1211 if (!vfd
->vidioc_streamoff
)
1213 dbgarg(cmd
, "type=%s\n", prt_names(i
, v4l2_type_names
));
1214 ret
=vfd
->vidioc_streamoff(file
, fh
, i
);
1217 /* ---------- tv norms ---------- */
1218 case VIDIOC_ENUMSTD
:
1220 struct v4l2_standard
*p
= arg
;
1221 v4l2_std_id id
= vfd
->tvnorms
,curr_id
=0;
1222 unsigned int index
= p
->index
,i
;
1229 /* Return norm array on a canonical way */
1230 for (i
=0;i
<= index
&& id
; i
++) {
1231 if ( (id
& V4L2_STD_PAL
) == V4L2_STD_PAL
) {
1232 curr_id
= V4L2_STD_PAL
;
1233 } else if ( (id
& V4L2_STD_PAL_BG
) == V4L2_STD_PAL_BG
) {
1234 curr_id
= V4L2_STD_PAL_BG
;
1235 } else if ( (id
& V4L2_STD_PAL_DK
) == V4L2_STD_PAL_DK
) {
1236 curr_id
= V4L2_STD_PAL_DK
;
1237 } else if ( (id
& V4L2_STD_PAL_B
) == V4L2_STD_PAL_B
) {
1238 curr_id
= V4L2_STD_PAL_B
;
1239 } else if ( (id
& V4L2_STD_PAL_B1
) == V4L2_STD_PAL_B1
) {
1240 curr_id
= V4L2_STD_PAL_B1
;
1241 } else if ( (id
& V4L2_STD_PAL_G
) == V4L2_STD_PAL_G
) {
1242 curr_id
= V4L2_STD_PAL_G
;
1243 } else if ( (id
& V4L2_STD_PAL_H
) == V4L2_STD_PAL_H
) {
1244 curr_id
= V4L2_STD_PAL_H
;
1245 } else if ( (id
& V4L2_STD_PAL_I
) == V4L2_STD_PAL_I
) {
1246 curr_id
= V4L2_STD_PAL_I
;
1247 } else if ( (id
& V4L2_STD_PAL_D
) == V4L2_STD_PAL_D
) {
1248 curr_id
= V4L2_STD_PAL_D
;
1249 } else if ( (id
& V4L2_STD_PAL_D1
) == V4L2_STD_PAL_D1
) {
1250 curr_id
= V4L2_STD_PAL_D1
;
1251 } else if ( (id
& V4L2_STD_PAL_K
) == V4L2_STD_PAL_K
) {
1252 curr_id
= V4L2_STD_PAL_K
;
1253 } else if ( (id
& V4L2_STD_PAL_M
) == V4L2_STD_PAL_M
) {
1254 curr_id
= V4L2_STD_PAL_M
;
1255 } else if ( (id
& V4L2_STD_PAL_N
) == V4L2_STD_PAL_N
) {
1256 curr_id
= V4L2_STD_PAL_N
;
1257 } else if ( (id
& V4L2_STD_PAL_Nc
) == V4L2_STD_PAL_Nc
) {
1258 curr_id
= V4L2_STD_PAL_Nc
;
1259 } else if ( (id
& V4L2_STD_PAL_60
) == V4L2_STD_PAL_60
) {
1260 curr_id
= V4L2_STD_PAL_60
;
1261 } else if ( (id
& V4L2_STD_NTSC
) == V4L2_STD_NTSC
) {
1262 curr_id
= V4L2_STD_NTSC
;
1263 } else if ( (id
& V4L2_STD_NTSC_M
) == V4L2_STD_NTSC_M
) {
1264 curr_id
= V4L2_STD_NTSC_M
;
1265 } else if ( (id
& V4L2_STD_NTSC_M_JP
) == V4L2_STD_NTSC_M_JP
) {
1266 curr_id
= V4L2_STD_NTSC_M_JP
;
1267 } else if ( (id
& V4L2_STD_NTSC_443
) == V4L2_STD_NTSC_443
) {
1268 curr_id
= V4L2_STD_NTSC_443
;
1269 } else if ( (id
& V4L2_STD_NTSC_M_KR
) == V4L2_STD_NTSC_M_KR
) {
1270 curr_id
= V4L2_STD_NTSC_M_KR
;
1271 } else if ( (id
& V4L2_STD_SECAM
) == V4L2_STD_SECAM
) {
1272 curr_id
= V4L2_STD_SECAM
;
1273 } else if ( (id
& V4L2_STD_SECAM_DK
) == V4L2_STD_SECAM_DK
) {
1274 curr_id
= V4L2_STD_SECAM_DK
;
1275 } else if ( (id
& V4L2_STD_SECAM_B
) == V4L2_STD_SECAM_B
) {
1276 curr_id
= V4L2_STD_SECAM_B
;
1277 } else if ( (id
& V4L2_STD_SECAM_D
) == V4L2_STD_SECAM_D
) {
1278 curr_id
= V4L2_STD_SECAM_D
;
1279 } else if ( (id
& V4L2_STD_SECAM_G
) == V4L2_STD_SECAM_G
) {
1280 curr_id
= V4L2_STD_SECAM_G
;
1281 } else if ( (id
& V4L2_STD_SECAM_H
) == V4L2_STD_SECAM_H
) {
1282 curr_id
= V4L2_STD_SECAM_H
;
1283 } else if ( (id
& V4L2_STD_SECAM_K
) == V4L2_STD_SECAM_K
) {
1284 curr_id
= V4L2_STD_SECAM_K
;
1285 } else if ( (id
& V4L2_STD_SECAM_K1
) == V4L2_STD_SECAM_K1
) {
1286 curr_id
= V4L2_STD_SECAM_K1
;
1287 } else if ( (id
& V4L2_STD_SECAM_L
) == V4L2_STD_SECAM_L
) {
1288 curr_id
= V4L2_STD_SECAM_L
;
1289 } else if ( (id
& V4L2_STD_SECAM_LC
) == V4L2_STD_SECAM_LC
) {
1290 curr_id
= V4L2_STD_SECAM_LC
;
1299 v4l2_video_std_construct(p
, curr_id
,v4l2_norm_to_name(curr_id
));
1302 dbgarg (cmd
, "index=%d, id=%Ld, name=%s, fps=%d/%d, "
1303 "framelines=%d\n", p
->index
,
1304 (unsigned long long)p
->id
, p
->name
,
1305 p
->frameperiod
.numerator
,
1306 p
->frameperiod
.denominator
,
1314 v4l2_std_id
*id
= arg
;
1316 *id
= vfd
->current_norm
;
1318 dbgarg (cmd
, "value=%08Lx\n", (long long unsigned) *id
);
1325 v4l2_std_id
*id
= arg
,norm
;
1327 dbgarg (cmd
, "value=%08Lx\n", (long long unsigned) *id
);
1329 norm
= (*id
) & vfd
->tvnorms
;
1330 if ( vfd
->tvnorms
&& !norm
) /* Check if std is supported */
1333 /* Calls the specific handler */
1334 if (vfd
->vidioc_s_std
)
1335 ret
=vfd
->vidioc_s_std(file
, fh
, &norm
);
1339 /* Updates standard information */
1341 vfd
->current_norm
=norm
;
1345 case VIDIOC_QUERYSTD
:
1349 if (!vfd
->vidioc_querystd
)
1351 ret
=vfd
->vidioc_querystd(file
, fh
, arg
);
1353 dbgarg (cmd
, "detected std=%08Lx\n",
1354 (unsigned long long)*p
);
1357 /* ------ input switching ---------- */
1358 /* FIXME: Inputs can be handled inside videodev2 */
1359 case VIDIOC_ENUMINPUT
:
1361 struct v4l2_input
*p
=arg
;
1364 if (!vfd
->vidioc_enum_input
)
1366 memset(p
, 0, sizeof(*p
));
1369 ret
=vfd
->vidioc_enum_input(file
, fh
, p
);
1371 dbgarg (cmd
, "index=%d, name=%s, type=%d, "
1373 "tuner=%d, std=%08Lx, status=%d\n",
1374 p
->index
,p
->name
,p
->type
,p
->audioset
,
1376 (unsigned long long)p
->std
,
1380 case VIDIOC_G_INPUT
:
1382 unsigned int *i
= arg
;
1384 if (!vfd
->vidioc_g_input
)
1386 ret
=vfd
->vidioc_g_input(file
, fh
, i
);
1388 dbgarg (cmd
, "value=%d\n",*i
);
1391 case VIDIOC_S_INPUT
:
1393 unsigned int *i
= arg
;
1395 if (!vfd
->vidioc_s_input
)
1397 dbgarg (cmd
, "value=%d\n",*i
);
1398 ret
=vfd
->vidioc_s_input(file
, fh
, *i
);
1402 /* ------ output switching ---------- */
1403 case VIDIOC_G_OUTPUT
:
1405 unsigned int *i
= arg
;
1407 if (!vfd
->vidioc_g_output
)
1409 ret
=vfd
->vidioc_g_output(file
, fh
, i
);
1411 dbgarg (cmd
, "value=%d\n",*i
);
1414 case VIDIOC_S_OUTPUT
:
1416 unsigned int *i
= arg
;
1418 if (!vfd
->vidioc_s_output
)
1420 dbgarg (cmd
, "value=%d\n",*i
);
1421 ret
=vfd
->vidioc_s_output(file
, fh
, *i
);
1425 /* --- controls ---------------------------------------------- */
1426 case VIDIOC_QUERYCTRL
:
1428 struct v4l2_queryctrl
*p
=arg
;
1430 if (!vfd
->vidioc_queryctrl
)
1432 ret
=vfd
->vidioc_queryctrl(file
, fh
, p
);
1435 dbgarg (cmd
, "id=%d, type=%d, name=%s, "
1437 " step=%d, default=%d, flags=0x%08x\n",
1438 p
->id
,p
->type
,p
->name
,p
->minimum
,
1439 p
->maximum
,p
->step
,p
->default_value
,
1445 struct v4l2_control
*p
= arg
;
1447 if (!vfd
->vidioc_g_ctrl
)
1449 dbgarg(cmd
, "Enum for index=%d\n", p
->id
);
1451 ret
=vfd
->vidioc_g_ctrl(file
, fh
, p
);
1453 dbgarg2 ( "id=%d, value=%d\n", p
->id
, p
->value
);
1458 struct v4l2_control
*p
= arg
;
1460 if (!vfd
->vidioc_s_ctrl
)
1462 dbgarg (cmd
, "id=%d, value=%d\n", p
->id
, p
->value
);
1464 ret
=vfd
->vidioc_s_ctrl(file
, fh
, p
);
1467 case VIDIOC_G_EXT_CTRLS
:
1469 struct v4l2_ext_controls
*p
= arg
;
1471 if (vfd
->vidioc_g_ext_ctrls
) {
1472 dbgarg(cmd
, "count=%d\n", p
->count
);
1474 ret
=vfd
->vidioc_g_ext_ctrls(file
, fh
, p
);
1478 case VIDIOC_S_EXT_CTRLS
:
1480 struct v4l2_ext_controls
*p
= arg
;
1482 if (vfd
->vidioc_s_ext_ctrls
) {
1483 dbgarg(cmd
, "count=%d\n", p
->count
);
1485 ret
=vfd
->vidioc_s_ext_ctrls(file
, fh
, p
);
1489 case VIDIOC_TRY_EXT_CTRLS
:
1491 struct v4l2_ext_controls
*p
= arg
;
1493 if (vfd
->vidioc_try_ext_ctrls
) {
1494 dbgarg(cmd
, "count=%d\n", p
->count
);
1496 ret
=vfd
->vidioc_try_ext_ctrls(file
, fh
, p
);
1500 case VIDIOC_QUERYMENU
:
1502 struct v4l2_querymenu
*p
=arg
;
1503 if (!vfd
->vidioc_querymenu
)
1505 ret
=vfd
->vidioc_querymenu(file
, fh
, p
);
1507 dbgarg (cmd
, "id=%d, index=%d, name=%s\n",
1508 p
->id
,p
->index
,p
->name
);
1511 /* --- audio ---------------------------------------------- */
1512 case VIDIOC_ENUMAUDIO
:
1514 struct v4l2_audio
*p
=arg
;
1516 if (!vfd
->vidioc_enumaudio
)
1518 dbgarg(cmd
, "Enum for index=%d\n", p
->index
);
1519 ret
=vfd
->vidioc_enumaudio(file
, fh
, p
);
1521 dbgarg2("index=%d, name=%s, capability=%d, "
1522 "mode=%d\n",p
->index
,p
->name
,
1523 p
->capability
, p
->mode
);
1526 case VIDIOC_G_AUDIO
:
1528 struct v4l2_audio
*p
=arg
;
1529 __u32 index
=p
->index
;
1531 if (!vfd
->vidioc_g_audio
)
1534 memset(p
,0,sizeof(*p
));
1536 dbgarg(cmd
, "Get for index=%d\n", p
->index
);
1537 ret
=vfd
->vidioc_g_audio(file
, fh
, p
);
1539 dbgarg2("index=%d, name=%s, capability=%d, "
1540 "mode=%d\n",p
->index
,
1541 p
->name
,p
->capability
, p
->mode
);
1544 case VIDIOC_S_AUDIO
:
1546 struct v4l2_audio
*p
=arg
;
1548 if (!vfd
->vidioc_s_audio
)
1550 dbgarg(cmd
, "index=%d, name=%s, capability=%d, "
1551 "mode=%d\n", p
->index
, p
->name
,
1552 p
->capability
, p
->mode
);
1553 ret
=vfd
->vidioc_s_audio(file
, fh
, p
);
1556 case VIDIOC_ENUMAUDOUT
:
1558 struct v4l2_audioout
*p
=arg
;
1560 if (!vfd
->vidioc_enumaudout
)
1562 dbgarg(cmd
, "Enum for index=%d\n", p
->index
);
1563 ret
=vfd
->vidioc_enumaudout(file
, fh
, p
);
1565 dbgarg2("index=%d, name=%s, capability=%d, "
1566 "mode=%d\n", p
->index
, p
->name
,
1567 p
->capability
,p
->mode
);
1570 case VIDIOC_G_AUDOUT
:
1572 struct v4l2_audioout
*p
=arg
;
1574 if (!vfd
->vidioc_g_audout
)
1576 dbgarg(cmd
, "Enum for index=%d\n", p
->index
);
1577 ret
=vfd
->vidioc_g_audout(file
, fh
, p
);
1579 dbgarg2("index=%d, name=%s, capability=%d, "
1580 "mode=%d\n", p
->index
, p
->name
,
1581 p
->capability
,p
->mode
);
1584 case VIDIOC_S_AUDOUT
:
1586 struct v4l2_audioout
*p
=arg
;
1588 if (!vfd
->vidioc_s_audout
)
1590 dbgarg(cmd
, "index=%d, name=%s, capability=%d, "
1591 "mode=%d\n", p
->index
, p
->name
,
1592 p
->capability
,p
->mode
);
1594 ret
=vfd
->vidioc_s_audout(file
, fh
, p
);
1597 case VIDIOC_G_MODULATOR
:
1599 struct v4l2_modulator
*p
=arg
;
1600 if (!vfd
->vidioc_g_modulator
)
1602 ret
=vfd
->vidioc_g_modulator(file
, fh
, p
);
1604 dbgarg(cmd
, "index=%d, name=%s, "
1605 "capability=%d, rangelow=%d,"
1606 " rangehigh=%d, txsubchans=%d\n",
1607 p
->index
, p
->name
,p
->capability
,
1608 p
->rangelow
, p
->rangehigh
,
1612 case VIDIOC_S_MODULATOR
:
1614 struct v4l2_modulator
*p
=arg
;
1615 if (!vfd
->vidioc_s_modulator
)
1617 dbgarg(cmd
, "index=%d, name=%s, capability=%d, "
1618 "rangelow=%d, rangehigh=%d, txsubchans=%d\n",
1619 p
->index
, p
->name
,p
->capability
,p
->rangelow
,
1620 p
->rangehigh
,p
->txsubchans
);
1621 ret
=vfd
->vidioc_s_modulator(file
, fh
, p
);
1626 struct v4l2_crop
*p
=arg
;
1627 if (!vfd
->vidioc_g_crop
)
1629 ret
=vfd
->vidioc_g_crop(file
, fh
, p
);
1631 dbgarg(cmd
, "type=%d\n", p
->type
);
1632 dbgrect(vfd
, "", &p
->c
);
1638 struct v4l2_crop
*p
=arg
;
1639 if (!vfd
->vidioc_s_crop
)
1641 dbgarg(cmd
, "type=%d\n", p
->type
);
1642 dbgrect(vfd
, "", &p
->c
);
1643 ret
=vfd
->vidioc_s_crop(file
, fh
, p
);
1646 case VIDIOC_CROPCAP
:
1648 struct v4l2_cropcap
*p
=arg
;
1649 /*FIXME: Should also show v4l2_fract pixelaspect */
1650 if (!vfd
->vidioc_cropcap
)
1652 dbgarg(cmd
, "type=%d\n", p
->type
);
1653 dbgrect(vfd
, "bounds ", &p
->bounds
);
1654 dbgrect(vfd
, "defrect ", &p
->defrect
);
1655 ret
=vfd
->vidioc_cropcap(file
, fh
, p
);
1658 case VIDIOC_G_JPEGCOMP
:
1660 struct v4l2_jpegcompression
*p
=arg
;
1661 if (!vfd
->vidioc_g_jpegcomp
)
1663 ret
=vfd
->vidioc_g_jpegcomp(file
, fh
, p
);
1665 dbgarg (cmd
, "quality=%d, APPn=%d, "
1666 "APP_len=%d, COM_len=%d, "
1667 "jpeg_markers=%d\n",
1668 p
->quality
,p
->APPn
,p
->APP_len
,
1669 p
->COM_len
,p
->jpeg_markers
);
1672 case VIDIOC_S_JPEGCOMP
:
1674 struct v4l2_jpegcompression
*p
=arg
;
1675 if (!vfd
->vidioc_g_jpegcomp
)
1677 dbgarg (cmd
, "quality=%d, APPn=%d, APP_len=%d, "
1678 "COM_len=%d, jpeg_markers=%d\n",
1679 p
->quality
,p
->APPn
,p
->APP_len
,
1680 p
->COM_len
,p
->jpeg_markers
);
1681 ret
=vfd
->vidioc_s_jpegcomp(file
, fh
, p
);
1684 case VIDIOC_G_ENC_INDEX
:
1686 struct v4l2_enc_idx
*p
=arg
;
1688 if (!vfd
->vidioc_g_enc_index
)
1690 ret
=vfd
->vidioc_g_enc_index(file
, fh
, p
);
1692 dbgarg (cmd
, "entries=%d, entries_cap=%d\n",
1693 p
->entries
,p
->entries_cap
);
1696 case VIDIOC_ENCODER_CMD
:
1698 struct v4l2_encoder_cmd
*p
=arg
;
1700 if (!vfd
->vidioc_encoder_cmd
)
1702 ret
=vfd
->vidioc_encoder_cmd(file
, fh
, p
);
1704 dbgarg (cmd
, "cmd=%d, flags=%d\n",
1708 case VIDIOC_TRY_ENCODER_CMD
:
1710 struct v4l2_encoder_cmd
*p
=arg
;
1712 if (!vfd
->vidioc_try_encoder_cmd
)
1714 ret
=vfd
->vidioc_try_encoder_cmd(file
, fh
, p
);
1716 dbgarg (cmd
, "cmd=%d, flags=%d\n",
1722 struct v4l2_streamparm
*p
=arg
;
1725 memset(p
,0,sizeof(*p
));
1728 if (vfd
->vidioc_g_parm
) {
1729 ret
=vfd
->vidioc_g_parm(file
, fh
, p
);
1731 struct v4l2_standard s
;
1733 if (p
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1736 v4l2_video_std_construct(&s
, vfd
->current_norm
,
1737 v4l2_norm_to_name(vfd
->current_norm
));
1739 p
->parm
.capture
.timeperframe
= s
.frameperiod
;
1743 dbgarg (cmd
, "type=%d\n", p
->type
);
1748 struct v4l2_streamparm
*p
=arg
;
1749 if (!vfd
->vidioc_s_parm
)
1751 dbgarg (cmd
, "type=%d\n", p
->type
);
1752 ret
=vfd
->vidioc_s_parm(file
, fh
, p
);
1755 case VIDIOC_G_TUNER
:
1757 struct v4l2_tuner
*p
=arg
;
1758 __u32 index
=p
->index
;
1760 if (!vfd
->vidioc_g_tuner
)
1763 memset(p
,0,sizeof(*p
));
1766 ret
=vfd
->vidioc_g_tuner(file
, fh
, p
);
1768 dbgarg (cmd
, "index=%d, name=%s, type=%d, "
1769 "capability=%d, rangelow=%d, "
1770 "rangehigh=%d, signal=%d, afc=%d, "
1771 "rxsubchans=%d, audmode=%d\n",
1772 p
->index
, p
->name
, p
->type
,
1773 p
->capability
, p
->rangelow
,
1774 p
->rangehigh
, p
->rxsubchans
,
1775 p
->audmode
, p
->signal
, p
->afc
);
1778 case VIDIOC_S_TUNER
:
1780 struct v4l2_tuner
*p
=arg
;
1781 if (!vfd
->vidioc_s_tuner
)
1783 dbgarg (cmd
, "index=%d, name=%s, type=%d, "
1784 "capability=%d, rangelow=%d, rangehigh=%d, "
1785 "signal=%d, afc=%d, rxsubchans=%d, "
1786 "audmode=%d\n",p
->index
, p
->name
, p
->type
,
1787 p
->capability
, p
->rangelow
,p
->rangehigh
,
1788 p
->rxsubchans
, p
->audmode
, p
->signal
,
1790 ret
=vfd
->vidioc_s_tuner(file
, fh
, p
);
1793 case VIDIOC_G_FREQUENCY
:
1795 struct v4l2_frequency
*p
=arg
;
1796 if (!vfd
->vidioc_g_frequency
)
1799 memset(p
,0,sizeof(*p
));
1801 ret
=vfd
->vidioc_g_frequency(file
, fh
, p
);
1803 dbgarg (cmd
, "tuner=%d, type=%d, frequency=%d\n",
1804 p
->tuner
,p
->type
,p
->frequency
);
1807 case VIDIOC_S_FREQUENCY
:
1809 struct v4l2_frequency
*p
=arg
;
1810 if (!vfd
->vidioc_s_frequency
)
1812 dbgarg (cmd
, "tuner=%d, type=%d, frequency=%d\n",
1813 p
->tuner
,p
->type
,p
->frequency
);
1814 ret
=vfd
->vidioc_s_frequency(file
, fh
, p
);
1817 case VIDIOC_G_SLICED_VBI_CAP
:
1819 struct v4l2_sliced_vbi_cap
*p
=arg
;
1820 if (!vfd
->vidioc_g_sliced_vbi_cap
)
1822 ret
=vfd
->vidioc_g_sliced_vbi_cap(file
, fh
, p
);
1824 dbgarg (cmd
, "service_set=%d\n", p
->service_set
);
1827 case VIDIOC_LOG_STATUS
:
1829 if (!vfd
->vidioc_log_status
)
1831 ret
=vfd
->vidioc_log_status(file
, fh
);
1834 #ifdef CONFIG_VIDEO_ADV_DEBUG
1835 case VIDIOC_DBG_G_REGISTER
:
1837 struct v4l2_register
*p
=arg
;
1838 if (!capable(CAP_SYS_ADMIN
))
1840 else if (vfd
->vidioc_g_register
)
1841 ret
=vfd
->vidioc_g_register(file
, fh
, p
);
1844 case VIDIOC_DBG_S_REGISTER
:
1846 struct v4l2_register
*p
=arg
;
1847 if (!capable(CAP_SYS_ADMIN
))
1849 else if (vfd
->vidioc_s_register
)
1850 ret
=vfd
->vidioc_s_register(file
, fh
, p
);
1854 case VIDIOC_G_CHIP_IDENT
:
1856 struct v4l2_chip_ident
*p
=arg
;
1857 if (!vfd
->vidioc_g_chip_ident
)
1859 ret
=vfd
->vidioc_g_chip_ident(file
, fh
, p
);
1861 dbgarg (cmd
, "chip_ident=%u, revision=0x%x\n", p
->ident
, p
->revision
);
1866 if (!vfd
->vidioc_default
)
1868 ret
= vfd
->vidioc_default(file
, fh
, cmd
, arg
);
1873 if (vfd
->debug
& V4L2_DEBUG_IOCTL_ARG
) {
1875 printk("%s: err: on ", vfd
->name
);
1876 v4l_print_ioctl(vfd
->name
, cmd
);
1884 int video_ioctl2 (struct inode
*inode
, struct file
*file
,
1885 unsigned int cmd
, unsigned long arg
)
1892 size_t ctrls_size
= 0;
1893 void __user
*user_ptr
= NULL
;
1895 #ifdef __OLD_VIDIOC_
1896 cmd
= video_fix_command(cmd
);
1898 is_ext_ctrl
= (cmd
== VIDIOC_S_EXT_CTRLS
|| cmd
== VIDIOC_G_EXT_CTRLS
||
1899 cmd
== VIDIOC_TRY_EXT_CTRLS
);
1901 /* Copy arguments into temp kernel buffer */
1902 switch (_IOC_DIR(cmd
)) {
1908 case (_IOC_WRITE
| _IOC_READ
):
1909 if (_IOC_SIZE(cmd
) <= sizeof(sbuf
)) {
1912 /* too big to allocate from stack */
1913 mbuf
= kmalloc(_IOC_SIZE(cmd
),GFP_KERNEL
);
1920 if (_IOC_DIR(cmd
) & _IOC_WRITE
)
1921 if (copy_from_user(parg
, (void __user
*)arg
, _IOC_SIZE(cmd
)))
1927 struct v4l2_ext_controls
*p
= parg
;
1929 /* In case of an error, tell the caller that it wasn't
1930 a specific control that caused it. */
1931 p
->error_idx
= p
->count
;
1932 user_ptr
= (void __user
*)p
->controls
;
1934 ctrls_size
= sizeof(struct v4l2_ext_control
) * p
->count
;
1935 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
1936 mbuf
= kmalloc(ctrls_size
, GFP_KERNEL
);
1941 if (copy_from_user(mbuf
, user_ptr
, ctrls_size
))
1948 err
= __video_do_ioctl(inode
, file
, cmd
, parg
);
1949 if (err
== -ENOIOCTLCMD
)
1952 struct v4l2_ext_controls
*p
= parg
;
1954 p
->controls
= (void *)user_ptr
;
1955 if (p
->count
&& err
== 0 && copy_to_user(user_ptr
, mbuf
, ctrls_size
))
1963 /* Copy results into user buffer */
1964 switch (_IOC_DIR(cmd
))
1967 case (_IOC_WRITE
| _IOC_READ
):
1968 if (copy_to_user((void __user
*)arg
, parg
, _IOC_SIZE(cmd
)))
1977 EXPORT_SYMBOL(video_ioctl2
);
1979 static const struct file_operations video_fops
;
1982 * video_register_device - register video4linux devices
1983 * @vfd: video device structure we want to register
1984 * @type: type of device to register
1985 * @nr: which device number (0 == /dev/video0, 1 == /dev/video1, ...
1988 * The registration code assigns minor numbers based on the type
1989 * requested. -ENFILE is returned in all the device slots for this
1990 * category are full. If not then the minor field is set and the
1991 * driver initialize function is called (if non %NULL).
1993 * Zero is returned on success.
1997 * %VFL_TYPE_GRABBER - A frame grabber
1999 * %VFL_TYPE_VTX - A teletext device
2001 * %VFL_TYPE_VBI - Vertical blank data (undecoded)
2003 * %VFL_TYPE_RADIO - A radio card
2006 int video_register_device(struct video_device
*vfd
, int type
, int nr
)
2016 case VFL_TYPE_GRABBER
:
2017 base
=MINOR_VFL_TYPE_GRABBER_MIN
;
2018 end
=MINOR_VFL_TYPE_GRABBER_MAX
+1;
2019 name_base
= "video";
2022 base
=MINOR_VFL_TYPE_VTX_MIN
;
2023 end
=MINOR_VFL_TYPE_VTX_MAX
+1;
2027 base
=MINOR_VFL_TYPE_VBI_MIN
;
2028 end
=MINOR_VFL_TYPE_VBI_MAX
+1;
2031 case VFL_TYPE_RADIO
:
2032 base
=MINOR_VFL_TYPE_RADIO_MIN
;
2033 end
=MINOR_VFL_TYPE_RADIO_MAX
+1;
2034 name_base
= "radio";
2037 printk(KERN_ERR
"%s called with unknown type: %d\n",
2042 /* pick a minor number */
2043 mutex_lock(&videodev_lock
);
2044 if (nr
>= 0 && nr
< end
-base
) {
2045 /* use the one the driver asked for */
2047 if (NULL
!= video_device
[i
]) {
2048 mutex_unlock(&videodev_lock
);
2052 /* use first free */
2053 for(i
=base
;i
<end
;i
++)
2054 if (NULL
== video_device
[i
])
2057 mutex_unlock(&videodev_lock
);
2061 video_device
[i
]=vfd
;
2063 mutex_unlock(&videodev_lock
);
2064 mutex_init(&vfd
->lock
);
2067 memset(&vfd
->class_dev
, 0x00, sizeof(vfd
->class_dev
));
2069 vfd
->class_dev
.parent
= vfd
->dev
;
2070 vfd
->class_dev
.class = &video_class
;
2071 vfd
->class_dev
.devt
= MKDEV(VIDEO_MAJOR
, vfd
->minor
);
2072 sprintf(vfd
->class_dev
.bus_id
, "%s%d", name_base
, i
- base
);
2073 ret
= device_register(&vfd
->class_dev
);
2075 printk(KERN_ERR
"%s: device_register failed\n",
2081 /* needed until all drivers are fixed */
2083 printk(KERN_WARNING
"videodev: \"%s\" has no release callback. "
2084 "Please fix your driver for proper sysfs support, see "
2085 "http://lwn.net/Articles/36850/\n", vfd
->name
);
2090 mutex_lock(&videodev_lock
);
2091 video_device
[vfd
->minor
] = NULL
;
2093 mutex_unlock(&videodev_lock
);
2096 EXPORT_SYMBOL(video_register_device
);
2099 * video_unregister_device - unregister a video4linux device
2100 * @vfd: the device to unregister
2102 * This unregisters the passed device and deassigns the minor
2103 * number. Future open calls will be met with errors.
2106 void video_unregister_device(struct video_device
*vfd
)
2108 mutex_lock(&videodev_lock
);
2109 if(video_device
[vfd
->minor
]!=vfd
)
2110 panic("videodev: bad unregister");
2112 video_device
[vfd
->minor
]=NULL
;
2113 device_unregister(&vfd
->class_dev
);
2114 mutex_unlock(&videodev_lock
);
2116 EXPORT_SYMBOL(video_unregister_device
);
2119 * Video fs operations
2121 static const struct file_operations video_fops
=
2123 .owner
= THIS_MODULE
,
2124 .llseek
= no_llseek
,
2129 * Initialise video for linux
2132 static int __init
videodev_init(void)
2136 printk(KERN_INFO
"Linux video capture interface: v2.00\n");
2137 if (register_chrdev(VIDEO_MAJOR
, VIDEO_NAME
, &video_fops
)) {
2138 printk(KERN_WARNING
"video_dev: unable to get major %d\n", VIDEO_MAJOR
);
2142 ret
= class_register(&video_class
);
2144 unregister_chrdev(VIDEO_MAJOR
, VIDEO_NAME
);
2145 printk(KERN_WARNING
"video_dev: class_register failed\n");
2152 static void __exit
videodev_exit(void)
2154 class_unregister(&video_class
);
2155 unregister_chrdev(VIDEO_MAJOR
, VIDEO_NAME
);
2158 module_init(videodev_init
)
2159 module_exit(videodev_exit
)
2161 MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
2162 MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
2163 MODULE_LICENSE("GPL");