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 <linux/smp_lock.h>
40 #include <asm/uaccess.h>
41 #include <asm/system.h>
43 #define __OLD_VIDIOC_ /* To allow fixing old calls*/
44 #include <linux/videodev2.h>
46 #ifdef CONFIG_VIDEO_V4L1
47 #include <linux/videodev.h>
49 #include <media/v4l2-common.h>
50 #include <linux/video_decoder.h>
52 #define VIDEO_NUM_DEVICES 256
53 #define VIDEO_NAME "video4linux"
60 static const struct std_descr standards[] = {
61 { V4L2_STD_NTSC, "NTSC" },
62 { V4L2_STD_NTSC_M, "NTSC-M" },
63 { V4L2_STD_NTSC_M_JP, "NTSC-M-JP" },
64 { V4L2_STD_NTSC_M_KR, "NTSC-M-KR" },
65 { V4L2_STD_NTSC_443, "NTSC-443" },
66 { V4L2_STD_PAL, "PAL" },
67 { V4L2_STD_PAL_BG, "PAL-BG" },
68 { V4L2_STD_PAL_B, "PAL-B" },
69 { V4L2_STD_PAL_B1, "PAL-B1" },
70 { V4L2_STD_PAL_G, "PAL-G" },
71 { V4L2_STD_PAL_H, "PAL-H" },
72 { V4L2_STD_PAL_I, "PAL-I" },
73 { V4L2_STD_PAL_DK, "PAL-DK" },
74 { V4L2_STD_PAL_D, "PAL-D" },
75 { V4L2_STD_PAL_D1, "PAL-D1" },
76 { V4L2_STD_PAL_K, "PAL-K" },
77 { V4L2_STD_PAL_M, "PAL-M" },
78 { V4L2_STD_PAL_N, "PAL-N" },
79 { V4L2_STD_PAL_Nc, "PAL-Nc" },
80 { V4L2_STD_PAL_60, "PAL-60" },
81 { V4L2_STD_SECAM, "SECAM" },
82 { V4L2_STD_SECAM_B, "SECAM-B" },
83 { V4L2_STD_SECAM_G, "SECAM-G" },
84 { V4L2_STD_SECAM_H, "SECAM-H" },
85 { V4L2_STD_SECAM_DK, "SECAM-DK" },
86 { V4L2_STD_SECAM_D, "SECAM-D" },
87 { V4L2_STD_SECAM_K, "SECAM-K" },
88 { V4L2_STD_SECAM_K1, "SECAM-K1" },
89 { V4L2_STD_SECAM_L, "SECAM-L" },
90 { V4L2_STD_SECAM_LC, "SECAM-Lc" },
94 /* video4linux standard ID conversion to standard name
96 const char *v4l2_norm_to_name(v4l2_std_id id)
101 /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
102 64 bit comparations. So, on that architecture, with some gcc
103 variants, compilation fails. Currently, the max value is 30bit wide.
107 for (i = 0; standards[i].std; i++)
108 if (myid == standards[i].std)
110 return standards[i].descr;
112 EXPORT_SYMBOL(v4l2_norm_to_name);
114 /* Fill in the fields of a v4l2_standard structure according to the
115 'id' and 'transmission' parameters. Returns negative on error. */
116 int v4l2_video_std_construct(struct v4l2_standard *vs,
117 int id, const char *name)
119 u32 index = vs->index;
121 memset(vs, 0, sizeof(struct v4l2_standard));
124 if (id & V4L2_STD_525_60) {
125 vs->frameperiod.numerator = 1001;
126 vs->frameperiod.denominator = 30000;
127 vs->framelines = 525;
129 vs->frameperiod.numerator = 1;
130 vs->frameperiod.denominator = 25;
131 vs->framelines = 625;
133 strlcpy(vs->name, name, sizeof(vs->name));
136 EXPORT_SYMBOL(v4l2_video_std_construct);
138 /* ----------------------------------------------------------------- */
139 /* some arrays for pretty-printing debug messages of enum types */
141 char *v4l2_field_names[] = {
142 [V4L2_FIELD_ANY] = "any",
143 [V4L2_FIELD_NONE] = "none",
144 [V4L2_FIELD_TOP] = "top",
145 [V4L2_FIELD_BOTTOM] = "bottom",
146 [V4L2_FIELD_INTERLACED] = "interlaced",
147 [V4L2_FIELD_SEQ_TB] = "seq-tb",
148 [V4L2_FIELD_SEQ_BT] = "seq-bt",
149 [V4L2_FIELD_ALTERNATE] = "alternate",
150 [V4L2_FIELD_INTERLACED_TB] = "interlaced-tb",
151 [V4L2_FIELD_INTERLACED_BT] = "interlaced-bt",
153 EXPORT_SYMBOL(v4l2_field_names);
155 char *v4l2_type_names[] = {
156 [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap",
157 [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over",
158 [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out",
159 [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
160 [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
161 [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
162 [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "sliced-vbi-out",
163 [V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "video-out-over",
165 EXPORT_SYMBOL(v4l2_type_names);
167 static char *v4l2_memory_names[] = {
168 [V4L2_MEMORY_MMAP] = "mmap",
169 [V4L2_MEMORY_USERPTR] = "userptr",
170 [V4L2_MEMORY_OVERLAY] = "overlay",
173 #define prt_names(a, arr) ((((a) >= 0) && ((a) < ARRAY_SIZE(arr))) ? \
176 /* ------------------------------------------------------------------ */
177 /* debug help functions */
179 #ifdef CONFIG_VIDEO_V4L1_COMPAT
180 static const char *v4l1_ioctls[] = {
181 [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
182 [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
183 [_IOC_NR(VIDIOCSCHAN)] = "VIDIOCSCHAN",
184 [_IOC_NR(VIDIOCGTUNER)] = "VIDIOCGTUNER",
185 [_IOC_NR(VIDIOCSTUNER)] = "VIDIOCSTUNER",
186 [_IOC_NR(VIDIOCGPICT)] = "VIDIOCGPICT",
187 [_IOC_NR(VIDIOCSPICT)] = "VIDIOCSPICT",
188 [_IOC_NR(VIDIOCCAPTURE)] = "VIDIOCCAPTURE",
189 [_IOC_NR(VIDIOCGWIN)] = "VIDIOCGWIN",
190 [_IOC_NR(VIDIOCSWIN)] = "VIDIOCSWIN",
191 [_IOC_NR(VIDIOCGFBUF)] = "VIDIOCGFBUF",
192 [_IOC_NR(VIDIOCSFBUF)] = "VIDIOCSFBUF",
193 [_IOC_NR(VIDIOCKEY)] = "VIDIOCKEY",
194 [_IOC_NR(VIDIOCGFREQ)] = "VIDIOCGFREQ",
195 [_IOC_NR(VIDIOCSFREQ)] = "VIDIOCSFREQ",
196 [_IOC_NR(VIDIOCGAUDIO)] = "VIDIOCGAUDIO",
197 [_IOC_NR(VIDIOCSAUDIO)] = "VIDIOCSAUDIO",
198 [_IOC_NR(VIDIOCSYNC)] = "VIDIOCSYNC",
199 [_IOC_NR(VIDIOCMCAPTURE)] = "VIDIOCMCAPTURE",
200 [_IOC_NR(VIDIOCGMBUF)] = "VIDIOCGMBUF",
201 [_IOC_NR(VIDIOCGUNIT)] = "VIDIOCGUNIT",
202 [_IOC_NR(VIDIOCGCAPTURE)] = "VIDIOCGCAPTURE",
203 [_IOC_NR(VIDIOCSCAPTURE)] = "VIDIOCSCAPTURE",
204 [_IOC_NR(VIDIOCSPLAYMODE)] = "VIDIOCSPLAYMODE",
205 [_IOC_NR(VIDIOCSWRITEMODE)] = "VIDIOCSWRITEMODE",
206 [_IOC_NR(VIDIOCGPLAYINFO)] = "VIDIOCGPLAYINFO",
207 [_IOC_NR(VIDIOCSMICROCODE)] = "VIDIOCSMICROCODE",
208 [_IOC_NR(VIDIOCGVBIFMT)] = "VIDIOCGVBIFMT",
209 [_IOC_NR(VIDIOCSVBIFMT)] = "VIDIOCSVBIFMT"
211 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
214 static const char *v4l2_ioctls[] = {
215 [_IOC_NR(VIDIOC_QUERYCAP)] = "VIDIOC_QUERYCAP",
216 [_IOC_NR(VIDIOC_RESERVED)] = "VIDIOC_RESERVED",
217 [_IOC_NR(VIDIOC_ENUM_FMT)] = "VIDIOC_ENUM_FMT",
218 [_IOC_NR(VIDIOC_G_FMT)] = "VIDIOC_G_FMT",
219 [_IOC_NR(VIDIOC_S_FMT)] = "VIDIOC_S_FMT",
220 [_IOC_NR(VIDIOC_REQBUFS)] = "VIDIOC_REQBUFS",
221 [_IOC_NR(VIDIOC_QUERYBUF)] = "VIDIOC_QUERYBUF",
222 [_IOC_NR(VIDIOC_G_FBUF)] = "VIDIOC_G_FBUF",
223 [_IOC_NR(VIDIOC_S_FBUF)] = "VIDIOC_S_FBUF",
224 [_IOC_NR(VIDIOC_OVERLAY)] = "VIDIOC_OVERLAY",
225 [_IOC_NR(VIDIOC_QBUF)] = "VIDIOC_QBUF",
226 [_IOC_NR(VIDIOC_DQBUF)] = "VIDIOC_DQBUF",
227 [_IOC_NR(VIDIOC_STREAMON)] = "VIDIOC_STREAMON",
228 [_IOC_NR(VIDIOC_STREAMOFF)] = "VIDIOC_STREAMOFF",
229 [_IOC_NR(VIDIOC_G_PARM)] = "VIDIOC_G_PARM",
230 [_IOC_NR(VIDIOC_S_PARM)] = "VIDIOC_S_PARM",
231 [_IOC_NR(VIDIOC_G_STD)] = "VIDIOC_G_STD",
232 [_IOC_NR(VIDIOC_S_STD)] = "VIDIOC_S_STD",
233 [_IOC_NR(VIDIOC_ENUMSTD)] = "VIDIOC_ENUMSTD",
234 [_IOC_NR(VIDIOC_ENUMINPUT)] = "VIDIOC_ENUMINPUT",
235 [_IOC_NR(VIDIOC_G_CTRL)] = "VIDIOC_G_CTRL",
236 [_IOC_NR(VIDIOC_S_CTRL)] = "VIDIOC_S_CTRL",
237 [_IOC_NR(VIDIOC_G_TUNER)] = "VIDIOC_G_TUNER",
238 [_IOC_NR(VIDIOC_S_TUNER)] = "VIDIOC_S_TUNER",
239 [_IOC_NR(VIDIOC_G_AUDIO)] = "VIDIOC_G_AUDIO",
240 [_IOC_NR(VIDIOC_S_AUDIO)] = "VIDIOC_S_AUDIO",
241 [_IOC_NR(VIDIOC_QUERYCTRL)] = "VIDIOC_QUERYCTRL",
242 [_IOC_NR(VIDIOC_QUERYMENU)] = "VIDIOC_QUERYMENU",
243 [_IOC_NR(VIDIOC_G_INPUT)] = "VIDIOC_G_INPUT",
244 [_IOC_NR(VIDIOC_S_INPUT)] = "VIDIOC_S_INPUT",
245 [_IOC_NR(VIDIOC_G_OUTPUT)] = "VIDIOC_G_OUTPUT",
246 [_IOC_NR(VIDIOC_S_OUTPUT)] = "VIDIOC_S_OUTPUT",
247 [_IOC_NR(VIDIOC_ENUMOUTPUT)] = "VIDIOC_ENUMOUTPUT",
248 [_IOC_NR(VIDIOC_G_AUDOUT)] = "VIDIOC_G_AUDOUT",
249 [_IOC_NR(VIDIOC_S_AUDOUT)] = "VIDIOC_S_AUDOUT",
250 [_IOC_NR(VIDIOC_G_MODULATOR)] = "VIDIOC_G_MODULATOR",
251 [_IOC_NR(VIDIOC_S_MODULATOR)] = "VIDIOC_S_MODULATOR",
252 [_IOC_NR(VIDIOC_G_FREQUENCY)] = "VIDIOC_G_FREQUENCY",
253 [_IOC_NR(VIDIOC_S_FREQUENCY)] = "VIDIOC_S_FREQUENCY",
254 [_IOC_NR(VIDIOC_CROPCAP)] = "VIDIOC_CROPCAP",
255 [_IOC_NR(VIDIOC_G_CROP)] = "VIDIOC_G_CROP",
256 [_IOC_NR(VIDIOC_S_CROP)] = "VIDIOC_S_CROP",
257 [_IOC_NR(VIDIOC_G_JPEGCOMP)] = "VIDIOC_G_JPEGCOMP",
258 [_IOC_NR(VIDIOC_S_JPEGCOMP)] = "VIDIOC_S_JPEGCOMP",
259 [_IOC_NR(VIDIOC_QUERYSTD)] = "VIDIOC_QUERYSTD",
260 [_IOC_NR(VIDIOC_TRY_FMT)] = "VIDIOC_TRY_FMT",
261 [_IOC_NR(VIDIOC_ENUMAUDIO)] = "VIDIOC_ENUMAUDIO",
262 [_IOC_NR(VIDIOC_ENUMAUDOUT)] = "VIDIOC_ENUMAUDOUT",
263 [_IOC_NR(VIDIOC_G_PRIORITY)] = "VIDIOC_G_PRIORITY",
264 [_IOC_NR(VIDIOC_S_PRIORITY)] = "VIDIOC_S_PRIORITY",
265 [_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP",
266 [_IOC_NR(VIDIOC_LOG_STATUS)] = "VIDIOC_LOG_STATUS",
267 [_IOC_NR(VIDIOC_G_EXT_CTRLS)] = "VIDIOC_G_EXT_CTRLS",
268 [_IOC_NR(VIDIOC_S_EXT_CTRLS)] = "VIDIOC_S_EXT_CTRLS",
269 [_IOC_NR(VIDIOC_TRY_EXT_CTRLS)] = "VIDIOC_TRY_EXT_CTRLS",
271 [_IOC_NR(VIDIOC_ENUM_FRAMESIZES)] = "VIDIOC_ENUM_FRAMESIZES",
272 [_IOC_NR(VIDIOC_ENUM_FRAMEINTERVALS)] = "VIDIOC_ENUM_FRAMEINTERVALS",
273 [_IOC_NR(VIDIOC_G_ENC_INDEX)] = "VIDIOC_G_ENC_INDEX",
274 [_IOC_NR(VIDIOC_ENCODER_CMD)] = "VIDIOC_ENCODER_CMD",
275 [_IOC_NR(VIDIOC_TRY_ENCODER_CMD)] = "VIDIOC_TRY_ENCODER_CMD",
277 [_IOC_NR(VIDIOC_DBG_S_REGISTER)] = "VIDIOC_DBG_S_REGISTER",
278 [_IOC_NR(VIDIOC_DBG_G_REGISTER)] = "VIDIOC_DBG_G_REGISTER",
280 [_IOC_NR(VIDIOC_G_CHIP_IDENT)] = "VIDIOC_G_CHIP_IDENT",
283 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
285 static const char *v4l2_int_ioctls[] = {
286 #ifdef CONFIG_VIDEO_V4L1_COMPAT
287 [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
288 [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
289 [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
290 [_IOC_NR(DECODER_SET_INPUT)] = "DECODER_SET_INPUT",
291 [_IOC_NR(DECODER_SET_OUTPUT)] = "DECODER_SET_OUTPUT",
292 [_IOC_NR(DECODER_ENABLE_OUTPUT)] = "DECODER_ENABLE_OUTPUT",
293 [_IOC_NR(DECODER_SET_PICTURE)] = "DECODER_SET_PICTURE",
294 [_IOC_NR(DECODER_SET_GPIO)] = "DECODER_SET_GPIO",
295 [_IOC_NR(DECODER_INIT)] = "DECODER_INIT",
296 [_IOC_NR(DECODER_SET_VBI_BYPASS)] = "DECODER_SET_VBI_BYPASS",
297 [_IOC_NR(DECODER_DUMP)] = "DECODER_DUMP",
299 [_IOC_NR(AUDC_SET_RADIO)] = "AUDC_SET_RADIO",
301 [_IOC_NR(TUNER_SET_TYPE_ADDR)] = "TUNER_SET_TYPE_ADDR",
302 [_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY",
303 [_IOC_NR(TUNER_SET_CONFIG)] = "TUNER_SET_CONFIG",
305 [_IOC_NR(VIDIOC_INT_S_TUNER_MODE)] = "VIDIOC_INT_S_TUNER_MODE",
306 [_IOC_NR(VIDIOC_INT_RESET)] = "VIDIOC_INT_RESET",
307 [_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",
308 [_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)] = "VIDIOC_INT_DECODE_VBI_LINE",
309 [_IOC_NR(VIDIOC_INT_S_VBI_DATA)] = "VIDIOC_INT_S_VBI_DATA",
310 [_IOC_NR(VIDIOC_INT_G_VBI_DATA)] = "VIDIOC_INT_G_VBI_DATA",
311 [_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
312 [_IOC_NR(VIDIOC_INT_S_STANDBY)] = "VIDIOC_INT_S_STANDBY",
313 [_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)] = "VIDIOC_INT_S_AUDIO_ROUTING",
314 [_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)] = "VIDIOC_INT_G_AUDIO_ROUTING",
315 [_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)] = "VIDIOC_INT_S_VIDEO_ROUTING",
316 [_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)] = "VIDIOC_INT_G_VIDEO_ROUTING",
317 [_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ)] = "VIDIOC_INT_S_CRYSTAL_FREQ",
318 [_IOC_NR(VIDIOC_INT_INIT)] = "VIDIOC_INT_INIT",
319 [_IOC_NR(VIDIOC_INT_G_STD_OUTPUT)] = "VIDIOC_INT_G_STD_OUTPUT",
320 [_IOC_NR(VIDIOC_INT_S_STD_OUTPUT)] = "VIDIOC_INT_S_STD_OUTPUT",
322 #define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
324 /* Common ioctl debug function. This function can be used by
325 external ioctl messages as well as internal V4L ioctl */
326 void v4l_printk_ioctl(unsigned int cmd)
330 switch (_IOC_TYPE(cmd)) {
332 if (_IOC_NR(cmd) >= V4L2_INT_IOCTLS) {
336 printk("%s", v4l2_int_ioctls[_IOC_NR(cmd)]);
338 #ifdef CONFIG_VIDEO_V4L1_COMPAT
340 if (_IOC_NR(cmd) >= V4L1_IOCTLS) {
344 printk("%s", v4l1_ioctls[_IOC_NR(cmd)]);
348 if (_IOC_NR(cmd) >= V4L2_IOCTLS) {
352 printk("%s", v4l2_ioctls[_IOC_NR(cmd)]);
358 switch (_IOC_DIR(cmd)) {
359 case _IOC_NONE: dir = "--"; break;
360 case _IOC_READ: dir = "r-"; break;
361 case _IOC_WRITE: dir = "-w"; break;
362 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
363 default: dir = "*ERR*"; break;
365 printk("%s ioctl '%c', dir=%s, #%d (0x%08x)",
366 type, _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
368 EXPORT_SYMBOL(v4l_printk_ioctl);
374 static ssize_t show_name(struct device *cd,
375 struct device_attribute *attr, char *buf)
377 struct video_device *vfd = container_of(cd, struct video_device,
379 return sprintf(buf, "%.*s\n", (int)sizeof(vfd->name), vfd->name);
382 struct video_device *video_device_alloc(void)
384 struct video_device *vfd;
386 vfd = kzalloc(sizeof(*vfd),GFP_KERNEL);
389 EXPORT_SYMBOL(video_device_alloc);
391 void video_device_release(struct video_device *vfd)
395 EXPORT_SYMBOL(video_device_release);
397 static void video_release(struct device *cd)
399 struct video_device *vfd = container_of(cd, struct video_device,
403 /* needed until all drivers are fixed */
410 static struct device_attribute video_device_attrs[] = {
411 __ATTR(name, S_IRUGO, show_name, NULL),
415 static struct class video_class = {
417 .dev_attrs = video_device_attrs,
418 .dev_release = video_release,
425 static struct video_device *video_device[VIDEO_NUM_DEVICES];
426 static DEFINE_MUTEX(videodev_lock);
428 struct video_device* video_devdata(struct file *file)
430 return video_device[iminor(file->f_path.dentry->d_inode)];
432 EXPORT_SYMBOL(video_devdata);
435 * Open a video device - FIXME: Obsoleted
437 static int video_open(struct inode *inode, struct file *file)
439 unsigned int minor = iminor(inode);
441 struct video_device *vfl;
442 const struct file_operations *old_fops;
444 if(minor>=VIDEO_NUM_DEVICES)
447 mutex_lock(&videodev_lock);
448 vfl=video_device[minor];
450 mutex_unlock(&videodev_lock);
451 request_module("char-major-%d-%d", VIDEO_MAJOR, minor);
452 mutex_lock(&videodev_lock);
453 vfl=video_device[minor];
455 mutex_unlock(&videodev_lock);
460 old_fops = file->f_op;
461 file->f_op = fops_get(vfl->fops);
463 err = file->f_op->open(inode,file);
465 fops_put(file->f_op);
466 file->f_op = fops_get(old_fops);
469 mutex_unlock(&videodev_lock);
475 * helper function -- handles userspace copying for ioctl arguments
480 video_fix_command(unsigned int cmd)
483 case VIDIOC_OVERLAY_OLD:
484 cmd = VIDIOC_OVERLAY;
486 case VIDIOC_S_PARM_OLD:
489 case VIDIOC_S_CTRL_OLD:
492 case VIDIOC_G_AUDIO_OLD:
493 cmd = VIDIOC_G_AUDIO;
495 case VIDIOC_G_AUDOUT_OLD:
496 cmd = VIDIOC_G_AUDOUT;
498 case VIDIOC_CROPCAP_OLD:
499 cmd = VIDIOC_CROPCAP;
507 * Obsolete usercopy function - Should be removed soon
510 video_usercopy(struct inode *inode, struct file *file,
511 unsigned int cmd, unsigned long arg,
512 int (*func)(struct inode *inode, struct file *file,
513 unsigned int cmd, void *arg))
520 size_t ctrls_size = 0;
521 void __user *user_ptr = NULL;
524 cmd = video_fix_command(cmd);
526 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
527 cmd == VIDIOC_TRY_EXT_CTRLS);
529 /* Copy arguments into temp kernel buffer */
530 switch (_IOC_DIR(cmd)) {
536 case (_IOC_WRITE | _IOC_READ):
537 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
540 /* too big to allocate from stack */
541 mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
548 if (_IOC_DIR(cmd) & _IOC_WRITE)
549 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
554 struct v4l2_ext_controls *p = parg;
556 /* In case of an error, tell the caller that it wasn't
557 a specific control that caused it. */
558 p->error_idx = p->count;
559 user_ptr = (void __user *)p->controls;
561 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
562 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
563 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
568 if (copy_from_user(mbuf, user_ptr, ctrls_size))
575 err = func(inode, file, cmd, parg);
576 if (err == -ENOIOCTLCMD)
579 struct v4l2_ext_controls *p = parg;
581 p->controls = (void *)user_ptr;
582 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
590 /* Copy results into user buffer */
591 switch (_IOC_DIR(cmd))
594 case (_IOC_WRITE | _IOC_READ):
595 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
604 EXPORT_SYMBOL(video_usercopy);
607 * open/release helper functions -- handle exclusive opens
608 * Should be removed soon
610 int video_exclusive_open(struct inode *inode, struct file *file)
612 struct video_device *vfl = video_devdata(file);
615 mutex_lock(&vfl->lock);
621 mutex_unlock(&vfl->lock);
624 EXPORT_SYMBOL(video_exclusive_open);
626 int video_exclusive_release(struct inode *inode, struct file *file)
628 struct video_device *vfl = video_devdata(file);
633 EXPORT_SYMBOL(video_exclusive_release);
635 static void dbgbuf(unsigned int cmd, struct video_device *vfd,
636 struct v4l2_buffer *p)
638 struct v4l2_timecode *tc=&p->timecode;
640 dbgarg (cmd, "%02ld:%02d:%02d.%08ld index=%d, type=%s, "
641 "bytesused=%d, flags=0x%08d, "
642 "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx, length=%d\n",
643 (p->timestamp.tv_sec/3600),
644 (int)(p->timestamp.tv_sec/60)%60,
645 (int)(p->timestamp.tv_sec%60),
646 p->timestamp.tv_usec,
648 prt_names(p->type, v4l2_type_names),
649 p->bytesused, p->flags,
650 p->field, p->sequence,
651 prt_names(p->memory, v4l2_memory_names),
652 p->m.userptr, p->length);
653 dbgarg2 ("timecode= %02d:%02d:%02d type=%d, "
654 "flags=0x%08d, frames=%d, userbits=0x%08x\n",
655 tc->hours,tc->minutes,tc->seconds,
656 tc->type, tc->flags, tc->frames, *(__u32 *) tc->userbits);
659 static inline void dbgrect(struct video_device *vfd, char *s,
662 dbgarg2 ("%sRect start at %dx%d, size= %dx%d\n", s, r->left, r->top,
663 r->width, r->height);
666 static inline void v4l_print_pix_fmt (struct video_device *vfd,
667 struct v4l2_pix_format *fmt)
669 dbgarg2 ("width=%d, height=%d, format=%c%c%c%c, field=%s, "
670 "bytesperline=%d sizeimage=%d, colorspace=%d\n",
671 fmt->width,fmt->height,
672 (fmt->pixelformat & 0xff),
673 (fmt->pixelformat >> 8) & 0xff,
674 (fmt->pixelformat >> 16) & 0xff,
675 (fmt->pixelformat >> 24) & 0xff,
676 prt_names(fmt->field, v4l2_field_names),
677 fmt->bytesperline, fmt->sizeimage, fmt->colorspace);
681 static int check_fmt (struct video_device *vfd, enum v4l2_buf_type type)
684 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
685 if (vfd->vidioc_try_fmt_cap)
688 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
689 if (vfd->vidioc_try_fmt_overlay)
692 case V4L2_BUF_TYPE_VBI_CAPTURE:
693 if (vfd->vidioc_try_fmt_vbi)
696 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
697 if (vfd->vidioc_try_fmt_vbi_output)
700 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
701 if (vfd->vidioc_try_fmt_vbi_capture)
704 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
705 if (vfd->vidioc_try_fmt_video_output)
708 case V4L2_BUF_TYPE_VBI_OUTPUT:
709 if (vfd->vidioc_try_fmt_vbi_output)
712 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
713 if (vfd->vidioc_try_fmt_output_overlay)
716 case V4L2_BUF_TYPE_PRIVATE:
717 if (vfd->vidioc_try_fmt_type_private)
724 static int __video_do_ioctl(struct inode *inode, struct file *file,
725 unsigned int cmd, void *arg)
727 struct video_device *vfd = video_devdata(file);
728 void *fh = file->private_data;
731 if ( (vfd->debug & V4L2_DEBUG_IOCTL) &&
732 !(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) {
733 v4l_print_ioctl(vfd->name, cmd);
737 #ifdef CONFIG_VIDEO_V4L1_COMPAT
738 /***********************************************************
739 Handles calls to the obsoleted V4L1 API
740 Due to the nature of VIDIOCGMBUF, each driver that supports
741 V4L1 should implement its own handler for this ioctl.
742 ***********************************************************/
744 /* --- streaming capture ------------------------------------- */
745 if (cmd == VIDIOCGMBUF) {
746 struct video_mbuf *p=arg;
748 memset(p, 0, sizeof(*p));
750 if (!vfd->vidiocgmbuf)
752 ret=vfd->vidiocgmbuf(file, fh, p);
754 dbgarg (cmd, "size=%d, frames=%d, offsets=0x%08lx\n",
756 (unsigned long)p->offsets);
760 /********************************************************
761 All other V4L1 calls are handled by v4l1_compat module.
762 Those calls will be translated into V4L2 calls, and
763 __video_do_ioctl will be called again, with one or more
765 ********************************************************/
766 if (_IOC_TYPE(cmd)=='v')
767 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
772 /* --- capabilities ------------------------------------------ */
773 case VIDIOC_QUERYCAP:
775 struct v4l2_capability *cap = (struct v4l2_capability*)arg;
776 memset(cap, 0, sizeof(*cap));
778 if (!vfd->vidioc_querycap)
781 ret=vfd->vidioc_querycap(file, fh, cap);
783 dbgarg (cmd, "driver=%s, card=%s, bus=%s, "
785 "capabilities=0x%08x\n",
786 cap->driver,cap->card,cap->bus_info,
792 /* --- priority ------------------------------------------ */
793 case VIDIOC_G_PRIORITY:
795 enum v4l2_priority *p=arg;
797 if (!vfd->vidioc_g_priority)
799 ret=vfd->vidioc_g_priority(file, fh, p);
801 dbgarg(cmd, "priority is %d\n", *p);
804 case VIDIOC_S_PRIORITY:
806 enum v4l2_priority *p=arg;
808 if (!vfd->vidioc_s_priority)
810 dbgarg(cmd, "setting priority to %d\n", *p);
811 ret=vfd->vidioc_s_priority(file, fh, *p);
815 /* --- capture ioctls ---------------------------------------- */
816 case VIDIOC_ENUM_FMT:
818 struct v4l2_fmtdesc *f = arg;
819 enum v4l2_buf_type type;
824 memset(f,0,sizeof(*f));
829 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
830 if (vfd->vidioc_enum_fmt_cap)
831 ret=vfd->vidioc_enum_fmt_cap(file, fh, f);
833 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
834 if (vfd->vidioc_enum_fmt_overlay)
835 ret=vfd->vidioc_enum_fmt_overlay(file, fh, f);
837 case V4L2_BUF_TYPE_VBI_CAPTURE:
838 if (vfd->vidioc_enum_fmt_vbi)
839 ret=vfd->vidioc_enum_fmt_vbi(file, fh, f);
841 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
842 if (vfd->vidioc_enum_fmt_vbi_output)
843 ret=vfd->vidioc_enum_fmt_vbi_output(file,
846 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
847 if (vfd->vidioc_enum_fmt_vbi_capture)
848 ret=vfd->vidioc_enum_fmt_vbi_capture(file,
851 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
852 if (vfd->vidioc_enum_fmt_video_output)
853 ret=vfd->vidioc_enum_fmt_video_output(file,
856 case V4L2_BUF_TYPE_VBI_OUTPUT:
857 if (vfd->vidioc_enum_fmt_vbi_output)
858 ret=vfd->vidioc_enum_fmt_vbi_output(file,
861 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
862 if (vfd->vidioc_enum_fmt_output_overlay)
863 ret=vfd->vidioc_enum_fmt_output_overlay(file, fh, f);
865 case V4L2_BUF_TYPE_PRIVATE:
866 if (vfd->vidioc_enum_fmt_type_private)
867 ret=vfd->vidioc_enum_fmt_type_private(file,
872 dbgarg (cmd, "index=%d, type=%d, flags=%d, "
873 "pixelformat=%c%c%c%c, description='%s'\n",
874 f->index, f->type, f->flags,
875 (f->pixelformat & 0xff),
876 (f->pixelformat >> 8) & 0xff,
877 (f->pixelformat >> 16) & 0xff,
878 (f->pixelformat >> 24) & 0xff,
884 struct v4l2_format *f = (struct v4l2_format *)arg;
885 enum v4l2_buf_type type=f->type;
887 memset(&f->fmt.pix,0,sizeof(f->fmt.pix));
890 /* FIXME: Should be one dump per type */
891 dbgarg (cmd, "type=%s\n", prt_names(type,
895 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
896 if (vfd->vidioc_g_fmt_cap)
897 ret=vfd->vidioc_g_fmt_cap(file, fh, f);
899 v4l_print_pix_fmt(vfd,&f->fmt.pix);
901 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
902 if (vfd->vidioc_g_fmt_overlay)
903 ret=vfd->vidioc_g_fmt_overlay(file, fh, f);
905 case V4L2_BUF_TYPE_VBI_CAPTURE:
906 if (vfd->vidioc_g_fmt_vbi)
907 ret=vfd->vidioc_g_fmt_vbi(file, fh, f);
909 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
910 if (vfd->vidioc_g_fmt_vbi_output)
911 ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f);
913 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
914 if (vfd->vidioc_g_fmt_vbi_capture)
915 ret=vfd->vidioc_g_fmt_vbi_capture(file, fh, f);
917 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
918 if (vfd->vidioc_g_fmt_video_output)
919 ret=vfd->vidioc_g_fmt_video_output(file,
922 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
923 if (vfd->vidioc_g_fmt_output_overlay)
924 ret=vfd->vidioc_g_fmt_output_overlay(file, fh, f);
926 case V4L2_BUF_TYPE_VBI_OUTPUT:
927 if (vfd->vidioc_g_fmt_vbi_output)
928 ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f);
930 case V4L2_BUF_TYPE_PRIVATE:
931 if (vfd->vidioc_g_fmt_type_private)
932 ret=vfd->vidioc_g_fmt_type_private(file,
941 struct v4l2_format *f = (struct v4l2_format *)arg;
943 /* FIXME: Should be one dump per type */
944 dbgarg (cmd, "type=%s\n", prt_names(f->type,
948 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
949 v4l_print_pix_fmt(vfd,&f->fmt.pix);
950 if (vfd->vidioc_s_fmt_cap)
951 ret=vfd->vidioc_s_fmt_cap(file, fh, f);
953 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
954 if (vfd->vidioc_s_fmt_overlay)
955 ret=vfd->vidioc_s_fmt_overlay(file, fh, f);
957 case V4L2_BUF_TYPE_VBI_CAPTURE:
958 if (vfd->vidioc_s_fmt_vbi)
959 ret=vfd->vidioc_s_fmt_vbi(file, fh, f);
961 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
962 if (vfd->vidioc_s_fmt_vbi_output)
963 ret=vfd->vidioc_s_fmt_vbi_output(file, fh, f);
965 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
966 if (vfd->vidioc_s_fmt_vbi_capture)
967 ret=vfd->vidioc_s_fmt_vbi_capture(file, fh, f);
969 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
970 if (vfd->vidioc_s_fmt_video_output)
971 ret=vfd->vidioc_s_fmt_video_output(file,
974 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
975 if (vfd->vidioc_s_fmt_output_overlay)
976 ret=vfd->vidioc_s_fmt_output_overlay(file, fh, f);
978 case V4L2_BUF_TYPE_VBI_OUTPUT:
979 if (vfd->vidioc_s_fmt_vbi_output)
980 ret=vfd->vidioc_s_fmt_vbi_output(file,
983 case V4L2_BUF_TYPE_PRIVATE:
984 if (vfd->vidioc_s_fmt_type_private)
985 ret=vfd->vidioc_s_fmt_type_private(file,
993 struct v4l2_format *f = (struct v4l2_format *)arg;
995 /* FIXME: Should be one dump per type */
996 dbgarg (cmd, "type=%s\n", prt_names(f->type,
999 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1000 if (vfd->vidioc_try_fmt_cap)
1001 ret=vfd->vidioc_try_fmt_cap(file, fh, f);
1003 v4l_print_pix_fmt(vfd,&f->fmt.pix);
1005 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1006 if (vfd->vidioc_try_fmt_overlay)
1007 ret=vfd->vidioc_try_fmt_overlay(file, fh, f);
1009 case V4L2_BUF_TYPE_VBI_CAPTURE:
1010 if (vfd->vidioc_try_fmt_vbi)
1011 ret=vfd->vidioc_try_fmt_vbi(file, fh, f);
1013 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
1014 if (vfd->vidioc_try_fmt_vbi_output)
1015 ret=vfd->vidioc_try_fmt_vbi_output(file,
1018 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
1019 if (vfd->vidioc_try_fmt_vbi_capture)
1020 ret=vfd->vidioc_try_fmt_vbi_capture(file,
1023 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1024 if (vfd->vidioc_try_fmt_video_output)
1025 ret=vfd->vidioc_try_fmt_video_output(file,
1028 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
1029 if (vfd->vidioc_try_fmt_output_overlay)
1030 ret=vfd->vidioc_try_fmt_output_overlay(file, fh, f);
1032 case V4L2_BUF_TYPE_VBI_OUTPUT:
1033 if (vfd->vidioc_try_fmt_vbi_output)
1034 ret=vfd->vidioc_try_fmt_vbi_output(file,
1037 case V4L2_BUF_TYPE_PRIVATE:
1038 if (vfd->vidioc_try_fmt_type_private)
1039 ret=vfd->vidioc_try_fmt_type_private(file,
1046 /* FIXME: Those buf reqs could be handled here,
1047 with some changes on videobuf to allow its header to be included at
1048 videodev2.h or being merged at videodev2.
1050 case VIDIOC_REQBUFS:
1052 struct v4l2_requestbuffers *p=arg;
1054 if (!vfd->vidioc_reqbufs)
1056 ret = check_fmt (vfd, p->type);
1060 ret=vfd->vidioc_reqbufs(file, fh, p);
1061 dbgarg (cmd, "count=%d, type=%s, memory=%s\n",
1063 prt_names(p->type, v4l2_type_names),
1064 prt_names(p->memory, v4l2_memory_names));
1067 case VIDIOC_QUERYBUF:
1069 struct v4l2_buffer *p=arg;
1071 if (!vfd->vidioc_querybuf)
1073 ret = check_fmt (vfd, p->type);
1077 ret=vfd->vidioc_querybuf(file, fh, p);
1084 struct v4l2_buffer *p=arg;
1086 if (!vfd->vidioc_qbuf)
1088 ret = check_fmt (vfd, p->type);
1092 ret=vfd->vidioc_qbuf(file, fh, p);
1099 struct v4l2_buffer *p=arg;
1100 if (!vfd->vidioc_dqbuf)
1102 ret = check_fmt (vfd, p->type);
1106 ret=vfd->vidioc_dqbuf(file, fh, p);
1111 case VIDIOC_OVERLAY:
1115 if (!vfd->vidioc_overlay)
1117 dbgarg (cmd, "value=%d\n",*i);
1118 ret=vfd->vidioc_overlay(file, fh, *i);
1123 struct v4l2_framebuffer *p=arg;
1124 if (!vfd->vidioc_g_fbuf)
1126 ret=vfd->vidioc_g_fbuf(file, fh, arg);
1128 dbgarg (cmd, "capability=%d, flags=%d, base=0x%08lx\n",
1129 p->capability,p->flags,
1130 (unsigned long)p->base);
1131 v4l_print_pix_fmt (vfd, &p->fmt);
1137 struct v4l2_framebuffer *p=arg;
1138 if (!vfd->vidioc_s_fbuf)
1141 dbgarg (cmd, "capability=%d, flags=%d, base=0x%08lx\n",
1142 p->capability,p->flags,(unsigned long)p->base);
1143 v4l_print_pix_fmt (vfd, &p->fmt);
1144 ret=vfd->vidioc_s_fbuf(file, fh, arg);
1148 case VIDIOC_STREAMON:
1150 enum v4l2_buf_type i = *(int *)arg;
1151 if (!vfd->vidioc_streamon)
1153 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1154 ret=vfd->vidioc_streamon(file, fh,i);
1157 case VIDIOC_STREAMOFF:
1159 enum v4l2_buf_type i = *(int *)arg;
1161 if (!vfd->vidioc_streamoff)
1163 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1164 ret=vfd->vidioc_streamoff(file, fh, i);
1167 /* ---------- tv norms ---------- */
1168 case VIDIOC_ENUMSTD:
1170 struct v4l2_standard *p = arg;
1171 v4l2_std_id id = vfd->tvnorms, curr_id = 0;
1172 unsigned int index = p->index, i, j = 0;
1173 const char *descr = "";
1175 /* Return norm array in a canonical way */
1176 for (i = 0; i <= index && id; i++) {
1177 /* last std value in the standards array is 0, so this
1178 while always ends there since (id & 0) == 0. */
1179 while ((id & standards[j].std) != standards[j].std)
1181 curr_id = standards[j].std;
1182 descr = standards[j].descr;
1186 if (curr_id != V4L2_STD_PAL &&
1187 curr_id != V4L2_STD_SECAM &&
1188 curr_id != V4L2_STD_NTSC)
1194 v4l2_video_std_construct(p, curr_id, descr);
1197 dbgarg(cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, "
1198 "framelines=%d\n", p->index,
1199 (unsigned long long)p->id, p->name,
1200 p->frameperiod.numerator,
1201 p->frameperiod.denominator,
1209 v4l2_std_id *id = arg;
1211 *id = vfd->current_norm;
1213 dbgarg (cmd, "value=%08Lx\n", (long long unsigned) *id);
1220 v4l2_std_id *id = arg,norm;
1222 dbgarg (cmd, "value=%08Lx\n", (long long unsigned) *id);
1224 norm = (*id) & vfd->tvnorms;
1225 if ( vfd->tvnorms && !norm) /* Check if std is supported */
1228 /* Calls the specific handler */
1229 if (vfd->vidioc_s_std)
1230 ret=vfd->vidioc_s_std(file, fh, &norm);
1234 /* Updates standard information */
1236 vfd->current_norm=norm;
1240 case VIDIOC_QUERYSTD:
1244 if (!vfd->vidioc_querystd)
1246 ret=vfd->vidioc_querystd(file, fh, arg);
1248 dbgarg (cmd, "detected std=%08Lx\n",
1249 (unsigned long long)*p);
1252 /* ------ input switching ---------- */
1253 /* FIXME: Inputs can be handled inside videodev2 */
1254 case VIDIOC_ENUMINPUT:
1256 struct v4l2_input *p=arg;
1259 if (!vfd->vidioc_enum_input)
1261 memset(p, 0, sizeof(*p));
1264 ret=vfd->vidioc_enum_input(file, fh, p);
1266 dbgarg (cmd, "index=%d, name=%s, type=%d, "
1268 "tuner=%d, std=%08Lx, status=%d\n",
1269 p->index,p->name,p->type,p->audioset,
1271 (unsigned long long)p->std,
1275 case VIDIOC_G_INPUT:
1277 unsigned int *i = arg;
1279 if (!vfd->vidioc_g_input)
1281 ret=vfd->vidioc_g_input(file, fh, i);
1283 dbgarg (cmd, "value=%d\n",*i);
1286 case VIDIOC_S_INPUT:
1288 unsigned int *i = arg;
1290 if (!vfd->vidioc_s_input)
1292 dbgarg (cmd, "value=%d\n",*i);
1293 ret=vfd->vidioc_s_input(file, fh, *i);
1297 /* ------ output switching ---------- */
1298 case VIDIOC_G_OUTPUT:
1300 unsigned int *i = arg;
1302 if (!vfd->vidioc_g_output)
1304 ret=vfd->vidioc_g_output(file, fh, i);
1306 dbgarg (cmd, "value=%d\n",*i);
1309 case VIDIOC_S_OUTPUT:
1311 unsigned int *i = arg;
1313 if (!vfd->vidioc_s_output)
1315 dbgarg (cmd, "value=%d\n",*i);
1316 ret=vfd->vidioc_s_output(file, fh, *i);
1320 /* --- controls ---------------------------------------------- */
1321 case VIDIOC_QUERYCTRL:
1323 struct v4l2_queryctrl *p=arg;
1325 if (!vfd->vidioc_queryctrl)
1327 ret=vfd->vidioc_queryctrl(file, fh, p);
1330 dbgarg (cmd, "id=%d, type=%d, name=%s, "
1332 " step=%d, default=%d, flags=0x%08x\n",
1333 p->id,p->type,p->name,p->minimum,
1334 p->maximum,p->step,p->default_value,
1340 struct v4l2_control *p = arg;
1342 if (!vfd->vidioc_g_ctrl)
1344 dbgarg(cmd, "Enum for index=%d\n", p->id);
1346 ret=vfd->vidioc_g_ctrl(file, fh, p);
1348 dbgarg2 ( "id=%d, value=%d\n", p->id, p->value);
1353 struct v4l2_control *p = arg;
1355 if (!vfd->vidioc_s_ctrl)
1357 dbgarg (cmd, "id=%d, value=%d\n", p->id, p->value);
1359 ret=vfd->vidioc_s_ctrl(file, fh, p);
1362 case VIDIOC_G_EXT_CTRLS:
1364 struct v4l2_ext_controls *p = arg;
1366 if (vfd->vidioc_g_ext_ctrls) {
1367 dbgarg(cmd, "count=%d\n", p->count);
1369 ret=vfd->vidioc_g_ext_ctrls(file, fh, p);
1373 case VIDIOC_S_EXT_CTRLS:
1375 struct v4l2_ext_controls *p = arg;
1377 if (vfd->vidioc_s_ext_ctrls) {
1378 dbgarg(cmd, "count=%d\n", p->count);
1380 ret=vfd->vidioc_s_ext_ctrls(file, fh, p);
1384 case VIDIOC_TRY_EXT_CTRLS:
1386 struct v4l2_ext_controls *p = arg;
1388 if (vfd->vidioc_try_ext_ctrls) {
1389 dbgarg(cmd, "count=%d\n", p->count);
1391 ret=vfd->vidioc_try_ext_ctrls(file, fh, p);
1395 case VIDIOC_QUERYMENU:
1397 struct v4l2_querymenu *p=arg;
1398 if (!vfd->vidioc_querymenu)
1400 ret=vfd->vidioc_querymenu(file, fh, p);
1402 dbgarg (cmd, "id=%d, index=%d, name=%s\n",
1403 p->id,p->index,p->name);
1406 /* --- audio ---------------------------------------------- */
1407 case VIDIOC_ENUMAUDIO:
1409 struct v4l2_audio *p=arg;
1411 if (!vfd->vidioc_enumaudio)
1413 dbgarg(cmd, "Enum for index=%d\n", p->index);
1414 ret=vfd->vidioc_enumaudio(file, fh, p);
1416 dbgarg2("index=%d, name=%s, capability=%d, "
1417 "mode=%d\n",p->index,p->name,
1418 p->capability, p->mode);
1421 case VIDIOC_G_AUDIO:
1423 struct v4l2_audio *p=arg;
1424 __u32 index=p->index;
1426 if (!vfd->vidioc_g_audio)
1429 memset(p,0,sizeof(*p));
1431 dbgarg(cmd, "Get for index=%d\n", p->index);
1432 ret=vfd->vidioc_g_audio(file, fh, p);
1434 dbgarg2("index=%d, name=%s, capability=%d, "
1435 "mode=%d\n",p->index,
1436 p->name,p->capability, p->mode);
1439 case VIDIOC_S_AUDIO:
1441 struct v4l2_audio *p=arg;
1443 if (!vfd->vidioc_s_audio)
1445 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1446 "mode=%d\n", p->index, p->name,
1447 p->capability, p->mode);
1448 ret=vfd->vidioc_s_audio(file, fh, p);
1451 case VIDIOC_ENUMAUDOUT:
1453 struct v4l2_audioout *p=arg;
1455 if (!vfd->vidioc_enumaudout)
1457 dbgarg(cmd, "Enum for index=%d\n", p->index);
1458 ret=vfd->vidioc_enumaudout(file, fh, p);
1460 dbgarg2("index=%d, name=%s, capability=%d, "
1461 "mode=%d\n", p->index, p->name,
1462 p->capability,p->mode);
1465 case VIDIOC_G_AUDOUT:
1467 struct v4l2_audioout *p=arg;
1469 if (!vfd->vidioc_g_audout)
1471 dbgarg(cmd, "Enum for index=%d\n", p->index);
1472 ret=vfd->vidioc_g_audout(file, fh, p);
1474 dbgarg2("index=%d, name=%s, capability=%d, "
1475 "mode=%d\n", p->index, p->name,
1476 p->capability,p->mode);
1479 case VIDIOC_S_AUDOUT:
1481 struct v4l2_audioout *p=arg;
1483 if (!vfd->vidioc_s_audout)
1485 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1486 "mode=%d\n", p->index, p->name,
1487 p->capability,p->mode);
1489 ret=vfd->vidioc_s_audout(file, fh, p);
1492 case VIDIOC_G_MODULATOR:
1494 struct v4l2_modulator *p=arg;
1495 if (!vfd->vidioc_g_modulator)
1497 ret=vfd->vidioc_g_modulator(file, fh, p);
1499 dbgarg(cmd, "index=%d, name=%s, "
1500 "capability=%d, rangelow=%d,"
1501 " rangehigh=%d, txsubchans=%d\n",
1502 p->index, p->name,p->capability,
1503 p->rangelow, p->rangehigh,
1507 case VIDIOC_S_MODULATOR:
1509 struct v4l2_modulator *p=arg;
1510 if (!vfd->vidioc_s_modulator)
1512 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1513 "rangelow=%d, rangehigh=%d, txsubchans=%d\n",
1514 p->index, p->name,p->capability,p->rangelow,
1515 p->rangehigh,p->txsubchans);
1516 ret=vfd->vidioc_s_modulator(file, fh, p);
1521 struct v4l2_crop *p=arg;
1522 if (!vfd->vidioc_g_crop)
1524 ret=vfd->vidioc_g_crop(file, fh, p);
1526 dbgarg(cmd, "type=%d\n", p->type);
1527 dbgrect(vfd, "", &p->c);
1533 struct v4l2_crop *p=arg;
1534 if (!vfd->vidioc_s_crop)
1536 dbgarg(cmd, "type=%d\n", p->type);
1537 dbgrect(vfd, "", &p->c);
1538 ret=vfd->vidioc_s_crop(file, fh, p);
1541 case VIDIOC_CROPCAP:
1543 struct v4l2_cropcap *p=arg;
1544 /*FIXME: Should also show v4l2_fract pixelaspect */
1545 if (!vfd->vidioc_cropcap)
1547 dbgarg(cmd, "type=%d\n", p->type);
1548 dbgrect(vfd, "bounds ", &p->bounds);
1549 dbgrect(vfd, "defrect ", &p->defrect);
1550 ret=vfd->vidioc_cropcap(file, fh, p);
1553 case VIDIOC_G_JPEGCOMP:
1555 struct v4l2_jpegcompression *p=arg;
1556 if (!vfd->vidioc_g_jpegcomp)
1558 ret=vfd->vidioc_g_jpegcomp(file, fh, p);
1560 dbgarg (cmd, "quality=%d, APPn=%d, "
1561 "APP_len=%d, COM_len=%d, "
1562 "jpeg_markers=%d\n",
1563 p->quality,p->APPn,p->APP_len,
1564 p->COM_len,p->jpeg_markers);
1567 case VIDIOC_S_JPEGCOMP:
1569 struct v4l2_jpegcompression *p=arg;
1570 if (!vfd->vidioc_g_jpegcomp)
1572 dbgarg (cmd, "quality=%d, APPn=%d, APP_len=%d, "
1573 "COM_len=%d, jpeg_markers=%d\n",
1574 p->quality,p->APPn,p->APP_len,
1575 p->COM_len,p->jpeg_markers);
1576 ret=vfd->vidioc_s_jpegcomp(file, fh, p);
1579 case VIDIOC_G_ENC_INDEX:
1581 struct v4l2_enc_idx *p=arg;
1583 if (!vfd->vidioc_g_enc_index)
1585 ret=vfd->vidioc_g_enc_index(file, fh, p);
1587 dbgarg (cmd, "entries=%d, entries_cap=%d\n",
1588 p->entries,p->entries_cap);
1591 case VIDIOC_ENCODER_CMD:
1593 struct v4l2_encoder_cmd *p=arg;
1595 if (!vfd->vidioc_encoder_cmd)
1597 ret=vfd->vidioc_encoder_cmd(file, fh, p);
1599 dbgarg (cmd, "cmd=%d, flags=%d\n",
1603 case VIDIOC_TRY_ENCODER_CMD:
1605 struct v4l2_encoder_cmd *p=arg;
1607 if (!vfd->vidioc_try_encoder_cmd)
1609 ret=vfd->vidioc_try_encoder_cmd(file, fh, p);
1611 dbgarg (cmd, "cmd=%d, flags=%d\n",
1617 struct v4l2_streamparm *p=arg;
1620 memset(p,0,sizeof(*p));
1623 if (vfd->vidioc_g_parm) {
1624 ret=vfd->vidioc_g_parm(file, fh, p);
1626 struct v4l2_standard s;
1628 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1631 v4l2_video_std_construct(&s, vfd->current_norm,
1632 v4l2_norm_to_name(vfd->current_norm));
1634 p->parm.capture.timeperframe = s.frameperiod;
1638 dbgarg (cmd, "type=%d\n", p->type);
1643 struct v4l2_streamparm *p=arg;
1644 if (!vfd->vidioc_s_parm)
1646 dbgarg (cmd, "type=%d\n", p->type);
1647 ret=vfd->vidioc_s_parm(file, fh, p);
1650 case VIDIOC_G_TUNER:
1652 struct v4l2_tuner *p=arg;
1653 __u32 index=p->index;
1655 if (!vfd->vidioc_g_tuner)
1658 memset(p,0,sizeof(*p));
1661 ret=vfd->vidioc_g_tuner(file, fh, p);
1663 dbgarg (cmd, "index=%d, name=%s, type=%d, "
1664 "capability=%d, rangelow=%d, "
1665 "rangehigh=%d, signal=%d, afc=%d, "
1666 "rxsubchans=%d, audmode=%d\n",
1667 p->index, p->name, p->type,
1668 p->capability, p->rangelow,
1669 p->rangehigh, p->rxsubchans,
1670 p->audmode, p->signal, p->afc);
1673 case VIDIOC_S_TUNER:
1675 struct v4l2_tuner *p=arg;
1676 if (!vfd->vidioc_s_tuner)
1678 dbgarg (cmd, "index=%d, name=%s, type=%d, "
1679 "capability=%d, rangelow=%d, rangehigh=%d, "
1680 "signal=%d, afc=%d, rxsubchans=%d, "
1681 "audmode=%d\n",p->index, p->name, p->type,
1682 p->capability, p->rangelow,p->rangehigh,
1683 p->rxsubchans, p->audmode, p->signal,
1685 ret=vfd->vidioc_s_tuner(file, fh, p);
1688 case VIDIOC_G_FREQUENCY:
1690 struct v4l2_frequency *p=arg;
1691 if (!vfd->vidioc_g_frequency)
1694 memset(p,0,sizeof(*p));
1696 ret=vfd->vidioc_g_frequency(file, fh, p);
1698 dbgarg (cmd, "tuner=%d, type=%d, frequency=%d\n",
1699 p->tuner,p->type,p->frequency);
1702 case VIDIOC_S_FREQUENCY:
1704 struct v4l2_frequency *p=arg;
1705 if (!vfd->vidioc_s_frequency)
1707 dbgarg (cmd, "tuner=%d, type=%d, frequency=%d\n",
1708 p->tuner,p->type,p->frequency);
1709 ret=vfd->vidioc_s_frequency(file, fh, p);
1712 case VIDIOC_G_SLICED_VBI_CAP:
1714 struct v4l2_sliced_vbi_cap *p=arg;
1715 if (!vfd->vidioc_g_sliced_vbi_cap)
1717 ret=vfd->vidioc_g_sliced_vbi_cap(file, fh, p);
1719 dbgarg (cmd, "service_set=%d\n", p->service_set);
1722 case VIDIOC_LOG_STATUS:
1724 if (!vfd->vidioc_log_status)
1726 ret=vfd->vidioc_log_status(file, fh);
1729 #ifdef CONFIG_VIDEO_ADV_DEBUG
1730 case VIDIOC_DBG_G_REGISTER:
1732 struct v4l2_register *p=arg;
1733 if (!capable(CAP_SYS_ADMIN))
1735 else if (vfd->vidioc_g_register)
1736 ret=vfd->vidioc_g_register(file, fh, p);
1739 case VIDIOC_DBG_S_REGISTER:
1741 struct v4l2_register *p=arg;
1742 if (!capable(CAP_SYS_ADMIN))
1744 else if (vfd->vidioc_s_register)
1745 ret=vfd->vidioc_s_register(file, fh, p);
1749 case VIDIOC_G_CHIP_IDENT:
1751 struct v4l2_chip_ident *p=arg;
1752 if (!vfd->vidioc_g_chip_ident)
1754 ret=vfd->vidioc_g_chip_ident(file, fh, p);
1756 dbgarg (cmd, "chip_ident=%u, revision=0x%x\n", p->ident, p->revision);
1761 if (!vfd->vidioc_default)
1763 ret = vfd->vidioc_default(file, fh, cmd, arg);
1768 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) {
1770 printk("%s: err: on ", vfd->name);
1771 v4l_print_ioctl(vfd->name, cmd);
1779 int video_ioctl2 (struct inode *inode, struct file *file,
1780 unsigned int cmd, unsigned long arg)
1787 size_t ctrls_size = 0;
1788 void __user *user_ptr = NULL;
1790 #ifdef __OLD_VIDIOC_
1791 cmd = video_fix_command(cmd);
1793 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
1794 cmd == VIDIOC_TRY_EXT_CTRLS);
1796 /* Copy arguments into temp kernel buffer */
1797 switch (_IOC_DIR(cmd)) {
1803 case (_IOC_WRITE | _IOC_READ):
1804 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
1807 /* too big to allocate from stack */
1808 mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
1815 if (_IOC_DIR(cmd) & _IOC_WRITE)
1816 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
1822 struct v4l2_ext_controls *p = parg;
1824 /* In case of an error, tell the caller that it wasn't
1825 a specific control that caused it. */
1826 p->error_idx = p->count;
1827 user_ptr = (void __user *)p->controls;
1829 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
1830 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
1831 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
1836 if (copy_from_user(mbuf, user_ptr, ctrls_size))
1843 err = __video_do_ioctl(inode, file, cmd, parg);
1844 if (err == -ENOIOCTLCMD)
1847 struct v4l2_ext_controls *p = parg;
1849 p->controls = (void *)user_ptr;
1850 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
1858 /* Copy results into user buffer */
1859 switch (_IOC_DIR(cmd))
1862 case (_IOC_WRITE | _IOC_READ):
1863 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
1872 EXPORT_SYMBOL(video_ioctl2);
1874 static const struct file_operations video_fops;
1877 * video_register_device - register video4linux devices
1878 * @vfd: video device structure we want to register
1879 * @type: type of device to register
1880 * @nr: which device number (0 == /dev/video0, 1 == /dev/video1, ...
1883 * The registration code assigns minor numbers based on the type
1884 * requested. -ENFILE is returned in all the device slots for this
1885 * category are full. If not then the minor field is set and the
1886 * driver initialize function is called (if non %NULL).
1888 * Zero is returned on success.
1892 * %VFL_TYPE_GRABBER - A frame grabber
1894 * %VFL_TYPE_VTX - A teletext device
1896 * %VFL_TYPE_VBI - Vertical blank data (undecoded)
1898 * %VFL_TYPE_RADIO - A radio card
1901 int video_register_device(struct video_device *vfd, int type, int nr)
1911 case VFL_TYPE_GRABBER:
1912 base=MINOR_VFL_TYPE_GRABBER_MIN;
1913 end=MINOR_VFL_TYPE_GRABBER_MAX+1;
1914 name_base = "video";
1917 base=MINOR_VFL_TYPE_VTX_MIN;
1918 end=MINOR_VFL_TYPE_VTX_MAX+1;
1922 base=MINOR_VFL_TYPE_VBI_MIN;
1923 end=MINOR_VFL_TYPE_VBI_MAX+1;
1926 case VFL_TYPE_RADIO:
1927 base=MINOR_VFL_TYPE_RADIO_MIN;
1928 end=MINOR_VFL_TYPE_RADIO_MAX+1;
1929 name_base = "radio";
1932 printk(KERN_ERR "%s called with unknown type: %d\n",
1937 /* pick a minor number */
1938 mutex_lock(&videodev_lock);
1939 if (nr >= 0 && nr < end-base) {
1940 /* use the one the driver asked for */
1942 if (NULL != video_device[i]) {
1943 mutex_unlock(&videodev_lock);
1947 /* use first free */
1948 for(i=base;i<end;i++)
1949 if (NULL == video_device[i])
1952 mutex_unlock(&videodev_lock);
1956 video_device[i]=vfd;
1958 mutex_unlock(&videodev_lock);
1959 mutex_init(&vfd->lock);
1962 memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev));
1964 vfd->class_dev.parent = vfd->dev;
1965 vfd->class_dev.class = &video_class;
1966 vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);
1967 sprintf(vfd->class_dev.bus_id, "%s%d", name_base, i - base);
1968 ret = device_register(&vfd->class_dev);
1970 printk(KERN_ERR "%s: device_register failed\n",
1976 /* needed until all drivers are fixed */
1978 printk(KERN_WARNING "videodev: \"%s\" has no release callback. "
1979 "Please fix your driver for proper sysfs support, see "
1980 "http://lwn.net/Articles/36850/\n", vfd->name);
1985 mutex_lock(&videodev_lock);
1986 video_device[vfd->minor] = NULL;
1988 mutex_unlock(&videodev_lock);
1991 EXPORT_SYMBOL(video_register_device);
1994 * video_unregister_device - unregister a video4linux device
1995 * @vfd: the device to unregister
1997 * This unregisters the passed device and deassigns the minor
1998 * number. Future open calls will be met with errors.
2001 void video_unregister_device(struct video_device *vfd)
2003 mutex_lock(&videodev_lock);
2004 if(video_device[vfd->minor]!=vfd)
2005 panic("videodev: bad unregister");
2007 video_device[vfd->minor]=NULL;
2008 device_unregister(&vfd->class_dev);
2009 mutex_unlock(&videodev_lock);
2011 EXPORT_SYMBOL(video_unregister_device);
2014 * Video fs operations
2016 static const struct file_operations video_fops=
2018 .owner = THIS_MODULE,
2019 .llseek = no_llseek,
2024 * Initialise video for linux
2027 static int __init videodev_init(void)
2031 printk(KERN_INFO "Linux video capture interface: v2.00\n");
2032 if (register_chrdev(VIDEO_MAJOR, VIDEO_NAME, &video_fops)) {
2033 printk(KERN_WARNING "video_dev: unable to get major %d\n", VIDEO_MAJOR);
2037 ret = class_register(&video_class);
2039 unregister_chrdev(VIDEO_MAJOR, VIDEO_NAME);
2040 printk(KERN_WARNING "video_dev: class_register failed\n");
2047 static void __exit videodev_exit(void)
2049 class_unregister(&video_class);
2050 unregister_chrdev(VIDEO_MAJOR, VIDEO_NAME);
2053 module_init(videodev_init)
2054 module_exit(videodev_exit)
2056 MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
2057 MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
2058 MODULE_LICENSE("GPL");