anntotate the places where ->poll() return values go
[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. */
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)
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
334static unsigned int v4l2_poll(struct file *filp, struct poll_table_struct *poll)
335{
336 struct video_device *vdev = video_devdata(filp);
e6c8adca 337 __poll_t res = POLLERR | POLLHUP;
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
2096a5dc
LP
824int __video_register_device(struct video_device *vdev, int type, int nr,
825 int warn_if_nr_in_use, struct module *owner)
27a5e6d3
HV
826{
827 int i = 0;
27a5e6d3 828 int ret;
dd89601d
HV
829 int minor_offset = 0;
830 int minor_cnt = VIDEO_NUM_DEVICES;
831 const char *name_base;
27a5e6d3 832
dc93a70c
HV
833 /* A minor value of -1 marks this video device as never
834 having been registered */
428c8d19 835 vdev->minor = -1;
ee7aa9f8 836
dc93a70c 837 /* the release callback MUST be present */
1fc2b5f7 838 if (WARN_ON(!vdev->release))
f3b9f50e 839 return -EINVAL;
1c1d86a1
HV
840 /* the v4l2_dev pointer MUST be present */
841 if (WARN_ON(!vdev->v4l2_dev))
842 return -EINVAL;
f3b9f50e 843
1babcb46
SA
844 /* v4l2_fh support */
845 spin_lock_init(&vdev->fh_lock);
846 INIT_LIST_HEAD(&vdev->fh_list);
847
dc93a70c 848 /* Part 1: check device type */
27a5e6d3
HV
849 switch (type) {
850 case VFL_TYPE_GRABBER:
27a5e6d3
HV
851 name_base = "video";
852 break;
27a5e6d3 853 case VFL_TYPE_VBI:
27a5e6d3
HV
854 name_base = "vbi";
855 break;
856 case VFL_TYPE_RADIO:
27a5e6d3
HV
857 name_base = "radio";
858 break;
2096a5dc
LP
859 case VFL_TYPE_SUBDEV:
860 name_base = "v4l-subdev";
861 break;
d42626bd
AP
862 case VFL_TYPE_SDR:
863 /* Use device name 'swradio' because 'sdr' was already taken. */
864 name_base = "swradio";
865 break;
b2fe22d0
ND
866 case VFL_TYPE_TOUCH:
867 name_base = "v4l-touch";
868 break;
27a5e6d3
HV
869 default:
870 printk(KERN_ERR "%s called with unknown type: %d\n",
871 __func__, type);
46f2c21c 872 return -EINVAL;
27a5e6d3
HV
873 }
874
dc93a70c
HV
875 vdev->vfl_type = type;
876 vdev->cdev = NULL;
1c1d86a1
HV
877 if (vdev->dev_parent == NULL)
878 vdev->dev_parent = vdev->v4l2_dev->dev;
879 if (vdev->ctrl_handler == NULL)
880 vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;
881 /* If the prio state pointer is NULL, then use the v4l2_device
882 prio state. */
883 if (vdev->prio == NULL)
884 vdev->prio = &vdev->v4l2_dev->prio;
dd89601d 885
22e22125 886 /* Part 2: find a free minor, device node number and device index. */
dd89601d
HV
887#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
888 /* Keep the ranges for the first four types for historical
889 * reasons.
890 * Newer devices (not yet in place) should use the range
891 * of 128-191 and just pick the first free minor there
892 * (new style). */
893 switch (type) {
894 case VFL_TYPE_GRABBER:
895 minor_offset = 0;
896 minor_cnt = 64;
897 break;
898 case VFL_TYPE_RADIO:
899 minor_offset = 64;
900 minor_cnt = 64;
901 break;
dd89601d
HV
902 case VFL_TYPE_VBI:
903 minor_offset = 224;
904 minor_cnt = 32;
905 break;
906 default:
907 minor_offset = 128;
908 minor_cnt = 64;
909 break;
910 }
911#endif
912
22e22125 913 /* Pick a device node number */
27a5e6d3 914 mutex_lock(&videodev_lock);
5062cb70 915 nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt);
dd89601d 916 if (nr == minor_cnt)
5062cb70 917 nr = devnode_find(vdev, 0, minor_cnt);
dd89601d 918 if (nr == minor_cnt) {
22e22125 919 printk(KERN_ERR "could not get a free device node number\n");
dd89601d
HV
920 mutex_unlock(&videodev_lock);
921 return -ENFILE;
27a5e6d3 922 }
dd89601d 923#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
22e22125 924 /* 1-on-1 mapping of device node number to minor number */
dd89601d
HV
925 i = nr;
926#else
22e22125
HV
927 /* The device node number and minor numbers are independent, so
928 we just find the first free minor number. */
dd89601d
HV
929 for (i = 0; i < VIDEO_NUM_DEVICES; i++)
930 if (video_device[i] == NULL)
931 break;
932 if (i == VIDEO_NUM_DEVICES) {
933 mutex_unlock(&videodev_lock);
934 printk(KERN_ERR "could not get a free minor\n");
935 return -ENFILE;
936 }
937#endif
dc93a70c
HV
938 vdev->minor = i + minor_offset;
939 vdev->num = nr;
5062cb70
HV
940 devnode_set(vdev);
941
dc93a70c
HV
942 /* Should not happen since we thought this minor was free */
943 WARN_ON(video_device[vdev->minor] != NULL);
7ae0cd9b 944 vdev->index = get_index(vdev);
6c3df5da 945 video_device[vdev->minor] = vdev;
27a5e6d3
HV
946 mutex_unlock(&videodev_lock);
947
48ea0be0
HV
948 if (vdev->ioctl_ops)
949 determine_valid_ioctls(vdev);
950
dc93a70c
HV
951 /* Part 3: Initialize the character device */
952 vdev->cdev = cdev_alloc();
953 if (vdev->cdev == NULL) {
954 ret = -ENOMEM;
955 goto cleanup;
956 }
86a5ef7d 957 vdev->cdev->ops = &v4l2_fops;
2096a5dc 958 vdev->cdev->owner = owner;
dc93a70c 959 ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
7f8ecfab
HV
960 if (ret < 0) {
961 printk(KERN_ERR "%s: cdev_add failed\n", __func__);
dc93a70c
HV
962 kfree(vdev->cdev);
963 vdev->cdev = NULL;
964 goto cleanup;
7f8ecfab 965 }
dc93a70c
HV
966
967 /* Part 4: register the device with sysfs */
dc93a70c
HV
968 vdev->dev.class = &video_class;
969 vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
1c1d86a1 970 vdev->dev.parent = vdev->dev_parent;
22e22125 971 dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
dc93a70c 972 ret = device_register(&vdev->dev);
27a5e6d3
HV
973 if (ret < 0) {
974 printk(KERN_ERR "%s: device_register failed\n", __func__);
dc93a70c 975 goto cleanup;
27a5e6d3 976 }
dc93a70c
HV
977 /* Register the release callback that will be called when the last
978 reference to the device goes away. */
979 vdev->dev.release = v4l2_device_release;
27a5e6d3 980
6b5270d2 981 if (nr != -1 && nr != vdev->num && warn_if_nr_in_use)
eac8ea53
LP
982 printk(KERN_WARNING "%s: requested %s%d, got %s\n", __func__,
983 name_base, nr, video_device_node_name(vdev));
bedf8bcf
HV
984
985 /* Increase v4l2_device refcount */
d9bfbcc0 986 v4l2_device_get(vdev->v4l2_dev);
bedf8bcf 987
2c0ab67b 988 /* Part 5: Register the entity. */
d9c21e3e
MCC
989 ret = video_register_media_controller(vdev, type);
990
2c0ab67b 991 /* Part 6: Activate this minor. The char device can now be used. */
957b4aa9 992 set_bit(V4L2_FL_REGISTERED, &vdev->flags);
2c0ab67b 993
dc93a70c 994 return 0;
7f8ecfab 995
dc93a70c 996cleanup:
27a5e6d3 997 mutex_lock(&videodev_lock);
dc93a70c
HV
998 if (vdev->cdev)
999 cdev_del(vdev->cdev);
1056e438 1000 video_device[vdev->minor] = NULL;
5062cb70 1001 devnode_clear(vdev);
27a5e6d3 1002 mutex_unlock(&videodev_lock);
dc93a70c
HV
1003 /* Mark this video device as never having been registered. */
1004 vdev->minor = -1;
27a5e6d3
HV
1005 return ret;
1006}
2096a5dc 1007EXPORT_SYMBOL(__video_register_device);
6b5270d2 1008
27a5e6d3
HV
1009/**
1010 * video_unregister_device - unregister a video4linux device
dc93a70c 1011 * @vdev: the device to unregister
27a5e6d3 1012 *
dc93a70c
HV
1013 * This unregisters the passed device. Future open calls will
1014 * be met with errors.
27a5e6d3 1015 */
dc93a70c 1016void video_unregister_device(struct video_device *vdev)
27a5e6d3 1017{
dc93a70c 1018 /* Check if vdev was ever registered at all */
957b4aa9 1019 if (!vdev || !video_is_registered(vdev))
dc93a70c
HV
1020 return;
1021
ca9afe6f
HV
1022 mutex_lock(&videodev_lock);
1023 /* This must be in a critical section to prevent a race with v4l2_open.
1024 * Once this bit has been cleared video_get may never be called again.
1025 */
957b4aa9 1026 clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
ca9afe6f 1027 mutex_unlock(&videodev_lock);
dc93a70c 1028 device_unregister(&vdev->dev);
27a5e6d3
HV
1029}
1030EXPORT_SYMBOL(video_unregister_device);
1031
27a5e6d3
HV
1032/*
1033 * Initialise video for linux
1034 */
27a5e6d3
HV
1035static int __init videodev_init(void)
1036{
7f8ecfab 1037 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
27a5e6d3
HV
1038 int ret;
1039
1040 printk(KERN_INFO "Linux video capture interface: v2.00\n");
7f8ecfab
HV
1041 ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
1042 if (ret < 0) {
1043 printk(KERN_WARNING "videodev: unable to get major %d\n",
1044 VIDEO_MAJOR);
1045 return ret;
27a5e6d3
HV
1046 }
1047
1048 ret = class_register(&video_class);
1049 if (ret < 0) {
7f8ecfab 1050 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
1051 printk(KERN_WARNING "video_dev: class_register failed\n");
1052 return -EIO;
1053 }
1054
1055 return 0;
1056}
1057
1058static void __exit videodev_exit(void)
1059{
7f8ecfab
HV
1060 dev_t dev = MKDEV(VIDEO_MAJOR, 0);
1061
27a5e6d3 1062 class_unregister(&video_class);
7f8ecfab 1063 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
27a5e6d3
HV
1064}
1065
ee981c6f 1066subsys_initcall(videodev_init);
27a5e6d3
HV
1067module_exit(videodev_exit)
1068
1069MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>");
1070MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2");
1071MODULE_LICENSE("GPL");
cbb72b0f 1072MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR);