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...) \
21 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { \
22 printk(KERN_DEBUG "%s: ", vfd->name); \
23 v4l_printk_ioctl(cmd); \
24 printk(" " fmt, ## arg); \
28 #define dbgarg2(fmt, arg...) \
30 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \
31 printk(KERN_DEBUG "%s: " fmt, vfd->name, ## arg);\
34 #include <linux/module.h>
35 #include <linux/types.h>
36 #include <linux/kernel.h>
38 #include <linux/string.h>
39 #include <linux/errno.h>
40 #include <linux/init.h>
41 #include <linux/kmod.h>
42 #include <linux/slab.h>
43 #include <linux/smp_lock.h>
44 #include <asm/uaccess.h>
45 #include <asm/system.h>
47 #define __OLD_VIDIOC_ /* To allow fixing old calls*/
48 #include <linux/videodev2.h>
50 #ifdef CONFIG_VIDEO_V4L1
51 #include <linux/videodev.h>
53 #include <media/v4l2-common.h>
54 #include <linux/video_decoder.h>
56 #define VIDEO_NUM_DEVICES 256
57 #define VIDEO_NAME "video4linux"
64 static const struct std_descr standards[] = {
65 { V4L2_STD_NTSC, "NTSC" },
66 { V4L2_STD_NTSC_M, "NTSC-M" },
67 { V4L2_STD_NTSC_M_JP, "NTSC-M-JP" },
68 { V4L2_STD_NTSC_M_KR, "NTSC-M-KR" },
69 { V4L2_STD_NTSC_443, "NTSC-443" },
70 { V4L2_STD_PAL, "PAL" },
71 { V4L2_STD_PAL_BG, "PAL-BG" },
72 { V4L2_STD_PAL_B, "PAL-B" },
73 { V4L2_STD_PAL_B1, "PAL-B1" },
74 { V4L2_STD_PAL_G, "PAL-G" },
75 { V4L2_STD_PAL_H, "PAL-H" },
76 { V4L2_STD_PAL_I, "PAL-I" },
77 { V4L2_STD_PAL_DK, "PAL-DK" },
78 { V4L2_STD_PAL_D, "PAL-D" },
79 { V4L2_STD_PAL_D1, "PAL-D1" },
80 { V4L2_STD_PAL_K, "PAL-K" },
81 { V4L2_STD_PAL_M, "PAL-M" },
82 { V4L2_STD_PAL_N, "PAL-N" },
83 { V4L2_STD_PAL_Nc, "PAL-Nc" },
84 { V4L2_STD_PAL_60, "PAL-60" },
85 { V4L2_STD_SECAM, "SECAM" },
86 { V4L2_STD_SECAM_B, "SECAM-B" },
87 { V4L2_STD_SECAM_G, "SECAM-G" },
88 { V4L2_STD_SECAM_H, "SECAM-H" },
89 { V4L2_STD_SECAM_DK, "SECAM-DK" },
90 { V4L2_STD_SECAM_D, "SECAM-D" },
91 { V4L2_STD_SECAM_K, "SECAM-K" },
92 { V4L2_STD_SECAM_K1, "SECAM-K1" },
93 { V4L2_STD_SECAM_L, "SECAM-L" },
94 { V4L2_STD_SECAM_LC, "SECAM-Lc" },
98 /* video4linux standard ID conversion to standard name
100 const char *v4l2_norm_to_name(v4l2_std_id id)
105 /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
106 64 bit comparations. So, on that architecture, with some gcc
107 variants, compilation fails. Currently, the max value is 30bit wide.
111 for (i = 0; standards[i].std; i++)
112 if (myid == standards[i].std)
114 return standards[i].descr;
116 EXPORT_SYMBOL(v4l2_norm_to_name);
118 /* Fill in the fields of a v4l2_standard structure according to the
119 'id' and 'transmission' parameters. Returns negative on error. */
120 int v4l2_video_std_construct(struct v4l2_standard *vs,
121 int id, const char *name)
123 u32 index = vs->index;
125 memset(vs, 0, sizeof(struct v4l2_standard));
128 if (id & V4L2_STD_525_60) {
129 vs->frameperiod.numerator = 1001;
130 vs->frameperiod.denominator = 30000;
131 vs->framelines = 525;
133 vs->frameperiod.numerator = 1;
134 vs->frameperiod.denominator = 25;
135 vs->framelines = 625;
137 strlcpy(vs->name, name, sizeof(vs->name));
140 EXPORT_SYMBOL(v4l2_video_std_construct);
142 /* ----------------------------------------------------------------- */
143 /* some arrays for pretty-printing debug messages of enum types */
145 const char *v4l2_field_names[] = {
146 [V4L2_FIELD_ANY] = "any",
147 [V4L2_FIELD_NONE] = "none",
148 [V4L2_FIELD_TOP] = "top",
149 [V4L2_FIELD_BOTTOM] = "bottom",
150 [V4L2_FIELD_INTERLACED] = "interlaced",
151 [V4L2_FIELD_SEQ_TB] = "seq-tb",
152 [V4L2_FIELD_SEQ_BT] = "seq-bt",
153 [V4L2_FIELD_ALTERNATE] = "alternate",
154 [V4L2_FIELD_INTERLACED_TB] = "interlaced-tb",
155 [V4L2_FIELD_INTERLACED_BT] = "interlaced-bt",
157 EXPORT_SYMBOL(v4l2_field_names);
159 const char *v4l2_type_names[] = {
160 [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "vid-cap",
161 [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "vid-overlay",
162 [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "vid-out",
163 [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
164 [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
165 [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
166 [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "sliced-vbi-out",
167 [V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "vid-out-overlay",
169 EXPORT_SYMBOL(v4l2_type_names);
171 static const char *v4l2_memory_names[] = {
172 [V4L2_MEMORY_MMAP] = "mmap",
173 [V4L2_MEMORY_USERPTR] = "userptr",
174 [V4L2_MEMORY_OVERLAY] = "overlay",
177 #define prt_names(a, arr) ((((a) >= 0) && ((a) < ARRAY_SIZE(arr))) ? \
180 /* ------------------------------------------------------------------ */
181 /* debug help functions */
183 #ifdef CONFIG_VIDEO_V4L1_COMPAT
184 static const char *v4l1_ioctls[] = {
185 [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
186 [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
187 [_IOC_NR(VIDIOCSCHAN)] = "VIDIOCSCHAN",
188 [_IOC_NR(VIDIOCGTUNER)] = "VIDIOCGTUNER",
189 [_IOC_NR(VIDIOCSTUNER)] = "VIDIOCSTUNER",
190 [_IOC_NR(VIDIOCGPICT)] = "VIDIOCGPICT",
191 [_IOC_NR(VIDIOCSPICT)] = "VIDIOCSPICT",
192 [_IOC_NR(VIDIOCCAPTURE)] = "VIDIOCCAPTURE",
193 [_IOC_NR(VIDIOCGWIN)] = "VIDIOCGWIN",
194 [_IOC_NR(VIDIOCSWIN)] = "VIDIOCSWIN",
195 [_IOC_NR(VIDIOCGFBUF)] = "VIDIOCGFBUF",
196 [_IOC_NR(VIDIOCSFBUF)] = "VIDIOCSFBUF",
197 [_IOC_NR(VIDIOCKEY)] = "VIDIOCKEY",
198 [_IOC_NR(VIDIOCGFREQ)] = "VIDIOCGFREQ",
199 [_IOC_NR(VIDIOCSFREQ)] = "VIDIOCSFREQ",
200 [_IOC_NR(VIDIOCGAUDIO)] = "VIDIOCGAUDIO",
201 [_IOC_NR(VIDIOCSAUDIO)] = "VIDIOCSAUDIO",
202 [_IOC_NR(VIDIOCSYNC)] = "VIDIOCSYNC",
203 [_IOC_NR(VIDIOCMCAPTURE)] = "VIDIOCMCAPTURE",
204 [_IOC_NR(VIDIOCGMBUF)] = "VIDIOCGMBUF",
205 [_IOC_NR(VIDIOCGUNIT)] = "VIDIOCGUNIT",
206 [_IOC_NR(VIDIOCGCAPTURE)] = "VIDIOCGCAPTURE",
207 [_IOC_NR(VIDIOCSCAPTURE)] = "VIDIOCSCAPTURE",
208 [_IOC_NR(VIDIOCSPLAYMODE)] = "VIDIOCSPLAYMODE",
209 [_IOC_NR(VIDIOCSWRITEMODE)] = "VIDIOCSWRITEMODE",
210 [_IOC_NR(VIDIOCGPLAYINFO)] = "VIDIOCGPLAYINFO",
211 [_IOC_NR(VIDIOCSMICROCODE)] = "VIDIOCSMICROCODE",
212 [_IOC_NR(VIDIOCGVBIFMT)] = "VIDIOCGVBIFMT",
213 [_IOC_NR(VIDIOCSVBIFMT)] = "VIDIOCSVBIFMT"
215 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
218 static const char *v4l2_ioctls[] = {
219 [_IOC_NR(VIDIOC_QUERYCAP)] = "VIDIOC_QUERYCAP",
220 [_IOC_NR(VIDIOC_RESERVED)] = "VIDIOC_RESERVED",
221 [_IOC_NR(VIDIOC_ENUM_FMT)] = "VIDIOC_ENUM_FMT",
222 [_IOC_NR(VIDIOC_G_FMT)] = "VIDIOC_G_FMT",
223 [_IOC_NR(VIDIOC_S_FMT)] = "VIDIOC_S_FMT",
224 [_IOC_NR(VIDIOC_REQBUFS)] = "VIDIOC_REQBUFS",
225 [_IOC_NR(VIDIOC_QUERYBUF)] = "VIDIOC_QUERYBUF",
226 [_IOC_NR(VIDIOC_G_FBUF)] = "VIDIOC_G_FBUF",
227 [_IOC_NR(VIDIOC_S_FBUF)] = "VIDIOC_S_FBUF",
228 [_IOC_NR(VIDIOC_OVERLAY)] = "VIDIOC_OVERLAY",
229 [_IOC_NR(VIDIOC_QBUF)] = "VIDIOC_QBUF",
230 [_IOC_NR(VIDIOC_DQBUF)] = "VIDIOC_DQBUF",
231 [_IOC_NR(VIDIOC_STREAMON)] = "VIDIOC_STREAMON",
232 [_IOC_NR(VIDIOC_STREAMOFF)] = "VIDIOC_STREAMOFF",
233 [_IOC_NR(VIDIOC_G_PARM)] = "VIDIOC_G_PARM",
234 [_IOC_NR(VIDIOC_S_PARM)] = "VIDIOC_S_PARM",
235 [_IOC_NR(VIDIOC_G_STD)] = "VIDIOC_G_STD",
236 [_IOC_NR(VIDIOC_S_STD)] = "VIDIOC_S_STD",
237 [_IOC_NR(VIDIOC_ENUMSTD)] = "VIDIOC_ENUMSTD",
238 [_IOC_NR(VIDIOC_ENUMINPUT)] = "VIDIOC_ENUMINPUT",
239 [_IOC_NR(VIDIOC_G_CTRL)] = "VIDIOC_G_CTRL",
240 [_IOC_NR(VIDIOC_S_CTRL)] = "VIDIOC_S_CTRL",
241 [_IOC_NR(VIDIOC_G_TUNER)] = "VIDIOC_G_TUNER",
242 [_IOC_NR(VIDIOC_S_TUNER)] = "VIDIOC_S_TUNER",
243 [_IOC_NR(VIDIOC_G_AUDIO)] = "VIDIOC_G_AUDIO",
244 [_IOC_NR(VIDIOC_S_AUDIO)] = "VIDIOC_S_AUDIO",
245 [_IOC_NR(VIDIOC_QUERYCTRL)] = "VIDIOC_QUERYCTRL",
246 [_IOC_NR(VIDIOC_QUERYMENU)] = "VIDIOC_QUERYMENU",
247 [_IOC_NR(VIDIOC_G_INPUT)] = "VIDIOC_G_INPUT",
248 [_IOC_NR(VIDIOC_S_INPUT)] = "VIDIOC_S_INPUT",
249 [_IOC_NR(VIDIOC_G_OUTPUT)] = "VIDIOC_G_OUTPUT",
250 [_IOC_NR(VIDIOC_S_OUTPUT)] = "VIDIOC_S_OUTPUT",
251 [_IOC_NR(VIDIOC_ENUMOUTPUT)] = "VIDIOC_ENUMOUTPUT",
252 [_IOC_NR(VIDIOC_G_AUDOUT)] = "VIDIOC_G_AUDOUT",
253 [_IOC_NR(VIDIOC_S_AUDOUT)] = "VIDIOC_S_AUDOUT",
254 [_IOC_NR(VIDIOC_G_MODULATOR)] = "VIDIOC_G_MODULATOR",
255 [_IOC_NR(VIDIOC_S_MODULATOR)] = "VIDIOC_S_MODULATOR",
256 [_IOC_NR(VIDIOC_G_FREQUENCY)] = "VIDIOC_G_FREQUENCY",
257 [_IOC_NR(VIDIOC_S_FREQUENCY)] = "VIDIOC_S_FREQUENCY",
258 [_IOC_NR(VIDIOC_CROPCAP)] = "VIDIOC_CROPCAP",
259 [_IOC_NR(VIDIOC_G_CROP)] = "VIDIOC_G_CROP",
260 [_IOC_NR(VIDIOC_S_CROP)] = "VIDIOC_S_CROP",
261 [_IOC_NR(VIDIOC_G_JPEGCOMP)] = "VIDIOC_G_JPEGCOMP",
262 [_IOC_NR(VIDIOC_S_JPEGCOMP)] = "VIDIOC_S_JPEGCOMP",
263 [_IOC_NR(VIDIOC_QUERYSTD)] = "VIDIOC_QUERYSTD",
264 [_IOC_NR(VIDIOC_TRY_FMT)] = "VIDIOC_TRY_FMT",
265 [_IOC_NR(VIDIOC_ENUMAUDIO)] = "VIDIOC_ENUMAUDIO",
266 [_IOC_NR(VIDIOC_ENUMAUDOUT)] = "VIDIOC_ENUMAUDOUT",
267 [_IOC_NR(VIDIOC_G_PRIORITY)] = "VIDIOC_G_PRIORITY",
268 [_IOC_NR(VIDIOC_S_PRIORITY)] = "VIDIOC_S_PRIORITY",
269 [_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP",
270 [_IOC_NR(VIDIOC_LOG_STATUS)] = "VIDIOC_LOG_STATUS",
271 [_IOC_NR(VIDIOC_G_EXT_CTRLS)] = "VIDIOC_G_EXT_CTRLS",
272 [_IOC_NR(VIDIOC_S_EXT_CTRLS)] = "VIDIOC_S_EXT_CTRLS",
273 [_IOC_NR(VIDIOC_TRY_EXT_CTRLS)] = "VIDIOC_TRY_EXT_CTRLS",
275 [_IOC_NR(VIDIOC_ENUM_FRAMESIZES)] = "VIDIOC_ENUM_FRAMESIZES",
276 [_IOC_NR(VIDIOC_ENUM_FRAMEINTERVALS)] = "VIDIOC_ENUM_FRAMEINTERVALS",
277 [_IOC_NR(VIDIOC_G_ENC_INDEX)] = "VIDIOC_G_ENC_INDEX",
278 [_IOC_NR(VIDIOC_ENCODER_CMD)] = "VIDIOC_ENCODER_CMD",
279 [_IOC_NR(VIDIOC_TRY_ENCODER_CMD)] = "VIDIOC_TRY_ENCODER_CMD",
281 [_IOC_NR(VIDIOC_DBG_S_REGISTER)] = "VIDIOC_DBG_S_REGISTER",
282 [_IOC_NR(VIDIOC_DBG_G_REGISTER)] = "VIDIOC_DBG_G_REGISTER",
284 [_IOC_NR(VIDIOC_G_CHIP_IDENT)] = "VIDIOC_G_CHIP_IDENT",
285 [_IOC_NR(VIDIOC_S_HW_FREQ_SEEK)] = "VIDIOC_S_HW_FREQ_SEEK",
288 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
290 static const char *v4l2_int_ioctls[] = {
291 #ifdef CONFIG_VIDEO_V4L1_COMPAT
292 [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
293 [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
294 [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
295 [_IOC_NR(DECODER_SET_INPUT)] = "DECODER_SET_INPUT",
296 [_IOC_NR(DECODER_SET_OUTPUT)] = "DECODER_SET_OUTPUT",
297 [_IOC_NR(DECODER_ENABLE_OUTPUT)] = "DECODER_ENABLE_OUTPUT",
298 [_IOC_NR(DECODER_SET_PICTURE)] = "DECODER_SET_PICTURE",
299 [_IOC_NR(DECODER_SET_GPIO)] = "DECODER_SET_GPIO",
300 [_IOC_NR(DECODER_INIT)] = "DECODER_INIT",
301 [_IOC_NR(DECODER_SET_VBI_BYPASS)] = "DECODER_SET_VBI_BYPASS",
302 [_IOC_NR(DECODER_DUMP)] = "DECODER_DUMP",
304 [_IOC_NR(AUDC_SET_RADIO)] = "AUDC_SET_RADIO",
306 [_IOC_NR(TUNER_SET_TYPE_ADDR)] = "TUNER_SET_TYPE_ADDR",
307 [_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY",
308 [_IOC_NR(TUNER_SET_CONFIG)] = "TUNER_SET_CONFIG",
310 [_IOC_NR(VIDIOC_INT_S_TUNER_MODE)] = "VIDIOC_INT_S_TUNER_MODE",
311 [_IOC_NR(VIDIOC_INT_RESET)] = "VIDIOC_INT_RESET",
312 [_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",
313 [_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)] = "VIDIOC_INT_DECODE_VBI_LINE",
314 [_IOC_NR(VIDIOC_INT_S_VBI_DATA)] = "VIDIOC_INT_S_VBI_DATA",
315 [_IOC_NR(VIDIOC_INT_G_VBI_DATA)] = "VIDIOC_INT_G_VBI_DATA",
316 [_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
317 [_IOC_NR(VIDIOC_INT_S_STANDBY)] = "VIDIOC_INT_S_STANDBY",
318 [_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)] = "VIDIOC_INT_S_AUDIO_ROUTING",
319 [_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)] = "VIDIOC_INT_G_AUDIO_ROUTING",
320 [_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)] = "VIDIOC_INT_S_VIDEO_ROUTING",
321 [_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)] = "VIDIOC_INT_G_VIDEO_ROUTING",
322 [_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ)] = "VIDIOC_INT_S_CRYSTAL_FREQ",
323 [_IOC_NR(VIDIOC_INT_INIT)] = "VIDIOC_INT_INIT",
324 [_IOC_NR(VIDIOC_INT_G_STD_OUTPUT)] = "VIDIOC_INT_G_STD_OUTPUT",
325 [_IOC_NR(VIDIOC_INT_S_STD_OUTPUT)] = "VIDIOC_INT_S_STD_OUTPUT",
327 #define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
329 /* Common ioctl debug function. This function can be used by
330 external ioctl messages as well as internal V4L ioctl */
331 void v4l_printk_ioctl(unsigned int cmd)
335 switch (_IOC_TYPE(cmd)) {
337 if (_IOC_NR(cmd) >= V4L2_INT_IOCTLS) {
341 printk("%s", v4l2_int_ioctls[_IOC_NR(cmd)]);
343 #ifdef CONFIG_VIDEO_V4L1_COMPAT
345 if (_IOC_NR(cmd) >= V4L1_IOCTLS) {
349 printk("%s", v4l1_ioctls[_IOC_NR(cmd)]);
353 if (_IOC_NR(cmd) >= V4L2_IOCTLS) {
357 printk("%s", v4l2_ioctls[_IOC_NR(cmd)]);
363 switch (_IOC_DIR(cmd)) {
364 case _IOC_NONE: dir = "--"; break;
365 case _IOC_READ: dir = "r-"; break;
366 case _IOC_WRITE: dir = "-w"; break;
367 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
368 default: dir = "*ERR*"; break;
370 printk("%s ioctl '%c', dir=%s, #%d (0x%08x)",
371 type, _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
373 EXPORT_SYMBOL(v4l_printk_ioctl);
379 static ssize_t show_index(struct device *cd,
380 struct device_attribute *attr, char *buf)
382 struct video_device *vfd = container_of(cd, struct video_device,
384 return sprintf(buf, "%i\n", vfd->index);
387 static ssize_t show_name(struct device *cd,
388 struct device_attribute *attr, char *buf)
390 struct video_device *vfd = container_of(cd, struct video_device,
392 return sprintf(buf, "%.*s\n", (int)sizeof(vfd->name), vfd->name);
395 struct video_device *video_device_alloc(void)
397 struct video_device *vfd;
399 vfd = kzalloc(sizeof(*vfd),GFP_KERNEL);
402 EXPORT_SYMBOL(video_device_alloc);
404 void video_device_release(struct video_device *vfd)
408 EXPORT_SYMBOL(video_device_release);
410 static void video_release(struct device *cd)
412 struct video_device *vfd = container_of(cd, struct video_device,
416 /* needed until all drivers are fixed */
423 static struct device_attribute video_device_attrs[] = {
424 __ATTR(name, S_IRUGO, show_name, NULL),
425 __ATTR(index, S_IRUGO, show_index, NULL),
429 static struct class video_class = {
431 .dev_attrs = video_device_attrs,
432 .dev_release = video_release,
439 static struct video_device *video_device[VIDEO_NUM_DEVICES];
440 static DEFINE_MUTEX(videodev_lock);
442 struct video_device* video_devdata(struct file *file)
444 return video_device[iminor(file->f_path.dentry->d_inode)];
446 EXPORT_SYMBOL(video_devdata);
449 * Open a video device - FIXME: Obsoleted
451 static int video_open(struct inode *inode, struct file *file)
453 unsigned int minor = iminor(inode);
455 struct video_device *vfl;
456 const struct file_operations *old_fops;
458 if(minor>=VIDEO_NUM_DEVICES)
461 mutex_lock(&videodev_lock);
462 vfl=video_device[minor];
464 mutex_unlock(&videodev_lock);
465 request_module("char-major-%d-%d", VIDEO_MAJOR, minor);
466 mutex_lock(&videodev_lock);
467 vfl=video_device[minor];
469 mutex_unlock(&videodev_lock);
474 old_fops = file->f_op;
475 file->f_op = fops_get(vfl->fops);
477 err = file->f_op->open(inode,file);
479 fops_put(file->f_op);
480 file->f_op = fops_get(old_fops);
483 mutex_unlock(&videodev_lock);
489 * helper function -- handles userspace copying for ioctl arguments
494 video_fix_command(unsigned int cmd)
497 case VIDIOC_OVERLAY_OLD:
498 cmd = VIDIOC_OVERLAY;
500 case VIDIOC_S_PARM_OLD:
503 case VIDIOC_S_CTRL_OLD:
506 case VIDIOC_G_AUDIO_OLD:
507 cmd = VIDIOC_G_AUDIO;
509 case VIDIOC_G_AUDOUT_OLD:
510 cmd = VIDIOC_G_AUDOUT;
512 case VIDIOC_CROPCAP_OLD:
513 cmd = VIDIOC_CROPCAP;
521 * Obsolete usercopy function - Should be removed soon
524 video_usercopy(struct inode *inode, struct file *file,
525 unsigned int cmd, unsigned long arg,
526 int (*func)(struct inode *inode, struct file *file,
527 unsigned int cmd, void *arg))
534 size_t ctrls_size = 0;
535 void __user *user_ptr = NULL;
538 cmd = video_fix_command(cmd);
540 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
541 cmd == VIDIOC_TRY_EXT_CTRLS);
543 /* Copy arguments into temp kernel buffer */
544 switch (_IOC_DIR(cmd)) {
550 case (_IOC_WRITE | _IOC_READ):
551 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
554 /* too big to allocate from stack */
555 mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
562 if (_IOC_DIR(cmd) & _IOC_WRITE)
563 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
568 struct v4l2_ext_controls *p = parg;
570 /* In case of an error, tell the caller that it wasn't
571 a specific control that caused it. */
572 p->error_idx = p->count;
573 user_ptr = (void __user *)p->controls;
575 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
576 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
577 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
582 if (copy_from_user(mbuf, user_ptr, ctrls_size))
589 err = func(inode, file, cmd, parg);
590 if (err == -ENOIOCTLCMD)
593 struct v4l2_ext_controls *p = parg;
595 p->controls = (void *)user_ptr;
596 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
604 /* Copy results into user buffer */
605 switch (_IOC_DIR(cmd))
608 case (_IOC_WRITE | _IOC_READ):
609 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
618 EXPORT_SYMBOL(video_usercopy);
621 * open/release helper functions -- handle exclusive opens
622 * Should be removed soon
624 int video_exclusive_open(struct inode *inode, struct file *file)
626 struct video_device *vfl = video_devdata(file);
629 mutex_lock(&vfl->lock);
635 mutex_unlock(&vfl->lock);
638 EXPORT_SYMBOL(video_exclusive_open);
640 int video_exclusive_release(struct inode *inode, struct file *file)
642 struct video_device *vfl = video_devdata(file);
647 EXPORT_SYMBOL(video_exclusive_release);
649 static void dbgbuf(unsigned int cmd, struct video_device *vfd,
650 struct v4l2_buffer *p)
652 struct v4l2_timecode *tc=&p->timecode;
654 dbgarg (cmd, "%02ld:%02d:%02d.%08ld index=%d, type=%s, "
655 "bytesused=%d, flags=0x%08d, "
656 "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx, length=%d\n",
657 (p->timestamp.tv_sec/3600),
658 (int)(p->timestamp.tv_sec/60)%60,
659 (int)(p->timestamp.tv_sec%60),
660 p->timestamp.tv_usec,
662 prt_names(p->type, v4l2_type_names),
663 p->bytesused, p->flags,
664 p->field, p->sequence,
665 prt_names(p->memory, v4l2_memory_names),
666 p->m.userptr, p->length);
667 dbgarg2("timecode=%02d:%02d:%02d type=%d, "
668 "flags=0x%08d, frames=%d, userbits=0x%08x\n",
669 tc->hours,tc->minutes,tc->seconds,
670 tc->type, tc->flags, tc->frames, *(__u32 *) tc->userbits);
673 static inline void dbgrect(struct video_device *vfd, char *s,
676 dbgarg2("%sRect start at %dx%d, size=%dx%d\n", s, r->left, r->top,
677 r->width, r->height);
680 static inline void v4l_print_pix_fmt (struct video_device *vfd,
681 struct v4l2_pix_format *fmt)
683 dbgarg2 ("width=%d, height=%d, format=%c%c%c%c, field=%s, "
684 "bytesperline=%d sizeimage=%d, colorspace=%d\n",
685 fmt->width,fmt->height,
686 (fmt->pixelformat & 0xff),
687 (fmt->pixelformat >> 8) & 0xff,
688 (fmt->pixelformat >> 16) & 0xff,
689 (fmt->pixelformat >> 24) & 0xff,
690 prt_names(fmt->field, v4l2_field_names),
691 fmt->bytesperline, fmt->sizeimage, fmt->colorspace);
694 static inline void v4l_print_ext_ctrls(unsigned int cmd,
695 struct video_device *vfd, struct v4l2_ext_controls *c, int show_vals)
699 if (!(vfd->debug & V4L2_DEBUG_IOCTL_ARG))
702 printk(KERN_CONT "class=0x%x", c->ctrl_class);
703 for (i = 0; i < c->count; i++) {
705 printk(KERN_CONT " id/val=0x%x/0x%x",
706 c->controls[i].id, c->controls[i].value);
708 printk(KERN_CONT " id=0x%x", c->controls[i].id);
710 printk(KERN_CONT "\n");
713 static inline int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
717 /* zero the reserved fields */
718 c->reserved[0] = c->reserved[1] = 0;
719 for (i = 0; i < c->count; i++) {
720 c->controls[i].reserved2[0] = 0;
721 c->controls[i].reserved2[1] = 0;
723 /* V4L2_CID_PRIVATE_BASE cannot be used as control class
724 when using extended controls.
725 Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL
726 is it allowed for backwards compatibility.
728 if (!allow_priv && c->ctrl_class == V4L2_CID_PRIVATE_BASE)
730 /* Check that all controls are from the same control class. */
731 for (i = 0; i < c->count; i++) {
732 if (V4L2_CTRL_ID2CLASS(c->controls[i].id) != c->ctrl_class) {
740 static int check_fmt (struct video_device *vfd, enum v4l2_buf_type type)
743 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
744 if (vfd->vidioc_try_fmt_vid_cap)
747 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
748 if (vfd->vidioc_try_fmt_vid_overlay)
751 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
752 if (vfd->vidioc_try_fmt_vid_out)
755 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
756 if (vfd->vidioc_try_fmt_vid_out_overlay)
759 case V4L2_BUF_TYPE_VBI_CAPTURE:
760 if (vfd->vidioc_try_fmt_vbi_cap)
763 case V4L2_BUF_TYPE_VBI_OUTPUT:
764 if (vfd->vidioc_try_fmt_vbi_out)
767 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
768 if (vfd->vidioc_try_fmt_sliced_vbi_cap)
771 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
772 if (vfd->vidioc_try_fmt_sliced_vbi_out)
775 case V4L2_BUF_TYPE_PRIVATE:
776 if (vfd->vidioc_try_fmt_type_private)
783 static int __video_do_ioctl(struct inode *inode, struct file *file,
784 unsigned int cmd, void *arg)
786 struct video_device *vfd = video_devdata(file);
787 void *fh = file->private_data;
790 if ( (vfd->debug & V4L2_DEBUG_IOCTL) &&
791 !(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) {
792 v4l_print_ioctl(vfd->name, cmd);
796 #ifdef CONFIG_VIDEO_V4L1_COMPAT
797 /***********************************************************
798 Handles calls to the obsoleted V4L1 API
799 Due to the nature of VIDIOCGMBUF, each driver that supports
800 V4L1 should implement its own handler for this ioctl.
801 ***********************************************************/
803 /* --- streaming capture ------------------------------------- */
804 if (cmd == VIDIOCGMBUF) {
805 struct video_mbuf *p=arg;
807 memset(p, 0, sizeof(*p));
809 if (!vfd->vidiocgmbuf)
811 ret=vfd->vidiocgmbuf(file, fh, p);
813 dbgarg (cmd, "size=%d, frames=%d, offsets=0x%08lx\n",
815 (unsigned long)p->offsets);
819 /********************************************************
820 All other V4L1 calls are handled by v4l1_compat module.
821 Those calls will be translated into V4L2 calls, and
822 __video_do_ioctl will be called again, with one or more
824 ********************************************************/
825 if (_IOC_TYPE(cmd)=='v')
826 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
831 /* --- capabilities ------------------------------------------ */
832 case VIDIOC_QUERYCAP:
834 struct v4l2_capability *cap = (struct v4l2_capability*)arg;
835 memset(cap, 0, sizeof(*cap));
837 if (!vfd->vidioc_querycap)
840 ret=vfd->vidioc_querycap(file, fh, cap);
842 dbgarg (cmd, "driver=%s, card=%s, bus=%s, "
844 "capabilities=0x%08x\n",
845 cap->driver,cap->card,cap->bus_info,
851 /* --- priority ------------------------------------------ */
852 case VIDIOC_G_PRIORITY:
854 enum v4l2_priority *p=arg;
856 if (!vfd->vidioc_g_priority)
858 ret=vfd->vidioc_g_priority(file, fh, p);
860 dbgarg(cmd, "priority is %d\n", *p);
863 case VIDIOC_S_PRIORITY:
865 enum v4l2_priority *p=arg;
867 if (!vfd->vidioc_s_priority)
869 dbgarg(cmd, "setting priority to %d\n", *p);
870 ret=vfd->vidioc_s_priority(file, fh, *p);
874 /* --- capture ioctls ---------------------------------------- */
875 case VIDIOC_ENUM_FMT:
877 struct v4l2_fmtdesc *f = arg;
878 enum v4l2_buf_type type;
883 memset(f,0,sizeof(*f));
888 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
889 if (vfd->vidioc_enum_fmt_vid_cap)
890 ret = vfd->vidioc_enum_fmt_vid_cap(file, fh, f);
892 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
893 if (vfd->vidioc_enum_fmt_vid_overlay)
894 ret = vfd->vidioc_enum_fmt_vid_overlay(file,
898 /* V4L2_BUF_TYPE_VBI_CAPTURE should not support VIDIOC_ENUM_FMT
899 * according to the spec. The bttv and saa7134 drivers support
900 * it though, so just warn that this is deprecated and will be
901 * removed in the near future. */
902 case V4L2_BUF_TYPE_VBI_CAPTURE:
903 if (vfd->vidioc_enum_fmt_vbi_cap) {
904 printk(KERN_WARNING "vidioc_enum_fmt_vbi_cap will be removed in 2.6.28!\n");
905 ret = vfd->vidioc_enum_fmt_vbi_cap(file, fh, f);
909 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
910 if (vfd->vidioc_enum_fmt_vid_out)
911 ret = vfd->vidioc_enum_fmt_vid_out(file, fh, f);
913 case V4L2_BUF_TYPE_PRIVATE:
914 if (vfd->vidioc_enum_fmt_type_private)
915 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;
936 memset(f->fmt.raw_data, 0, sizeof(f->fmt.raw_data));
938 /* FIXME: Should be one dump per type */
939 dbgarg(cmd, "type=%s\n", prt_names(f->type, v4l2_type_names));
942 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
943 if (vfd->vidioc_g_fmt_vid_cap)
944 ret = vfd->vidioc_g_fmt_vid_cap(file, fh, f);
946 v4l_print_pix_fmt(vfd, &f->fmt.pix);
948 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
949 if (vfd->vidioc_g_fmt_vid_overlay)
950 ret = vfd->vidioc_g_fmt_vid_overlay(file,
953 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
954 if (vfd->vidioc_g_fmt_vid_out)
955 ret = vfd->vidioc_g_fmt_vid_out(file, fh, f);
957 v4l_print_pix_fmt(vfd, &f->fmt.pix);
959 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
960 if (vfd->vidioc_g_fmt_vid_out_overlay)
961 ret = vfd->vidioc_g_fmt_vid_out_overlay(file,
964 case V4L2_BUF_TYPE_VBI_CAPTURE:
965 if (vfd->vidioc_g_fmt_vbi_cap)
966 ret = vfd->vidioc_g_fmt_vbi_cap(file, fh, f);
968 case V4L2_BUF_TYPE_VBI_OUTPUT:
969 if (vfd->vidioc_g_fmt_vbi_out)
970 ret = vfd->vidioc_g_fmt_vbi_out(file, fh, f);
972 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
973 if (vfd->vidioc_g_fmt_sliced_vbi_cap)
974 ret = vfd->vidioc_g_fmt_sliced_vbi_cap(file,
977 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
978 if (vfd->vidioc_g_fmt_sliced_vbi_out)
979 ret = vfd->vidioc_g_fmt_sliced_vbi_out(file,
982 case V4L2_BUF_TYPE_PRIVATE:
983 if (vfd->vidioc_g_fmt_type_private)
984 ret = vfd->vidioc_g_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, v4l2_type_names));
999 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1000 v4l_print_pix_fmt(vfd, &f->fmt.pix);
1001 if (vfd->vidioc_s_fmt_vid_cap)
1002 ret = vfd->vidioc_s_fmt_vid_cap(file, fh, f);
1004 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1005 if (vfd->vidioc_s_fmt_vid_overlay)
1006 ret = vfd->vidioc_s_fmt_vid_overlay(file,
1009 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1010 v4l_print_pix_fmt(vfd, &f->fmt.pix);
1011 if (vfd->vidioc_s_fmt_vid_out)
1012 ret = vfd->vidioc_s_fmt_vid_out(file, fh, f);
1014 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
1015 if (vfd->vidioc_s_fmt_vid_out_overlay)
1016 ret = vfd->vidioc_s_fmt_vid_out_overlay(file,
1019 case V4L2_BUF_TYPE_VBI_CAPTURE:
1020 if (vfd->vidioc_s_fmt_vbi_cap)
1021 ret = vfd->vidioc_s_fmt_vbi_cap(file, fh, f);
1023 case V4L2_BUF_TYPE_VBI_OUTPUT:
1024 if (vfd->vidioc_s_fmt_vbi_out)
1025 ret = vfd->vidioc_s_fmt_vbi_out(file, fh, f);
1027 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
1028 if (vfd->vidioc_s_fmt_sliced_vbi_cap)
1029 ret = vfd->vidioc_s_fmt_sliced_vbi_cap(file,
1032 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
1033 if (vfd->vidioc_s_fmt_sliced_vbi_out)
1034 ret = vfd->vidioc_s_fmt_sliced_vbi_out(file,
1037 case V4L2_BUF_TYPE_PRIVATE:
1038 if (vfd->vidioc_s_fmt_type_private)
1039 ret = vfd->vidioc_s_fmt_type_private(file,
1045 case VIDIOC_TRY_FMT:
1047 struct v4l2_format *f = (struct v4l2_format *)arg;
1049 /* FIXME: Should be one dump per type */
1050 dbgarg (cmd, "type=%s\n", prt_names(f->type,
1053 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1054 if (vfd->vidioc_try_fmt_vid_cap)
1055 ret = vfd->vidioc_try_fmt_vid_cap(file, fh, f);
1057 v4l_print_pix_fmt(vfd, &f->fmt.pix);
1059 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1060 if (vfd->vidioc_try_fmt_vid_overlay)
1061 ret = vfd->vidioc_try_fmt_vid_overlay(file,
1064 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1065 if (vfd->vidioc_try_fmt_vid_out)
1066 ret = vfd->vidioc_try_fmt_vid_out(file, fh, f);
1068 v4l_print_pix_fmt(vfd, &f->fmt.pix);
1070 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
1071 if (vfd->vidioc_try_fmt_vid_out_overlay)
1072 ret = vfd->vidioc_try_fmt_vid_out_overlay(file,
1075 case V4L2_BUF_TYPE_VBI_CAPTURE:
1076 if (vfd->vidioc_try_fmt_vbi_cap)
1077 ret = vfd->vidioc_try_fmt_vbi_cap(file, fh, f);
1079 case V4L2_BUF_TYPE_VBI_OUTPUT:
1080 if (vfd->vidioc_try_fmt_vbi_out)
1081 ret = vfd->vidioc_try_fmt_vbi_out(file, fh, f);
1083 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
1084 if (vfd->vidioc_try_fmt_sliced_vbi_cap)
1085 ret = vfd->vidioc_try_fmt_sliced_vbi_cap(file,
1088 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
1089 if (vfd->vidioc_try_fmt_sliced_vbi_out)
1090 ret = vfd->vidioc_try_fmt_sliced_vbi_out(file,
1093 case V4L2_BUF_TYPE_PRIVATE:
1094 if (vfd->vidioc_try_fmt_type_private)
1095 ret = vfd->vidioc_try_fmt_type_private(file,
1102 /* FIXME: Those buf reqs could be handled here,
1103 with some changes on videobuf to allow its header to be included at
1104 videodev2.h or being merged at videodev2.
1106 case VIDIOC_REQBUFS:
1108 struct v4l2_requestbuffers *p=arg;
1110 if (!vfd->vidioc_reqbufs)
1112 ret = check_fmt (vfd, p->type);
1116 ret=vfd->vidioc_reqbufs(file, fh, p);
1117 dbgarg (cmd, "count=%d, type=%s, memory=%s\n",
1119 prt_names(p->type, v4l2_type_names),
1120 prt_names(p->memory, v4l2_memory_names));
1123 case VIDIOC_QUERYBUF:
1125 struct v4l2_buffer *p=arg;
1127 if (!vfd->vidioc_querybuf)
1129 ret = check_fmt (vfd, p->type);
1133 ret=vfd->vidioc_querybuf(file, fh, p);
1140 struct v4l2_buffer *p=arg;
1142 if (!vfd->vidioc_qbuf)
1144 ret = check_fmt (vfd, p->type);
1148 ret=vfd->vidioc_qbuf(file, fh, p);
1155 struct v4l2_buffer *p=arg;
1156 if (!vfd->vidioc_dqbuf)
1158 ret = check_fmt (vfd, p->type);
1162 ret=vfd->vidioc_dqbuf(file, fh, p);
1167 case VIDIOC_OVERLAY:
1171 if (!vfd->vidioc_overlay)
1173 dbgarg (cmd, "value=%d\n",*i);
1174 ret=vfd->vidioc_overlay(file, fh, *i);
1179 struct v4l2_framebuffer *p = arg;
1181 if (!vfd->vidioc_g_fbuf)
1183 ret = vfd->vidioc_g_fbuf(file, fh, arg);
1185 dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
1186 p->capability, p->flags,
1187 (unsigned long)p->base);
1188 v4l_print_pix_fmt(vfd, &p->fmt);
1194 struct v4l2_framebuffer *p = arg;
1196 if (!vfd->vidioc_s_fbuf)
1198 dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
1199 p->capability, p->flags, (unsigned long)p->base);
1200 v4l_print_pix_fmt(vfd, &p->fmt);
1201 ret = vfd->vidioc_s_fbuf(file, fh, arg);
1204 case VIDIOC_STREAMON:
1206 enum v4l2_buf_type i = *(int *)arg;
1207 if (!vfd->vidioc_streamon)
1209 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1210 ret=vfd->vidioc_streamon(file, fh,i);
1213 case VIDIOC_STREAMOFF:
1215 enum v4l2_buf_type i = *(int *)arg;
1217 if (!vfd->vidioc_streamoff)
1219 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1220 ret=vfd->vidioc_streamoff(file, fh, i);
1223 /* ---------- tv norms ---------- */
1224 case VIDIOC_ENUMSTD:
1226 struct v4l2_standard *p = arg;
1227 v4l2_std_id id = vfd->tvnorms, curr_id = 0;
1228 unsigned int index = p->index, i, j = 0;
1229 const char *descr = "";
1231 /* Return norm array in a canonical way */
1232 for (i = 0; i <= index && id; i++) {
1233 /* last std value in the standards array is 0, so this
1234 while always ends there since (id & 0) == 0. */
1235 while ((id & standards[j].std) != standards[j].std)
1237 curr_id = standards[j].std;
1238 descr = standards[j].descr;
1242 if (curr_id != V4L2_STD_PAL &&
1243 curr_id != V4L2_STD_SECAM &&
1244 curr_id != V4L2_STD_NTSC)
1250 v4l2_video_std_construct(p, curr_id, descr);
1253 dbgarg(cmd, "index=%d, id=0x%Lx, name=%s, fps=%d/%d, "
1254 "framelines=%d\n", p->index,
1255 (unsigned long long)p->id, p->name,
1256 p->frameperiod.numerator,
1257 p->frameperiod.denominator,
1265 v4l2_std_id *id = arg;
1268 /* Calls the specific handler */
1269 if (vfd->vidioc_g_std)
1270 ret = vfd->vidioc_g_std(file, fh, id);
1272 *id = vfd->current_norm;
1275 dbgarg(cmd, "std=0x%08Lx\n", (long long unsigned)*id);
1280 v4l2_std_id *id = arg,norm;
1282 dbgarg(cmd, "std=%08Lx\n", (long long unsigned)*id);
1284 norm = (*id) & vfd->tvnorms;
1285 if ( vfd->tvnorms && !norm) /* Check if std is supported */
1288 /* Calls the specific handler */
1289 if (vfd->vidioc_s_std)
1290 ret=vfd->vidioc_s_std(file, fh, &norm);
1294 /* Updates standard information */
1296 vfd->current_norm=norm;
1300 case VIDIOC_QUERYSTD:
1304 if (!vfd->vidioc_querystd)
1306 ret=vfd->vidioc_querystd(file, fh, arg);
1308 dbgarg (cmd, "detected std=%08Lx\n",
1309 (unsigned long long)*p);
1312 /* ------ input switching ---------- */
1313 /* FIXME: Inputs can be handled inside videodev2 */
1314 case VIDIOC_ENUMINPUT:
1316 struct v4l2_input *p=arg;
1319 if (!vfd->vidioc_enum_input)
1321 memset(p, 0, sizeof(*p));
1324 ret=vfd->vidioc_enum_input(file, fh, p);
1326 dbgarg (cmd, "index=%d, name=%s, type=%d, "
1328 "tuner=%d, std=%08Lx, status=%d\n",
1329 p->index,p->name,p->type,p->audioset,
1331 (unsigned long long)p->std,
1335 case VIDIOC_G_INPUT:
1337 unsigned int *i = arg;
1339 if (!vfd->vidioc_g_input)
1341 ret=vfd->vidioc_g_input(file, fh, i);
1343 dbgarg (cmd, "value=%d\n",*i);
1346 case VIDIOC_S_INPUT:
1348 unsigned int *i = arg;
1350 if (!vfd->vidioc_s_input)
1352 dbgarg (cmd, "value=%d\n",*i);
1353 ret=vfd->vidioc_s_input(file, fh, *i);
1357 /* ------ output switching ---------- */
1358 case VIDIOC_ENUMOUTPUT:
1360 struct v4l2_output *p = arg;
1363 if (!vfd->vidioc_enum_output)
1365 memset(p, 0, sizeof(*p));
1368 ret = vfd->vidioc_enum_output(file, fh, p);
1370 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1372 "modulator=%d, std=0x%08Lx\n",
1373 p->index, p->name, p->type, p->audioset,
1374 p->modulator, (unsigned long long)p->std);
1377 case VIDIOC_G_OUTPUT:
1379 unsigned int *i = arg;
1381 if (!vfd->vidioc_g_output)
1383 ret=vfd->vidioc_g_output(file, fh, i);
1385 dbgarg (cmd, "value=%d\n",*i);
1388 case VIDIOC_S_OUTPUT:
1390 unsigned int *i = arg;
1392 if (!vfd->vidioc_s_output)
1394 dbgarg (cmd, "value=%d\n",*i);
1395 ret=vfd->vidioc_s_output(file, fh, *i);
1399 /* --- controls ---------------------------------------------- */
1400 case VIDIOC_QUERYCTRL:
1402 struct v4l2_queryctrl *p = arg;
1404 if (!vfd->vidioc_queryctrl)
1406 ret = vfd->vidioc_queryctrl(file, fh, p);
1408 dbgarg(cmd, "id=0x%x, type=%d, name=%s, min/max=%d/%d, "
1409 "step=%d, default=%d, flags=0x%08x\n",
1410 p->id, p->type, p->name,
1411 p->minimum, p->maximum,
1412 p->step, p->default_value, p->flags);
1414 dbgarg(cmd, "id=0x%x\n", p->id);
1419 struct v4l2_control *p = arg;
1421 if (vfd->vidioc_g_ctrl)
1422 ret = vfd->vidioc_g_ctrl(file, fh, p);
1423 else if (vfd->vidioc_g_ext_ctrls) {
1424 struct v4l2_ext_controls ctrls;
1425 struct v4l2_ext_control ctrl;
1427 ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
1429 ctrls.controls = &ctrl;
1431 ctrl.value = p->value;
1432 if (check_ext_ctrls(&ctrls, 1)) {
1433 ret = vfd->vidioc_g_ext_ctrls(file, fh, &ctrls);
1435 p->value = ctrl.value;
1440 dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);
1442 dbgarg(cmd, "id=0x%x\n", p->id);
1447 struct v4l2_control *p = arg;
1448 struct v4l2_ext_controls ctrls;
1449 struct v4l2_ext_control ctrl;
1451 if (!vfd->vidioc_s_ctrl && !vfd->vidioc_s_ext_ctrls)
1454 dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);
1456 if (vfd->vidioc_s_ctrl) {
1457 ret = vfd->vidioc_s_ctrl(file, fh, p);
1460 if (!vfd->vidioc_s_ext_ctrls)
1463 ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
1465 ctrls.controls = &ctrl;
1467 ctrl.value = p->value;
1468 if (check_ext_ctrls(&ctrls, 1))
1469 ret = vfd->vidioc_s_ext_ctrls(file, fh, &ctrls);
1472 case VIDIOC_G_EXT_CTRLS:
1474 struct v4l2_ext_controls *p = arg;
1476 p->error_idx = p->count;
1477 if (!vfd->vidioc_g_ext_ctrls)
1479 if (check_ext_ctrls(p, 0))
1480 ret = vfd->vidioc_g_ext_ctrls(file, fh, p);
1481 v4l_print_ext_ctrls(cmd, vfd, p, !ret);
1484 case VIDIOC_S_EXT_CTRLS:
1486 struct v4l2_ext_controls *p = arg;
1488 p->error_idx = p->count;
1489 if (!vfd->vidioc_s_ext_ctrls)
1491 v4l_print_ext_ctrls(cmd, vfd, p, 1);
1492 if (check_ext_ctrls(p, 0))
1493 ret = vfd->vidioc_s_ext_ctrls(file, fh, p);
1496 case VIDIOC_TRY_EXT_CTRLS:
1498 struct v4l2_ext_controls *p = arg;
1500 p->error_idx = p->count;
1501 if (!vfd->vidioc_try_ext_ctrls)
1503 v4l_print_ext_ctrls(cmd, vfd, p, 1);
1504 if (check_ext_ctrls(p, 0))
1505 ret = vfd->vidioc_try_ext_ctrls(file, fh, p);
1508 case VIDIOC_QUERYMENU:
1510 struct v4l2_querymenu *p = arg;
1512 if (!vfd->vidioc_querymenu)
1514 ret = vfd->vidioc_querymenu(file, fh, p);
1516 dbgarg(cmd, "id=0x%x, index=%d, name=%s\n",
1517 p->id, p->index, p->name);
1519 dbgarg(cmd, "id=0x%x, index=%d\n",
1523 /* --- audio ---------------------------------------------- */
1524 case VIDIOC_ENUMAUDIO:
1526 struct v4l2_audio *p = arg;
1528 if (!vfd->vidioc_enumaudio)
1530 ret = vfd->vidioc_enumaudio(file, fh, p);
1532 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1533 "mode=0x%x\n", p->index, p->name,
1534 p->capability, p->mode);
1536 dbgarg(cmd, "index=%d\n", p->index);
1539 case VIDIOC_G_AUDIO:
1541 struct v4l2_audio *p = arg;
1542 __u32 index = p->index;
1544 if (!vfd->vidioc_g_audio)
1547 memset(p, 0, sizeof(*p));
1549 ret = vfd->vidioc_g_audio(file, fh, p);
1551 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1552 "mode=0x%x\n", p->index,
1553 p->name, p->capability, p->mode);
1555 dbgarg(cmd, "index=%d\n", p->index);
1558 case VIDIOC_S_AUDIO:
1560 struct v4l2_audio *p = arg;
1562 if (!vfd->vidioc_s_audio)
1564 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1565 "mode=0x%x\n", p->index, p->name,
1566 p->capability, p->mode);
1567 ret = vfd->vidioc_s_audio(file, fh, p);
1570 case VIDIOC_ENUMAUDOUT:
1572 struct v4l2_audioout *p=arg;
1574 if (!vfd->vidioc_enumaudout)
1576 dbgarg(cmd, "Enum for index=%d\n", p->index);
1577 ret=vfd->vidioc_enumaudout(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_G_AUDOUT:
1586 struct v4l2_audioout *p=arg;
1588 if (!vfd->vidioc_g_audout)
1590 dbgarg(cmd, "Enum for index=%d\n", p->index);
1591 ret=vfd->vidioc_g_audout(file, fh, p);
1593 dbgarg2("index=%d, name=%s, capability=%d, "
1594 "mode=%d\n", p->index, p->name,
1595 p->capability,p->mode);
1598 case VIDIOC_S_AUDOUT:
1600 struct v4l2_audioout *p=arg;
1602 if (!vfd->vidioc_s_audout)
1604 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1605 "mode=%d\n", p->index, p->name,
1606 p->capability,p->mode);
1608 ret=vfd->vidioc_s_audout(file, fh, p);
1611 case VIDIOC_G_MODULATOR:
1613 struct v4l2_modulator *p=arg;
1614 if (!vfd->vidioc_g_modulator)
1616 ret=vfd->vidioc_g_modulator(file, fh, p);
1618 dbgarg(cmd, "index=%d, name=%s, "
1619 "capability=%d, rangelow=%d,"
1620 " rangehigh=%d, txsubchans=%d\n",
1621 p->index, p->name,p->capability,
1622 p->rangelow, p->rangehigh,
1626 case VIDIOC_S_MODULATOR:
1628 struct v4l2_modulator *p=arg;
1629 if (!vfd->vidioc_s_modulator)
1631 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1632 "rangelow=%d, rangehigh=%d, txsubchans=%d\n",
1633 p->index, p->name,p->capability,p->rangelow,
1634 p->rangehigh,p->txsubchans);
1635 ret=vfd->vidioc_s_modulator(file, fh, p);
1640 struct v4l2_crop *p=arg;
1641 if (!vfd->vidioc_g_crop)
1643 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1644 ret=vfd->vidioc_g_crop(file, fh, p);
1646 dbgrect(vfd, "", &p->c);
1652 struct v4l2_crop *p=arg;
1653 if (!vfd->vidioc_s_crop)
1655 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1656 dbgrect(vfd, "", &p->c);
1657 ret=vfd->vidioc_s_crop(file, fh, p);
1660 case VIDIOC_CROPCAP:
1662 struct v4l2_cropcap *p = arg;
1664 /*FIXME: Should also show v4l2_fract pixelaspect */
1665 if (!vfd->vidioc_cropcap)
1667 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1668 ret = vfd->vidioc_cropcap(file, fh, p);
1670 dbgrect(vfd, "bounds ", &p->bounds);
1671 dbgrect(vfd, "defrect ", &p->defrect);
1675 case VIDIOC_G_JPEGCOMP:
1677 struct v4l2_jpegcompression *p=arg;
1678 if (!vfd->vidioc_g_jpegcomp)
1680 ret=vfd->vidioc_g_jpegcomp(file, fh, p);
1682 dbgarg (cmd, "quality=%d, APPn=%d, "
1683 "APP_len=%d, COM_len=%d, "
1684 "jpeg_markers=%d\n",
1685 p->quality,p->APPn,p->APP_len,
1686 p->COM_len,p->jpeg_markers);
1689 case VIDIOC_S_JPEGCOMP:
1691 struct v4l2_jpegcompression *p=arg;
1692 if (!vfd->vidioc_g_jpegcomp)
1694 dbgarg (cmd, "quality=%d, APPn=%d, APP_len=%d, "
1695 "COM_len=%d, jpeg_markers=%d\n",
1696 p->quality,p->APPn,p->APP_len,
1697 p->COM_len,p->jpeg_markers);
1698 ret=vfd->vidioc_s_jpegcomp(file, fh, p);
1701 case VIDIOC_G_ENC_INDEX:
1703 struct v4l2_enc_idx *p=arg;
1705 if (!vfd->vidioc_g_enc_index)
1707 ret=vfd->vidioc_g_enc_index(file, fh, p);
1709 dbgarg (cmd, "entries=%d, entries_cap=%d\n",
1710 p->entries,p->entries_cap);
1713 case VIDIOC_ENCODER_CMD:
1715 struct v4l2_encoder_cmd *p = arg;
1717 if (!vfd->vidioc_encoder_cmd)
1719 memset(&p->raw, 0, sizeof(p->raw));
1720 ret = vfd->vidioc_encoder_cmd(file, fh, p);
1722 dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
1725 case VIDIOC_TRY_ENCODER_CMD:
1727 struct v4l2_encoder_cmd *p = arg;
1729 if (!vfd->vidioc_try_encoder_cmd)
1731 memset(&p->raw, 0, sizeof(p->raw));
1732 ret = vfd->vidioc_try_encoder_cmd(file, fh, p);
1734 dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
1739 struct v4l2_streamparm *p=arg;
1742 memset(p,0,sizeof(*p));
1745 if (vfd->vidioc_g_parm) {
1746 ret=vfd->vidioc_g_parm(file, fh, p);
1748 struct v4l2_standard s;
1750 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1753 v4l2_video_std_construct(&s, vfd->current_norm,
1754 v4l2_norm_to_name(vfd->current_norm));
1756 p->parm.capture.timeperframe = s.frameperiod;
1760 dbgarg (cmd, "type=%d\n", p->type);
1765 struct v4l2_streamparm *p=arg;
1766 if (!vfd->vidioc_s_parm)
1768 dbgarg (cmd, "type=%d\n", p->type);
1769 ret=vfd->vidioc_s_parm(file, fh, p);
1772 case VIDIOC_G_TUNER:
1774 struct v4l2_tuner *p = arg;
1775 __u32 index = p->index;
1777 if (!vfd->vidioc_g_tuner)
1780 memset(p, 0, sizeof(*p));
1783 ret = vfd->vidioc_g_tuner(file, fh, p);
1785 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1786 "capability=0x%x, rangelow=%d, "
1787 "rangehigh=%d, signal=%d, afc=%d, "
1788 "rxsubchans=0x%x, audmode=%d\n",
1789 p->index, p->name, p->type,
1790 p->capability, p->rangelow,
1791 p->rangehigh, p->signal, p->afc,
1792 p->rxsubchans, p->audmode);
1795 case VIDIOC_S_TUNER:
1797 struct v4l2_tuner *p = arg;
1799 if (!vfd->vidioc_s_tuner)
1801 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1802 "capability=0x%x, rangelow=%d, "
1803 "rangehigh=%d, signal=%d, afc=%d, "
1804 "rxsubchans=0x%x, audmode=%d\n",
1805 p->index, p->name, p->type,
1806 p->capability, p->rangelow,
1807 p->rangehigh, p->signal, p->afc,
1808 p->rxsubchans, p->audmode);
1809 ret = vfd->vidioc_s_tuner(file, fh, p);
1812 case VIDIOC_G_FREQUENCY:
1814 struct v4l2_frequency *p = arg;
1816 if (!vfd->vidioc_g_frequency)
1819 memset(p->reserved, 0, sizeof(p->reserved));
1821 ret = vfd->vidioc_g_frequency(file, fh, p);
1823 dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
1824 p->tuner, p->type, p->frequency);
1827 case VIDIOC_S_FREQUENCY:
1829 struct v4l2_frequency *p=arg;
1830 if (!vfd->vidioc_s_frequency)
1832 dbgarg (cmd, "tuner=%d, type=%d, frequency=%d\n",
1833 p->tuner,p->type,p->frequency);
1834 ret=vfd->vidioc_s_frequency(file, fh, p);
1837 case VIDIOC_G_SLICED_VBI_CAP:
1839 struct v4l2_sliced_vbi_cap *p = arg;
1840 __u32 type = p->type;
1842 if (!vfd->vidioc_g_sliced_vbi_cap)
1844 memset(p, 0, sizeof(*p));
1846 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1847 ret = vfd->vidioc_g_sliced_vbi_cap(file, fh, p);
1849 dbgarg2("service_set=%d\n", p->service_set);
1852 case VIDIOC_LOG_STATUS:
1854 if (!vfd->vidioc_log_status)
1856 ret=vfd->vidioc_log_status(file, fh);
1859 #ifdef CONFIG_VIDEO_ADV_DEBUG
1860 case VIDIOC_DBG_G_REGISTER:
1862 struct v4l2_register *p=arg;
1863 if (!capable(CAP_SYS_ADMIN))
1865 else if (vfd->vidioc_g_register)
1866 ret=vfd->vidioc_g_register(file, fh, p);
1869 case VIDIOC_DBG_S_REGISTER:
1871 struct v4l2_register *p=arg;
1872 if (!capable(CAP_SYS_ADMIN))
1874 else if (vfd->vidioc_s_register)
1875 ret=vfd->vidioc_s_register(file, fh, p);
1879 case VIDIOC_G_CHIP_IDENT:
1881 struct v4l2_chip_ident *p=arg;
1882 if (!vfd->vidioc_g_chip_ident)
1884 ret=vfd->vidioc_g_chip_ident(file, fh, p);
1886 dbgarg (cmd, "chip_ident=%u, revision=0x%x\n", p->ident, p->revision);
1891 if (!vfd->vidioc_default)
1893 ret = vfd->vidioc_default(file, fh, cmd, arg);
1896 case VIDIOC_S_HW_FREQ_SEEK:
1898 struct v4l2_hw_freq_seek *p = arg;
1899 if (!vfd->vidioc_s_hw_freq_seek)
1902 "tuner=%d, type=%d, seek_upward=%d, wrap_around=%d\n",
1903 p->tuner, p->type, p->seek_upward, p->wrap_around);
1904 ret = vfd->vidioc_s_hw_freq_seek(file, fh, p);
1909 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) {
1911 v4l_print_ioctl(vfd->name, cmd);
1912 printk(KERN_CONT " error %d\n", ret);
1919 int video_ioctl2 (struct inode *inode, struct file *file,
1920 unsigned int cmd, unsigned long arg)
1927 size_t ctrls_size = 0;
1928 void __user *user_ptr = NULL;
1930 #ifdef __OLD_VIDIOC_
1931 cmd = video_fix_command(cmd);
1933 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
1934 cmd == VIDIOC_TRY_EXT_CTRLS);
1936 /* Copy arguments into temp kernel buffer */
1937 switch (_IOC_DIR(cmd)) {
1943 case (_IOC_WRITE | _IOC_READ):
1944 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
1947 /* too big to allocate from stack */
1948 mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
1955 if (_IOC_DIR(cmd) & _IOC_WRITE)
1956 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
1962 struct v4l2_ext_controls *p = parg;
1964 /* In case of an error, tell the caller that it wasn't
1965 a specific control that caused it. */
1966 p->error_idx = p->count;
1967 user_ptr = (void __user *)p->controls;
1969 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
1970 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
1971 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
1976 if (copy_from_user(mbuf, user_ptr, ctrls_size))
1983 err = __video_do_ioctl(inode, file, cmd, parg);
1984 if (err == -ENOIOCTLCMD)
1987 struct v4l2_ext_controls *p = parg;
1989 p->controls = (void *)user_ptr;
1990 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
1998 /* Copy results into user buffer */
1999 switch (_IOC_DIR(cmd))
2002 case (_IOC_WRITE | _IOC_READ):
2003 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
2012 EXPORT_SYMBOL(video_ioctl2);
2016 unsigned int used[VIDEO_NUM_DEVICES];
2019 static int __fill_index_info(struct device *cd, void *data)
2021 struct index_info *info = data;
2022 struct video_device *vfd = container_of(cd, struct video_device,
2025 if (info->dev == vfd->dev)
2026 info->used[vfd->index] = 1;
2032 * assign_index - assign stream number based on parent device
2033 * @vdev: video_device to assign index number to, vdev->dev should be assigned
2034 * @num: -1 if auto assign, requested number otherwise
2037 * returns -ENFILE if num is already in use, a free index number if
2040 static int get_index(struct video_device *vdev, int num)
2042 struct index_info *info;
2046 if (num >= VIDEO_NUM_DEVICES)
2049 info = kzalloc(sizeof(*info), GFP_KERNEL);
2053 info->dev = vdev->dev;
2055 ret = class_for_each_device(&video_class, info,
2062 if (!info->used[num])
2070 for (i = 0; i < VIDEO_NUM_DEVICES; i++) {
2082 static const struct file_operations video_fops;
2084 int video_register_device(struct video_device *vfd, int type, int nr)
2086 return video_register_device_index(vfd, type, nr, -1);
2088 EXPORT_SYMBOL(video_register_device);
2091 * video_register_device - register video4linux devices
2092 * @vfd: video device structure we want to register
2093 * @type: type of device to register
2094 * @nr: which device number (0 == /dev/video0, 1 == /dev/video1, ...
2097 * The registration code assigns minor numbers based on the type
2098 * requested. -ENFILE is returned in all the device slots for this
2099 * category are full. If not then the minor field is set and the
2100 * driver initialize function is called (if non %NULL).
2102 * Zero is returned on success.
2106 * %VFL_TYPE_GRABBER - A frame grabber
2108 * %VFL_TYPE_VTX - A teletext device
2110 * %VFL_TYPE_VBI - Vertical blank data (undecoded)
2112 * %VFL_TYPE_RADIO - A radio card
2115 int video_register_device_index(struct video_device *vfd, int type, int nr,
2126 case VFL_TYPE_GRABBER:
2127 base=MINOR_VFL_TYPE_GRABBER_MIN;
2128 end=MINOR_VFL_TYPE_GRABBER_MAX+1;
2129 name_base = "video";
2132 base=MINOR_VFL_TYPE_VTX_MIN;
2133 end=MINOR_VFL_TYPE_VTX_MAX+1;
2137 base=MINOR_VFL_TYPE_VBI_MIN;
2138 end=MINOR_VFL_TYPE_VBI_MAX+1;
2141 case VFL_TYPE_RADIO:
2142 base=MINOR_VFL_TYPE_RADIO_MIN;
2143 end=MINOR_VFL_TYPE_RADIO_MAX+1;
2144 name_base = "radio";
2147 printk(KERN_ERR "%s called with unknown type: %d\n",
2152 /* pick a minor number */
2153 mutex_lock(&videodev_lock);
2154 if (nr >= 0 && nr < end-base) {
2155 /* use the one the driver asked for */
2157 if (NULL != video_device[i]) {
2158 mutex_unlock(&videodev_lock);
2162 /* use first free */
2163 for(i=base;i<end;i++)
2164 if (NULL == video_device[i])
2167 mutex_unlock(&videodev_lock);
2171 video_device[i]=vfd;
2174 ret = get_index(vfd, index);
2176 printk(KERN_ERR "%s: get_index failed\n",
2183 mutex_unlock(&videodev_lock);
2184 mutex_init(&vfd->lock);
2187 memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev));
2189 vfd->class_dev.parent = vfd->dev;
2190 vfd->class_dev.class = &video_class;
2191 vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);
2192 sprintf(vfd->class_dev.bus_id, "%s%d", name_base, i - base);
2193 ret = device_register(&vfd->class_dev);
2195 printk(KERN_ERR "%s: device_register failed\n",
2201 /* needed until all drivers are fixed */
2203 printk(KERN_WARNING "videodev: \"%s\" has no release callback. "
2204 "Please fix your driver for proper sysfs support, see "
2205 "http://lwn.net/Articles/36850/\n", vfd->name);
2210 mutex_lock(&videodev_lock);
2211 video_device[vfd->minor] = NULL;
2213 mutex_unlock(&videodev_lock);
2216 EXPORT_SYMBOL(video_register_device_index);
2219 * video_unregister_device - unregister a video4linux device
2220 * @vfd: the device to unregister
2222 * This unregisters the passed device and deassigns the minor
2223 * number. Future open calls will be met with errors.
2226 void video_unregister_device(struct video_device *vfd)
2228 mutex_lock(&videodev_lock);
2229 if(video_device[vfd->minor]!=vfd)
2230 panic("videodev: bad unregister");
2232 video_device[vfd->minor]=NULL;
2233 device_unregister(&vfd->class_dev);
2234 mutex_unlock(&videodev_lock);
2236 EXPORT_SYMBOL(video_unregister_device);
2239 * Video fs operations
2241 static const struct file_operations video_fops=
2243 .owner = THIS_MODULE,
2244 .llseek = no_llseek,
2249 * Initialise video for linux
2252 static int __init videodev_init(void)
2256 printk(KERN_INFO "Linux video capture interface: v2.00\n");
2257 if (register_chrdev(VIDEO_MAJOR, VIDEO_NAME, &video_fops)) {
2258 printk(KERN_WARNING "video_dev: unable to get major %d\n", VIDEO_MAJOR);
2262 ret = class_register(&video_class);
2264 unregister_chrdev(VIDEO_MAJOR, VIDEO_NAME);
2265 printk(KERN_WARNING "video_dev: class_register failed\n");
2272 static void __exit videodev_exit(void)
2274 class_unregister(&video_class);
2275 unregister_chrdev(VIDEO_MAJOR, VIDEO_NAME);
2278 module_init(videodev_init)
2279 module_exit(videodev_exit)
2281 MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
2282 MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
2283 MODULE_LICENSE("GPL");