Em Mon, 15 Jun 2009 13:25:28 +0200
Hans Verkuil <hverk...@xs4all.nl> escreveu:

> Hi all,
> 
> While looking at the video_register_device changes that broke ov511 I realized
> that the video_register_device_index function is never called from drivers. It
> will always assign a default index number. I also don't see a good use-case
> for giving it an explicit index. My proposal is to remove this API. Since it
> is never called, nothing will change effectively. I'm never happy with unused
> functions.

It sounds ok to me.

> However, I think we do need a new video_register_device_range function. This
> would be identical to video_register_device, but with an additional count
> argument: this allows drivers to select a kernel number in the range of
> nr to nr + count - 1. If cnt == -1, then the maximum is the compiled-in
> maximum.
> 
> So video_register_device would call video_register_device_range(...nr, 1),
> thus restoring the original behavior, while ivtv and cx18 can call
> video_register_device_range(...nr, -1), thus keeping the current behavior.

I don't think that this is needed. The issue with ov511 is that it was using
the error condition of video_register to identify how much ov511 devices were
already registered.

I already fixed it by adding an explicit device number count on it, just like
all the other drivers. With this, ov511 will behave like the other drivers.

With the current implementation, it should honor the explicit minor order
passed via modprobe parameter, as before.

There's one small change on the behavior that it is also present on all other
devices that allow users to explicit the desired minor order: instead of
failing if that device is already used, it will get the next available one.
IMO, this is better than just failing. So, the only remaining issue is that
video_register should print a warning if it had to get a different minor than
specified.

In other words, the enclosed patch seems to be a good approach to close this
issue



Cheers,
Mauro

---

v4l2-dev: Print a warning if need to use a different minor than specified

From: Mauro Carvalho Chehab <mche...@redhat.com>

video_register_device has two behaviors: dynamic minor attribution or 
forced minor attribution. The latter mode is used to allow users to 
force probing a device using a certain minor order. Even for the last 
case, video_register_device won't fail if that minor is already used 
but, instead, it will seek for the next available minor, without warning 
users about that.

While don't fail due to a busy minor seems the better behavior, it 
should be printing a warning when this happen.

While here, let's remove video_register_device_index(), since no driver 
is using it.

Signed-off-by: Mauro Carvalho Chehab <mche...@redhat.com>

---
 linux/drivers/media/video/v4l2-dev.c |   31 ++++++++++++++++---------------
 linux/include/media/v4l2-dev.h       |    5 ++---
 2 files changed, 18 insertions(+), 18 deletions(-)

--- master.orig/linux/drivers/media/video/v4l2-dev.c
+++ master/linux/drivers/media/video/v4l2-dev.c
@@ -384,23 +384,18 @@ static int get_index(struct video_device
        return i == VIDEO_NUM_DEVICES ? -ENFILE : i;
 }
 
-int video_register_device(struct video_device *vdev, int type, int nr)
-{
-       return video_register_device_index(vdev, type, nr, -1);
-}
-EXPORT_SYMBOL(video_register_device);
 
 /**
- *     video_register_device_index - register video4linux devices
+ *     video_register_device - register video4linux devices
  *     @vdev: video device structure we want to register
  *     @type: type of device to register
  *     @nr:   which device number (0 == /dev/video0, 1 == /dev/video1, ...
  *             -1 == first free)
- *     @index: stream number based on parent device;
- *             -1 if auto assign, requested number otherwise
  *
  *     The registration code assigns minor numbers based on the type
- *     requested. -ENFILE is returned in all the device slots for this
+ *     requested. If the requested one is already used, get the next
+ *     available one and prints a warning.
+ *     -ENFILE is returned in all the device slots for this
  *     category are full. If not then the minor field is set and the
  *     driver initialize function is called (if non %NULL).
  *
@@ -416,10 +411,10 @@ EXPORT_SYMBOL(video_register_device);
  *
  *     %VFL_TYPE_RADIO - A radio card
  */
-int video_register_device_index(struct video_device *vdev, int type, int nr,
-                                       int index)
+int video_register_device(struct video_device *vdev, const int type,
+                         const int desirednr)
 {
-       int i = 0;
+       int i = 0, nr;
        int ret;
        int minor_offset = 0;
        int minor_cnt = VIDEO_NUM_DEVICES;
@@ -493,7 +488,8 @@ int video_register_device_index(struct v
 
        /* Pick a minor number */
        mutex_lock(&videodev_lock);
-       nr = find_next_zero_bit(video_nums[type], minor_cnt, nr == -1 ? 0 : nr);
+       nr = find_next_zero_bit(video_nums[type], minor_cnt,
+                               desirednr == -1 ? 0 : desirednr);
        if (nr == minor_cnt)
                nr = find_first_zero_bit(video_nums[type], minor_cnt);
        if (nr == minor_cnt) {
@@ -501,6 +497,11 @@ int video_register_device_index(struct v
                mutex_unlock(&videodev_lock);
                return -ENFILE;
        }
+
+       if (desirednr >= 0 && nr != desirednr)
+               printk(KERN_INFO "Minor %d is already used. Using instead %d\n",
+                      desirednr, nr);
+
 #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
        /* 1-on-1 mapping of kernel number to minor number */
        i = nr;
@@ -520,7 +521,7 @@ int video_register_device_index(struct v
        set_bit(nr, video_nums[type]);
        /* Should not happen since we thought this minor was free */
        WARN_ON(video_device[vdev->minor] != NULL);
-       ret = vdev->index = get_index(vdev, index);
+       ret = vdev->index = get_index(vdev, -1);
        mutex_unlock(&videodev_lock);
 
        if (ret < 0) {
@@ -612,7 +613,7 @@ cleanup:
        vdev->minor = -1;
        return ret;
 }
-EXPORT_SYMBOL(video_register_device_index);
+EXPORT_SYMBOL(video_register_device);
 
 /**
  *     video_unregister_device - unregister a video4linux device
--- master.orig/linux/include/media/v4l2-dev.h
+++ master/linux/include/media/v4l2-dev.h
@@ -103,9 +103,8 @@ struct video_device
    you call video_device_release() on failure.
 
    Also note that vdev->minor is set to -1 if the registration failed. */
-int __must_check video_register_device(struct video_device *vdev, int type, 
int nr);
-int __must_check video_register_device_index(struct video_device *vdev,
-                                               int type, int nr, int index);
+int __must_check video_register_device(struct video_device *vdev,
+                                      const int type, const int nr);
 
 /* Unregister video devices. Will do nothing if vdev == NULL or
    vdev->minor < 0. */

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to