Skip to contentSkip to conversation

add missing sysfs support to CPiA webcam video driver

PATCH New Helge Deller 1 participant 1 message Jul 8, 2004 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 add missing sysfs support to CPiA webcam video driver

The attached patch (vs. 2.6.7) adds the missing sysfs support to the CPiA driver by adding the needed remove() function. This avoids the current kernel warnings:
videodev: "CPiA Camera" has no release callback. Please fix your driver for proper sysfs support, see http://lwn.net/Articles/36850/

Tested with a CPiA USB webcam.
Please apply.

Helge

drivers/media/video/cpia.c renamed from drivers/media/video/cpia.c.org +29 -10
@@ -1368,7 +1368,7 @@
 	if (!cpia_proc_root || !cam)
 		return;
 
-	sprintf(name, "video%d", cam->vdev.minor);
+	sprintf(name, "video%d", cam->vdev->minor);
 	
 	ent = create_proc_entry(name, S_IFREG|S_IRUGO|S_IWUSR, cpia_proc_root);
 	if (!ent)
@@ -1393,7 +1393,7 @@
 	if (!cam || !cam->proc_entry)
 		return;
 	
-	sprintf(name, "video%d", cam->vdev.minor);
+	sprintf(name, "video%d", cam->vdev->minor);
 	remove_proc_entry(name, cpia_proc_root);
 	cam->proc_entry = NULL;
 }
@@ -3710,7 +3710,7 @@
 
 		DBG("VIDIOCGUNIT\n");
 
-		vu->video    = cam->vdev.minor;
+		vu->video    = cam->vdev->minor;
 		vu->vbi      = VIDEO_NO_UNIT;
 		vu->radio    = VIDEO_NO_UNIT;
 		vu->audio    = VIDEO_NO_UNIT;
@@ -3804,6 +3804,14 @@
 	return 0;
 }
 
+
+void cpia_video_release(struct video_device *vfd)
+{
+	struct cam_data *cam = vfd->priv;
+	down(&cam->busy_lock);
+	video_device_release(vfd);
+}
+
 static struct file_operations cpia_fops = {
 	.owner		= THIS_MODULE,
 	.open		= cpia_open,
@@ -3820,6 +3828,8 @@
 	.type		= VID_TYPE_CAPTURE,
 	.hardware	= VID_HARDWARE_CPIA,
 	.fops           = &cpia_fops,
+	.release	= cpia_video_release,
+	.minor		= -1,
 };
 
 /* initialise cam_data structure  */
@@ -3930,7 +3940,7 @@
 }
 
 /* initialize cam_data structure  */
-static void init_camera_struct(struct cam_data *cam,
+static int init_camera_struct(struct cam_data *cam,
                                struct cpia_camera_ops *ops )
 {
 	int i;
@@ -3946,8 +3956,13 @@
 
 	cam->proc_entry = NULL;
 
-	memcpy(&cam->vdev, &cpia_template, sizeof(cpia_template));
-	cam->vdev.priv = cam;
+	cam->vdev = video_device_alloc();
+	if (!cam->vdev) {
+		printk(KERN_ERR "cpia: video_device_alloc() failed!\n");
+		return -ENOMEM;
+	}
+	memcpy(cam->vdev, &cpia_template, sizeof(cpia_template));
+	cam->vdev->priv = cam;
 	
 	cam->curframe = 0;
 	for (i = 0; i < FRAME_NUM; i++) {
@@ -3960,6 +3975,7 @@
 	cam->decompressed_frame.height = 0;
 	cam->decompressed_frame.state = FRAME_UNUSED;
 	cam->decompressed_frame.data = NULL;
+	return 0;
 }
 
 struct cam_data *cpia_register_camera(struct cpia_camera_ops *ops, void *lowlevel)
@@ -3970,11 +3986,14 @@
 		return NULL;
 
 	
-	init_camera_struct( camera, ops );
+	if (init_camera_struct( camera, ops )) {
+		kfree(camera);
+		return NULL;
+	}
 	camera->lowlevel_data = lowlevel;
 	
 	/* register v4l device */
-	if (video_register_device(&camera->vdev, VFL_TYPE_GRABBER, video_nr) == -1) {
+	if (video_register_device(camera->vdev, VFL_TYPE_GRABBER, video_nr) == -1) {
 		kfree(camera);
 		printk(KERN_DEBUG "video_register_device failed\n");
 		return NULL;
@@ -4019,7 +4038,7 @@
 void cpia_unregister_camera(struct cam_data *cam)
 {
 	DBG("unregistering video\n");
-	video_unregister_device(&cam->vdev);
+	video_unregister_device(cam->vdev);
 	if (cam->open_count) {
 		put_cam(cam->ops);
 		DBG("camera open -- setting ops to NULL\n");
@@ -4027,7 +4046,7 @@
 	}
 	
 #ifdef CONFIG_PROC_FS
-	DBG("destroying /proc/cpia/video%d\n", cam->vdev.minor);
+	DBG("destroying /proc/cpia/video%d\n", cam->vdev->minor);
 	destroy_proc_cpia_cam(cam);
 #endif	
 	if (!cam->open_count) {
drivers/media/video/cpia.h renamed from drivers/media/video/cpia.h.org +1 -1
@@ -268,7 +268,7 @@
 					/* v4l */
 	int video_size;			/* VIDEO_SIZE_ */
 	volatile enum v4l_camstates camstate;	/* v4l layer status */
-	struct video_device vdev;	/* v4l videodev */
+	struct video_device *vdev;	/* v4l videodev */
 	struct video_picture vp;	/* v4l camera settings */
 	struct video_window vw;		/* v4l capture area */
 	struct video_capture vc;       	/* v4l subcapture area */