diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/v4l2-dev.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c index 1219721894a1..4e61c77b7634 100644 --- a/drivers/media/video/v4l2-dev.c +++ b/drivers/media/video/v4l2-dev.c | |||
@@ -66,7 +66,7 @@ static struct device_attribute video_device_attrs[] = { | |||
66 | */ | 66 | */ |
67 | static struct video_device *video_device[VIDEO_NUM_DEVICES]; | 67 | static struct video_device *video_device[VIDEO_NUM_DEVICES]; |
68 | static DEFINE_MUTEX(videodev_lock); | 68 | static DEFINE_MUTEX(videodev_lock); |
69 | static DECLARE_BITMAP(video_nums[VFL_TYPE_MAX], VIDEO_NUM_DEVICES); | 69 | static DECLARE_BITMAP(devnode_nums[VFL_TYPE_MAX], VIDEO_NUM_DEVICES); |
70 | 70 | ||
71 | struct video_device *video_device_alloc(void) | 71 | struct video_device *video_device_alloc(void) |
72 | { | 72 | { |
@@ -119,8 +119,8 @@ static void v4l2_device_release(struct device *cd) | |||
119 | the release() callback. */ | 119 | the release() callback. */ |
120 | vdev->cdev = NULL; | 120 | vdev->cdev = NULL; |
121 | 121 | ||
122 | /* Mark minor as free */ | 122 | /* Mark device node number as free */ |
123 | clear_bit(vdev->num, video_nums[vdev->vfl_type]); | 123 | clear_bit(vdev->num, devnode_nums[vdev->vfl_type]); |
124 | 124 | ||
125 | mutex_unlock(&videodev_lock); | 125 | mutex_unlock(&videodev_lock); |
126 | 126 | ||
@@ -338,13 +338,14 @@ static int get_index(struct video_device *vdev) | |||
338 | * video_register_device - register video4linux devices | 338 | * video_register_device - register video4linux devices |
339 | * @vdev: video device structure we want to register | 339 | * @vdev: video device structure we want to register |
340 | * @type: type of device to register | 340 | * @type: type of device to register |
341 | * @nr: which device number (0 == /dev/video0, 1 == /dev/video1, ... | 341 | * @nr: which device node number (0 == /dev/video0, 1 == /dev/video1, ... |
342 | * -1 == first free) | 342 | * -1 == first free) |
343 | * | 343 | * |
344 | * The registration code assigns minor numbers based on the type | 344 | * The registration code assigns minor numbers and device node numbers |
345 | * requested. -ENFILE is returned in all the device slots for this | 345 | * based on the requested type and registers the new device node with |
346 | * category are full. If not then the minor field is set and the | 346 | * the kernel. |
347 | * driver initialize function is called (if non %NULL). | 347 | * An error is returned if no free minor or device node number could be |
348 | * found, or if the registration of the device node failed. | ||
348 | * | 349 | * |
349 | * Zero is returned on success. | 350 | * Zero is returned on success. |
350 | * | 351 | * |
@@ -401,7 +402,7 @@ int video_register_device(struct video_device *vdev, int type, int nr) | |||
401 | if (vdev->v4l2_dev && vdev->v4l2_dev->dev) | 402 | if (vdev->v4l2_dev && vdev->v4l2_dev->dev) |
402 | vdev->parent = vdev->v4l2_dev->dev; | 403 | vdev->parent = vdev->v4l2_dev->dev; |
403 | 404 | ||
404 | /* Part 2: find a free minor, kernel number and device index. */ | 405 | /* Part 2: find a free minor, device node number and device index. */ |
405 | #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES | 406 | #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES |
406 | /* Keep the ranges for the first four types for historical | 407 | /* Keep the ranges for the first four types for historical |
407 | * reasons. | 408 | * reasons. |
@@ -432,21 +433,22 @@ int video_register_device(struct video_device *vdev, int type, int nr) | |||
432 | } | 433 | } |
433 | #endif | 434 | #endif |
434 | 435 | ||
435 | /* Pick a minor number */ | 436 | /* Pick a device node number */ |
436 | mutex_lock(&videodev_lock); | 437 | mutex_lock(&videodev_lock); |
437 | nr = find_next_zero_bit(video_nums[type], minor_cnt, nr == -1 ? 0 : nr); | 438 | nr = find_next_zero_bit(devnode_nums[type], minor_cnt, nr == -1 ? 0 : nr); |
438 | if (nr == minor_cnt) | 439 | if (nr == minor_cnt) |
439 | nr = find_first_zero_bit(video_nums[type], minor_cnt); | 440 | nr = find_first_zero_bit(devnode_nums[type], minor_cnt); |
440 | if (nr == minor_cnt) { | 441 | if (nr == minor_cnt) { |
441 | printk(KERN_ERR "could not get a free kernel number\n"); | 442 | printk(KERN_ERR "could not get a free device node number\n"); |
442 | mutex_unlock(&videodev_lock); | 443 | mutex_unlock(&videodev_lock); |
443 | return -ENFILE; | 444 | return -ENFILE; |
444 | } | 445 | } |
445 | #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES | 446 | #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES |
446 | /* 1-on-1 mapping of kernel number to minor number */ | 447 | /* 1-on-1 mapping of device node number to minor number */ |
447 | i = nr; | 448 | i = nr; |
448 | #else | 449 | #else |
449 | /* The kernel number and minor numbers are independent */ | 450 | /* The device node number and minor numbers are independent, so |
451 | we just find the first free minor number. */ | ||
450 | for (i = 0; i < VIDEO_NUM_DEVICES; i++) | 452 | for (i = 0; i < VIDEO_NUM_DEVICES; i++) |
451 | if (video_device[i] == NULL) | 453 | if (video_device[i] == NULL) |
452 | break; | 454 | break; |
@@ -458,7 +460,7 @@ int video_register_device(struct video_device *vdev, int type, int nr) | |||
458 | #endif | 460 | #endif |
459 | vdev->minor = i + minor_offset; | 461 | vdev->minor = i + minor_offset; |
460 | vdev->num = nr; | 462 | vdev->num = nr; |
461 | set_bit(nr, video_nums[type]); | 463 | set_bit(nr, devnode_nums[type]); |
462 | /* Should not happen since we thought this minor was free */ | 464 | /* Should not happen since we thought this minor was free */ |
463 | WARN_ON(video_device[vdev->minor] != NULL); | 465 | WARN_ON(video_device[vdev->minor] != NULL); |
464 | vdev->index = get_index(vdev); | 466 | vdev->index = get_index(vdev); |
@@ -492,7 +494,7 @@ int video_register_device(struct video_device *vdev, int type, int nr) | |||
492 | vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor); | 494 | vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor); |
493 | if (vdev->parent) | 495 | if (vdev->parent) |
494 | vdev->dev.parent = vdev->parent; | 496 | vdev->dev.parent = vdev->parent; |
495 | dev_set_name(&vdev->dev, "%s%d", name_base, nr); | 497 | dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num); |
496 | ret = device_register(&vdev->dev); | 498 | ret = device_register(&vdev->dev); |
497 | if (ret < 0) { | 499 | if (ret < 0) { |
498 | printk(KERN_ERR "%s: device_register failed\n", __func__); | 500 | printk(KERN_ERR "%s: device_register failed\n", __func__); |
@@ -512,7 +514,7 @@ cleanup: | |||
512 | mutex_lock(&videodev_lock); | 514 | mutex_lock(&videodev_lock); |
513 | if (vdev->cdev) | 515 | if (vdev->cdev) |
514 | cdev_del(vdev->cdev); | 516 | cdev_del(vdev->cdev); |
515 | clear_bit(vdev->num, video_nums[type]); | 517 | clear_bit(vdev->num, devnode_nums[type]); |
516 | mutex_unlock(&videodev_lock); | 518 | mutex_unlock(&videodev_lock); |
517 | /* Mark this video device as never having been registered. */ | 519 | /* Mark this video device as never having been registered. */ |
518 | vdev->minor = -1; | 520 | vdev->minor = -1; |