Merge tag 'atlas7-pinctrl-dts-for-4.2' of git://git.kernel.org/pub/scm/linux/kernel...
[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
AB
360 } else
361 ret = -ENOTTY;
dc93a70c 362
86a5ef7d 363 return ret;
dc93a70c
HV
364}
365
ecc6517d
BL
366#ifdef CONFIG_MMU
367#define v4l2_get_unmapped_area NULL
368#else
369static unsigned long v4l2_get_unmapped_area(struct file *filp,
370 unsigned long addr, unsigned long len, unsigned long pgoff,
371 unsigned long flags)
372{
373 struct video_device *vdev = video_devdata(filp);
cc4b7e7f 374 int ret;
ecc6517d
BL
375
376 if (!vdev->fops->get_unmapped_area)
377 return -ENOSYS;
378 if (!video_is_registered(vdev))
379 return -ENODEV;
cc4b7e7f 380 ret = vdev->fops->get_unmapped_area(filp, addr, len, pgoff, flags);
17028cdb 381 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
382 printk(KERN_DEBUG "%s: get_unmapped_area (%d)\n",
383 video_device_node_name(vdev), ret);
384 return ret;
ecc6517d
BL
385}
386#endif
387
dc93a70c
HV
388static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
389{
390 struct video_device *vdev = video_devdata(filp);
ee6869af
HV
391 int ret = -ENODEV;
392
393 if (!vdev->fops->mmap)
cf533735 394 return -ENODEV;
ee6869af
HV
395 if (video_is_registered(vdev))
396 ret = vdev->fops->mmap(filp, vm);
17028cdb 397 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
398 printk(KERN_DEBUG "%s: mmap (%d)\n",
399 video_device_node_name(vdev), ret);
ee6869af 400 return ret;
dc93a70c
HV
401}
402
403/* Override for the open function */
404static int v4l2_open(struct inode *inode, struct file *filp)
405{
406 struct video_device *vdev;
65d9ff9c 407 int ret = 0;
dc93a70c
HV
408
409 /* Check if the video device is available */
410 mutex_lock(&videodev_lock);
411 vdev = video_devdata(filp);
ee6869af 412 /* return ENODEV if the video device has already been removed. */
ca9afe6f 413 if (vdev == NULL || !video_is_registered(vdev)) {
dc93a70c
HV
414 mutex_unlock(&videodev_lock);
415 return -ENODEV;
416 }
417 /* and increase the device refcount */
418 video_get(vdev);
419 mutex_unlock(&videodev_lock);
ee6869af 420 if (vdev->fops->open) {
ee6869af
HV
421 if (video_is_registered(vdev))
422 ret = vdev->fops->open(filp);
423 else
424 ret = -ENODEV;
ee6869af 425 }
65d9ff9c 426
17028cdb 427 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
428 printk(KERN_DEBUG "%s: open (%d)\n",
429 video_device_node_name(vdev), ret);
8f695d3f
EG
430 /* decrease the refcount in case of an error */
431 if (ret)
432 video_put(vdev);
dc93a70c
HV
433 return ret;
434}
435
436/* Override for the release function */
437static int v4l2_release(struct inode *inode, struct file *filp)
438{
439 struct video_device *vdev = video_devdata(filp);
65d9ff9c
HV
440 int ret = 0;
441
cf533735
HV
442 if (vdev->fops->release)
443 ret = vdev->fops->release(filp);
17028cdb 444 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
445 printk(KERN_DEBUG "%s: release\n",
446 video_device_node_name(vdev));
cf533735 447
8f695d3f
EG
448 /* decrease the refcount unconditionally since the release()
449 return value is ignored. */
450 video_put(vdev);
dc93a70c
HV
451 return ret;
452}
453
dc93a70c
HV
454static const struct file_operations v4l2_fops = {
455 .owner = THIS_MODULE,
456 .read = v4l2_read,
457 .write = v4l2_write,
458 .open = v4l2_open,
ecc6517d 459 .get_unmapped_area = v4l2_get_unmapped_area,
dc93a70c 460 .mmap = v4l2_mmap,
86a5ef7d 461 .unlocked_ioctl = v4l2_ioctl,
dc93a70c 462#ifdef CONFIG_COMPAT
9bb7cde7 463 .compat_ioctl = v4l2_compat_ioctl32,
dc93a70c
HV
464#endif
465 .release = v4l2_release,
466 .poll = v4l2_poll,
467 .llseek = no_llseek,
468};
469
27a5e6d3 470/**
1c1d86a1
HV
471 * get_index - assign stream index number based on v4l2_dev
472 * @vdev: video_device to assign index number to, vdev->v4l2_dev should be assigned
27a5e6d3 473 *
dc93a70c 474 * Note that when this is called the new device has not yet been registered
7ae0cd9b 475 * in the video_device array, but it was able to obtain a minor number.
27a5e6d3 476 *
7ae0cd9b
HV
477 * This means that we can always obtain a free stream index number since
478 * the worst case scenario is that there are VIDEO_NUM_DEVICES - 1 slots in
479 * use of the video_device array.
480 *
481 * Returns a free index number.
27a5e6d3 482 */
7ae0cd9b 483static int get_index(struct video_device *vdev)
27a5e6d3 484{
775a05dd
HV
485 /* This can be static since this function is called with the global
486 videodev_lock held. */
487 static DECLARE_BITMAP(used, VIDEO_NUM_DEVICES);
27a5e6d3
HV
488 int i;
489
775a05dd 490 bitmap_zero(used, VIDEO_NUM_DEVICES);
806e5b7c 491
27a5e6d3
HV
492 for (i = 0; i < VIDEO_NUM_DEVICES; i++) {
493 if (video_device[i] != NULL &&
1c1d86a1 494 video_device[i]->v4l2_dev == vdev->v4l2_dev) {
775a05dd 495 set_bit(video_device[i]->index, used);
27a5e6d3
HV
496 }
497 }
498
7ae0cd9b 499 return find_first_zero_bit(used, VIDEO_NUM_DEVICES);
27a5e6d3
HV
500}
501
48ea0be0
HV
502#define SET_VALID_IOCTL(ops, cmd, op) \
503 if (ops->op) \
504 set_bit(_IOC_NR(cmd), valid_ioctls)
505
506/* This determines which ioctls are actually implemented in the driver.
507 It's a one-time thing which simplifies video_ioctl2 as it can just do
508 a bit test.
509
510 Note that drivers can override this by setting bits to 1 in
511 vdev->valid_ioctls. If an ioctl is marked as 1 when this function is
512 called, then that ioctl will actually be marked as unimplemented.
513
514 It does that by first setting up the local valid_ioctls bitmap, and
515 at the end do a:
516
517 vdev->valid_ioctls = valid_ioctls & ~(vdev->valid_ioctls)
518 */
519static void determine_valid_ioctls(struct video_device *vdev)
520{
521 DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE);
522 const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops;
4b20259f
HV
523 bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER;
524 bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI;
bfffd743 525 bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO;
582c52cb 526 bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR;
4b20259f
HV
527 bool is_rx = vdev->vfl_dir != VFL_DIR_TX;
528 bool is_tx = vdev->vfl_dir != VFL_DIR_RX;
48ea0be0
HV
529
530 bitmap_zero(valid_ioctls, BASE_VIDIOC_PRIVATE);
531
90d0fc49
HV
532 /* vfl_type and vfl_dir independent ioctls */
533
48ea0be0 534 SET_VALID_IOCTL(ops, VIDIOC_QUERYCAP, vidioc_querycap);
2438e78a
HV
535 set_bit(_IOC_NR(VIDIOC_G_PRIORITY), valid_ioctls);
536 set_bit(_IOC_NR(VIDIOC_S_PRIORITY), valid_ioctls);
537
90d0fc49
HV
538 /* Note: the control handler can also be passed through the filehandle,
539 and that can't be tested here. If the bit for these control ioctls
540 is set, then the ioctl is valid. But if it is 0, then it can still
541 be valid if the filehandle passed the control handler. */
542 if (vdev->ctrl_handler || ops->vidioc_queryctrl)
543 set_bit(_IOC_NR(VIDIOC_QUERYCTRL), valid_ioctls);
e6bee368
HV
544 if (vdev->ctrl_handler || ops->vidioc_query_ext_ctrl)
545 set_bit(_IOC_NR(VIDIOC_QUERY_EXT_CTRL), valid_ioctls);
90d0fc49
HV
546 if (vdev->ctrl_handler || ops->vidioc_g_ctrl || ops->vidioc_g_ext_ctrls)
547 set_bit(_IOC_NR(VIDIOC_G_CTRL), valid_ioctls);
548 if (vdev->ctrl_handler || ops->vidioc_s_ctrl || ops->vidioc_s_ext_ctrls)
549 set_bit(_IOC_NR(VIDIOC_S_CTRL), valid_ioctls);
550 if (vdev->ctrl_handler || ops->vidioc_g_ext_ctrls)
551 set_bit(_IOC_NR(VIDIOC_G_EXT_CTRLS), valid_ioctls);
552 if (vdev->ctrl_handler || ops->vidioc_s_ext_ctrls)
553 set_bit(_IOC_NR(VIDIOC_S_EXT_CTRLS), valid_ioctls);
554 if (vdev->ctrl_handler || ops->vidioc_try_ext_ctrls)
555 set_bit(_IOC_NR(VIDIOC_TRY_EXT_CTRLS), valid_ioctls);
556 if (vdev->ctrl_handler || ops->vidioc_querymenu)
557 set_bit(_IOC_NR(VIDIOC_QUERYMENU), valid_ioctls);
558 SET_VALID_IOCTL(ops, VIDIOC_G_FREQUENCY, vidioc_g_frequency);
559 SET_VALID_IOCTL(ops, VIDIOC_S_FREQUENCY, vidioc_s_frequency);
560 SET_VALID_IOCTL(ops, VIDIOC_LOG_STATUS, vidioc_log_status);
561#ifdef CONFIG_VIDEO_ADV_DEBUG
96b03d2a 562 set_bit(_IOC_NR(VIDIOC_DBG_G_CHIP_INFO), valid_ioctls);
79b0c640
HV
563 set_bit(_IOC_NR(VIDIOC_DBG_G_REGISTER), valid_ioctls);
564 set_bit(_IOC_NR(VIDIOC_DBG_S_REGISTER), valid_ioctls);
90d0fc49 565#endif
90d0fc49
HV
566 /* yes, really vidioc_subscribe_event */
567 SET_VALID_IOCTL(ops, VIDIOC_DQEVENT, vidioc_subscribe_event);
568 SET_VALID_IOCTL(ops, VIDIOC_SUBSCRIBE_EVENT, vidioc_subscribe_event);
569 SET_VALID_IOCTL(ops, VIDIOC_UNSUBSCRIBE_EVENT, vidioc_unsubscribe_event);
90d0fc49
HV
570 if (ops->vidioc_enum_freq_bands || ops->vidioc_g_tuner || ops->vidioc_g_modulator)
571 set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls);
572
4b20259f 573 if (is_vid) {
90d0fc49 574 /* video specific ioctls */
4b20259f
HV
575 if ((is_rx && (ops->vidioc_enum_fmt_vid_cap ||
576 ops->vidioc_enum_fmt_vid_cap_mplane ||
577 ops->vidioc_enum_fmt_vid_overlay)) ||
578 (is_tx && (ops->vidioc_enum_fmt_vid_out ||
579 ops->vidioc_enum_fmt_vid_out_mplane)))
580 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
581 if ((is_rx && (ops->vidioc_g_fmt_vid_cap ||
582 ops->vidioc_g_fmt_vid_cap_mplane ||
583 ops->vidioc_g_fmt_vid_overlay)) ||
584 (is_tx && (ops->vidioc_g_fmt_vid_out ||
585 ops->vidioc_g_fmt_vid_out_mplane ||
586 ops->vidioc_g_fmt_vid_out_overlay)))
587 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
588 if ((is_rx && (ops->vidioc_s_fmt_vid_cap ||
589 ops->vidioc_s_fmt_vid_cap_mplane ||
590 ops->vidioc_s_fmt_vid_overlay)) ||
591 (is_tx && (ops->vidioc_s_fmt_vid_out ||
592 ops->vidioc_s_fmt_vid_out_mplane ||
593 ops->vidioc_s_fmt_vid_out_overlay)))
594 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
595 if ((is_rx && (ops->vidioc_try_fmt_vid_cap ||
596 ops->vidioc_try_fmt_vid_cap_mplane ||
597 ops->vidioc_try_fmt_vid_overlay)) ||
598 (is_tx && (ops->vidioc_try_fmt_vid_out ||
599 ops->vidioc_try_fmt_vid_out_mplane ||
600 ops->vidioc_try_fmt_vid_out_overlay)))
601 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
90d0fc49
HV
602 SET_VALID_IOCTL(ops, VIDIOC_OVERLAY, vidioc_overlay);
603 SET_VALID_IOCTL(ops, VIDIOC_G_FBUF, vidioc_g_fbuf);
604 SET_VALID_IOCTL(ops, VIDIOC_S_FBUF, vidioc_s_fbuf);
605 SET_VALID_IOCTL(ops, VIDIOC_G_JPEGCOMP, vidioc_g_jpegcomp);
606 SET_VALID_IOCTL(ops, VIDIOC_S_JPEGCOMP, vidioc_s_jpegcomp);
607 SET_VALID_IOCTL(ops, VIDIOC_G_ENC_INDEX, vidioc_g_enc_index);
608 SET_VALID_IOCTL(ops, VIDIOC_ENCODER_CMD, vidioc_encoder_cmd);
609 SET_VALID_IOCTL(ops, VIDIOC_TRY_ENCODER_CMD, vidioc_try_encoder_cmd);
610 SET_VALID_IOCTL(ops, VIDIOC_DECODER_CMD, vidioc_decoder_cmd);
611 SET_VALID_IOCTL(ops, VIDIOC_TRY_DECODER_CMD, vidioc_try_decoder_cmd);
612 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMESIZES, vidioc_enum_framesizes);
613 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMEINTERVALS, vidioc_enum_frameintervals);
2c9fc463
HV
614 if (ops->vidioc_g_crop || ops->vidioc_g_selection)
615 set_bit(_IOC_NR(VIDIOC_G_CROP), valid_ioctls);
616 if (ops->vidioc_s_crop || ops->vidioc_s_selection)
617 set_bit(_IOC_NR(VIDIOC_S_CROP), valid_ioctls);
618 SET_VALID_IOCTL(ops, VIDIOC_G_SELECTION, vidioc_g_selection);
619 SET_VALID_IOCTL(ops, VIDIOC_S_SELECTION, vidioc_s_selection);
620 if (ops->vidioc_cropcap || ops->vidioc_g_selection)
621 set_bit(_IOC_NR(VIDIOC_CROPCAP), valid_ioctls);
4b20259f 622 } else if (is_vbi) {
90d0fc49 623 /* vbi specific ioctls */
4b20259f
HV
624 if ((is_rx && (ops->vidioc_g_fmt_vbi_cap ||
625 ops->vidioc_g_fmt_sliced_vbi_cap)) ||
626 (is_tx && (ops->vidioc_g_fmt_vbi_out ||
627 ops->vidioc_g_fmt_sliced_vbi_out)))
628 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
629 if ((is_rx && (ops->vidioc_s_fmt_vbi_cap ||
630 ops->vidioc_s_fmt_sliced_vbi_cap)) ||
631 (is_tx && (ops->vidioc_s_fmt_vbi_out ||
632 ops->vidioc_s_fmt_sliced_vbi_out)))
633 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
634 if ((is_rx && (ops->vidioc_try_fmt_vbi_cap ||
635 ops->vidioc_try_fmt_sliced_vbi_cap)) ||
636 (is_tx && (ops->vidioc_try_fmt_vbi_out ||
637 ops->vidioc_try_fmt_sliced_vbi_out)))
638 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
90d0fc49 639 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap);
582c52cb
AP
640 } else if (is_sdr) {
641 /* SDR specific ioctls */
642 if (ops->vidioc_enum_fmt_sdr_cap)
643 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
644 if (ops->vidioc_g_fmt_sdr_cap)
645 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
646 if (ops->vidioc_s_fmt_sdr_cap)
647 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
648 if (ops->vidioc_try_fmt_sdr_cap)
649 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
4b20259f 650 }
582c52cb
AP
651
652 if (is_vid || is_vbi || is_sdr) {
653 /* ioctls valid for video, vbi or sdr */
5815d0c4
FS
654 SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs);
655 SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf);
656 SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf);
657 SET_VALID_IOCTL(ops, VIDIOC_EXPBUF, vidioc_expbuf);
658 SET_VALID_IOCTL(ops, VIDIOC_DQBUF, vidioc_dqbuf);
659 SET_VALID_IOCTL(ops, VIDIOC_CREATE_BUFS, vidioc_create_bufs);
660 SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf);
72be89c8
HV
661 SET_VALID_IOCTL(ops, VIDIOC_STREAMON, vidioc_streamon);
662 SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
582c52cb
AP
663 }
664
665 if (is_vid || is_vbi) {
666 /* ioctls valid for video or vbi */
4b20259f
HV
667 if (ops->vidioc_s_std)
668 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
4b20259f 669 SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std);
ca371575 670 SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std);
4b20259f 671 if (is_rx) {
90d0fc49 672 SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd);
4b20259f
HV
673 SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input);
674 SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input);
675 SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input);
676 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio);
677 SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio);
678 SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio);
90d0fc49 679 SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings);
dd519bb3 680 SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid);
4b20259f
HV
681 }
682 if (is_tx) {
683 SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output);
684 SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output);
685 SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output);
686 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout);
687 SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout);
688 SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout);
689 }
4b20259f 690 if (ops->vidioc_g_parm || (vdev->vfl_type == VFL_TYPE_GRABBER &&
ca371575 691 ops->vidioc_g_std))
4b20259f
HV
692 set_bit(_IOC_NR(VIDIOC_G_PARM), valid_ioctls);
693 SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
4b20259f
HV
694 SET_VALID_IOCTL(ops, VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings);
695 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings);
696 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings);
4b20259f 697 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap);
dd519bb3 698 SET_VALID_IOCTL(ops, VIDIOC_G_EDID, vidioc_g_edid);
4b20259f 699 }
bfffd743
HV
700 if (is_tx && (is_radio || is_sdr)) {
701 /* radio transmitter only ioctls */
90d0fc49
HV
702 SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator);
703 SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator);
704 }
705 if (is_rx) {
706 /* receiver only ioctls */
707 SET_VALID_IOCTL(ops, VIDIOC_G_TUNER, vidioc_g_tuner);
708 SET_VALID_IOCTL(ops, VIDIOC_S_TUNER, vidioc_s_tuner);
709 SET_VALID_IOCTL(ops, VIDIOC_S_HW_FREQ_SEEK, vidioc_s_hw_freq_seek);
710 }
711
48ea0be0
HV
712 bitmap_andnot(vdev->valid_ioctls, valid_ioctls, vdev->valid_ioctls,
713 BASE_VIDIOC_PRIVATE);
714}
715
27a5e6d3 716/**
2096a5dc 717 * __video_register_device - register video4linux devices
dc93a70c 718 * @vdev: video device structure we want to register
27a5e6d3 719 * @type: type of device to register
22e22125 720 * @nr: which device node number (0 == /dev/video0, 1 == /dev/video1, ...
27a5e6d3 721 * -1 == first free)
6b5270d2
HV
722 * @warn_if_nr_in_use: warn if the desired device node number
723 * was already in use and another number was chosen instead.
2096a5dc 724 * @owner: module that owns the video device node
27a5e6d3 725 *
22e22125
HV
726 * The registration code assigns minor numbers and device node numbers
727 * based on the requested type and registers the new device node with
728 * the kernel.
46b63377
HV
729 *
730 * This function assumes that struct video_device was zeroed when it
731 * was allocated and does not contain any stale date.
732 *
22e22125
HV
733 * An error is returned if no free minor or device node number could be
734 * found, or if the registration of the device node failed.
27a5e6d3
HV
735 *
736 * Zero is returned on success.
737 *
738 * Valid types are
739 *
740 * %VFL_TYPE_GRABBER - A frame grabber
741 *
27a5e6d3
HV
742 * %VFL_TYPE_VBI - Vertical blank data (undecoded)
743 *
744 * %VFL_TYPE_RADIO - A radio card
2096a5dc
LP
745 *
746 * %VFL_TYPE_SUBDEV - A subdevice
d42626bd
AP
747 *
748 * %VFL_TYPE_SDR - Software Defined Radio
27a5e6d3 749 */
2096a5dc
LP
750int __video_register_device(struct video_device *vdev, int type, int nr,
751 int warn_if_nr_in_use, struct module *owner)
27a5e6d3
HV
752{
753 int i = 0;
27a5e6d3 754 int ret;
dd89601d
HV
755 int minor_offset = 0;
756 int minor_cnt = VIDEO_NUM_DEVICES;
757 const char *name_base;
27a5e6d3 758
dc93a70c
HV
759 /* A minor value of -1 marks this video device as never
760 having been registered */
428c8d19 761 vdev->minor = -1;
ee7aa9f8 762
dc93a70c 763 /* the release callback MUST be present */
1fc2b5f7 764 if (WARN_ON(!vdev->release))
f3b9f50e 765 return -EINVAL;
1c1d86a1
HV
766 /* the v4l2_dev pointer MUST be present */
767 if (WARN_ON(!vdev->v4l2_dev))
768 return -EINVAL;
f3b9f50e 769
1babcb46
SA
770 /* v4l2_fh support */
771 spin_lock_init(&vdev->fh_lock);
772 INIT_LIST_HEAD(&vdev->fh_list);
773
dc93a70c 774 /* Part 1: check device type */
27a5e6d3
HV
775 switch (type) {
776 case VFL_TYPE_GRABBER:
27a5e6d3
HV
777 name_base = "video";
778 break;
27a5e6d3 779 case VFL_TYPE_VBI:
27a5e6d3
HV
780 name_base = "vbi";
781 break;
782 case VFL_TYPE_RADIO:
27a5e6d3
HV
783 name_base = "radio";
784 break;
2096a5dc
LP
785 case VFL_TYPE_SUBDEV:
786 name_base = "v4l-subdev";
787 break;
d42626bd
AP
788 case VFL_TYPE_SDR:
789 /* Use device name 'swradio' because 'sdr' was already taken. */
790 name_base = "swradio";
791 break;
27a5e6d3
HV
792 default:
793 printk(KERN_ERR "%s called with unknown type: %d\n",
794 __func__, type);
46f2c21c 795 return -EINVAL;
27a5e6d3
HV
796 }
797
dc93a70c
HV
798 vdev->vfl_type = type;
799 vdev->cdev = NULL;
1c1d86a1
HV
800 if (vdev->dev_parent == NULL)
801 vdev->dev_parent = vdev->v4l2_dev->dev;
802 if (vdev->ctrl_handler == NULL)
803 vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;
804 /* If the prio state pointer is NULL, then use the v4l2_device
805 prio state. */
806 if (vdev->prio == NULL)
807 vdev->prio = &vdev->v4l2_dev->prio;
dd89601d 808
22e22125 809 /* Part 2: find a free minor, device node number and device index. */
dd89601d
HV
810#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
811 /* Keep the ranges for the first four types for historical
812 * reasons.
813 * Newer devices (not yet in place) should use the range
814 * of 128-191 and just pick the first free minor there
815 * (new style). */
816 switch (type) {
817 case VFL_TYPE_GRABBER:
818 minor_offset = 0;
819 minor_cnt = 64;
820 break;
821 case VFL_TYPE_RADIO:
822 minor_offset = 64;
823 minor_cnt = 64;
824 break;
dd89601d
HV
825 case VFL_TYPE_VBI:
826 minor_offset = 224;
827 minor_cnt = 32;
828 break;
829 default:
830 minor_offset = 128;
831 minor_cnt = 64;
832 break;
833 }
834#endif
835
22e22125 836 /* Pick a device node number */
27a5e6d3 837 mutex_lock(&videodev_lock);
5062cb70 838 nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt);
dd89601d 839 if (nr == minor_cnt)
5062cb70 840 nr = devnode_find(vdev, 0, minor_cnt);
dd89601d 841 if (nr == minor_cnt) {
22e22125 842 printk(KERN_ERR "could not get a free device node number\n");
dd89601d
HV
843 mutex_unlock(&videodev_lock);
844 return -ENFILE;
27a5e6d3 845 }
dd89601d 846#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
22e22125 847 /* 1-on-1 mapping of device node number to minor number */
dd89601d
HV
848 i = nr;
849#else
22e22125
HV
850 /* The device node number and minor numbers are independent, so
851 we just find the first free minor number. */
dd89601d
HV
852 for (i = 0; i < VIDEO_NUM_DEVICES; i++)
853 if (video_device[i] == NULL)
854 break;
855 if (i == VIDEO_NUM_DEVICES) {
856 mutex_unlock(&videodev_lock);
857 printk(KERN_ERR "could not get a free minor\n");
858 return -ENFILE;
859 }
860#endif
dc93a70c
HV
861 vdev->minor = i + minor_offset;
862 vdev->num = nr;
5062cb70
HV
863 devnode_set(vdev);
864
dc93a70c
HV
865 /* Should not happen since we thought this minor was free */
866 WARN_ON(video_device[vdev->minor] != NULL);
7ae0cd9b 867 vdev->index = get_index(vdev);
6c3df5da 868 video_device[vdev->minor] = vdev;
27a5e6d3
HV
869 mutex_unlock(&videodev_lock);
870
48ea0be0
HV
871 if (vdev->ioctl_ops)
872 determine_valid_ioctls(vdev);
873
dc93a70c
HV
874 /* Part 3: Initialize the character device */
875 vdev->cdev = cdev_alloc();
876 if (vdev->cdev == NULL) {
877 ret = -ENOMEM;
878 goto cleanup;
879 }
86a5ef7d 880 vdev->cdev->ops = &v4l2_fops;
2096a5dc 881 vdev->cdev->owner = owner;
dc93a70c 882 ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
7f8ecfab
HV
883 if (ret < 0) {
884 printk(KERN_ERR "%s: cdev_add failed\n", __func__);
dc93a70c
HV
885 kfree(vdev->cdev);
886 vdev->cdev = NULL;
887 goto cleanup;
7f8ecfab 888 }
dc93a70c
HV
889
890 /* Part 4: register the device with sysfs */
dc93a70c
HV
891 vdev->dev.class = &video_class;
892 vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
1c1d86a1 893 vdev->dev.parent = vdev->dev_parent;
22e22125 894 dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
dc93a70c 895 ret = device_register(&vdev->dev);
27a5e6d3
HV
896 if (ret < 0) {
897 printk(KERN_ERR "%s: device_register failed\n", __func__);
dc93a70c 898 goto cleanup;
27a5e6d3 899 }
dc93a70c
HV
900 /* Register the release callback that will be called when the last
901 reference to the device goes away. */
902 vdev->dev.release = v4l2_device_release;
27a5e6d3 903
6b5270d2 904 if (nr != -1 && nr != vdev->num && warn_if_nr_in_use)
eac8ea53
LP
905 printk(KERN_WARNING "%s: requested %s%d, got %s\n", __func__,
906 name_base, nr, video_device_node_name(vdev));
bedf8bcf
HV
907
908 /* Increase v4l2_device refcount */
d9bfbcc0 909 v4l2_device_get(vdev->v4l2_dev);
bedf8bcf 910
2c0ab67b
LP
911#if defined(CONFIG_MEDIA_CONTROLLER)
912 /* Part 5: Register the entity. */
d9bfbcc0 913 if (vdev->v4l2_dev->mdev &&
c4f0b78a 914 vdev->vfl_type != VFL_TYPE_SUBDEV) {
2c0ab67b
LP
915 vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L;
916 vdev->entity.name = vdev->name;
e31a0ba7
MCC
917 vdev->entity.info.dev.major = VIDEO_MAJOR;
918 vdev->entity.info.dev.minor = vdev->minor;
2c0ab67b
LP
919 ret = media_device_register_entity(vdev->v4l2_dev->mdev,
920 &vdev->entity);
921 if (ret < 0)
922 printk(KERN_WARNING
923 "%s: media_device_register_entity failed\n",
924 __func__);
925 }
926#endif
927 /* Part 6: Activate this minor. The char device can now be used. */
957b4aa9 928 set_bit(V4L2_FL_REGISTERED, &vdev->flags);
2c0ab67b 929
dc93a70c 930 return 0;
7f8ecfab 931
dc93a70c 932cleanup:
27a5e6d3 933 mutex_lock(&videodev_lock);
dc93a70c
HV
934 if (vdev->cdev)
935 cdev_del(vdev->cdev);
1056e438 936 video_device[vdev->minor] = NULL;
5062cb70 937 devnode_clear(vdev);
27a5e6d3 938 mutex_unlock(&videodev_lock);
dc93a70c
HV
939 /* Mark this video device as never having been registered. */
940 vdev->minor = -1;
27a5e6d3
HV
941 return ret;
942}
2096a5dc 943EXPORT_SYMBOL(__video_register_device);
6b5270d2 944
27a5e6d3
HV
945/**
946 * video_unregister_device - unregister a video4linux device
dc93a70c 947 * @vdev: the device to unregister
27a5e6d3 948 *
dc93a70c
HV
949 * This unregisters the passed device. Future open calls will
950 * be met with errors.
27a5e6d3 951 */
dc93a70c 952void video_unregister_device(struct video_device *vdev)
27a5e6d3 953{
dc93a70c 954 /* Check if vdev was ever registered at all */
957b4aa9 955 if (!vdev || !video_is_registered(vdev))
dc93a70c
HV
956 return;
957
ca9afe6f
HV
958 mutex_lock(&videodev_lock);
959 /* This must be in a critical section to prevent a race with v4l2_open.
960 * Once this bit has been cleared video_get may never be called again.
961 */
957b4aa9 962 clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
ca9afe6f 963 mutex_unlock(&videodev_lock);
dc93a70c 964 device_unregister(&vdev->dev);
27a5e6d3
HV
965}
966EXPORT_SYMBOL(video_unregister_device);
967
27a5e6d3
HV
968/*
969 * Initialise video for linux
970 */
27a5e6d3
HV
971static int __init videodev_init(void)
972{
7f8ecfab 973 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
27a5e6d3
HV
974 int ret;
975
976 printk(KERN_INFO "Linux video capture interface: v2.00\n");
7f8ecfab
HV
977 ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
978 if (ret < 0) {
979 printk(KERN_WARNING "videodev: unable to get major %d\n",
980 VIDEO_MAJOR);
981 return ret;
27a5e6d3
HV
982 }
983
984 ret = class_register(&video_class);
985 if (ret < 0) {
7f8ecfab 986 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
987 printk(KERN_WARNING "video_dev: class_register failed\n");
988 return -EIO;
989 }
990
991 return 0;
992}
993
994static void __exit videodev_exit(void)
995{
7f8ecfab
HV
996 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
997
27a5e6d3 998 class_unregister(&video_class);
7f8ecfab 999 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
1000}
1001
ee981c6f 1002subsys_initcall(videodev_init);
27a5e6d3
HV
1003module_exit(videodev_exit)
1004
1005MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
1006MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
1007MODULE_LICENSE("GPL");
cbb72b0f 1008MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR);
This page took 0.589867 seconds and 5 git commands to generate.