On Wednesday 31 March 2010 18:34:39 Dean A. wrote:
> # HG changeset patch
> # User Dean Anderson <[email protected]>
> # Date 1270053044 25200
> # Node ID 0690e4e1d81e785af1a5f06a13573dcf2cc5cb0c
> # Parent  c72bdc8732abc0cf7bc376babfd06b2d999bdcf4
> s2255drv: adding v4l2_device structure. video_register_device cleanup
> 
> From: Dean Anderson <[email protected]>
> 
> adding v4l2_device structure.
> if one video_register_device call fails, allows use of other devices
> or channels.

That's not correct. There is only one v4l2_device per USB device. And the
first argument should be &dev->interface->dev, not &dev->udev->dev.

When you register the video device node you shouldn't set vdev[i]->parent
anymore, instead point vdev[i]->v4l2_dev to the v4l2_device struct.

Regards,

        Hans

> 
> Priority: normal
> 
> Signed-off-by: Dean Anderson <[email protected]>
> 
> diff -r c72bdc8732ab -r 0690e4e1d81e linux/drivers/media/video/s2255drv.c
> --- a/linux/drivers/media/video/s2255drv.c    Wed Mar 31 07:38:11 2010 -0700
> +++ b/linux/drivers/media/video/s2255drv.c    Wed Mar 31 09:30:44 2010 -0700
> @@ -51,6 +51,7 @@
>  #include <linux/smp_lock.h>
>  #include <media/videobuf-vmalloc.h>
>  #include <media/v4l2-common.h>
> +#include <media/v4l2-device.h>
>  #include <media/v4l2-ioctl.h>
>  #include <linux/vmalloc.h>
>  #include <linux/usb.h>
> @@ -77,7 +78,6 @@
>  #define S2255_DEF_BUFS          16
>  #define S2255_SETMODE_TIMEOUT   500
>  #define S2255_VIDSTATUS_TIMEOUT 350
> -#define MAX_CHANNELS         4
>  #define S2255_MARKER_FRAME   cpu_to_le32(0x2255DA4AL)
>  #define S2255_MARKER_RESPONSE        cpu_to_le32(0x2255ACACL)
>  #define S2255_RESPONSE_SETMODE  cpu_to_le32(0x01)
> @@ -225,6 +225,8 @@
>  
>  struct s2255_dev {
>       struct video_device     vdev[MAX_CHANNELS];
> +     struct v4l2_device      v4l2_dev[MAX_CHANNELS];
> +     int                     channels; /* number of channels registered */
>       int                     frames;
>       struct mutex            lock;
>       struct mutex            open_lock;
> @@ -1753,7 +1755,8 @@
>       int state;
>       dprintk(1, "s2255: open called (dev=%s)\n",
>               video_device_node_name(vdev));
> -     for (i = 0; i < MAX_CHANNELS; i++)
> +
> +     for (i = 0; i < dev->channels; i++)
>               if (&dev->vdev[i] == vdev) {
>                       cur_channel = i;
>                       break;
> @@ -1994,7 +1997,11 @@
>       int ret;
>       int i;
>       int cur_nr = video_nr;
> -
> +     for (i = 0; i < MAX_CHANNELS; i++) {
> +             ret = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev[i]);
> +             if (ret)
> +                     goto unreg_v4l2;
> +     }
>       /* initialize all video 4 linux */
>       /* register 4 video devices */
>       for (i = 0; i < MAX_CHANNELS; i++) {
> @@ -2014,16 +2021,29 @@
>                                                   VFL_TYPE_GRABBER,
>                                                   cur_nr + i);
>               video_set_drvdata(&dev->vdev[i], dev);
> -
> -             if (ret != 0) {
> +             if (ret) {
>                       dev_err(&dev->udev->dev,
>                               "failed to register video device!\n");
> -                     return ret;
> +                     break;
>               }
> +             dev->channels++;
> +             v4l2_info(&dev->v4l2_dev[i], "V4L2 device registered as %s\n",
> +                       video_device_node_name(&dev->vdev[i]));
> +
>       }
> +
>       printk(KERN_INFO "Sensoray 2255 V4L driver Revision: %d.%d\n",
>              S2255_MAJOR_VERSION,
>              S2255_MINOR_VERSION);
> +     /* if no channels registered, return error and probe will fail*/
> +     if (dev->channels == 0)
> +             return ret;
> +     if (dev->channels != MAX_CHANNELS)
> +             printk(KERN_WARNING "s2255: Not all channels available.\n");
> +     return 0;
> +unreg_v4l2:
> +     for (i-- ; i > 0; i--)
> +             v4l2_device_unregister(&dev->v4l2_dev[i]);
>       return ret;
>  }
>  
> @@ -2705,13 +2725,9 @@
>       /* loads v4l specific */
>       retval = s2255_probe_v4l(dev);
>       if (retval)
> -             goto errorV4L;
> +             goto errorBOARDINIT;
>       dev_info(&interface->dev, "Sensoray 2255 detected\n");
>       return 0;
> -errorV4L:
> -     for (i = 0; i < MAX_CHANNELS; i++)
> -             if (video_is_registered(&dev->vdev[i]))
> -                     video_unregister_device(&dev->vdev[i]);
>  errorBOARDINIT:
>       s2255_board_shutdown(dev);
>  errorFWMARKER:
> 
> 

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to