media: v4l2-compat-ioctl32: don't oops on overlay
[linux-2.6-block.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>
7c0f6ba6 28#include <linux/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. */
4839c58f 105static inline unsigned long *devnode_bits(enum vfl_devnode_type vfl_type)
5062cb70
HV
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. */
4839c58f 116static inline unsigned long *devnode_bits(enum vfl_devnode_type vfl_type)
5062cb70
HV
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)
d9c21e3e
MCC
197 if (v4l2_dev->mdev) {
198 /* Remove interfaces and interface links */
199 media_devnode_remove(vdev->intf_devnode);
4ca72efa 200 if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN)
d9c21e3e
MCC
201 media_device_unregister_entity(&vdev->entity);
202 }
c064b8ea
LP
203#endif
204
8280b662
HV
205 /* Do not call v4l2_device_put if there is no release callback set.
206 * Drivers that have no v4l2_device release callback might free the
207 * v4l2_dev instance in the video_device release callback below, so we
208 * must perform this check here.
209 *
210 * TODO: In the long run all drivers that use v4l2_device should use the
211 * v4l2_device release callback. This check will then be unnecessary.
212 */
d9bfbcc0 213 if (v4l2_dev->release == NULL)
8280b662
HV
214 v4l2_dev = NULL;
215
dc93a70c
HV
216 /* Release video_device and perform other
217 cleanups as needed. */
218 vdev->release(vdev);
bedf8bcf
HV
219
220 /* Decrease v4l2_device refcount */
221 if (v4l2_dev)
222 v4l2_device_put(v4l2_dev);
27a5e6d3
HV
223}
224
225static struct class video_class = {
226 .name = VIDEO_NAME,
13e2237f 227 .dev_groups = video_device_groups,
27a5e6d3
HV
228};
229
27a5e6d3
HV
230struct video_device *video_devdata(struct file *file)
231{
496ad9aa 232 return video_device[iminor(file_inode(file))];
27a5e6d3
HV
233}
234EXPORT_SYMBOL(video_devdata);
235
02265493
HV
236
237/* Priority handling */
238
239static inline bool prio_is_valid(enum v4l2_priority prio)
240{
241 return prio == V4L2_PRIORITY_BACKGROUND ||
242 prio == V4L2_PRIORITY_INTERACTIVE ||
243 prio == V4L2_PRIORITY_RECORD;
244}
245
246void v4l2_prio_init(struct v4l2_prio_state *global)
247{
248 memset(global, 0, sizeof(*global));
249}
250EXPORT_SYMBOL(v4l2_prio_init);
251
252int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
253 enum v4l2_priority new)
254{
255 if (!prio_is_valid(new))
256 return -EINVAL;
257 if (*local == new)
258 return 0;
259
260 atomic_inc(&global->prios[new]);
261 if (prio_is_valid(*local))
262 atomic_dec(&global->prios[*local]);
263 *local = new;
264 return 0;
265}
266EXPORT_SYMBOL(v4l2_prio_change);
267
268void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
269{
270 v4l2_prio_change(global, local, V4L2_PRIORITY_DEFAULT);
271}
272EXPORT_SYMBOL(v4l2_prio_open);
273
274void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local)
275{
276 if (prio_is_valid(local))
277 atomic_dec(&global->prios[local]);
278}
279EXPORT_SYMBOL(v4l2_prio_close);
280
281enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
282{
283 if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
284 return V4L2_PRIORITY_RECORD;
285 if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
286 return V4L2_PRIORITY_INTERACTIVE;
287 if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
288 return V4L2_PRIORITY_BACKGROUND;
289 return V4L2_PRIORITY_UNSET;
290}
291EXPORT_SYMBOL(v4l2_prio_max);
292
293int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local)
294{
295 return (local < v4l2_prio_max(global)) ? -EBUSY : 0;
296}
297EXPORT_SYMBOL(v4l2_prio_check);
298
299
dc93a70c
HV
300static ssize_t v4l2_read(struct file *filp, char __user *buf,
301 size_t sz, loff_t *off)
302{
303 struct video_device *vdev = video_devdata(filp);
2877842d 304 int ret = -ENODEV;
dc93a70c
HV
305
306 if (!vdev->fops->read)
307 return -EINVAL;
ee6869af
HV
308 if (video_is_registered(vdev))
309 ret = vdev->fops->read(filp, buf, sz, off);
17028cdb
HV
310 if ((vdev->dev_debug & V4L2_DEV_DEBUG_FOP) &&
311 (vdev->dev_debug & V4L2_DEV_DEBUG_STREAMING))
cc4b7e7f
HV
312 printk(KERN_DEBUG "%s: read: %zd (%d)\n",
313 video_device_node_name(vdev), sz, ret);
ee6869af 314 return ret;
dc93a70c
HV
315}
316
317static ssize_t v4l2_write(struct file *filp, const char __user *buf,
318 size_t sz, loff_t *off)
319{
320 struct video_device *vdev = video_devdata(filp);
2877842d 321 int ret = -ENODEV;
dc93a70c
HV
322
323 if (!vdev->fops->write)
324 return -EINVAL;
ee6869af
HV
325 if (video_is_registered(vdev))
326 ret = vdev->fops->write(filp, buf, sz, off);
17028cdb
HV
327 if ((vdev->dev_debug & V4L2_DEV_DEBUG_FOP) &&
328 (vdev->dev_debug & V4L2_DEV_DEBUG_STREAMING))
cc4b7e7f
HV
329 printk(KERN_DEBUG "%s: write: %zd (%d)\n",
330 video_device_node_name(vdev), sz, ret);
ee6869af 331 return ret;
dc93a70c
HV
332}
333
c23e0cb8 334static __poll_t v4l2_poll(struct file *filp, struct poll_table_struct *poll)
dc93a70c
HV
335{
336 struct video_device *vdev = video_devdata(filp);
a9a08845 337 __poll_t res = EPOLLERR | EPOLLHUP;
ee6869af
HV
338
339 if (!vdev->fops->poll)
2877842d 340 return DEFAULT_POLLMASK;
ee6869af 341 if (video_is_registered(vdev))
cf533735 342 res = vdev->fops->poll(filp, poll);
17028cdb 343 if (vdev->dev_debug & V4L2_DEV_DEBUG_POLL)
cc4b7e7f 344 printk(KERN_DEBUG "%s: poll: %08x\n",
cf533735
HV
345 video_device_node_name(vdev), res);
346 return res;
dc93a70c
HV
347}
348
86a5ef7d 349static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
dc93a70c
HV
350{
351 struct video_device *vdev = video_devdata(filp);
72420630 352 int ret = -ENODEV;
dc93a70c 353
86a5ef7d 354 if (vdev->fops->unlocked_ioctl) {
5a5adf6b 355 struct mutex *lock = v4l2_ioctl_get_lock(vdev, cmd);
8ab75e3e 356
5a5adf6b
HV
357 if (lock && mutex_lock_interruptible(lock))
358 return -ERESTARTSYS;
72420630
MCC
359 if (video_is_registered(vdev))
360 ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
5a5adf6b
HV
361 if (lock)
362 mutex_unlock(lock);
86a5ef7d
AB
363 } else
364 ret = -ENOTTY;
dc93a70c 365
86a5ef7d 366 return ret;
dc93a70c
HV
367}
368
ecc6517d
BL
369#ifdef CONFIG_MMU
370#define v4l2_get_unmapped_area NULL
371#else
372static unsigned long v4l2_get_unmapped_area(struct file *filp,
373 unsigned long addr, unsigned long len, unsigned long pgoff,
374 unsigned long flags)
375{
376 struct video_device *vdev = video_devdata(filp);
cc4b7e7f 377 int ret;
ecc6517d
BL
378
379 if (!vdev->fops->get_unmapped_area)
380 return -ENOSYS;
381 if (!video_is_registered(vdev))
382 return -ENODEV;
cc4b7e7f 383 ret = vdev->fops->get_unmapped_area(filp, addr, len, pgoff, flags);
17028cdb 384 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
385 printk(KERN_DEBUG "%s: get_unmapped_area (%d)\n",
386 video_device_node_name(vdev), ret);
387 return ret;
ecc6517d
BL
388}
389#endif
390
dc93a70c
HV
391static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
392{
393 struct video_device *vdev = video_devdata(filp);
ee6869af
HV
394 int ret = -ENODEV;
395
396 if (!vdev->fops->mmap)
cf533735 397 return -ENODEV;
ee6869af
HV
398 if (video_is_registered(vdev))
399 ret = vdev->fops->mmap(filp, vm);
17028cdb 400 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
401 printk(KERN_DEBUG "%s: mmap (%d)\n",
402 video_device_node_name(vdev), ret);
ee6869af 403 return ret;
dc93a70c
HV
404}
405
406/* Override for the open function */
407static int v4l2_open(struct inode *inode, struct file *filp)
408{
409 struct video_device *vdev;
65d9ff9c 410 int ret = 0;
dc93a70c
HV
411
412 /* Check if the video device is available */
413 mutex_lock(&videodev_lock);
414 vdev = video_devdata(filp);
ee6869af 415 /* return ENODEV if the video device has already been removed. */
ca9afe6f 416 if (vdev == NULL || !video_is_registered(vdev)) {
dc93a70c
HV
417 mutex_unlock(&videodev_lock);
418 return -ENODEV;
419 }
420 /* and increase the device refcount */
421 video_get(vdev);
422 mutex_unlock(&videodev_lock);
ee6869af 423 if (vdev->fops->open) {
ee6869af
HV
424 if (video_is_registered(vdev))
425 ret = vdev->fops->open(filp);
426 else
427 ret = -ENODEV;
ee6869af 428 }
65d9ff9c 429
17028cdb 430 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
431 printk(KERN_DEBUG "%s: open (%d)\n",
432 video_device_node_name(vdev), ret);
8f695d3f
EG
433 /* decrease the refcount in case of an error */
434 if (ret)
435 video_put(vdev);
dc93a70c
HV
436 return ret;
437}
438
439/* Override for the release function */
440static int v4l2_release(struct inode *inode, struct file *filp)
441{
442 struct video_device *vdev = video_devdata(filp);
65d9ff9c
HV
443 int ret = 0;
444
cf533735
HV
445 if (vdev->fops->release)
446 ret = vdev->fops->release(filp);
17028cdb 447 if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
cc4b7e7f
HV
448 printk(KERN_DEBUG "%s: release\n",
449 video_device_node_name(vdev));
cf533735 450
8f695d3f
EG
451 /* decrease the refcount unconditionally since the release()
452 return value is ignored. */
453 video_put(vdev);
dc93a70c
HV
454 return ret;
455}
456
dc93a70c
HV
457static const struct file_operations v4l2_fops = {
458 .owner = THIS_MODULE,
459 .read = v4l2_read,
460 .write = v4l2_write,
461 .open = v4l2_open,
ecc6517d 462 .get_unmapped_area = v4l2_get_unmapped_area,
dc93a70c 463 .mmap = v4l2_mmap,
86a5ef7d 464 .unlocked_ioctl = v4l2_ioctl,
dc93a70c 465#ifdef CONFIG_COMPAT
9bb7cde7 466 .compat_ioctl = v4l2_compat_ioctl32,
dc93a70c
HV
467#endif
468 .release = v4l2_release,
469 .poll = v4l2_poll,
470 .llseek = no_llseek,
471};
472
27a5e6d3 473/**
1c1d86a1
HV
474 * get_index - assign stream index number based on v4l2_dev
475 * @vdev: video_device to assign index number to, vdev->v4l2_dev should be assigned
27a5e6d3 476 *
dc93a70c 477 * Note that when this is called the new device has not yet been registered
7ae0cd9b 478 * in the video_device array, but it was able to obtain a minor number.
27a5e6d3 479 *
7ae0cd9b
HV
480 * This means that we can always obtain a free stream index number since
481 * the worst case scenario is that there are VIDEO_NUM_DEVICES - 1 slots in
482 * use of the video_device array.
483 *
484 * Returns a free index number.
27a5e6d3 485 */
7ae0cd9b 486static int get_index(struct video_device *vdev)
27a5e6d3 487{
775a05dd
HV
488 /* This can be static since this function is called with the global
489 videodev_lock held. */
490 static DECLARE_BITMAP(used, VIDEO_NUM_DEVICES);
27a5e6d3
HV
491 int i;
492
775a05dd 493 bitmap_zero(used, VIDEO_NUM_DEVICES);
806e5b7c 494
27a5e6d3
HV
495 for (i = 0; i < VIDEO_NUM_DEVICES; i++) {
496 if (video_device[i] != NULL &&
1c1d86a1 497 video_device[i]->v4l2_dev == vdev->v4l2_dev) {
775a05dd 498 set_bit(video_device[i]->index, used);
27a5e6d3
HV
499 }
500 }
501
7ae0cd9b 502 return find_first_zero_bit(used, VIDEO_NUM_DEVICES);
27a5e6d3
HV
503}
504
48ea0be0
HV
505#define SET_VALID_IOCTL(ops, cmd, op) \
506 if (ops->op) \
507 set_bit(_IOC_NR(cmd), valid_ioctls)
508
509/* This determines which ioctls are actually implemented in the driver.
510 It's a one-time thing which simplifies video_ioctl2 as it can just do
511 a bit test.
512
513 Note that drivers can override this by setting bits to 1 in
514 vdev->valid_ioctls. If an ioctl is marked as 1 when this function is
515 called, then that ioctl will actually be marked as unimplemented.
516
517 It does that by first setting up the local valid_ioctls bitmap, and
518 at the end do a:
519
520 vdev->valid_ioctls = valid_ioctls & ~(vdev->valid_ioctls)
521 */
522static void determine_valid_ioctls(struct video_device *vdev)
523{
524 DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE);
525 const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops;
4b20259f
HV
526 bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER;
527 bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI;
bfffd743 528 bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO;
582c52cb 529 bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR;
b2fe22d0 530 bool is_tch = vdev->vfl_type == VFL_TYPE_TOUCH;
4b20259f
HV
531 bool is_rx = vdev->vfl_dir != VFL_DIR_TX;
532 bool is_tx = vdev->vfl_dir != VFL_DIR_RX;
48ea0be0
HV
533
534 bitmap_zero(valid_ioctls, BASE_VIDIOC_PRIVATE);
535
90d0fc49
HV
536 /* vfl_type and vfl_dir independent ioctls */
537
48ea0be0 538 SET_VALID_IOCTL(ops, VIDIOC_QUERYCAP, vidioc_querycap);
2438e78a
HV
539 set_bit(_IOC_NR(VIDIOC_G_PRIORITY), valid_ioctls);
540 set_bit(_IOC_NR(VIDIOC_S_PRIORITY), valid_ioctls);
541
90d0fc49
HV
542 /* Note: the control handler can also be passed through the filehandle,
543 and that can't be tested here. If the bit for these control ioctls
544 is set, then the ioctl is valid. But if it is 0, then it can still
545 be valid if the filehandle passed the control handler. */
546 if (vdev->ctrl_handler || ops->vidioc_queryctrl)
547 set_bit(_IOC_NR(VIDIOC_QUERYCTRL), valid_ioctls);
e6bee368
HV
548 if (vdev->ctrl_handler || ops->vidioc_query_ext_ctrl)
549 set_bit(_IOC_NR(VIDIOC_QUERY_EXT_CTRL), valid_ioctls);
90d0fc49
HV
550 if (vdev->ctrl_handler || ops->vidioc_g_ctrl || ops->vidioc_g_ext_ctrls)
551 set_bit(_IOC_NR(VIDIOC_G_CTRL), valid_ioctls);
552 if (vdev->ctrl_handler || ops->vidioc_s_ctrl || ops->vidioc_s_ext_ctrls)
553 set_bit(_IOC_NR(VIDIOC_S_CTRL), valid_ioctls);
554 if (vdev->ctrl_handler || ops->vidioc_g_ext_ctrls)
555 set_bit(_IOC_NR(VIDIOC_G_EXT_CTRLS), valid_ioctls);
556 if (vdev->ctrl_handler || ops->vidioc_s_ext_ctrls)
557 set_bit(_IOC_NR(VIDIOC_S_EXT_CTRLS), valid_ioctls);
558 if (vdev->ctrl_handler || ops->vidioc_try_ext_ctrls)
559 set_bit(_IOC_NR(VIDIOC_TRY_EXT_CTRLS), valid_ioctls);
560 if (vdev->ctrl_handler || ops->vidioc_querymenu)
561 set_bit(_IOC_NR(VIDIOC_QUERYMENU), valid_ioctls);
562 SET_VALID_IOCTL(ops, VIDIOC_G_FREQUENCY, vidioc_g_frequency);
563 SET_VALID_IOCTL(ops, VIDIOC_S_FREQUENCY, vidioc_s_frequency);
564 SET_VALID_IOCTL(ops, VIDIOC_LOG_STATUS, vidioc_log_status);
565#ifdef CONFIG_VIDEO_ADV_DEBUG
96b03d2a 566 set_bit(_IOC_NR(VIDIOC_DBG_G_CHIP_INFO), valid_ioctls);
79b0c640
HV
567 set_bit(_IOC_NR(VIDIOC_DBG_G_REGISTER), valid_ioctls);
568 set_bit(_IOC_NR(VIDIOC_DBG_S_REGISTER), valid_ioctls);
90d0fc49 569#endif
90d0fc49
HV
570 /* yes, really vidioc_subscribe_event */
571 SET_VALID_IOCTL(ops, VIDIOC_DQEVENT, vidioc_subscribe_event);
572 SET_VALID_IOCTL(ops, VIDIOC_SUBSCRIBE_EVENT, vidioc_subscribe_event);
573 SET_VALID_IOCTL(ops, VIDIOC_UNSUBSCRIBE_EVENT, vidioc_unsubscribe_event);
90d0fc49
HV
574 if (ops->vidioc_enum_freq_bands || ops->vidioc_g_tuner || ops->vidioc_g_modulator)
575 set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls);
576
b2fe22d0 577 if (is_vid || is_tch) {
fb9ffa6a 578 /* video and metadata specific ioctls */
4b20259f
HV
579 if ((is_rx && (ops->vidioc_enum_fmt_vid_cap ||
580 ops->vidioc_enum_fmt_vid_cap_mplane ||
fb9ffa6a
LP
581 ops->vidioc_enum_fmt_vid_overlay ||
582 ops->vidioc_enum_fmt_meta_cap)) ||
4b20259f
HV
583 (is_tx && (ops->vidioc_enum_fmt_vid_out ||
584 ops->vidioc_enum_fmt_vid_out_mplane)))
585 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
586 if ((is_rx && (ops->vidioc_g_fmt_vid_cap ||
587 ops->vidioc_g_fmt_vid_cap_mplane ||
fb9ffa6a
LP
588 ops->vidioc_g_fmt_vid_overlay ||
589 ops->vidioc_g_fmt_meta_cap)) ||
4b20259f
HV
590 (is_tx && (ops->vidioc_g_fmt_vid_out ||
591 ops->vidioc_g_fmt_vid_out_mplane ||
592 ops->vidioc_g_fmt_vid_out_overlay)))
593 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
594 if ((is_rx && (ops->vidioc_s_fmt_vid_cap ||
595 ops->vidioc_s_fmt_vid_cap_mplane ||
fb9ffa6a
LP
596 ops->vidioc_s_fmt_vid_overlay ||
597 ops->vidioc_s_fmt_meta_cap)) ||
4b20259f
HV
598 (is_tx && (ops->vidioc_s_fmt_vid_out ||
599 ops->vidioc_s_fmt_vid_out_mplane ||
600 ops->vidioc_s_fmt_vid_out_overlay)))
601 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
602 if ((is_rx && (ops->vidioc_try_fmt_vid_cap ||
603 ops->vidioc_try_fmt_vid_cap_mplane ||
fb9ffa6a
LP
604 ops->vidioc_try_fmt_vid_overlay ||
605 ops->vidioc_try_fmt_meta_cap)) ||
4b20259f
HV
606 (is_tx && (ops->vidioc_try_fmt_vid_out ||
607 ops->vidioc_try_fmt_vid_out_mplane ||
608 ops->vidioc_try_fmt_vid_out_overlay)))
609 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
90d0fc49
HV
610 SET_VALID_IOCTL(ops, VIDIOC_OVERLAY, vidioc_overlay);
611 SET_VALID_IOCTL(ops, VIDIOC_G_FBUF, vidioc_g_fbuf);
612 SET_VALID_IOCTL(ops, VIDIOC_S_FBUF, vidioc_s_fbuf);
613 SET_VALID_IOCTL(ops, VIDIOC_G_JPEGCOMP, vidioc_g_jpegcomp);
614 SET_VALID_IOCTL(ops, VIDIOC_S_JPEGCOMP, vidioc_s_jpegcomp);
615 SET_VALID_IOCTL(ops, VIDIOC_G_ENC_INDEX, vidioc_g_enc_index);
616 SET_VALID_IOCTL(ops, VIDIOC_ENCODER_CMD, vidioc_encoder_cmd);
617 SET_VALID_IOCTL(ops, VIDIOC_TRY_ENCODER_CMD, vidioc_try_encoder_cmd);
618 SET_VALID_IOCTL(ops, VIDIOC_DECODER_CMD, vidioc_decoder_cmd);
619 SET_VALID_IOCTL(ops, VIDIOC_TRY_DECODER_CMD, vidioc_try_decoder_cmd);
620 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMESIZES, vidioc_enum_framesizes);
621 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMEINTERVALS, vidioc_enum_frameintervals);
2c9fc463
HV
622 if (ops->vidioc_g_crop || ops->vidioc_g_selection)
623 set_bit(_IOC_NR(VIDIOC_G_CROP), valid_ioctls);
624 if (ops->vidioc_s_crop || ops->vidioc_s_selection)
625 set_bit(_IOC_NR(VIDIOC_S_CROP), valid_ioctls);
626 SET_VALID_IOCTL(ops, VIDIOC_G_SELECTION, vidioc_g_selection);
627 SET_VALID_IOCTL(ops, VIDIOC_S_SELECTION, vidioc_s_selection);
628 if (ops->vidioc_cropcap || ops->vidioc_g_selection)
629 set_bit(_IOC_NR(VIDIOC_CROPCAP), valid_ioctls);
4b20259f 630 } else if (is_vbi) {
90d0fc49 631 /* vbi specific ioctls */
4b20259f
HV
632 if ((is_rx && (ops->vidioc_g_fmt_vbi_cap ||
633 ops->vidioc_g_fmt_sliced_vbi_cap)) ||
634 (is_tx && (ops->vidioc_g_fmt_vbi_out ||
635 ops->vidioc_g_fmt_sliced_vbi_out)))
636 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
637 if ((is_rx && (ops->vidioc_s_fmt_vbi_cap ||
638 ops->vidioc_s_fmt_sliced_vbi_cap)) ||
639 (is_tx && (ops->vidioc_s_fmt_vbi_out ||
640 ops->vidioc_s_fmt_sliced_vbi_out)))
641 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
642 if ((is_rx && (ops->vidioc_try_fmt_vbi_cap ||
643 ops->vidioc_try_fmt_sliced_vbi_cap)) ||
644 (is_tx && (ops->vidioc_try_fmt_vbi_out ||
645 ops->vidioc_try_fmt_sliced_vbi_out)))
646 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
90d0fc49 647 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap);
9effc72f
AP
648 } else if (is_sdr && is_rx) {
649 /* SDR receiver specific ioctls */
582c52cb
AP
650 if (ops->vidioc_enum_fmt_sdr_cap)
651 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
652 if (ops->vidioc_g_fmt_sdr_cap)
653 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
654 if (ops->vidioc_s_fmt_sdr_cap)
655 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
656 if (ops->vidioc_try_fmt_sdr_cap)
657 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
9effc72f
AP
658 } else if (is_sdr && is_tx) {
659 /* SDR transmitter specific ioctls */
660 if (ops->vidioc_enum_fmt_sdr_out)
661 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
662 if (ops->vidioc_g_fmt_sdr_out)
663 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
664 if (ops->vidioc_s_fmt_sdr_out)
665 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
666 if (ops->vidioc_try_fmt_sdr_out)
667 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
4b20259f 668 }
582c52cb 669
b2fe22d0 670 if (is_vid || is_vbi || is_sdr || is_tch) {
fb9ffa6a 671 /* ioctls valid for video, metadata, vbi or sdr */
5815d0c4
FS
672 SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs);
673 SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf);
674 SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf);
675 SET_VALID_IOCTL(ops, VIDIOC_EXPBUF, vidioc_expbuf);
676 SET_VALID_IOCTL(ops, VIDIOC_DQBUF, vidioc_dqbuf);
677 SET_VALID_IOCTL(ops, VIDIOC_CREATE_BUFS, vidioc_create_bufs);
678 SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf);
72be89c8
HV
679 SET_VALID_IOCTL(ops, VIDIOC_STREAMON, vidioc_streamon);
680 SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
582c52cb
AP
681 }
682
b2fe22d0 683 if (is_vid || is_vbi || is_tch) {
582c52cb 684 /* ioctls valid for video or vbi */
4b20259f
HV
685 if (ops->vidioc_s_std)
686 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
4b20259f 687 SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std);
ca371575 688 SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std);
4b20259f 689 if (is_rx) {
90d0fc49 690 SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd);
4b20259f
HV
691 SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input);
692 SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input);
693 SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input);
694 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio);
695 SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio);
696 SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio);
90d0fc49 697 SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings);
dd519bb3 698 SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid);
4b20259f
HV
699 }
700 if (is_tx) {
701 SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output);
702 SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output);
703 SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output);
704 SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout);
705 SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout);
706 SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout);
707 }
4b20259f 708 if (ops->vidioc_g_parm || (vdev->vfl_type == VFL_TYPE_GRABBER &&
ca371575 709 ops->vidioc_g_std))
4b20259f
HV
710 set_bit(_IOC_NR(VIDIOC_G_PARM), valid_ioctls);
711 SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
4b20259f
HV
712 SET_VALID_IOCTL(ops, VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings);
713 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings);
714 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings);
4b20259f 715 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap);
dd519bb3 716 SET_VALID_IOCTL(ops, VIDIOC_G_EDID, vidioc_g_edid);
4b20259f 717 }
bfffd743
HV
718 if (is_tx && (is_radio || is_sdr)) {
719 /* radio transmitter only ioctls */
90d0fc49
HV
720 SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator);
721 SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator);
722 }
723 if (is_rx) {
724 /* receiver only ioctls */
725 SET_VALID_IOCTL(ops, VIDIOC_G_TUNER, vidioc_g_tuner);
726 SET_VALID_IOCTL(ops, VIDIOC_S_TUNER, vidioc_s_tuner);
727 SET_VALID_IOCTL(ops, VIDIOC_S_HW_FREQ_SEEK, vidioc_s_hw_freq_seek);
728 }
729
48ea0be0
HV
730 bitmap_andnot(vdev->valid_ioctls, valid_ioctls, vdev->valid_ioctls,
731 BASE_VIDIOC_PRIVATE);
732}
733
d9c21e3e
MCC
734static int video_register_media_controller(struct video_device *vdev, int type)
735{
736#if defined(CONFIG_MEDIA_CONTROLLER)
737 u32 intf_type;
738 int ret;
739
740 if (!vdev->v4l2_dev->mdev)
741 return 0;
742
b76a2a8c 743 vdev->entity.obj_type = MEDIA_ENTITY_TYPE_VIDEO_DEVICE;
4ca72efa 744 vdev->entity.function = MEDIA_ENT_F_UNKNOWN;
d9c21e3e
MCC
745
746 switch (type) {
747 case VFL_TYPE_GRABBER:
748 intf_type = MEDIA_INTF_T_V4L_VIDEO;
4ca72efa 749 vdev->entity.function = MEDIA_ENT_F_IO_V4L;
d9c21e3e
MCC
750 break;
751 case VFL_TYPE_VBI:
752 intf_type = MEDIA_INTF_T_V4L_VBI;
4ca72efa 753 vdev->entity.function = MEDIA_ENT_F_IO_VBI;
d9c21e3e
MCC
754 break;
755 case VFL_TYPE_SDR:
756 intf_type = MEDIA_INTF_T_V4L_SWRADIO;
4ca72efa 757 vdev->entity.function = MEDIA_ENT_F_IO_SWRADIO;
d9c21e3e 758 break;
b2fe22d0
ND
759 case VFL_TYPE_TOUCH:
760 intf_type = MEDIA_INTF_T_V4L_TOUCH;
761 vdev->entity.function = MEDIA_ENT_F_IO_V4L;
762 break;
d9c21e3e
MCC
763 case VFL_TYPE_RADIO:
764 intf_type = MEDIA_INTF_T_V4L_RADIO;
765 /*
766 * Radio doesn't have an entity at the V4L2 side to represent
767 * radio input or output. Instead, the audio input/output goes
768 * via either physical wires or ALSA.
769 */
770 break;
771 case VFL_TYPE_SUBDEV:
772 intf_type = MEDIA_INTF_T_V4L_SUBDEV;
773 /* Entity will be created via v4l2_device_register_subdev() */
774 break;
775 default:
776 return 0;
777 }
778
4ca72efa 779 if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN) {
d9c21e3e
MCC
780 vdev->entity.name = vdev->name;
781
782 /* Needed just for backward compatibility with legacy MC API */
783 vdev->entity.info.dev.major = VIDEO_MAJOR;
784 vdev->entity.info.dev.minor = vdev->minor;
785
786 ret = media_device_register_entity(vdev->v4l2_dev->mdev,
787 &vdev->entity);
788 if (ret < 0) {
789 printk(KERN_WARNING
790 "%s: media_device_register_entity failed\n",
791 __func__);
792 return ret;
793 }
794 }
795
796 vdev->intf_devnode = media_devnode_create(vdev->v4l2_dev->mdev,
797 intf_type,
798 0, VIDEO_MAJOR,
0b3b72df 799 vdev->minor);
d9c21e3e
MCC
800 if (!vdev->intf_devnode) {
801 media_device_unregister_entity(&vdev->entity);
802 return -ENOMEM;
803 }
804
4ca72efa 805 if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN) {
d9c21e3e
MCC
806 struct media_link *link;
807
808 link = media_create_intf_link(&vdev->entity,
13f6e888
MCC
809 &vdev->intf_devnode->intf,
810 MEDIA_LNK_FL_ENABLED);
d9c21e3e
MCC
811 if (!link) {
812 media_devnode_remove(vdev->intf_devnode);
813 media_device_unregister_entity(&vdev->entity);
814 return -ENOMEM;
815 }
816 }
817
818 /* FIXME: how to create the other interface links? */
819
820#endif
821 return 0;
822}
823
4839c58f
MCC
824int __video_register_device(struct video_device *vdev,
825 enum vfl_devnode_type type,
826 int nr, int warn_if_nr_in_use,
827 struct module *owner)
27a5e6d3
HV
828{
829 int i = 0;
27a5e6d3 830 int ret;
dd89601d
HV
831 int minor_offset = 0;
832 int minor_cnt = VIDEO_NUM_DEVICES;
833 const char *name_base;
27a5e6d3 834
dc93a70c
HV
835 /* A minor value of -1 marks this video device as never
836 having been registered */
428c8d19 837 vdev->minor = -1;
ee7aa9f8 838
dc93a70c 839 /* the release callback MUST be present */
1fc2b5f7 840 if (WARN_ON(!vdev->release))
f3b9f50e 841 return -EINVAL;
1c1d86a1
HV
842 /* the v4l2_dev pointer MUST be present */
843 if (WARN_ON(!vdev->v4l2_dev))
844 return -EINVAL;
f3b9f50e 845
1babcb46
SA
846 /* v4l2_fh support */
847 spin_lock_init(&vdev->fh_lock);
848 INIT_LIST_HEAD(&vdev->fh_list);
849
dc93a70c 850 /* Part 1: check device type */
27a5e6d3
HV
851 switch (type) {
852 case VFL_TYPE_GRABBER:
27a5e6d3
HV
853 name_base = "video";
854 break;
27a5e6d3 855 case VFL_TYPE_VBI:
27a5e6d3
HV
856 name_base = "vbi";
857 break;
858 case VFL_TYPE_RADIO:
27a5e6d3
HV
859 name_base = "radio";
860 break;
2096a5dc
LP
861 case VFL_TYPE_SUBDEV:
862 name_base = "v4l-subdev";
863 break;
d42626bd
AP
864 case VFL_TYPE_SDR:
865 /* Use device name 'swradio' because 'sdr' was already taken. */
866 name_base = "swradio";
867 break;
b2fe22d0
ND
868 case VFL_TYPE_TOUCH:
869 name_base = "v4l-touch";
870 break;
27a5e6d3
HV
871 default:
872 printk(KERN_ERR "%s called with unknown type: %d\n",
873 __func__, type);
46f2c21c 874 return -EINVAL;
27a5e6d3
HV
875 }
876
dc93a70c
HV
877 vdev->vfl_type = type;
878 vdev->cdev = NULL;
1c1d86a1
HV
879 if (vdev->dev_parent == NULL)
880 vdev->dev_parent = vdev->v4l2_dev->dev;
881 if (vdev->ctrl_handler == NULL)
882 vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;
883 /* If the prio state pointer is NULL, then use the v4l2_device
884 prio state. */
885 if (vdev->prio == NULL)
886 vdev->prio = &vdev->v4l2_dev->prio;
dd89601d 887
22e22125 888 /* Part 2: find a free minor, device node number and device index. */
dd89601d
HV
889#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
890 /* Keep the ranges for the first four types for historical
891 * reasons.
892 * Newer devices (not yet in place) should use the range
893 * of 128-191 and just pick the first free minor there
894 * (new style). */
895 switch (type) {
896 case VFL_TYPE_GRABBER:
897 minor_offset = 0;
898 minor_cnt = 64;
899 break;
900 case VFL_TYPE_RADIO:
901 minor_offset = 64;
902 minor_cnt = 64;
903 break;
dd89601d
HV
904 case VFL_TYPE_VBI:
905 minor_offset = 224;
906 minor_cnt = 32;
907 break;
908 default:
909 minor_offset = 128;
910 minor_cnt = 64;
911 break;
912 }
913#endif
914
22e22125 915 /* Pick a device node number */
27a5e6d3 916 mutex_lock(&videodev_lock);
5062cb70 917 nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt);
dd89601d 918 if (nr == minor_cnt)
5062cb70 919 nr = devnode_find(vdev, 0, minor_cnt);
dd89601d 920 if (nr == minor_cnt) {
22e22125 921 printk(KERN_ERR "could not get a free device node number\n");
dd89601d
HV
922 mutex_unlock(&videodev_lock);
923 return -ENFILE;
27a5e6d3 924 }
dd89601d 925#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
22e22125 926 /* 1-on-1 mapping of device node number to minor number */
dd89601d
HV
927 i = nr;
928#else
22e22125
HV
929 /* The device node number and minor numbers are independent, so
930 we just find the first free minor number. */
dd89601d
HV
931 for (i = 0; i < VIDEO_NUM_DEVICES; i++)
932 if (video_device[i] == NULL)
933 break;
934 if (i == VIDEO_NUM_DEVICES) {
935 mutex_unlock(&videodev_lock);
936 printk(KERN_ERR "could not get a free minor\n");
937 return -ENFILE;
938 }
939#endif
dc93a70c
HV
940 vdev->minor = i + minor_offset;
941 vdev->num = nr;
5062cb70
HV
942 devnode_set(vdev);
943
dc93a70c
HV
944 /* Should not happen since we thought this minor was free */
945 WARN_ON(video_device[vdev->minor] != NULL);
7ae0cd9b 946 vdev->index = get_index(vdev);
6c3df5da 947 video_device[vdev->minor] = vdev;
27a5e6d3
HV
948 mutex_unlock(&videodev_lock);
949
48ea0be0
HV
950 if (vdev->ioctl_ops)
951 determine_valid_ioctls(vdev);
952
dc93a70c
HV
953 /* Part 3: Initialize the character device */
954 vdev->cdev = cdev_alloc();
955 if (vdev->cdev == NULL) {
956 ret = -ENOMEM;
957 goto cleanup;
958 }
86a5ef7d 959 vdev->cdev->ops = &v4l2_fops;
2096a5dc 960 vdev->cdev->owner = owner;
dc93a70c 961 ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
7f8ecfab
HV
962 if (ret < 0) {
963 printk(KERN_ERR "%s: cdev_add failed\n", __func__);
dc93a70c
HV
964 kfree(vdev->cdev);
965 vdev->cdev = NULL;
966 goto cleanup;
7f8ecfab 967 }
dc93a70c
HV
968
969 /* Part 4: register the device with sysfs */
dc93a70c
HV
970 vdev->dev.class = &video_class;
971 vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
1c1d86a1 972 vdev->dev.parent = vdev->dev_parent;
22e22125 973 dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
dc93a70c 974 ret = device_register(&vdev->dev);
27a5e6d3
HV
975 if (ret < 0) {
976 printk(KERN_ERR "%s: device_register failed\n", __func__);
dc93a70c 977 goto cleanup;
27a5e6d3 978 }
dc93a70c
HV
979 /* Register the release callback that will be called when the last
980 reference to the device goes away. */
981 vdev->dev.release = v4l2_device_release;
27a5e6d3 982
6b5270d2 983 if (nr != -1 && nr != vdev->num && warn_if_nr_in_use)
eac8ea53
LP
984 printk(KERN_WARNING "%s: requested %s%d, got %s\n", __func__,
985 name_base, nr, video_device_node_name(vdev));
bedf8bcf
HV
986
987 /* Increase v4l2_device refcount */
d9bfbcc0 988 v4l2_device_get(vdev->v4l2_dev);
bedf8bcf 989
2c0ab67b 990 /* Part 5: Register the entity. */
d9c21e3e
MCC
991 ret = video_register_media_controller(vdev, type);
992
2c0ab67b 993 /* Part 6: Activate this minor. The char device can now be used. */
957b4aa9 994 set_bit(V4L2_FL_REGISTERED, &vdev->flags);
2c0ab67b 995
dc93a70c 996 return 0;
7f8ecfab 997
dc93a70c 998cleanup:
27a5e6d3 999 mutex_lock(&videodev_lock);
dc93a70c
HV
1000 if (vdev->cdev)
1001 cdev_del(vdev->cdev);
1056e438 1002 video_device[vdev->minor] = NULL;
5062cb70 1003 devnode_clear(vdev);
27a5e6d3 1004 mutex_unlock(&videodev_lock);
dc93a70c
HV
1005 /* Mark this video device as never having been registered. */
1006 vdev->minor = -1;
27a5e6d3
HV
1007 return ret;
1008}
2096a5dc 1009EXPORT_SYMBOL(__video_register_device);
6b5270d2 1010
27a5e6d3
HV
1011/**
1012 * video_unregister_device - unregister a video4linux device
dc93a70c 1013 * @vdev: the device to unregister
27a5e6d3 1014 *
dc93a70c
HV
1015 * This unregisters the passed device. Future open calls will
1016 * be met with errors.
27a5e6d3 1017 */
dc93a70c 1018void video_unregister_device(struct video_device *vdev)
27a5e6d3 1019{
dc93a70c 1020 /* Check if vdev was ever registered at all */
957b4aa9 1021 if (!vdev || !video_is_registered(vdev))
dc93a70c
HV
1022 return;
1023
ca9afe6f
HV
1024 mutex_lock(&videodev_lock);
1025 /* This must be in a critical section to prevent a race with v4l2_open.
1026 * Once this bit has been cleared video_get may never be called again.
1027 */
957b4aa9 1028 clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
ca9afe6f 1029 mutex_unlock(&videodev_lock);
dc93a70c 1030 device_unregister(&vdev->dev);
27a5e6d3
HV
1031}
1032EXPORT_SYMBOL(video_unregister_device);
1033
27a5e6d3
HV
1034/*
1035 * Initialise video for linux
1036 */
27a5e6d3
HV
1037static int __init videodev_init(void)
1038{
7f8ecfab 1039 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
27a5e6d3
HV
1040 int ret;
1041
1042 printk(KERN_INFO "Linux video capture interface: v2.00\n");
7f8ecfab
HV
1043 ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
1044 if (ret < 0) {
1045 printk(KERN_WARNING "videodev: unable to get major %d\n",
1046 VIDEO_MAJOR);
1047 return ret;
27a5e6d3
HV
1048 }
1049
1050 ret = class_register(&video_class);
1051 if (ret < 0) {
7f8ecfab 1052 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
1053 printk(KERN_WARNING "video_dev: class_register failed\n");
1054 return -EIO;
1055 }
1056
1057 return 0;
1058}
1059
1060static void __exit videodev_exit(void)
1061{
7f8ecfab
HV
1062 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
1063
27a5e6d3 1064 class_unregister(&video_class);
7f8ecfab 1065 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
1066}
1067
ee981c6f 1068subsys_initcall(videodev_init);
27a5e6d3
HV
1069module_exit(videodev_exit)
1070
1071MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
1072MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
1073MODULE_LICENSE("GPL");
cbb72b0f 1074MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR);