diff mbox

s2255drv: v4l2 device added

Message ID tkrat.6506e871933e5a00@sensoray.com (mailing list archive)
State Accepted
Headers show

Commit Message

Dean Anderson March 31, 2010, 4:34 p.m. UTC
None
diff mbox

Patch

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: