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