[media] v4l2 core: improve debug flag handling
[deliverable/linux.git] / drivers / media / v4l2-core / v4l2-dev.c
CommitLineData
27a5e6d3
HV
1/*
2 * Video capture interface for Linux version 2
3 *
4 * A generic video device interface for the LINUX operating system
5 * using a set of device structures/vectors for low level operations.
6 *
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.
11 *
d9b01449 12 * Authors: Alan Cox, <alan@lxorguk.ukuu.org.uk> (version 1)
27a5e6d3
HV
13 * Mauro Carvalho Chehab <mchehab@infradead.org> (version 2)
14 *
15 * Fixes: 20000516 Claudio Matsuoka <claudio@conectiva.com>
16 * - Added procfs support
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>
27a5e6d3 28#include <asm/uaccess.h>
27a5e6d3
HV
29
30#include <media/v4l2-common.h>
9bea3514 31#include <media/v4l2-device.h>
bec43661 32#include <media/v4l2-ioctl.h>
27a5e6d3
HV
33
34#define VIDEO_NUM_DEVICES 256
35#define VIDEO_NAME "video4linux"
36
37/*
38 * sysfs stuff
39 */
40
13e2237f
GKH
41static ssize_t index_show(struct device *cd,
42 struct device_attribute *attr, char *buf)
27a5e6d3 43{
dc93a70c 44 struct video_device *vdev = to_video_device(cd);
bfa8a273 45
dc93a70c 46 return sprintf(buf, "%i\n", vdev->index);
27a5e6d3 47}
13e2237f 48static DEVICE_ATTR_RO(index);
27a5e6d3 49
17028cdb 50static ssize_t dev_debug_show(struct device *cd,
13e2237f 51 struct device_attribute *attr, char *buf)
80131fe0
HV
52{
53 struct video_device *vdev = to_video_device(cd);
54
17028cdb 55 return sprintf(buf, "%i\n", vdev->dev_debug);
80131fe0
HV
56}
57
17028cdb 58static ssize_t dev_debug_store(struct device *cd, struct device_attribute *attr,
13e2237f 59 const char *buf, size_t len)
80131fe0
HV
60{
61 struct video_device *vdev = to_video_device(cd);
62 int res = 0;
63 u16 value;
64
65 res = kstrtou16(buf, 0, &value);
66 if (res)
67 return res;
68
17028cdb 69 vdev->dev_debug = value;
80131fe0
HV
70 return len;
71}
17028cdb 72static DEVICE_ATTR_RW(dev_debug);
80131fe0 73
13e2237f 74static ssize_t name_show(struct device *cd,
27a5e6d3
HV
75 struct device_attribute *attr, char *buf)
76{
dc93a70c 77 struct video_device *vdev = to_video_device(cd);
bfa8a273 78
dc93a70c 79 return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name);
27a5e6d3 80}
13e2237f 81static DEVICE_ATTR_RO(name);
27a5e6d3 82
13e2237f
GKH
83static struct attribute *video_device_attrs[] = {
84 &dev_attr_name.attr,
17028cdb 85 &dev_attr_dev_debug.attr,
13e2237f
GKH
86 &dev_attr_index.attr,
87 NULL,
27a5e6d3 88};
13e2237f 89ATTRIBUTE_GROUPS(video_device);
27a5e6d3 90
7f8ecfab
HV
91/*
92 * Active devices
93 */
94static struct video_device *video_device[VIDEO_NUM_DEVICES];
95static DEFINE_MUTEX(videodev_lock);
22e22125 96static DECLARE_BITMAP(devnode_nums[VFL_TYPE_MAX], VIDEO_NUM_DEVICES);
7f8ecfab 97
5062cb70
HV
98/* Device node utility functions */
99
100/* Note: these utility functions all assume that vfl_type is in the range
101 [0, VFL_TYPE_MAX-1]. */
102
103#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
104/* Return the bitmap corresponding to vfl_type. */
105static inline unsigned long *devnode_bits(int vfl_type)
106{
107 /* Any types not assigned to fixed minor ranges must be mapped to
108 one single bitmap for the purposes of finding a free node number
109 since all those unassigned types use the same minor range. */
226c0eea 110 int idx = (vfl_type > VFL_TYPE_RADIO) ? VFL_TYPE_MAX - 1 : vfl_type;
5062cb70
HV
111
112 return devnode_nums[idx];
113}
114#else
115/* Return the bitmap corresponding to vfl_type. */
116static inline unsigned long *devnode_bits(int vfl_type)
117{
118 return devnode_nums[vfl_type];
119}
120#endif
121
122/* Mark device node number vdev->num as used */
123static inline void devnode_set(struct video_device *vdev)
124{
125 set_bit(vdev->num, devnode_bits(vdev->vfl_type));
126}
127
128/* Mark device node number vdev->num as unused */
129static inline void devnode_clear(struct video_device *vdev)
130{
131 clear_bit(vdev->num, devnode_bits(vdev->vfl_type));
132}
133
134/* Try to find a free device node number in the range [from, to> */
135static inline int devnode_find(struct video_device *vdev, int from, int to)
136{
137 return find_next_zero_bit(devnode_bits(vdev->vfl_type), to, from);
138}
139
27a5e6d3
HV
140struct video_device *video_device_alloc(void)
141{
bfa8a273 142 return kzalloc(sizeof(struct video_device), GFP_KERNEL);
27a5e6d3
HV
143}
144EXPORT_SYMBOL(video_device_alloc);
145
dc93a70c 146void video_device_release(struct video_device *vdev)
27a5e6d3 147{
dc93a70c 148 kfree(vdev);
27a5e6d3
HV
149}
150EXPORT_SYMBOL(video_device_release);
151
dc93a70c 152void video_device_release_empty(struct video_device *vdev)
f9e86b5e
HV
153{
154 /* Do nothing */
155 /* Only valid when the video_device struct is a static. */
156}
157EXPORT_SYMBOL(video_device_release_empty);
158
dc93a70c 159static inline void video_get(struct video_device *vdev)
7f8ecfab 160{
dc93a70c
HV
161 get_device(&vdev->dev);
162}
163
164static inline void video_put(struct video_device *vdev)
165{
166 put_device(&vdev->dev);
167}
168
169/* Called when the last user of the video device exits. */
170static void v4l2_device_release(struct device *cd)
171{
172 struct video_device *vdev = to_video_device(cd);
bedf8bcf 173 struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
7f8ecfab
HV
174
175 mutex_lock(&videodev_lock);
1fc2b5f7 176 if (WARN_ON(video_device[vdev->minor] != vdev)) {
dc93a70c 177 /* should not happen */
1fc2b5f7 178 mutex_unlock(&videodev_lock);
6ea9a182
HV
179 return;
180 }
7f8ecfab
HV
181
182 /* Free up this device for reuse */
dc93a70c 183 video_device[vdev->minor] = NULL;
7f8ecfab 184
dc93a70c
HV
185 /* Delete the cdev on this minor as well */
186 cdev_del(vdev->cdev);
187 /* Just in case some driver tries to access this from
188 the release() callback. */
189 vdev->cdev = NULL;
7f8ecfab 190
22e22125 191 /* Mark device node number as free */
5062cb70 192 devnode_clear(vdev);
7f8ecfab 193
dc93a70c 194 mutex_unlock(&videodev_lock);
27a5e6d3 195
c064b8ea 196#if defined(CONFIG_MEDIA_CONTROLLER)
d9bfbcc0 197 if (v4l2_dev->mdev &&
c064b8ea
LP
198 vdev->vfl_type != VFL_TYPE_SUBDEV)
199 media_device_unregister_entity(&vdev->entity);
200#endif
201
8280b662
HV
202 /* Do not call v4l2_device_put if there is no release callback set.
203 * Drivers that have no v4l2_device release callback might free the
204 * v4l2_dev instance in the video_device release callback below, so we
205 * must perform this check here.
206 *
207 * TODO: In the long run all drivers that use v4l2_device should use the
208 * v4l2_device release callback. This check will then be unnecessary.
209 */
d9bfbcc0 210 if (v4l2_dev->release == NULL)
8280b662
HV
211 v4l2_dev = NULL;
212
dc93a70c
HV
213 /* Release video_device and perform other
214 cleanups as needed. */
215 vdev->release(vdev);
bedf8bcf
HV
216
217 /* Decrease v4l2_device refcount */
218 if (v4l2_dev)
219 v4l2_device_put(v4l2_dev);
27a5e6d3
HV
220}
221
222static struct class video_class = {
223 .name = VIDEO_NAME,
13e2237f 224 .dev_groups = video_device_groups,
27a5e6d3
HV
225};
226
27a5e6d3
HV
227struct video_device *video_devdata(struct file *file)
228{
496ad9aa 229 return video_device[iminor(file_inode(file))];
27a5e6d3
HV
230}
231EXPORT_SYMBOL(video_devdata);
232
02265493
HV
233
234/* Priority handling */
235
236static inline bool prio_is_valid(enum v4l2_priority prio)
237{
238 return prio == V4L2_PRIORITY_BACKGROUND ||
239 prio == V4L2_PRIORITY_INTERACTIVE ||
240 prio == V4L2_PRIORITY_RECORD;
241}
242
243void v4l2_prio_init(struct v4l2_prio_state *global)
244{
245 memset(global, 0, sizeof(*global));
246}
247EXPORT_SYMBOL(v4l2_prio_init);
248
249int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
250 enum v4l2_priority new)
251{
252 if (!prio_is_valid(new))
253 return -EINVAL;
254 if (*local == new)
255 return 0;
256
257 atomic_inc(&global->prios[new]);
258 if (prio_is_valid(*local))
259 atomic_dec(&global->prios[*local]);
260 *local = new;
261 return 0;
262}
263EXPORT_SYMBOL(v4l2_prio_change);
264
265void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
266{
267 v4l2_prio_change(global, local, V4L2_PRIORITY_DEFAULT);
268}
269EXPORT_SYMBOL(v4l2_prio_open);
270
271void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local)
272{
273 if (prio_is_valid(local))
274 atomic_dec(&global->prios[local]);
275}
276EXPORT_SYMBOL(v4l2_prio_close);
277
278enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
279{
280 if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
281 return V4L2_PRIORITY_RECORD;
282 if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
283 return V4L2_PRIORITY_INTERACTIVE;
284 if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
285 return V4L2_PRIORITY_BACKGROUND;
286 return V4L2_PRIORITY_UNSET;
287}
288EXPORT_SYMBOL(v4l2_prio_max);
289
290int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local)
291{
292 return (local < v4l2_prio_max(global)) ? -EBUSY : 0;
293}
294EXPORT_SYMBOL(v4l2_prio_check);
295
296
dc93a70c
HV
297static ssize_t v4l2_read(struct file *filp, char __user *buf,
298 size_t sz, loff_t *off)
299{
300 struct video_device *vdev = video_devdata(filp);
2877842d 301 int ret = -ENODEV;
dc93a70c
HV
302
303 if (!vdev->fops->read)
304 return -EINVAL;
ee6869af
HV
305 if (video_is_registered(vdev))
306 ret = vdev->fops->read(filp, buf, sz, off);
17028cdb
HV
307 if ((vdev->dev_debug & V4L2_DEV_DEBUG_FOP) &&
308 (vdev->dev_debug & V4L2_DEV_DEBUG_STREAMING))
cc4b7e7f
HV
309 printk(KERN_DEBUG "%s: read: %zd (%d)\n",
310 video_device_node_name(vdev), sz, ret);
ee6869af 311 return ret;
dc93a70c
HV
312}
313
314static ssize_t v4l2_write(struct file *filp, const char __user *buf,
315 size_t sz, loff_t *off)
316{
317 struct video_device *vdev = video_devdata(filp);
2877842d 318 int ret = -ENODEV;
dc93a70c
HV
319
320 if (!vdev->fops->write)
321 return -EINVAL;
ee6869af
HV
322 if (video_is_registered(vdev))
323 ret = vdev->fops->write(filp, buf, sz, off);
17028cdb
HV
324 if ((vdev->dev_debug & V4L2_DEV_DEBUG_FOP) &&
325 (vdev->dev_debug & V4L2_DEV_DEBUG_STREAMING))
cc4b7e7f
HV
326 printk(KERN_DEBUG "%s: write: %zd (%d)\n",
327 video_device_node_name(vdev), sz, ret);
ee6869af 328 return ret;
dc93a70c
HV
329}
330
331static unsigned int v4l2_poll(struct file *filp, struct poll_table_struct *poll)
332{
333 struct video_device *vdev = video_devdata(filp);
cf533735 334 unsigned int res = POLLERR | POLLHUP;
ee6869af
HV
335
336 if (!vdev->fops->poll)
2877842d 337 return DEFAULT_POLLMASK;
ee6869af 338 if (video_is_registered(vdev))
cf533735 339 res = vdev->fops->poll(filp, poll);
17028cdb 340 if (vdev->dev_debug & V4L2_DEV_DEBUG_POLL)
cc4b7e7f 341 printk(KERN_DEBUG "%s: poll: %08x\n",
cf533735
HV
342 video_device_node_name(vdev), res);
343 return res;
dc93a70c
HV
344}
345
86a5ef7d 346static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
dc93a70c
HV
347{
348 struct video_device *vdev = video_devdata(filp);
72420630 349 int ret = -ENODEV;
dc93a70c 350
86a5ef7d 351 if (vdev->fops->unlocked_ioctl) {
5a5adf6b 352 struct mutex *lock = v4l2_ioctl_get_lock(vdev, cmd);
8ab75e3e 353
5a5adf6b
HV
354 if (lock && mutex_lock_interruptible(lock))
355 return -ERESTARTSYS;
72420630
MCC
356 if (video_is_registered(vdev))
357 ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
5a5adf6b
HV
358 if (lock)
359 mutex_unlock(lock);
86a5ef7d 360 } else if (vdev->fops->ioctl) {
879aa24d
HV
361 /* This code path is a replacement for the BKL. It is a major
362 * hack but it will have to do for those drivers that are not
363 * yet converted to use unlocked_ioctl.
364 *
d9bfbcc0
HV
365 * All drivers implement struct v4l2_device, so we use the
366 * lock defined there to serialize the ioctls.
879aa24d 367 *
d9bfbcc0
HV
368 * However, if the driver sleeps, then it blocks all ioctls
369 * since the lock is still held. This is very common for
370 * VIDIOC_DQBUF since that normally waits for a frame to arrive.
371 * As a result any other ioctl calls will proceed very, very
372 * slowly since each call will have to wait for the VIDIOC_QBUF
373 * to finish. Things that should take 0.01s may now take 10-20
374 * seconds.
879aa24d
HV
375 *
376 * The workaround is to *not* take the lock for VIDIOC_DQBUF.
377 * This actually works OK for videobuf-based drivers, since
378 * videobuf will take its own internal lock.
379 */
d9bfbcc0 380 struct mutex *m = &vdev->v4l2_dev->ioctl_lock;
0edf2e5e 381
879aa24d
HV
382 if (cmd != VIDIOC_DQBUF && mutex_lock_interruptible(m))
383 return -ERESTARTSYS;
72420630
MCC
384 if (video_is_registered(vdev))
385 ret = vdev->fops->ioctl(filp, cmd, arg);
879aa24d
HV
386 if (cmd != VIDIOC_DQBUF)
387 mutex_unlock(m);
86a5ef7d
AB
388 } else
389 ret = -ENOTTY;
dc93a70c 390
86a5ef7d 391 return ret;
dc93a70c
HV
392}
393
ecc6517d
BL
394#ifdef CONFIG_MMU
395#define v4l2_get_unmapped_area NULL
396#else
397static unsigned long v4l2_get_unmapped_area(struct file *filp,
398 unsigned long addr, unsigned long len, unsigned long pgoff,
399 unsigned long flags)
400{
401 struct video_device *vdev = video_devdata(filp);
cc4b7e7f 402 int ret;
ecc6517d
BL
403
404 if (!vdev->fops->get_unmapped_area)
405 return -ENOSYS;
406 if (!video_is_registered(vdev))
407 return -ENODEV;
cc4b7e7f 408 ret = vdev->fops->get_unmapped_area(filp, addr, len, pgoff, flags);
17028cdb 409 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
410 printk(KERN_DEBUG "%s: get_unmapped_area (%d)\n",
411 video_device_node_name(vdev), ret);
412 return ret;
ecc6517d
BL
413}
414#endif
415
dc93a70c
HV
416static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
417{
418 struct video_device *vdev = video_devdata(filp);
ee6869af
HV
419 int ret = -ENODEV;
420
421 if (!vdev->fops->mmap)
cf533735 422 return -ENODEV;
ee6869af
HV
423 if (video_is_registered(vdev))
424 ret = vdev->fops->mmap(filp, vm);
17028cdb 425 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
426 printk(KERN_DEBUG "%s: mmap (%d)\n",
427 video_device_node_name(vdev), ret);
ee6869af 428 return ret;
dc93a70c
HV
429}
430
431/* Override for the open function */
432static int v4l2_open(struct inode *inode, struct file *filp)
433{
434 struct video_device *vdev;
65d9ff9c 435 int ret = 0;
dc93a70c
HV
436
437 /* Check if the video device is available */
438 mutex_lock(&videodev_lock);
439 vdev = video_devdata(filp);
ee6869af 440 /* return ENODEV if the video device has already been removed. */
ca9afe6f 441 if (vdev == NULL || !video_is_registered(vdev)) {
dc93a70c
HV
442 mutex_unlock(&videodev_lock);
443 return -ENODEV;
444 }
445 /* and increase the device refcount */
446 video_get(vdev);
447 mutex_unlock(&videodev_lock);
ee6869af 448 if (vdev->fops->open) {
ee6869af
HV
449 if (video_is_registered(vdev))
450 ret = vdev->fops->open(filp);
451 else
452 ret = -ENODEV;
ee6869af 453 }
65d9ff9c 454
17028cdb 455 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
456 printk(KERN_DEBUG "%s: open (%d)\n",
457 video_device_node_name(vdev), ret);
8f695d3f
EG
458 /* decrease the refcount in case of an error */
459 if (ret)
460 video_put(vdev);
dc93a70c
HV
461 return ret;
462}
463
464/* Override for the release function */
465static int v4l2_release(struct inode *inode, struct file *filp)
466{
467 struct video_device *vdev = video_devdata(filp);
65d9ff9c
HV
468 int ret = 0;
469
cf533735
HV
470 if (vdev->fops->release)
471 ret = vdev->fops->release(filp);
17028cdb 472 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
473 printk(KERN_DEBUG "%s: release\n",
474 video_device_node_name(vdev));
cf533735 475
8f695d3f
EG
476 /* decrease the refcount unconditionally since the release()
477 return value is ignored. */
478 video_put(vdev);
dc93a70c
HV
479 return ret;
480}
481
dc93a70c
HV
482static const struct file_operations v4l2_fops = {
483 .owner = THIS_MODULE,
484 .read = v4l2_read,
485 .write = v4l2_write,
486 .open = v4l2_open,
ecc6517d 487 .get_unmapped_area = v4l2_get_unmapped_area,
dc93a70c 488 .mmap = v4l2_mmap,
86a5ef7d 489 .unlocked_ioctl = v4l2_ioctl,
dc93a70c 490#ifdef CONFIG_COMPAT
9bb7cde7 491 .compat_ioctl = v4l2_compat_ioctl32,
dc93a70c
HV
492#endif
493 .release = v4l2_release,
494 .poll = v4l2_poll,
495 .llseek = no_llseek,
496};
497
27a5e6d3 498/**
1c1d86a1
HV
499 * get_index - assign stream index number based on v4l2_dev
500 * @vdev: video_device to assign index number to, vdev->v4l2_dev should be assigned
27a5e6d3 501 *
dc93a70c 502 * Note that when this is called the new device has not yet been registered
7ae0cd9b 503 * in the video_device array, but it was able to obtain a minor number.
27a5e6d3 504 *
7ae0cd9b
HV
505 * This means that we can always obtain a free stream index number since
506 * the worst case scenario is that there are VIDEO_NUM_DEVICES - 1 slots in
507 * use of the video_device array.
508 *
509 * Returns a free index number.
27a5e6d3 510 */
7ae0cd9b 511static int get_index(struct video_device *vdev)
27a5e6d3 512{
775a05dd
HV
513 /* This can be static since this function is called with the global
514 videodev_lock held. */
515 static DECLARE_BITMAP(used, VIDEO_NUM_DEVICES);
27a5e6d3
HV
516 int i;
517
775a05dd 518 bitmap_zero(used, VIDEO_NUM_DEVICES);
806e5b7c 519
27a5e6d3
HV
520 for (i = 0; i < VIDEO_NUM_DEVICES; i++) {
521 if (video_device[i] != NULL &&
1c1d86a1 522 video_device[i]->v4l2_dev == vdev->v4l2_dev) {
775a05dd 523 set_bit(video_device[i]->index, used);
27a5e6d3
HV
524 }
525 }
526
7ae0cd9b 527 return find_first_zero_bit(used, VIDEO_NUM_DEVICES);
27a5e6d3
HV
528}
529
48ea0be0
HV
530#define SET_VALID_IOCTL(ops, cmd, op) \
531 if (ops->op) \
532 set_bit(_IOC_NR(cmd), valid_ioctls)
533
534/* This determines which ioctls are actually implemented in the driver.
535 It's a one-time thing which simplifies video_ioctl2 as it can just do
536 a bit test.
537
538 Note that drivers can override this by setting bits to 1 in
539 vdev->valid_ioctls. If an ioctl is marked as 1 when this function is
540 called, then that ioctl will actually be marked as unimplemented.
541
542 It does that by first setting up the local valid_ioctls bitmap, and
543 at the end do a:
544
545 vdev->valid_ioctls = valid_ioctls & ~(vdev->valid_ioctls)
546 */
547static void determine_valid_ioctls(struct video_device *vdev)
548{
549 DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE);
550 const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops;
4b20259f
HV
551 bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER;
552 bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI;
bfffd743 553 bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO;
582c52cb 554 bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR;
4b20259f
HV
555 bool is_rx = vdev->vfl_dir != VFL_DIR_TX;
556 bool is_tx = vdev->vfl_dir != VFL_DIR_RX;
48ea0be0
HV
557
558 bitmap_zero(valid_ioctls, BASE_VIDIOC_PRIVATE);
559
90d0fc49
HV
560 /* vfl_type and vfl_dir independent ioctls */
561
48ea0be0 562 SET_VALID_IOCTL(ops, VIDIOC_QUERYCAP, vidioc_querycap);
b7284bb0 563 if (ops->vidioc_g_priority)
48ea0be0 564 set_bit(_IOC_NR(VIDIOC_G_PRIORITY), valid_ioctls);
b7284bb0 565 if (ops->vidioc_s_priority)
48ea0be0 566 set_bit(_IOC_NR(VIDIOC_S_PRIORITY), valid_ioctls);
90d0fc49
HV
567 /* Note: the control handler can also be passed through the filehandle,
568 and that can't be tested here. If the bit for these control ioctls
569 is set, then the ioctl is valid. But if it is 0, then it can still
570 be valid if the filehandle passed the control handler. */
571 if (vdev->ctrl_handler || ops->vidioc_queryctrl)
572 set_bit(_IOC_NR(VIDIOC_QUERYCTRL), valid_ioctls);
e6bee368
HV
573 if (vdev->ctrl_handler || ops->vidioc_query_ext_ctrl)
574 set_bit(_IOC_NR(VIDIOC_QUERY_EXT_CTRL), valid_ioctls);
90d0fc49
HV
575 if (vdev->ctrl_handler || ops->vidioc_g_ctrl || ops->vidioc_g_ext_ctrls)
576 set_bit(_IOC_NR(VIDIOC_G_CTRL), valid_ioctls);
577 if (vdev->ctrl_handler || ops->vidioc_s_ctrl || ops->vidioc_s_ext_ctrls)
578 set_bit(_IOC_NR(VIDIOC_S_CTRL), valid_ioctls);
579 if (vdev->ctrl_handler || ops->vidioc_g_ext_ctrls)
580 set_bit(_IOC_NR(VIDIOC_G_EXT_CTRLS), valid_ioctls);
581 if (vdev->ctrl_handler || ops->vidioc_s_ext_ctrls)
582 set_bit(_IOC_NR(VIDIOC_S_EXT_CTRLS), valid_ioctls);
583 if (vdev->ctrl_handler || ops->vidioc_try_ext_ctrls)
584 set_bit(_IOC_NR(VIDIOC_TRY_EXT_CTRLS), valid_ioctls);
585 if (vdev->ctrl_handler || ops->vidioc_querymenu)
586 set_bit(_IOC_NR(VIDIOC_QUERYMENU), valid_ioctls);
587 SET_VALID_IOCTL(ops, VIDIOC_G_FREQUENCY, vidioc_g_frequency);
588 SET_VALID_IOCTL(ops, VIDIOC_S_FREQUENCY, vidioc_s_frequency);
589 SET_VALID_IOCTL(ops, VIDIOC_LOG_STATUS, vidioc_log_status);
590#ifdef CONFIG_VIDEO_ADV_DEBUG
96b03d2a 591 set_bit(_IOC_NR(VIDIOC_DBG_G_CHIP_INFO), valid_ioctls);
79b0c640
HV
592 set_bit(_IOC_NR(VIDIOC_DBG_G_REGISTER), valid_ioctls);
593 set_bit(_IOC_NR(VIDIOC_DBG_S_REGISTER), valid_ioctls);
90d0fc49 594#endif
90d0fc49
HV
595 /* yes, really vidioc_subscribe_event */
596 SET_VALID_IOCTL(ops, VIDIOC_DQEVENT, vidioc_subscribe_event);
597 SET_VALID_IOCTL(ops, VIDIOC_SUBSCRIBE_EVENT, vidioc_subscribe_event);
598 SET_VALID_IOCTL(ops, VIDIOC_UNSUBSCRIBE_EVENT, vidioc_unsubscribe_event);
90d0fc49
HV
599 if (ops->vidioc_enum_freq_bands || ops->vidioc_g_tuner || ops->vidioc_g_modulator)
600 set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls);
601
4b20259f 602 if (is_vid) {
90d0fc49 603 /* video specific ioctls */
4b20259f
HV
604 if ((is_rx && (ops->vidioc_enum_fmt_vid_cap ||
605 ops->vidioc_enum_fmt_vid_cap_mplane ||
606 ops->vidioc_enum_fmt_vid_overlay)) ||
607 (is_tx && (ops->vidioc_enum_fmt_vid_out ||
608 ops->vidioc_enum_fmt_vid_out_mplane)))
609 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
610 if ((is_rx && (ops->vidioc_g_fmt_vid_cap ||
611 ops->vidioc_g_fmt_vid_cap_mplane ||
612 ops->vidioc_g_fmt_vid_overlay)) ||
613 (is_tx && (ops->vidioc_g_fmt_vid_out ||
614 ops->vidioc_g_fmt_vid_out_mplane ||
615 ops->vidioc_g_fmt_vid_out_overlay)))
616 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
617 if ((is_rx && (ops->vidioc_s_fmt_vid_cap ||
618 ops->vidioc_s_fmt_vid_cap_mplane ||
619 ops->vidioc_s_fmt_vid_overlay)) ||
620 (is_tx && (ops->vidioc_s_fmt_vid_out ||
621 ops->vidioc_s_fmt_vid_out_mplane ||
622 ops->vidioc_s_fmt_vid_out_overlay)))
623 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
624 if ((is_rx && (ops->vidioc_try_fmt_vid_cap ||
625 ops->vidioc_try_fmt_vid_cap_mplane ||
626 ops->vidioc_try_fmt_vid_overlay)) ||
627 (is_tx && (ops->vidioc_try_fmt_vid_out ||
628 ops->vidioc_try_fmt_vid_out_mplane ||
629 ops->vidioc_try_fmt_vid_out_overlay)))
630 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
90d0fc49
HV
631 SET_VALID_IOCTL(ops, VIDIOC_OVERLAY, vidioc_overlay);
632 SET_VALID_IOCTL(ops, VIDIOC_G_FBUF, vidioc_g_fbuf);
633 SET_VALID_IOCTL(ops, VIDIOC_S_FBUF, vidioc_s_fbuf);
634 SET_VALID_IOCTL(ops, VIDIOC_G_JPEGCOMP, vidioc_g_jpegcomp);
635 SET_VALID_IOCTL(ops, VIDIOC_S_JPEGCOMP, vidioc_s_jpegcomp);
636 SET_VALID_IOCTL(ops, VIDIOC_G_ENC_INDEX, vidioc_g_enc_index);
637 SET_VALID_IOCTL(ops, VIDIOC_ENCODER_CMD, vidioc_encoder_cmd);
638 SET_VALID_IOCTL(ops, VIDIOC_TRY_ENCODER_CMD, vidioc_try_encoder_cmd);
639 SET_VALID_IOCTL(ops, VIDIOC_DECODER_CMD, vidioc_decoder_cmd);
640 SET_VALID_IOCTL(ops, VIDIOC_TRY_DECODER_CMD, vidioc_try_decoder_cmd);
641 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMESIZES, vidioc_enum_framesizes);
642 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMEINTERVALS, vidioc_enum_frameintervals);
4b20259f 643 } else if (is_vbi) {
90d0fc49 644 /* vbi specific ioctls */
4b20259f
HV
645 if ((is_rx && (ops->vidioc_g_fmt_vbi_cap ||
646 ops->vidioc_g_fmt_sliced_vbi_cap)) ||
647 (is_tx && (ops->vidioc_g_fmt_vbi_out ||
648 ops->vidioc_g_fmt_sliced_vbi_out)))
649 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
650 if ((is_rx && (ops->vidioc_s_fmt_vbi_cap ||
651 ops->vidioc_s_fmt_sliced_vbi_cap)) ||
652 (is_tx && (ops->vidioc_s_fmt_vbi_out ||
653 ops->vidioc_s_fmt_sliced_vbi_out)))
654 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
655 if ((is_rx && (ops->vidioc_try_fmt_vbi_cap ||
656 ops->vidioc_try_fmt_sliced_vbi_cap)) ||
657 (is_tx && (ops->vidioc_try_fmt_vbi_out ||
658 ops->vidioc_try_fmt_sliced_vbi_out)))
659 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
90d0fc49 660 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap);
582c52cb
AP
661 } else if (is_sdr) {
662 /* SDR specific ioctls */
663 if (ops->vidioc_enum_fmt_sdr_cap)
664 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
665 if (ops->vidioc_g_fmt_sdr_cap)
666 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
667 if (ops->vidioc_s_fmt_sdr_cap)
668 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
669 if (ops->vidioc_try_fmt_sdr_cap)
670 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
4b20259f 671 }
582c52cb
AP
672
673 if (is_vid || is_vbi || is_sdr) {
674 /* ioctls valid for video, vbi or sdr */
5815d0c4
FS
675 SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs);
676 SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf);
677 SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf);
678 SET_VALID_IOCTL(ops, VIDIOC_EXPBUF, vidioc_expbuf);
679 SET_VALID_IOCTL(ops, VIDIOC_DQBUF, vidioc_dqbuf);
680 SET_VALID_IOCTL(ops, VIDIOC_CREATE_BUFS, vidioc_create_bufs);
681 SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf);
72be89c8
HV
682 SET_VALID_IOCTL(ops, VIDIOC_STREAMON, vidioc_streamon);
683 SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
582c52cb
AP
684 }
685
686 if (is_vid || is_vbi) {
687 /* ioctls valid for video or vbi */
4b20259f
HV
688 if (ops->vidioc_s_std)
689 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
4b20259f 690 SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std);
ca371575 691 SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std);
4b20259f 692 if (is_rx) {
90d0fc49 693 SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd);
4b20259f
HV
694 SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input);
695 SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input);
696 SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input);
697 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio);
698 SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio);
699 SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio);
90d0fc49 700 SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings);
dd519bb3 701 SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid);
4b20259f
HV
702 }
703 if (is_tx) {
704 SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output);
705 SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output);
706 SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output);
707 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout);
708 SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout);
709 SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout);
710 }
4b20259f
HV
711 if (ops->vidioc_g_crop || ops->vidioc_g_selection)
712 set_bit(_IOC_NR(VIDIOC_G_CROP), valid_ioctls);
713 if (ops->vidioc_s_crop || ops->vidioc_s_selection)
714 set_bit(_IOC_NR(VIDIOC_S_CROP), valid_ioctls);
715 SET_VALID_IOCTL(ops, VIDIOC_G_SELECTION, vidioc_g_selection);
716 SET_VALID_IOCTL(ops, VIDIOC_S_SELECTION, vidioc_s_selection);
717 if (ops->vidioc_cropcap || ops->vidioc_g_selection)
718 set_bit(_IOC_NR(VIDIOC_CROPCAP), valid_ioctls);
4b20259f 719 if (ops->vidioc_g_parm || (vdev->vfl_type == VFL_TYPE_GRABBER &&
ca371575 720 ops->vidioc_g_std))
4b20259f
HV
721 set_bit(_IOC_NR(VIDIOC_G_PARM), valid_ioctls);
722 SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
4b20259f
HV
723 SET_VALID_IOCTL(ops, VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings);
724 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings);
725 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings);
4b20259f 726 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap);
dd519bb3 727 SET_VALID_IOCTL(ops, VIDIOC_G_EDID, vidioc_g_edid);
4b20259f 728 }
bfffd743
HV
729 if (is_tx && (is_radio || is_sdr)) {
730 /* radio transmitter only ioctls */
90d0fc49
HV
731 SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator);
732 SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator);
733 }
734 if (is_rx) {
735 /* receiver only ioctls */
736 SET_VALID_IOCTL(ops, VIDIOC_G_TUNER, vidioc_g_tuner);
737 SET_VALID_IOCTL(ops, VIDIOC_S_TUNER, vidioc_s_tuner);
738 SET_VALID_IOCTL(ops, VIDIOC_S_HW_FREQ_SEEK, vidioc_s_hw_freq_seek);
739 }
740
48ea0be0
HV
741 bitmap_andnot(vdev->valid_ioctls, valid_ioctls, vdev->valid_ioctls,
742 BASE_VIDIOC_PRIVATE);
743}
744
27a5e6d3 745/**
2096a5dc 746 * __video_register_device - register video4linux devices
dc93a70c 747 * @vdev: video device structure we want to register
27a5e6d3 748 * @type: type of device to register
22e22125 749 * @nr: which device node number (0 == /dev/video0, 1 == /dev/video1, ...
27a5e6d3 750 * -1 == first free)
6b5270d2
HV
751 * @warn_if_nr_in_use: warn if the desired device node number
752 * was already in use and another number was chosen instead.
2096a5dc 753 * @owner: module that owns the video device node
27a5e6d3 754 *
22e22125
HV
755 * The registration code assigns minor numbers and device node numbers
756 * based on the requested type and registers the new device node with
757 * the kernel.
46b63377
HV
758 *
759 * This function assumes that struct video_device was zeroed when it
760 * was allocated and does not contain any stale date.
761 *
22e22125
HV
762 * An error is returned if no free minor or device node number could be
763 * found, or if the registration of the device node failed.
27a5e6d3
HV
764 *
765 * Zero is returned on success.
766 *
767 * Valid types are
768 *
769 * %VFL_TYPE_GRABBER - A frame grabber
770 *
27a5e6d3
HV
771 * %VFL_TYPE_VBI - Vertical blank data (undecoded)
772 *
773 * %VFL_TYPE_RADIO - A radio card
2096a5dc
LP
774 *
775 * %VFL_TYPE_SUBDEV - A subdevice
d42626bd
AP
776 *
777 * %VFL_TYPE_SDR - Software Defined Radio
27a5e6d3 778 */
2096a5dc
LP
779int __video_register_device(struct video_device *vdev, int type, int nr,
780 int warn_if_nr_in_use, struct module *owner)
27a5e6d3
HV
781{
782 int i = 0;
27a5e6d3 783 int ret;
dd89601d
HV
784 int minor_offset = 0;
785 int minor_cnt = VIDEO_NUM_DEVICES;
786 const char *name_base;
27a5e6d3 787
dc93a70c
HV
788 /* A minor value of -1 marks this video device as never
789 having been registered */
428c8d19 790 vdev->minor = -1;
ee7aa9f8 791
dc93a70c 792 /* the release callback MUST be present */
1fc2b5f7 793 if (WARN_ON(!vdev->release))
f3b9f50e 794 return -EINVAL;
1c1d86a1
HV
795 /* the v4l2_dev pointer MUST be present */
796 if (WARN_ON(!vdev->v4l2_dev))
797 return -EINVAL;
f3b9f50e 798
1babcb46
SA
799 /* v4l2_fh support */
800 spin_lock_init(&vdev->fh_lock);
801 INIT_LIST_HEAD(&vdev->fh_list);
802
dc93a70c 803 /* Part 1: check device type */
27a5e6d3
HV
804 switch (type) {
805 case VFL_TYPE_GRABBER:
27a5e6d3
HV
806 name_base = "video";
807 break;
27a5e6d3 808 case VFL_TYPE_VBI:
27a5e6d3
HV
809 name_base = "vbi";
810 break;
811 case VFL_TYPE_RADIO:
27a5e6d3
HV
812 name_base = "radio";
813 break;
2096a5dc
LP
814 case VFL_TYPE_SUBDEV:
815 name_base = "v4l-subdev";
816 break;
d42626bd
AP
817 case VFL_TYPE_SDR:
818 /* Use device name 'swradio' because 'sdr' was already taken. */
819 name_base = "swradio";
820 break;
27a5e6d3
HV
821 default:
822 printk(KERN_ERR "%s called with unknown type: %d\n",
823 __func__, type);
46f2c21c 824 return -EINVAL;
27a5e6d3
HV
825 }
826
dc93a70c
HV
827 vdev->vfl_type = type;
828 vdev->cdev = NULL;
1c1d86a1
HV
829 if (vdev->dev_parent == NULL)
830 vdev->dev_parent = vdev->v4l2_dev->dev;
831 if (vdev->ctrl_handler == NULL)
832 vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;
833 /* If the prio state pointer is NULL, then use the v4l2_device
834 prio state. */
835 if (vdev->prio == NULL)
836 vdev->prio = &vdev->v4l2_dev->prio;
dd89601d 837
22e22125 838 /* Part 2: find a free minor, device node number and device index. */
dd89601d
HV
839#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
840 /* Keep the ranges for the first four types for historical
841 * reasons.
842 * Newer devices (not yet in place) should use the range
843 * of 128-191 and just pick the first free minor there
844 * (new style). */
845 switch (type) {
846 case VFL_TYPE_GRABBER:
847 minor_offset = 0;
848 minor_cnt = 64;
849 break;
850 case VFL_TYPE_RADIO:
851 minor_offset = 64;
852 minor_cnt = 64;
853 break;
dd89601d
HV
854 case VFL_TYPE_VBI:
855 minor_offset = 224;
856 minor_cnt = 32;
857 break;
858 default:
859 minor_offset = 128;
860 minor_cnt = 64;
861 break;
862 }
863#endif
864
22e22125 865 /* Pick a device node number */
27a5e6d3 866 mutex_lock(&videodev_lock);
5062cb70 867 nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt);
dd89601d 868 if (nr == minor_cnt)
5062cb70 869 nr = devnode_find(vdev, 0, minor_cnt);
dd89601d 870 if (nr == minor_cnt) {
22e22125 871 printk(KERN_ERR "could not get a free device node number\n");
dd89601d
HV
872 mutex_unlock(&videodev_lock);
873 return -ENFILE;
27a5e6d3 874 }
dd89601d 875#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
22e22125 876 /* 1-on-1 mapping of device node number to minor number */
dd89601d
HV
877 i = nr;
878#else
22e22125
HV
879 /* The device node number and minor numbers are independent, so
880 we just find the first free minor number. */
dd89601d
HV
881 for (i = 0; i < VIDEO_NUM_DEVICES; i++)
882 if (video_device[i] == NULL)
883 break;
884 if (i == VIDEO_NUM_DEVICES) {
885 mutex_unlock(&videodev_lock);
886 printk(KERN_ERR "could not get a free minor\n");
887 return -ENFILE;
888 }
889#endif
dc93a70c
HV
890 vdev->minor = i + minor_offset;
891 vdev->num = nr;
5062cb70
HV
892 devnode_set(vdev);
893
dc93a70c
HV
894 /* Should not happen since we thought this minor was free */
895 WARN_ON(video_device[vdev->minor] != NULL);
7ae0cd9b 896 vdev->index = get_index(vdev);
6c3df5da 897 video_device[vdev->minor] = vdev;
27a5e6d3
HV
898 mutex_unlock(&videodev_lock);
899
48ea0be0
HV
900 if (vdev->ioctl_ops)
901 determine_valid_ioctls(vdev);
902
dc93a70c
HV
903 /* Part 3: Initialize the character device */
904 vdev->cdev = cdev_alloc();
905 if (vdev->cdev == NULL) {
906 ret = -ENOMEM;
907 goto cleanup;
908 }
86a5ef7d 909 vdev->cdev->ops = &v4l2_fops;
2096a5dc 910 vdev->cdev->owner = owner;
dc93a70c 911 ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
7f8ecfab
HV
912 if (ret < 0) {
913 printk(KERN_ERR "%s: cdev_add failed\n", __func__);
dc93a70c
HV
914 kfree(vdev->cdev);
915 vdev->cdev = NULL;
916 goto cleanup;
7f8ecfab 917 }
dc93a70c
HV
918
919 /* Part 4: register the device with sysfs */
dc93a70c
HV
920 vdev->dev.class = &video_class;
921 vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
1c1d86a1 922 vdev->dev.parent = vdev->dev_parent;
22e22125 923 dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
dc93a70c 924 ret = device_register(&vdev->dev);
27a5e6d3
HV
925 if (ret < 0) {
926 printk(KERN_ERR "%s: device_register failed\n", __func__);
dc93a70c 927 goto cleanup;
27a5e6d3 928 }
dc93a70c
HV
929 /* Register the release callback that will be called when the last
930 reference to the device goes away. */
931 vdev->dev.release = v4l2_device_release;
27a5e6d3 932
6b5270d2 933 if (nr != -1 && nr != vdev->num && warn_if_nr_in_use)
eac8ea53
LP
934 printk(KERN_WARNING "%s: requested %s%d, got %s\n", __func__,
935 name_base, nr, video_device_node_name(vdev));
bedf8bcf
HV
936
937 /* Increase v4l2_device refcount */
d9bfbcc0 938 v4l2_device_get(vdev->v4l2_dev);
bedf8bcf 939
2c0ab67b
LP
940#if defined(CONFIG_MEDIA_CONTROLLER)
941 /* Part 5: Register the entity. */
d9bfbcc0 942 if (vdev->v4l2_dev->mdev &&
c4f0b78a 943 vdev->vfl_type != VFL_TYPE_SUBDEV) {
2c0ab67b
LP
944 vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L;
945 vdev->entity.name = vdev->name;
fa5034c6
CL
946 vdev->entity.info.v4l.major = VIDEO_MAJOR;
947 vdev->entity.info.v4l.minor = vdev->minor;
2c0ab67b
LP
948 ret = media_device_register_entity(vdev->v4l2_dev->mdev,
949 &vdev->entity);
950 if (ret < 0)
951 printk(KERN_WARNING
952 "%s: media_device_register_entity failed\n",
953 __func__);
954 }
955#endif
956 /* Part 6: Activate this minor. The char device can now be used. */
957b4aa9 957 set_bit(V4L2_FL_REGISTERED, &vdev->flags);
2c0ab67b 958
dc93a70c 959 return 0;
7f8ecfab 960
dc93a70c 961cleanup:
27a5e6d3 962 mutex_lock(&videodev_lock);
dc93a70c
HV
963 if (vdev->cdev)
964 cdev_del(vdev->cdev);
1056e438 965 video_device[vdev->minor] = NULL;
5062cb70 966 devnode_clear(vdev);
27a5e6d3 967 mutex_unlock(&videodev_lock);
dc93a70c
HV
968 /* Mark this video device as never having been registered. */
969 vdev->minor = -1;
27a5e6d3
HV
970 return ret;
971}
2096a5dc 972EXPORT_SYMBOL(__video_register_device);
6b5270d2 973
27a5e6d3
HV
974/**
975 * video_unregister_device - unregister a video4linux device
dc93a70c 976 * @vdev: the device to unregister
27a5e6d3 977 *
dc93a70c
HV
978 * This unregisters the passed device. Future open calls will
979 * be met with errors.
27a5e6d3 980 */
dc93a70c 981void video_unregister_device(struct video_device *vdev)
27a5e6d3 982{
dc93a70c 983 /* Check if vdev was ever registered at all */
957b4aa9 984 if (!vdev || !video_is_registered(vdev))
dc93a70c
HV
985 return;
986
ca9afe6f
HV
987 mutex_lock(&videodev_lock);
988 /* This must be in a critical section to prevent a race with v4l2_open.
989 * Once this bit has been cleared video_get may never be called again.
990 */
957b4aa9 991 clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
ca9afe6f 992 mutex_unlock(&videodev_lock);
dc93a70c 993 device_unregister(&vdev->dev);
27a5e6d3
HV
994}
995EXPORT_SYMBOL(video_unregister_device);
996
27a5e6d3
HV
997/*
998 * Initialise video for linux
999 */
27a5e6d3
HV
1000static int __init videodev_init(void)
1001{
7f8ecfab 1002 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
27a5e6d3
HV
1003 int ret;
1004
1005 printk(KERN_INFO "Linux video capture interface: v2.00\n");
7f8ecfab
HV
1006 ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
1007 if (ret < 0) {
1008 printk(KERN_WARNING "videodev: unable to get major %d\n",
1009 VIDEO_MAJOR);
1010 return ret;
27a5e6d3
HV
1011 }
1012
1013 ret = class_register(&video_class);
1014 if (ret < 0) {
7f8ecfab 1015 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
1016 printk(KERN_WARNING "video_dev: class_register failed\n");
1017 return -EIO;
1018 }
1019
1020 return 0;
1021}
1022
1023static void __exit videodev_exit(void)
1024{
7f8ecfab
HV
1025 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
1026
27a5e6d3 1027 class_unregister(&video_class);
7f8ecfab 1028 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
1029}
1030
ee981c6f 1031subsys_initcall(videodev_init);
27a5e6d3
HV
1032module_exit(videodev_exit)
1033
1034MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
1035MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
1036MODULE_LICENSE("GPL");
cbb72b0f 1037MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR);
This page took 0.636946 seconds and 5 git commands to generate.