# HG changeset patch # User Dean Anderson <dean@xxxxxxxxxxxx> # Date 1270053044 25200 # Node ID 0690e4e1d81e785af1a5f06a13573dcf2cc5cb0c # Parent c72bdc8732abc0cf7bc376babfd06b2d999bdcf4 s2255drv: adding v4l2_device structure. video_register_device cleanup From: Dean Anderson <dean@xxxxxxxxxxxx> adding v4l2_device structure. if one video_register_device call fails, allows use of other devices or channels. Priority: normal Signed-off-by: Dean Anderson <dean@xxxxxxxxxxxx> 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: -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html