1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/module.h>
20#include <linux/types.h>
21#include <linux/kernel.h>
22#include <linux/mm.h>
23#include <linux/string.h>
24#include <linux/errno.h>
25#include <linux/init.h>
26#include <linux/kmod.h>
27#include <linux/slab.h>
28#include <asm/uaccess.h>
29
30#include <media/v4l2-common.h>
31#include <media/v4l2-device.h>
32#include <media/v4l2-ioctl.h>
33
34#define VIDEO_NUM_DEVICES 256
35#define VIDEO_NAME "video4linux"
36
37
38
39
40
41static ssize_t show_index(struct device *cd,
42 struct device_attribute *attr, char *buf)
43{
44 struct video_device *vdev = to_video_device(cd);
45
46 return sprintf(buf, "%i\n", vdev->index);
47}
48
49static ssize_t show_name(struct device *cd,
50 struct device_attribute *attr, char *buf)
51{
52 struct video_device *vdev = to_video_device(cd);
53
54 return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name);
55}
56
57static struct device_attribute video_device_attrs[] = {
58 __ATTR(name, S_IRUGO, show_name, NULL),
59 __ATTR(index, S_IRUGO, show_index, NULL),
60 __ATTR_NULL
61};
62
63
64
65
66static struct video_device *video_device[VIDEO_NUM_DEVICES];
67static DEFINE_MUTEX(videodev_lock);
68static DECLARE_BITMAP(devnode_nums[VFL_TYPE_MAX], VIDEO_NUM_DEVICES);
69
70
71
72
73
74
75#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
76
77static inline unsigned long *devnode_bits(int vfl_type)
78{
79
80
81
82 int idx = (vfl_type > VFL_TYPE_RADIO) ? VFL_TYPE_MAX - 1 : vfl_type;
83
84 return devnode_nums[idx];
85}
86#else
87
88static inline unsigned long *devnode_bits(int vfl_type)
89{
90 return devnode_nums[vfl_type];
91}
92#endif
93
94
95static inline void devnode_set(struct video_device *vdev)
96{
97 set_bit(vdev->num, devnode_bits(vdev->vfl_type));
98}
99
100
101static inline void devnode_clear(struct video_device *vdev)
102{
103 clear_bit(vdev->num, devnode_bits(vdev->vfl_type));
104}
105
106
107static inline int devnode_find(struct video_device *vdev, int from, int to)
108{
109 return find_next_zero_bit(devnode_bits(vdev->vfl_type), to, from);
110}
111
112struct video_device *video_device_alloc(void)
113{
114 return kzalloc(sizeof(struct video_device), GFP_KERNEL);
115}
116EXPORT_SYMBOL(video_device_alloc);
117
118void video_device_release(struct video_device *vdev)
119{
120 kfree(vdev);
121}
122EXPORT_SYMBOL(video_device_release);
123
124void video_device_release_empty(struct video_device *vdev)
125{
126
127
128}
129EXPORT_SYMBOL(video_device_release_empty);
130
131static inline void video_get(struct video_device *vdev)
132{
133 get_device(&vdev->dev);
134}
135
136static inline void video_put(struct video_device *vdev)
137{
138 put_device(&vdev->dev);
139}
140
141
142static void v4l2_device_release(struct device *cd)
143{
144 struct video_device *vdev = to_video_device(cd);
145 struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
146
147 mutex_lock(&videodev_lock);
148 if (WARN_ON(video_device[vdev->minor] != vdev)) {
149
150 mutex_unlock(&videodev_lock);
151 return;
152 }
153
154
155 video_device[vdev->minor] = NULL;
156
157
158 cdev_del(vdev->cdev);
159
160
161 vdev->cdev = NULL;
162
163
164 devnode_clear(vdev);
165
166 mutex_unlock(&videodev_lock);
167
168#if defined(CONFIG_MEDIA_CONTROLLER)
169 if (v4l2_dev && v4l2_dev->mdev &&
170 vdev->vfl_type != VFL_TYPE_SUBDEV)
171 media_device_unregister_entity(&vdev->entity);
172#endif
173
174
175
176
177
178
179
180
181
182 if (v4l2_dev && v4l2_dev->release == NULL)
183 v4l2_dev = NULL;
184
185
186
187 vdev->release(vdev);
188
189
190 if (v4l2_dev)
191 v4l2_device_put(v4l2_dev);
192}
193
194static struct class video_class = {
195 .name = VIDEO_NAME,
196 .dev_attrs = video_device_attrs,
197};
198
199struct video_device *video_devdata(struct file *file)
200{
201 return video_device[iminor(file->f_path.dentry->d_inode)];
202}
203EXPORT_SYMBOL(video_devdata);
204
205
206
207
208static inline bool prio_is_valid(enum v4l2_priority prio)
209{
210 return prio == V4L2_PRIORITY_BACKGROUND ||
211 prio == V4L2_PRIORITY_INTERACTIVE ||
212 prio == V4L2_PRIORITY_RECORD;
213}
214
215void v4l2_prio_init(struct v4l2_prio_state *global)
216{
217 memset(global, 0, sizeof(*global));
218}
219EXPORT_SYMBOL(v4l2_prio_init);
220
221int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
222 enum v4l2_priority new)
223{
224 if (!prio_is_valid(new))
225 return -EINVAL;
226 if (*local == new)
227 return 0;
228
229 atomic_inc(&global->prios[new]);
230 if (prio_is_valid(*local))
231 atomic_dec(&global->prios[*local]);
232 *local = new;
233 return 0;
234}
235EXPORT_SYMBOL(v4l2_prio_change);
236
237void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
238{
239 v4l2_prio_change(global, local, V4L2_PRIORITY_DEFAULT);
240}
241EXPORT_SYMBOL(v4l2_prio_open);
242
243void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local)
244{
245 if (prio_is_valid(local))
246 atomic_dec(&global->prios[local]);
247}
248EXPORT_SYMBOL(v4l2_prio_close);
249
250enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
251{
252 if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
253 return V4L2_PRIORITY_RECORD;
254 if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
255 return V4L2_PRIORITY_INTERACTIVE;
256 if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
257 return V4L2_PRIORITY_BACKGROUND;
258 return V4L2_PRIORITY_UNSET;
259}
260EXPORT_SYMBOL(v4l2_prio_max);
261
262int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local)
263{
264 return (local < v4l2_prio_max(global)) ? -EBUSY : 0;
265}
266EXPORT_SYMBOL(v4l2_prio_check);
267
268
269static ssize_t v4l2_read(struct file *filp, char __user *buf,
270 size_t sz, loff_t *off)
271{
272 struct video_device *vdev = video_devdata(filp);
273 int ret = -ENODEV;
274
275 if (!vdev->fops->read)
276 return -EINVAL;
277 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags) &&
278 mutex_lock_interruptible(vdev->lock))
279 return -ERESTARTSYS;
280 if (video_is_registered(vdev))
281 ret = vdev->fops->read(filp, buf, sz, off);
282 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
283 mutex_unlock(vdev->lock);
284 return ret;
285}
286
287static ssize_t v4l2_write(struct file *filp, const char __user *buf,
288 size_t sz, loff_t *off)
289{
290 struct video_device *vdev = video_devdata(filp);
291 int ret = -ENODEV;
292
293 if (!vdev->fops->write)
294 return -EINVAL;
295 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags) &&
296 mutex_lock_interruptible(vdev->lock))
297 return -ERESTARTSYS;
298 if (video_is_registered(vdev))
299 ret = vdev->fops->write(filp, buf, sz, off);
300 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
301 mutex_unlock(vdev->lock);
302 return ret;
303}
304
305static unsigned int v4l2_poll(struct file *filp, struct poll_table_struct *poll)
306{
307 struct video_device *vdev = video_devdata(filp);
308 int ret = POLLERR | POLLHUP;
309
310 if (!vdev->fops->poll)
311 return DEFAULT_POLLMASK;
312 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
313 mutex_lock(vdev->lock);
314 if (video_is_registered(vdev))
315 ret = vdev->fops->poll(filp, poll);
316 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
317 mutex_unlock(vdev->lock);
318 return ret;
319}
320
321static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
322{
323 struct video_device *vdev = video_devdata(filp);
324 int ret = -ENODEV;
325
326 if (vdev->fops->unlocked_ioctl) {
327 bool locked = false;
328
329 if (vdev->lock) {
330
331 locked = !v4l2_is_known_ioctl(cmd) ||
332 !test_bit(_IOC_NR(cmd), vdev->disable_locking);
333
334 if (locked && mutex_lock_interruptible(vdev->lock))
335 return -ERESTARTSYS;
336 }
337 if (video_is_registered(vdev))
338 ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
339 if (locked)
340 mutex_unlock(vdev->lock);
341 } else if (vdev->fops->ioctl) {
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364 static DEFINE_MUTEX(v4l2_ioctl_mutex);
365 struct mutex *m = vdev->v4l2_dev ?
366 &vdev->v4l2_dev->ioctl_lock : &v4l2_ioctl_mutex;
367
368 if (cmd != VIDIOC_DQBUF && mutex_lock_interruptible(m))
369 return -ERESTARTSYS;
370 if (video_is_registered(vdev))
371 ret = vdev->fops->ioctl(filp, cmd, arg);
372 if (cmd != VIDIOC_DQBUF)
373 mutex_unlock(m);
374 } else
375 ret = -ENOTTY;
376
377 return ret;
378}
379
380#ifdef CONFIG_MMU
381#define v4l2_get_unmapped_area NULL
382#else
383static unsigned long v4l2_get_unmapped_area(struct file *filp,
384 unsigned long addr, unsigned long len, unsigned long pgoff,
385 unsigned long flags)
386{
387 struct video_device *vdev = video_devdata(filp);
388
389 if (!vdev->fops->get_unmapped_area)
390 return -ENOSYS;
391 if (!video_is_registered(vdev))
392 return -ENODEV;
393 return vdev->fops->get_unmapped_area(filp, addr, len, pgoff, flags);
394}
395#endif
396
397static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
398{
399 struct video_device *vdev = video_devdata(filp);
400 int ret = -ENODEV;
401
402 if (!vdev->fops->mmap)
403 return ret;
404 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags) &&
405 mutex_lock_interruptible(vdev->lock))
406 return -ERESTARTSYS;
407 if (video_is_registered(vdev))
408 ret = vdev->fops->mmap(filp, vm);
409 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
410 mutex_unlock(vdev->lock);
411 return ret;
412}
413
414
415static int v4l2_open(struct inode *inode, struct file *filp)
416{
417 struct video_device *vdev;
418 int ret = 0;
419
420
421 mutex_lock(&videodev_lock);
422 vdev = video_devdata(filp);
423
424 if (vdev == NULL || !video_is_registered(vdev)) {
425 mutex_unlock(&videodev_lock);
426 return -ENODEV;
427 }
428
429 video_get(vdev);
430 mutex_unlock(&videodev_lock);
431 if (vdev->fops->open) {
432 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags) &&
433 mutex_lock_interruptible(vdev->lock)) {
434 ret = -ERESTARTSYS;
435 goto err;
436 }
437 if (video_is_registered(vdev))
438 ret = vdev->fops->open(filp);
439 else
440 ret = -ENODEV;
441 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
442 mutex_unlock(vdev->lock);
443 }
444
445err:
446
447 if (ret)
448 video_put(vdev);
449 return ret;
450}
451
452
453static int v4l2_release(struct inode *inode, struct file *filp)
454{
455 struct video_device *vdev = video_devdata(filp);
456 int ret = 0;
457
458 if (vdev->fops->release) {
459 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
460 mutex_lock(vdev->lock);
461 vdev->fops->release(filp);
462 if (test_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags))
463 mutex_unlock(vdev->lock);
464 }
465
466
467 video_put(vdev);
468 return ret;
469}
470
471static const struct file_operations v4l2_fops = {
472 .owner = THIS_MODULE,
473 .read = v4l2_read,
474 .write = v4l2_write,
475 .open = v4l2_open,
476 .get_unmapped_area = v4l2_get_unmapped_area,
477 .mmap = v4l2_mmap,
478 .unlocked_ioctl = v4l2_ioctl,
479#ifdef CONFIG_COMPAT
480 .compat_ioctl = v4l2_compat_ioctl32,
481#endif
482 .release = v4l2_release,
483 .poll = v4l2_poll,
484 .llseek = no_llseek,
485};
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500static int get_index(struct video_device *vdev)
501{
502
503
504 static DECLARE_BITMAP(used, VIDEO_NUM_DEVICES);
505 int i;
506
507
508 if (vdev->parent == NULL)
509 return 0;
510
511 bitmap_zero(used, VIDEO_NUM_DEVICES);
512
513 for (i = 0; i < VIDEO_NUM_DEVICES; i++) {
514 if (video_device[i] != NULL &&
515 video_device[i]->parent == vdev->parent) {
516 set_bit(video_device[i]->index, used);
517 }
518 }
519
520 return find_first_zero_bit(used, VIDEO_NUM_DEVICES);
521}
522
523#define SET_VALID_IOCTL(ops, cmd, op) \
524 if (ops->op) \
525 set_bit(_IOC_NR(cmd), valid_ioctls)
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540static void determine_valid_ioctls(struct video_device *vdev)
541{
542 DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE);
543 const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops;
544
545 bitmap_zero(valid_ioctls, BASE_VIDIOC_PRIVATE);
546
547 SET_VALID_IOCTL(ops, VIDIOC_QUERYCAP, vidioc_querycap);
548 if (ops->vidioc_g_priority ||
549 test_bit(V4L2_FL_USE_FH_PRIO, &vdev->flags))
550 set_bit(_IOC_NR(VIDIOC_G_PRIORITY), valid_ioctls);
551 if (ops->vidioc_s_priority ||
552 test_bit(V4L2_FL_USE_FH_PRIO, &vdev->flags))
553 set_bit(_IOC_NR(VIDIOC_S_PRIORITY), valid_ioctls);
554 if (ops->vidioc_enum_fmt_vid_cap ||
555 ops->vidioc_enum_fmt_vid_out ||
556 ops->vidioc_enum_fmt_vid_cap_mplane ||
557 ops->vidioc_enum_fmt_vid_out_mplane ||
558 ops->vidioc_enum_fmt_vid_overlay ||
559 ops->vidioc_enum_fmt_type_private)
560 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
561 if (ops->vidioc_g_fmt_vid_cap ||
562 ops->vidioc_g_fmt_vid_out ||
563 ops->vidioc_g_fmt_vid_cap_mplane ||
564 ops->vidioc_g_fmt_vid_out_mplane ||
565 ops->vidioc_g_fmt_vid_overlay ||
566 ops->vidioc_g_fmt_vbi_cap ||
567 ops->vidioc_g_fmt_vid_out_overlay ||
568 ops->vidioc_g_fmt_vbi_out ||
569 ops->vidioc_g_fmt_sliced_vbi_cap ||
570 ops->vidioc_g_fmt_sliced_vbi_out ||
571 ops->vidioc_g_fmt_type_private)
572 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
573 if (ops->vidioc_s_fmt_vid_cap ||
574 ops->vidioc_s_fmt_vid_out ||
575 ops->vidioc_s_fmt_vid_cap_mplane ||
576 ops->vidioc_s_fmt_vid_out_mplane ||
577 ops->vidioc_s_fmt_vid_overlay ||
578 ops->vidioc_s_fmt_vbi_cap ||
579 ops->vidioc_s_fmt_vid_out_overlay ||
580 ops->vidioc_s_fmt_vbi_out ||
581 ops->vidioc_s_fmt_sliced_vbi_cap ||
582 ops->vidioc_s_fmt_sliced_vbi_out ||
583 ops->vidioc_s_fmt_type_private)
584 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
585 if (ops->vidioc_try_fmt_vid_cap ||
586 ops->vidioc_try_fmt_vid_out ||
587 ops->vidioc_try_fmt_vid_cap_mplane ||
588 ops->vidioc_try_fmt_vid_out_mplane ||
589 ops->vidioc_try_fmt_vid_overlay ||
590 ops->vidioc_try_fmt_vbi_cap ||
591 ops->vidioc_try_fmt_vid_out_overlay ||
592 ops->vidioc_try_fmt_vbi_out ||
593 ops->vidioc_try_fmt_sliced_vbi_cap ||
594 ops->vidioc_try_fmt_sliced_vbi_out ||
595 ops->vidioc_try_fmt_type_private)
596 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
597 SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs);
598 SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf);
599 SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf);
600 SET_VALID_IOCTL(ops, VIDIOC_DQBUF, vidioc_dqbuf);
601 SET_VALID_IOCTL(ops, VIDIOC_OVERLAY, vidioc_overlay);
602 SET_VALID_IOCTL(ops, VIDIOC_G_FBUF, vidioc_g_fbuf);
603 SET_VALID_IOCTL(ops, VIDIOC_S_FBUF, vidioc_s_fbuf);
604 SET_VALID_IOCTL(ops, VIDIOC_STREAMON, vidioc_streamon);
605 SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
606 if (vdev->tvnorms)
607 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
608 if (ops->vidioc_g_std || vdev->current_norm)
609 set_bit(_IOC_NR(VIDIOC_G_STD), valid_ioctls);
610 SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std);
611 SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd);
612 SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input);
613 SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input);
614 SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input);
615 SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output);
616 SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output);
617 SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output);
618
619
620
621
622 if (vdev->ctrl_handler || ops->vidioc_queryctrl)
623 set_bit(_IOC_NR(VIDIOC_QUERYCTRL), valid_ioctls);
624 if (vdev->ctrl_handler || ops->vidioc_g_ctrl || ops->vidioc_g_ext_ctrls)
625 set_bit(_IOC_NR(VIDIOC_G_CTRL), valid_ioctls);
626 if (vdev->ctrl_handler || ops->vidioc_s_ctrl || ops->vidioc_s_ext_ctrls)
627 set_bit(_IOC_NR(VIDIOC_S_CTRL), valid_ioctls);
628 if (vdev->ctrl_handler || ops->vidioc_g_ext_ctrls)
629 set_bit(_IOC_NR(VIDIOC_G_EXT_CTRLS), valid_ioctls);
630 if (vdev->ctrl_handler || ops->vidioc_s_ext_ctrls)
631 set_bit(_IOC_NR(VIDIOC_S_EXT_CTRLS), valid_ioctls);
632 if (vdev->ctrl_handler || ops->vidioc_try_ext_ctrls)
633 set_bit(_IOC_NR(VIDIOC_TRY_EXT_CTRLS), valid_ioctls);
634 if (vdev->ctrl_handler || ops->vidioc_querymenu)
635 set_bit(_IOC_NR(VIDIOC_QUERYMENU), valid_ioctls);
636 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio);
637 SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio);
638 SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio);
639 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout);
640 SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout);
641 SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout);
642 SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator);
643 SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator);
644 if (ops->vidioc_g_crop || ops->vidioc_g_selection)
645 set_bit(_IOC_NR(VIDIOC_G_CROP), valid_ioctls);
646 if (ops->vidioc_s_crop || ops->vidioc_s_selection)
647 set_bit(_IOC_NR(VIDIOC_S_CROP), valid_ioctls);
648 SET_VALID_IOCTL(ops, VIDIOC_G_SELECTION, vidioc_g_selection);
649 SET_VALID_IOCTL(ops, VIDIOC_S_SELECTION, vidioc_s_selection);
650 if (ops->vidioc_cropcap || ops->vidioc_g_selection)
651 set_bit(_IOC_NR(VIDIOC_CROPCAP), valid_ioctls);
652 SET_VALID_IOCTL(ops, VIDIOC_G_JPEGCOMP, vidioc_g_jpegcomp);
653 SET_VALID_IOCTL(ops, VIDIOC_S_JPEGCOMP, vidioc_s_jpegcomp);
654 SET_VALID_IOCTL(ops, VIDIOC_G_ENC_INDEX, vidioc_g_enc_index);
655 SET_VALID_IOCTL(ops, VIDIOC_ENCODER_CMD, vidioc_encoder_cmd);
656 SET_VALID_IOCTL(ops, VIDIOC_TRY_ENCODER_CMD, vidioc_try_encoder_cmd);
657 SET_VALID_IOCTL(ops, VIDIOC_DECODER_CMD, vidioc_decoder_cmd);
658 SET_VALID_IOCTL(ops, VIDIOC_TRY_DECODER_CMD, vidioc_try_decoder_cmd);
659 if (ops->vidioc_g_parm || vdev->vfl_type == VFL_TYPE_GRABBER)
660 set_bit(_IOC_NR(VIDIOC_G_PARM), valid_ioctls);
661 SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
662 SET_VALID_IOCTL(ops, VIDIOC_G_TUNER, vidioc_g_tuner);
663 SET_VALID_IOCTL(ops, VIDIOC_S_TUNER, vidioc_s_tuner);
664 SET_VALID_IOCTL(ops, VIDIOC_G_FREQUENCY, vidioc_g_frequency);
665 SET_VALID_IOCTL(ops, VIDIOC_S_FREQUENCY, vidioc_s_frequency);
666 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap);
667 SET_VALID_IOCTL(ops, VIDIOC_LOG_STATUS, vidioc_log_status);
668#ifdef CONFIG_VIDEO_ADV_DEBUG
669 SET_VALID_IOCTL(ops, VIDIOC_DBG_G_REGISTER, vidioc_g_register);
670 SET_VALID_IOCTL(ops, VIDIOC_DBG_S_REGISTER, vidioc_s_register);
671#endif
672 SET_VALID_IOCTL(ops, VIDIOC_DBG_G_CHIP_IDENT, vidioc_g_chip_ident);
673 SET_VALID_IOCTL(ops, VIDIOC_S_HW_FREQ_SEEK, vidioc_s_hw_freq_seek);
674 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMESIZES, vidioc_enum_framesizes);
675 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMEINTERVALS, vidioc_enum_frameintervals);
676 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_PRESETS, vidioc_enum_dv_presets);
677 SET_VALID_IOCTL(ops, VIDIOC_S_DV_PRESET, vidioc_s_dv_preset);
678 SET_VALID_IOCTL(ops, VIDIOC_G_DV_PRESET, vidioc_g_dv_preset);
679 SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_PRESET, vidioc_query_dv_preset);
680 SET_VALID_IOCTL(ops, VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings);
681 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings);
682 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings);
683 SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings);
684 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap);
685
686 SET_VALID_IOCTL(ops, VIDIOC_DQEVENT, vidioc_subscribe_event);
687 SET_VALID_IOCTL(ops, VIDIOC_SUBSCRIBE_EVENT, vidioc_subscribe_event);
688 SET_VALID_IOCTL(ops, VIDIOC_UNSUBSCRIBE_EVENT, vidioc_unsubscribe_event);
689 SET_VALID_IOCTL(ops, VIDIOC_CREATE_BUFS, vidioc_create_bufs);
690 SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf);
691 bitmap_andnot(vdev->valid_ioctls, valid_ioctls, vdev->valid_ioctls,
692 BASE_VIDIOC_PRIVATE);
693}
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727int __video_register_device(struct video_device *vdev, int type, int nr,
728 int warn_if_nr_in_use, struct module *owner)
729{
730 int i = 0;
731 int ret;
732 int minor_offset = 0;
733 int minor_cnt = VIDEO_NUM_DEVICES;
734 const char *name_base;
735
736
737
738 vdev->minor = -1;
739
740
741 if (WARN_ON(!vdev->release))
742 return -EINVAL;
743
744
745 spin_lock_init(&vdev->fh_lock);
746 INIT_LIST_HEAD(&vdev->fh_list);
747
748
749 switch (type) {
750 case VFL_TYPE_GRABBER:
751 name_base = "video";
752 break;
753 case VFL_TYPE_VBI:
754 name_base = "vbi";
755 break;
756 case VFL_TYPE_RADIO:
757 name_base = "radio";
758 break;
759 case VFL_TYPE_SUBDEV:
760 name_base = "v4l-subdev";
761 break;
762 default:
763 printk(KERN_ERR "%s called with unknown type: %d\n",
764 __func__, type);
765 return -EINVAL;
766 }
767
768 vdev->vfl_type = type;
769 vdev->cdev = NULL;
770 if (vdev->v4l2_dev) {
771 if (vdev->v4l2_dev->dev)
772 vdev->parent = vdev->v4l2_dev->dev;
773 if (vdev->ctrl_handler == NULL)
774 vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;
775
776
777 if (vdev->prio == NULL)
778 vdev->prio = &vdev->v4l2_dev->prio;
779 }
780
781
782#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
783
784
785
786
787
788 switch (type) {
789 case VFL_TYPE_GRABBER:
790 minor_offset = 0;
791 minor_cnt = 64;
792 break;
793 case VFL_TYPE_RADIO:
794 minor_offset = 64;
795 minor_cnt = 64;
796 break;
797 case VFL_TYPE_VBI:
798 minor_offset = 224;
799 minor_cnt = 32;
800 break;
801 default:
802 minor_offset = 128;
803 minor_cnt = 64;
804 break;
805 }
806#endif
807
808
809 mutex_lock(&videodev_lock);
810 nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt);
811 if (nr == minor_cnt)
812 nr = devnode_find(vdev, 0, minor_cnt);
813 if (nr == minor_cnt) {
814 printk(KERN_ERR "could not get a free device node number\n");
815 mutex_unlock(&videodev_lock);
816 return -ENFILE;
817 }
818#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
819
820 i = nr;
821#else
822
823
824 for (i = 0; i < VIDEO_NUM_DEVICES; i++)
825 if (video_device[i] == NULL)
826 break;
827 if (i == VIDEO_NUM_DEVICES) {
828 mutex_unlock(&videodev_lock);
829 printk(KERN_ERR "could not get a free minor\n");
830 return -ENFILE;
831 }
832#endif
833 vdev->minor = i + minor_offset;
834 vdev->num = nr;
835 devnode_set(vdev);
836
837
838 WARN_ON(video_device[vdev->minor] != NULL);
839 vdev->index = get_index(vdev);
840 mutex_unlock(&videodev_lock);
841
842
843 if (vdev->lock == NULL)
844 WARN_ON(test_and_clear_bit(V4L2_FL_LOCK_ALL_FOPS, &vdev->flags));
845
846 if (vdev->ioctl_ops)
847 determine_valid_ioctls(vdev);
848
849
850 vdev->cdev = cdev_alloc();
851 if (vdev->cdev == NULL) {
852 ret = -ENOMEM;
853 goto cleanup;
854 }
855 vdev->cdev->ops = &v4l2_fops;
856 vdev->cdev->owner = owner;
857 ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
858 if (ret < 0) {
859 printk(KERN_ERR "%s: cdev_add failed\n", __func__);
860 kfree(vdev->cdev);
861 vdev->cdev = NULL;
862 goto cleanup;
863 }
864
865
866 vdev->dev.class = &video_class;
867 vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
868 if (vdev->parent)
869 vdev->dev.parent = vdev->parent;
870 dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
871 ret = device_register(&vdev->dev);
872 if (ret < 0) {
873 printk(KERN_ERR "%s: device_register failed\n", __func__);
874 goto cleanup;
875 }
876
877
878 vdev->dev.release = v4l2_device_release;
879
880 if (nr != -1 && nr != vdev->num && warn_if_nr_in_use)
881 printk(KERN_WARNING "%s: requested %s%d, got %s\n", __func__,
882 name_base, nr, video_device_node_name(vdev));
883
884
885 if (vdev->v4l2_dev)
886 v4l2_device_get(vdev->v4l2_dev);
887
888#if defined(CONFIG_MEDIA_CONTROLLER)
889
890 if (vdev->v4l2_dev && vdev->v4l2_dev->mdev &&
891 vdev->vfl_type != VFL_TYPE_SUBDEV) {
892 vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L;
893 vdev->entity.name = vdev->name;
894 vdev->entity.info.v4l.major = VIDEO_MAJOR;
895 vdev->entity.info.v4l.minor = vdev->minor;
896 ret = media_device_register_entity(vdev->v4l2_dev->mdev,
897 &vdev->entity);
898 if (ret < 0)
899 printk(KERN_WARNING
900 "%s: media_device_register_entity failed\n",
901 __func__);
902 }
903#endif
904
905 set_bit(V4L2_FL_REGISTERED, &vdev->flags);
906 mutex_lock(&videodev_lock);
907 video_device[vdev->minor] = vdev;
908 mutex_unlock(&videodev_lock);
909
910 return 0;
911
912cleanup:
913 mutex_lock(&videodev_lock);
914 if (vdev->cdev)
915 cdev_del(vdev->cdev);
916 devnode_clear(vdev);
917 mutex_unlock(&videodev_lock);
918
919 vdev->minor = -1;
920 return ret;
921}
922EXPORT_SYMBOL(__video_register_device);
923
924
925
926
927
928
929
930
931void video_unregister_device(struct video_device *vdev)
932{
933
934 if (!vdev || !video_is_registered(vdev))
935 return;
936
937 mutex_lock(&videodev_lock);
938
939
940
941 clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
942 mutex_unlock(&videodev_lock);
943 device_unregister(&vdev->dev);
944}
945EXPORT_SYMBOL(video_unregister_device);
946
947
948
949
950static int __init videodev_init(void)
951{
952 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
953 int ret;
954
955 printk(KERN_INFO "Linux video capture interface: v2.00\n");
956 ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
957 if (ret < 0) {
958 printk(KERN_WARNING "videodev: unable to get major %d\n",
959 VIDEO_MAJOR);
960 return ret;
961 }
962
963 ret = class_register(&video_class);
964 if (ret < 0) {
965 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
966 printk(KERN_WARNING "video_dev: class_register failed\n");
967 return -EIO;
968 }
969
970 return 0;
971}
972
973static void __exit videodev_exit(void)
974{
975 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
976
977 class_unregister(&video_class);
978 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
979}
980
981subsys_initcall(videodev_init);
982module_exit(videodev_exit)
983
984MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
985MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
986MODULE_LICENSE("GPL");
987MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR);
988
989
990
991
992
993
994
995