Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.0-rc2 820 lines 22 kB view raw
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 * 12 * Authors: Alan Cox, <alan@lxorguk.ukuu.org.uk> (version 1) 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> 28#include <asm/uaccess.h> 29#include <asm/system.h> 30 31#include <media/v4l2-common.h> 32#include <media/v4l2-device.h> 33#include <media/v4l2-ioctl.h> 34 35#define VIDEO_NUM_DEVICES 256 36#define VIDEO_NAME "video4linux" 37 38/* 39 * sysfs stuff 40 */ 41 42static ssize_t show_index(struct device *cd, 43 struct device_attribute *attr, char *buf) 44{ 45 struct video_device *vdev = to_video_device(cd); 46 47 return sprintf(buf, "%i\n", vdev->index); 48} 49 50static ssize_t show_name(struct device *cd, 51 struct device_attribute *attr, char *buf) 52{ 53 struct video_device *vdev = to_video_device(cd); 54 55 return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name); 56} 57 58static struct device_attribute video_device_attrs[] = { 59 __ATTR(name, S_IRUGO, show_name, NULL), 60 __ATTR(index, S_IRUGO, show_index, NULL), 61 __ATTR_NULL 62}; 63 64/* 65 * Active devices 66 */ 67static struct video_device *video_device[VIDEO_NUM_DEVICES]; 68static DEFINE_MUTEX(videodev_lock); 69static DECLARE_BITMAP(devnode_nums[VFL_TYPE_MAX], VIDEO_NUM_DEVICES); 70 71/* Device node utility functions */ 72 73/* Note: these utility functions all assume that vfl_type is in the range 74 [0, VFL_TYPE_MAX-1]. */ 75 76#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES 77/* Return the bitmap corresponding to vfl_type. */ 78static inline unsigned long *devnode_bits(int vfl_type) 79{ 80 /* Any types not assigned to fixed minor ranges must be mapped to 81 one single bitmap for the purposes of finding a free node number 82 since all those unassigned types use the same minor range. */ 83 int idx = (vfl_type > VFL_TYPE_RADIO) ? VFL_TYPE_MAX - 1 : vfl_type; 84 85 return devnode_nums[idx]; 86} 87#else 88/* Return the bitmap corresponding to vfl_type. */ 89static inline unsigned long *devnode_bits(int vfl_type) 90{ 91 return devnode_nums[vfl_type]; 92} 93#endif 94 95/* Mark device node number vdev->num as used */ 96static inline void devnode_set(struct video_device *vdev) 97{ 98 set_bit(vdev->num, devnode_bits(vdev->vfl_type)); 99} 100 101/* Mark device node number vdev->num as unused */ 102static inline void devnode_clear(struct video_device *vdev) 103{ 104 clear_bit(vdev->num, devnode_bits(vdev->vfl_type)); 105} 106 107/* Try to find a free device node number in the range [from, to> */ 108static inline int devnode_find(struct video_device *vdev, int from, int to) 109{ 110 return find_next_zero_bit(devnode_bits(vdev->vfl_type), to, from); 111} 112 113struct video_device *video_device_alloc(void) 114{ 115 return kzalloc(sizeof(struct video_device), GFP_KERNEL); 116} 117EXPORT_SYMBOL(video_device_alloc); 118 119void video_device_release(struct video_device *vdev) 120{ 121 kfree(vdev); 122} 123EXPORT_SYMBOL(video_device_release); 124 125void video_device_release_empty(struct video_device *vdev) 126{ 127 /* Do nothing */ 128 /* Only valid when the video_device struct is a static. */ 129} 130EXPORT_SYMBOL(video_device_release_empty); 131 132static inline void video_get(struct video_device *vdev) 133{ 134 get_device(&vdev->dev); 135} 136 137static inline void video_put(struct video_device *vdev) 138{ 139 put_device(&vdev->dev); 140} 141 142/* Called when the last user of the video device exits. */ 143static void v4l2_device_release(struct device *cd) 144{ 145 struct video_device *vdev = to_video_device(cd); 146 struct v4l2_device *v4l2_dev = vdev->v4l2_dev; 147 148 mutex_lock(&videodev_lock); 149 if (video_device[vdev->minor] != vdev) { 150 mutex_unlock(&videodev_lock); 151 /* should not happen */ 152 WARN_ON(1); 153 return; 154 } 155 156 /* Free up this device for reuse */ 157 video_device[vdev->minor] = NULL; 158 159 /* Delete the cdev on this minor as well */ 160 cdev_del(vdev->cdev); 161 /* Just in case some driver tries to access this from 162 the release() callback. */ 163 vdev->cdev = NULL; 164 165 /* Mark device node number as free */ 166 devnode_clear(vdev); 167 168 mutex_unlock(&videodev_lock); 169 170 /* Release video_device and perform other 171 cleanups as needed. */ 172 vdev->release(vdev); 173 174 /* Decrease v4l2_device refcount */ 175 if (v4l2_dev) 176 v4l2_device_put(v4l2_dev); 177} 178 179static struct class video_class = { 180 .name = VIDEO_NAME, 181 .dev_attrs = video_device_attrs, 182}; 183 184struct video_device *video_devdata(struct file *file) 185{ 186 return video_device[iminor(file->f_path.dentry->d_inode)]; 187} 188EXPORT_SYMBOL(video_devdata); 189 190 191/* Priority handling */ 192 193static inline bool prio_is_valid(enum v4l2_priority prio) 194{ 195 return prio == V4L2_PRIORITY_BACKGROUND || 196 prio == V4L2_PRIORITY_INTERACTIVE || 197 prio == V4L2_PRIORITY_RECORD; 198} 199 200void v4l2_prio_init(struct v4l2_prio_state *global) 201{ 202 memset(global, 0, sizeof(*global)); 203} 204EXPORT_SYMBOL(v4l2_prio_init); 205 206int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local, 207 enum v4l2_priority new) 208{ 209 if (!prio_is_valid(new)) 210 return -EINVAL; 211 if (*local == new) 212 return 0; 213 214 atomic_inc(&global->prios[new]); 215 if (prio_is_valid(*local)) 216 atomic_dec(&global->prios[*local]); 217 *local = new; 218 return 0; 219} 220EXPORT_SYMBOL(v4l2_prio_change); 221 222void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local) 223{ 224 v4l2_prio_change(global, local, V4L2_PRIORITY_DEFAULT); 225} 226EXPORT_SYMBOL(v4l2_prio_open); 227 228void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local) 229{ 230 if (prio_is_valid(local)) 231 atomic_dec(&global->prios[local]); 232} 233EXPORT_SYMBOL(v4l2_prio_close); 234 235enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global) 236{ 237 if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0) 238 return V4L2_PRIORITY_RECORD; 239 if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0) 240 return V4L2_PRIORITY_INTERACTIVE; 241 if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0) 242 return V4L2_PRIORITY_BACKGROUND; 243 return V4L2_PRIORITY_UNSET; 244} 245EXPORT_SYMBOL(v4l2_prio_max); 246 247int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local) 248{ 249 return (local < v4l2_prio_max(global)) ? -EBUSY : 0; 250} 251EXPORT_SYMBOL(v4l2_prio_check); 252 253 254static ssize_t v4l2_read(struct file *filp, char __user *buf, 255 size_t sz, loff_t *off) 256{ 257 struct video_device *vdev = video_devdata(filp); 258 int ret = -ENODEV; 259 260 if (!vdev->fops->read) 261 return -EINVAL; 262 if (vdev->lock && mutex_lock_interruptible(vdev->lock)) 263 return -ERESTARTSYS; 264 if (video_is_registered(vdev)) 265 ret = vdev->fops->read(filp, buf, sz, off); 266 if (vdev->lock) 267 mutex_unlock(vdev->lock); 268 return ret; 269} 270 271static ssize_t v4l2_write(struct file *filp, const char __user *buf, 272 size_t sz, loff_t *off) 273{ 274 struct video_device *vdev = video_devdata(filp); 275 int ret = -ENODEV; 276 277 if (!vdev->fops->write) 278 return -EINVAL; 279 if (vdev->lock && mutex_lock_interruptible(vdev->lock)) 280 return -ERESTARTSYS; 281 if (video_is_registered(vdev)) 282 ret = vdev->fops->write(filp, buf, sz, off); 283 if (vdev->lock) 284 mutex_unlock(vdev->lock); 285 return ret; 286} 287 288static unsigned int v4l2_poll(struct file *filp, struct poll_table_struct *poll) 289{ 290 struct video_device *vdev = video_devdata(filp); 291 int ret = POLLERR | POLLHUP; 292 293 if (!vdev->fops->poll) 294 return DEFAULT_POLLMASK; 295 if (vdev->lock) 296 mutex_lock(vdev->lock); 297 if (video_is_registered(vdev)) 298 ret = vdev->fops->poll(filp, poll); 299 if (vdev->lock) 300 mutex_unlock(vdev->lock); 301 return ret; 302} 303 304static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 305{ 306 struct video_device *vdev = video_devdata(filp); 307 int ret = -ENODEV; 308 309 if (vdev->fops->unlocked_ioctl) { 310 if (vdev->lock && mutex_lock_interruptible(vdev->lock)) 311 return -ERESTARTSYS; 312 if (video_is_registered(vdev)) 313 ret = vdev->fops->unlocked_ioctl(filp, cmd, arg); 314 if (vdev->lock) 315 mutex_unlock(vdev->lock); 316 } else if (vdev->fops->ioctl) { 317 /* This code path is a replacement for the BKL. It is a major 318 * hack but it will have to do for those drivers that are not 319 * yet converted to use unlocked_ioctl. 320 * 321 * There are two options: if the driver implements struct 322 * v4l2_device, then the lock defined there is used to 323 * serialize the ioctls. Otherwise the v4l2 core lock defined 324 * below is used. This lock is really bad since it serializes 325 * completely independent devices. 326 * 327 * Both variants suffer from the same problem: if the driver 328 * sleeps, then it blocks all ioctls since the lock is still 329 * held. This is very common for VIDIOC_DQBUF since that 330 * normally waits for a frame to arrive. As a result any other 331 * ioctl calls will proceed very, very slowly since each call 332 * will have to wait for the VIDIOC_QBUF to finish. Things that 333 * should take 0.01s may now take 10-20 seconds. 334 * 335 * The workaround is to *not* take the lock for VIDIOC_DQBUF. 336 * This actually works OK for videobuf-based drivers, since 337 * videobuf will take its own internal lock. 338 */ 339 static DEFINE_MUTEX(v4l2_ioctl_mutex); 340 struct mutex *m = vdev->v4l2_dev ? 341 &vdev->v4l2_dev->ioctl_lock : &v4l2_ioctl_mutex; 342 343 if (cmd != VIDIOC_DQBUF && mutex_lock_interruptible(m)) 344 return -ERESTARTSYS; 345 if (video_is_registered(vdev)) 346 ret = vdev->fops->ioctl(filp, cmd, arg); 347 if (cmd != VIDIOC_DQBUF) 348 mutex_unlock(m); 349 } else 350 ret = -ENOTTY; 351 352 return ret; 353} 354 355#ifdef CONFIG_MMU 356#define v4l2_get_unmapped_area NULL 357#else 358static unsigned long v4l2_get_unmapped_area(struct file *filp, 359 unsigned long addr, unsigned long len, unsigned long pgoff, 360 unsigned long flags) 361{ 362 struct video_device *vdev = video_devdata(filp); 363 364 if (!vdev->fops->get_unmapped_area) 365 return -ENOSYS; 366 if (!video_is_registered(vdev)) 367 return -ENODEV; 368 return vdev->fops->get_unmapped_area(filp, addr, len, pgoff, flags); 369} 370#endif 371 372static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm) 373{ 374 struct video_device *vdev = video_devdata(filp); 375 int ret = -ENODEV; 376 377 if (!vdev->fops->mmap) 378 return ret; 379 if (vdev->lock && mutex_lock_interruptible(vdev->lock)) 380 return -ERESTARTSYS; 381 if (video_is_registered(vdev)) 382 ret = vdev->fops->mmap(filp, vm); 383 if (vdev->lock) 384 mutex_unlock(vdev->lock); 385 return ret; 386} 387 388/* Override for the open function */ 389static int v4l2_open(struct inode *inode, struct file *filp) 390{ 391 struct video_device *vdev; 392#if defined(CONFIG_MEDIA_CONTROLLER) 393 struct media_entity *entity = NULL; 394#endif 395 int ret = 0; 396 397 /* Check if the video device is available */ 398 mutex_lock(&videodev_lock); 399 vdev = video_devdata(filp); 400 /* return ENODEV if the video device has already been removed. */ 401 if (vdev == NULL || !video_is_registered(vdev)) { 402 mutex_unlock(&videodev_lock); 403 return -ENODEV; 404 } 405 /* and increase the device refcount */ 406 video_get(vdev); 407 mutex_unlock(&videodev_lock); 408#if defined(CONFIG_MEDIA_CONTROLLER) 409 if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 410 vdev->vfl_type != VFL_TYPE_SUBDEV) { 411 entity = media_entity_get(&vdev->entity); 412 if (!entity) { 413 ret = -EBUSY; 414 video_put(vdev); 415 return ret; 416 } 417 } 418#endif 419 if (vdev->fops->open) { 420 if (vdev->lock && mutex_lock_interruptible(vdev->lock)) { 421 ret = -ERESTARTSYS; 422 goto err; 423 } 424 if (video_is_registered(vdev)) 425 ret = vdev->fops->open(filp); 426 else 427 ret = -ENODEV; 428 if (vdev->lock) 429 mutex_unlock(vdev->lock); 430 } 431 432err: 433 /* decrease the refcount in case of an error */ 434 if (ret) { 435#if defined(CONFIG_MEDIA_CONTROLLER) 436 if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 437 vdev->vfl_type != VFL_TYPE_SUBDEV) 438 media_entity_put(entity); 439#endif 440 video_put(vdev); 441 } 442 return ret; 443} 444 445/* Override for the release function */ 446static int v4l2_release(struct inode *inode, struct file *filp) 447{ 448 struct video_device *vdev = video_devdata(filp); 449 int ret = 0; 450 451 if (vdev->fops->release) { 452 if (vdev->lock) 453 mutex_lock(vdev->lock); 454 vdev->fops->release(filp); 455 if (vdev->lock) 456 mutex_unlock(vdev->lock); 457 } 458#if defined(CONFIG_MEDIA_CONTROLLER) 459 if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 460 vdev->vfl_type != VFL_TYPE_SUBDEV) 461 media_entity_put(&vdev->entity); 462#endif 463 /* decrease the refcount unconditionally since the release() 464 return value is ignored. */ 465 video_put(vdev); 466 return ret; 467} 468 469static const struct file_operations v4l2_fops = { 470 .owner = THIS_MODULE, 471 .read = v4l2_read, 472 .write = v4l2_write, 473 .open = v4l2_open, 474 .get_unmapped_area = v4l2_get_unmapped_area, 475 .mmap = v4l2_mmap, 476 .unlocked_ioctl = v4l2_ioctl, 477#ifdef CONFIG_COMPAT 478 .compat_ioctl = v4l2_compat_ioctl32, 479#endif 480 .release = v4l2_release, 481 .poll = v4l2_poll, 482 .llseek = no_llseek, 483}; 484 485/** 486 * get_index - assign stream index number based on parent device 487 * @vdev: video_device to assign index number to, vdev->parent should be assigned 488 * 489 * Note that when this is called the new device has not yet been registered 490 * in the video_device array, but it was able to obtain a minor number. 491 * 492 * This means that we can always obtain a free stream index number since 493 * the worst case scenario is that there are VIDEO_NUM_DEVICES - 1 slots in 494 * use of the video_device array. 495 * 496 * Returns a free index number. 497 */ 498static int get_index(struct video_device *vdev) 499{ 500 /* This can be static since this function is called with the global 501 videodev_lock held. */ 502 static DECLARE_BITMAP(used, VIDEO_NUM_DEVICES); 503 int i; 504 505 /* Some drivers do not set the parent. In that case always return 0. */ 506 if (vdev->parent == NULL) 507 return 0; 508 509 bitmap_zero(used, VIDEO_NUM_DEVICES); 510 511 for (i = 0; i < VIDEO_NUM_DEVICES; i++) { 512 if (video_device[i] != NULL && 513 video_device[i]->parent == vdev->parent) { 514 set_bit(video_device[i]->index, used); 515 } 516 } 517 518 return find_first_zero_bit(used, VIDEO_NUM_DEVICES); 519} 520 521/** 522 * __video_register_device - register video4linux devices 523 * @vdev: video device structure we want to register 524 * @type: type of device to register 525 * @nr: which device node number (0 == /dev/video0, 1 == /dev/video1, ... 526 * -1 == first free) 527 * @warn_if_nr_in_use: warn if the desired device node number 528 * was already in use and another number was chosen instead. 529 * @owner: module that owns the video device node 530 * 531 * The registration code assigns minor numbers and device node numbers 532 * based on the requested type and registers the new device node with 533 * the kernel. 534 * 535 * This function assumes that struct video_device was zeroed when it 536 * was allocated and does not contain any stale date. 537 * 538 * An error is returned if no free minor or device node number could be 539 * found, or if the registration of the device node failed. 540 * 541 * Zero is returned on success. 542 * 543 * Valid types are 544 * 545 * %VFL_TYPE_GRABBER - A frame grabber 546 * 547 * %VFL_TYPE_VBI - Vertical blank data (undecoded) 548 * 549 * %VFL_TYPE_RADIO - A radio card 550 * 551 * %VFL_TYPE_SUBDEV - A subdevice 552 */ 553int __video_register_device(struct video_device *vdev, int type, int nr, 554 int warn_if_nr_in_use, struct module *owner) 555{ 556 int i = 0; 557 int ret; 558 int minor_offset = 0; 559 int minor_cnt = VIDEO_NUM_DEVICES; 560 const char *name_base; 561 562 /* A minor value of -1 marks this video device as never 563 having been registered */ 564 vdev->minor = -1; 565 566 /* the release callback MUST be present */ 567 WARN_ON(!vdev->release); 568 if (!vdev->release) 569 return -EINVAL; 570 571 /* v4l2_fh support */ 572 spin_lock_init(&vdev->fh_lock); 573 INIT_LIST_HEAD(&vdev->fh_list); 574 575 /* Part 1: check device type */ 576 switch (type) { 577 case VFL_TYPE_GRABBER: 578 name_base = "video"; 579 break; 580 case VFL_TYPE_VBI: 581 name_base = "vbi"; 582 break; 583 case VFL_TYPE_RADIO: 584 name_base = "radio"; 585 break; 586 case VFL_TYPE_SUBDEV: 587 name_base = "v4l-subdev"; 588 break; 589 default: 590 printk(KERN_ERR "%s called with unknown type: %d\n", 591 __func__, type); 592 return -EINVAL; 593 } 594 595 vdev->vfl_type = type; 596 vdev->cdev = NULL; 597 if (vdev->v4l2_dev) { 598 if (vdev->v4l2_dev->dev) 599 vdev->parent = vdev->v4l2_dev->dev; 600 if (vdev->ctrl_handler == NULL) 601 vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler; 602 /* If the prio state pointer is NULL, then use the v4l2_device 603 prio state. */ 604 if (vdev->prio == NULL) 605 vdev->prio = &vdev->v4l2_dev->prio; 606 } 607 608 /* Part 2: find a free minor, device node number and device index. */ 609#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES 610 /* Keep the ranges for the first four types for historical 611 * reasons. 612 * Newer devices (not yet in place) should use the range 613 * of 128-191 and just pick the first free minor there 614 * (new style). */ 615 switch (type) { 616 case VFL_TYPE_GRABBER: 617 minor_offset = 0; 618 minor_cnt = 64; 619 break; 620 case VFL_TYPE_RADIO: 621 minor_offset = 64; 622 minor_cnt = 64; 623 break; 624 case VFL_TYPE_VBI: 625 minor_offset = 224; 626 minor_cnt = 32; 627 break; 628 default: 629 minor_offset = 128; 630 minor_cnt = 64; 631 break; 632 } 633#endif 634 635 /* Pick a device node number */ 636 mutex_lock(&videodev_lock); 637 nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt); 638 if (nr == minor_cnt) 639 nr = devnode_find(vdev, 0, minor_cnt); 640 if (nr == minor_cnt) { 641 printk(KERN_ERR "could not get a free device node number\n"); 642 mutex_unlock(&videodev_lock); 643 return -ENFILE; 644 } 645#ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES 646 /* 1-on-1 mapping of device node number to minor number */ 647 i = nr; 648#else 649 /* The device node number and minor numbers are independent, so 650 we just find the first free minor number. */ 651 for (i = 0; i < VIDEO_NUM_DEVICES; i++) 652 if (video_device[i] == NULL) 653 break; 654 if (i == VIDEO_NUM_DEVICES) { 655 mutex_unlock(&videodev_lock); 656 printk(KERN_ERR "could not get a free minor\n"); 657 return -ENFILE; 658 } 659#endif 660 vdev->minor = i + minor_offset; 661 vdev->num = nr; 662 devnode_set(vdev); 663 664 /* Should not happen since we thought this minor was free */ 665 WARN_ON(video_device[vdev->minor] != NULL); 666 vdev->index = get_index(vdev); 667 mutex_unlock(&videodev_lock); 668 669 /* Part 3: Initialize the character device */ 670 vdev->cdev = cdev_alloc(); 671 if (vdev->cdev == NULL) { 672 ret = -ENOMEM; 673 goto cleanup; 674 } 675 vdev->cdev->ops = &v4l2_fops; 676 vdev->cdev->owner = owner; 677 ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1); 678 if (ret < 0) { 679 printk(KERN_ERR "%s: cdev_add failed\n", __func__); 680 kfree(vdev->cdev); 681 vdev->cdev = NULL; 682 goto cleanup; 683 } 684 685 /* Part 4: register the device with sysfs */ 686 vdev->dev.class = &video_class; 687 vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor); 688 if (vdev->parent) 689 vdev->dev.parent = vdev->parent; 690 dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num); 691 ret = device_register(&vdev->dev); 692 if (ret < 0) { 693 printk(KERN_ERR "%s: device_register failed\n", __func__); 694 goto cleanup; 695 } 696 /* Register the release callback that will be called when the last 697 reference to the device goes away. */ 698 vdev->dev.release = v4l2_device_release; 699 700 if (nr != -1 && nr != vdev->num && warn_if_nr_in_use) 701 printk(KERN_WARNING "%s: requested %s%d, got %s\n", __func__, 702 name_base, nr, video_device_node_name(vdev)); 703 704 /* Increase v4l2_device refcount */ 705 if (vdev->v4l2_dev) 706 v4l2_device_get(vdev->v4l2_dev); 707 708#if defined(CONFIG_MEDIA_CONTROLLER) 709 /* Part 5: Register the entity. */ 710 if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 711 vdev->vfl_type != VFL_TYPE_SUBDEV) { 712 vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L; 713 vdev->entity.name = vdev->name; 714 vdev->entity.v4l.major = VIDEO_MAJOR; 715 vdev->entity.v4l.minor = vdev->minor; 716 ret = media_device_register_entity(vdev->v4l2_dev->mdev, 717 &vdev->entity); 718 if (ret < 0) 719 printk(KERN_WARNING 720 "%s: media_device_register_entity failed\n", 721 __func__); 722 } 723#endif 724 /* Part 6: Activate this minor. The char device can now be used. */ 725 set_bit(V4L2_FL_REGISTERED, &vdev->flags); 726 mutex_lock(&videodev_lock); 727 video_device[vdev->minor] = vdev; 728 mutex_unlock(&videodev_lock); 729 730 return 0; 731 732cleanup: 733 mutex_lock(&videodev_lock); 734 if (vdev->cdev) 735 cdev_del(vdev->cdev); 736 devnode_clear(vdev); 737 mutex_unlock(&videodev_lock); 738 /* Mark this video device as never having been registered. */ 739 vdev->minor = -1; 740 return ret; 741} 742EXPORT_SYMBOL(__video_register_device); 743 744/** 745 * video_unregister_device - unregister a video4linux device 746 * @vdev: the device to unregister 747 * 748 * This unregisters the passed device. Future open calls will 749 * be met with errors. 750 */ 751void video_unregister_device(struct video_device *vdev) 752{ 753 /* Check if vdev was ever registered at all */ 754 if (!vdev || !video_is_registered(vdev)) 755 return; 756 757#if defined(CONFIG_MEDIA_CONTROLLER) 758 if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && 759 vdev->vfl_type != VFL_TYPE_SUBDEV) 760 media_device_unregister_entity(&vdev->entity); 761#endif 762 763 mutex_lock(&videodev_lock); 764 /* This must be in a critical section to prevent a race with v4l2_open. 765 * Once this bit has been cleared video_get may never be called again. 766 */ 767 clear_bit(V4L2_FL_REGISTERED, &vdev->flags); 768 mutex_unlock(&videodev_lock); 769 device_unregister(&vdev->dev); 770} 771EXPORT_SYMBOL(video_unregister_device); 772 773/* 774 * Initialise video for linux 775 */ 776static int __init videodev_init(void) 777{ 778 dev_t dev = MKDEV(VIDEO_MAJOR, 0); 779 int ret; 780 781 printk(KERN_INFO "Linux video capture interface: v2.00\n"); 782 ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME); 783 if (ret < 0) { 784 printk(KERN_WARNING "videodev: unable to get major %d\n", 785 VIDEO_MAJOR); 786 return ret; 787 } 788 789 ret = class_register(&video_class); 790 if (ret < 0) { 791 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES); 792 printk(KERN_WARNING "video_dev: class_register failed\n"); 793 return -EIO; 794 } 795 796 return 0; 797} 798 799static void __exit videodev_exit(void) 800{ 801 dev_t dev = MKDEV(VIDEO_MAJOR, 0); 802 803 class_unregister(&video_class); 804 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES); 805} 806 807module_init(videodev_init) 808module_exit(videodev_exit) 809 810MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@infradead.org>"); 811MODULE_DESCRIPTION("Device registrar for Video4Linux drivers v2"); 812MODULE_LICENSE("GPL"); 813MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR); 814 815 816/* 817 * Local variables: 818 * c-basic-offset: 8 819 * End: 820 */