Title: [5989] trunk/drivers/media/video/blackfin: Fix Bug [#4649]: Kernel crashes after install and remove module blackfin_cam for several times

Diff

Modified: trunk/drivers/media/video/blackfin/adv7183b.c (5988 => 5989)


--- trunk/drivers/media/video/blackfin/adv7183b.c	2009-01-09 14:02:48 UTC (rev 5988)
+++ trunk/drivers/media/video/blackfin/adv7183b.c	2009-01-09 15:13:55 UTC (rev 5989)
@@ -190,7 +190,7 @@
 	return 0;
 }
 
-static int adv7183b_create_sysfs(struct video_device *v4ldev)
+static int adv7183b_create_sysfs(struct video_device *v4ldev, int action)
 {
 	return 0;
 }

Modified: trunk/drivers/media/video/blackfin/blackfin_cam.c (5988 => 5989)


--- trunk/drivers/media/video/blackfin/blackfin_cam.c	2009-01-09 14:02:48 UTC (rev 5988)
+++ trunk/drivers/media/video/blackfin/blackfin_cam.c	2009-01-09 15:13:55 UTC (rev 5989)
@@ -356,7 +356,7 @@
 {
 	struct video_device *v4ldev = cam->videodev;
 
-	return cam->cam_ops->create_sysfs(v4ldev);
+	return cam->cam_ops->create_sysfs(v4ldev, 1);
 }
 
 static int bcap_init_v4l(struct sensor_data *data)
@@ -444,7 +444,7 @@
 	if (!data->cam_ops) {
 		err = -ENODEV;
 		goto error_out;
-	};
+	}
 
 	i2c_global_client = new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
@@ -495,33 +495,23 @@
 
 static int sensor_detach_client(struct i2c_client *client)
 {
-	struct sensor_data *data;
+	struct sensor_data *data = ""
 	int err;
 
-	data = ""
-
 	data->cam_ops->cam_control(i2c_global_client, CAM_CMD_EXIT, 1);
+	data->cam_ops->create_sysfs(data->bcap_dev->videodev, 0);
 
 	if ((err = i2c_detach_client(client)))
 		return err;
 
 	video_unregister_device(data->bcap_dev->videodev);
-	kfree(data->bcap_dev->videodev);
 	kfree(data->bcap_dev->ppidev);
 	kfree(data->bcap_dev);
-
 	kfree(data);
 
 	return 0;
 }
 
-static int sensor_command(struct i2c_client *client, unsigned int cmd,
-			  void *arg)
-{
-	/* as yet unimplemented */
-	return -EINVAL;
-}
-
 static struct i2c_driver sensor_driver = {
 	.driver = {
 		   .name = SENSOR_NAME,
@@ -529,7 +519,6 @@
 	.id = I2C_DRIVERID_BCAP,
 	.attach_adapter = sensor_attach_adapter,
 	.detach_client = sensor_detach_client,
-	.command = sensor_command,
 };
 
 #if 0

Modified: trunk/drivers/media/video/blackfin/blackfin_cam.h (5988 => 5989)


--- trunk/drivers/media/video/blackfin/blackfin_cam.h	2009-01-09 14:02:48 UTC (rev 5988)
+++ trunk/drivers/media/video/blackfin/blackfin_cam.h	2009-01-09 15:13:55 UTC (rev 5989)
@@ -214,7 +214,7 @@
 
 struct bcap_camera_ops {
 	int (*cam_control) (struct i2c_client * client, u32 cmd, u32 arg);
-	int (*create_sysfs) (struct video_device * v4ldev);
+	int (*create_sysfs) (struct video_device *v4ldev, int action);
 	int (*power) (u32 arg);
 };
 

Modified: trunk/drivers/media/video/blackfin/mt9v022.c (5988 => 5989)


--- trunk/drivers/media/video/blackfin/mt9v022.c	2009-01-09 14:02:48 UTC (rev 5988)
+++ trunk/drivers/media/video/blackfin/mt9v022.c	2009-01-09 15:13:55 UTC (rev 5989)
@@ -342,7 +342,7 @@
 static DEVICE_ATTR(v_mirror, S_IRUGO | S_IWUSR,
 			 sysfs_v_mirror_show, sysfs_v_mirror_store);
 
-static int mt9v022_create_sysfs(struct video_device *v4ldev)
+static int mt9v022_create_sysfs(struct video_device *v4ldev, int action)
 {
 
 	int rc;

Modified: trunk/drivers/media/video/blackfin/ov9655.c (5988 => 5989)


--- trunk/drivers/media/video/blackfin/ov9655.c	2009-01-09 14:02:48 UTC (rev 5988)
+++ trunk/drivers/media/video/blackfin/ov9655.c	2009-01-09 15:13:55 UTC (rev 5989)
@@ -340,7 +340,7 @@
 static DEVICE_ATTR(v_mirror, S_IRUGO | S_IWUSR,
 			 sysfs_v_mirror_show, sysfs_v_mirror_store);
 
-static int ov9655_create_sysfs(struct video_device *v4ldev)
+static int ov9655_create_sysfs(struct video_device *v4ldev, int action)
 {
 
 	int rc;

Modified: trunk/drivers/media/video/blackfin/vs6524.c (5988 => 5989)


--- trunk/drivers/media/video/blackfin/vs6524.c	2009-01-09 14:02:48 UTC (rev 5988)
+++ trunk/drivers/media/video/blackfin/vs6524.c	2009-01-09 15:13:55 UTC (rev 5989)
@@ -494,10 +494,13 @@
 static DEVICE_ATTR(v_mirror, S_IRUGO | S_IWUSR,
 			 sysfs_v_mirror_show, sysfs_v_mirror_store);
 
-static int vs6524_create_sysfs(struct video_device *v4ldev)
+static int vs6524_create_sysfs(struct video_device *v4ldev, int action)
 {
-	int rc;
+	int rc = 0;
 
+	if (!action)
+		goto remove;
+
 	rc = device_create_file(&v4ldev->dev, &dev_attr_fps);
 	if (rc)
 		goto err;
@@ -513,6 +516,8 @@
 
 	return 0;
 
+remove:
+	device_remove_file(&v4ldev->dev, &dev_attr_h_mirror);
 err_h_mirror:
 	device_remove_file(&v4ldev->dev, &dev_attr_v_mirror);
 err_v_mirror:

Modified: trunk/drivers/media/video/blackfin/vs6624.c (5988 => 5989)


--- trunk/drivers/media/video/blackfin/vs6624.c	2009-01-09 14:02:48 UTC (rev 5988)
+++ trunk/drivers/media/video/blackfin/vs6624.c	2009-01-09 15:13:55 UTC (rev 5989)
@@ -588,10 +588,13 @@
 static DEVICE_ATTR(v_mirror, S_IRUGO | S_IWUSR,
 			 sysfs_v_mirror_show, sysfs_v_mirror_store);
 
-static int vs6624_create_sysfs(struct video_device *v4ldev)
+static int vs6624_create_sysfs(struct video_device *v4ldev, int action)
 {
-	int rc;
+	int rc = 0;
 
+	if (!action)
+		goto remove;
+
 	rc = device_create_file(&v4ldev->dev, &dev_attr_fps);
 	if (rc)
 		goto err;
@@ -607,6 +610,8 @@
 
 	return 0;
 
+remove:
+	device_remove_file(&v4ldev->dev, &dev_attr_h_mirror);
 err_h_mirror:
 	device_remove_file(&v4ldev->dev, &dev_attr_v_mirror);
 err_v_mirror:
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to