浏览代码

msm: camera: reqmgr: Change subdev register logic in camera req manager

Due to deferred probes being dpendent on request manager to register
v4l2 subdev, failures are seen if probes are delayed. Change logic
for subdev registration to avoid failures due to delay.

CRs-Fixed: 2584631
Change-Id: Ia01d5d27ff6a6e6dbbb8e3b25b9aa53ac2fa9e38
Signed-off-by: Mukund Madhusudan Atre <[email protected]>
Signed-off-by: Jigarkumar Zala <[email protected]>
Mukund Madhusudan Atre 5 年之前
父节点
当前提交
80ccf69ac9

+ 24 - 57
drivers/cam_req_mgr/cam_req_mgr_dev.c

@@ -626,15 +626,6 @@ int cam_register_subdev(struct cam_subdev *csd)
 	}
 
 	mutex_lock(&g_dev.dev_lock);
-	if ((g_dev.subdev_nodes_created) &&
-		(csd->sd_flags & V4L2_SUBDEV_FL_HAS_DEVNODE)) {
-		CAM_ERR(CAM_CRM,
-			"dynamic node is not allowed, name: %s, type :%d",
-			csd->name, csd->ent_function);
-		rc = -EINVAL;
-		goto reg_fail;
-	}
-
 	sd = &csd->sd;
 	v4l2_subdev_init(sd, csd->ops);
 	sd->internal_ops = csd->internal_ops;
@@ -646,11 +637,34 @@ int cam_register_subdev(struct cam_subdev *csd)
 	sd->entity.pads = NULL;
 	sd->entity.function = csd->ent_function;
 
+	if (csd->subdev_node_created) {
+		CAM_ERR(CAM_CRM,
+			"Dynamic Node is not allowed, name: %s, type: %d",
+			csd->name, csd->ent_function);
+		rc = -EINVAL;
+		goto reg_fail;
+	}
+
 	rc = v4l2_device_register_subdev(g_dev.v4l2_dev, sd);
 	if (rc) {
 		CAM_ERR(CAM_CRM, "register subdev failed");
 		goto reg_fail;
 	}
+
+	rc = v4l2_device_register_subdev_nodes(g_dev.v4l2_dev);
+	if (rc) {
+		CAM_ERR(CAM_CRM,
+			"Device Register subdev node failed: rc = %d", rc);
+		goto reg_fail;
+
+	}
+
+	if ((sd->flags & V4L2_SUBDEV_FL_HAS_DEVNODE)) {
+		sd->entity.name = video_device_node_name(sd->devnode);
+		CAM_DBG(CAM_CRM, "created node :%s", sd->entity.name);
+	}
+
+	csd->subdev_node_created = true;
 	g_dev.count++;
 
 reg_fail:
@@ -684,7 +698,6 @@ static int cam_req_mgr_remove(struct platform_device *pdev)
 	cam_v4l2_device_cleanup();
 	mutex_destroy(&g_dev.dev_lock);
 	g_dev.state = false;
-	g_dev.subdev_nodes_created = false;
 
 	return 0;
 }
@@ -708,7 +721,6 @@ static int cam_req_mgr_probe(struct platform_device *pdev)
 	g_dev.open_cnt = 0;
 	mutex_init(&g_dev.cam_lock);
 	spin_lock_init(&g_dev.cam_eventq_lock);
-	g_dev.subdev_nodes_created = false;
 	mutex_init(&g_dev.dev_lock);
 
 	rc = cam_req_mgr_util_init();
@@ -723,8 +735,6 @@ static int cam_req_mgr_probe(struct platform_device *pdev)
 		goto req_mgr_core_fail;
 	}
 
-	g_dev.state = true;
-
 	if (g_cam_req_mgr_timer_cachep == NULL) {
 		g_cam_req_mgr_timer_cachep = kmem_cache_create("crm_timer",
 			sizeof(struct cam_req_mgr_timer), 64,
@@ -738,6 +748,7 @@ static int cam_req_mgr_probe(struct platform_device *pdev)
 				g_cam_req_mgr_timer_cachep->name);
 	}
 
+	g_dev.state = true;
 	return rc;
 
 req_mgr_core_fail:
@@ -770,56 +781,12 @@ static struct platform_driver cam_req_mgr_driver = {
 	},
 };
 
-int cam_dev_mgr_create_subdev_nodes(void)
-{
-	int rc;
-	struct v4l2_subdev *sd;
-
-	if (!g_dev.v4l2_dev)
-		return -EINVAL;
-
-	if (g_dev.state != true) {
-		CAM_ERR(CAM_CRM, "camera root device not ready yet");
-		return -ENODEV;
-	}
-
-	mutex_lock(&g_dev.dev_lock);
-	if (g_dev.subdev_nodes_created)	{
-		rc = -EEXIST;
-		goto create_fail;
-	}
-
-	rc = v4l2_device_register_subdev_nodes(g_dev.v4l2_dev);
-	if (rc) {
-		CAM_ERR(CAM_CRM, "failed to register the sub devices");
-		goto create_fail;
-	}
-
-	list_for_each_entry(sd, &g_dev.v4l2_dev->subdevs, list) {
-		if (!(sd->flags & V4L2_SUBDEV_FL_HAS_DEVNODE))
-			continue;
-		sd->entity.name = video_device_node_name(sd->devnode);
-		CAM_DBG(CAM_CRM, "created node :%s", sd->entity.name);
-	}
-
-	g_dev.subdev_nodes_created = true;
-
-create_fail:
-	mutex_unlock(&g_dev.dev_lock);
-	return rc;
-}
-
 int cam_req_mgr_init(void)
 {
 	return platform_driver_register(&cam_req_mgr_driver);
 }
 EXPORT_SYMBOL(cam_req_mgr_init);
 
-int cam_req_mgr_late_init(void)
-{
-	return cam_dev_mgr_create_subdev_nodes();
-}
-
 void cam_req_mgr_exit(void)
 {
 	platform_driver_unregister(&cam_req_mgr_driver);

+ 0 - 8
drivers/cam_req_mgr/cam_req_mgr_dev.h

@@ -12,7 +12,6 @@
  *
  * @video: pointer to struct video device.
  * @v4l2_dev: pointer to struct v4l2 device.
- * @subdev_nodes_created: flag to check the created state.
  * @count: number of subdevices registered.
  * @dev_lock: lock for the subdevice count.
  * @state: state of the root device.
@@ -24,7 +23,6 @@
 struct cam_req_mgr_device {
 	struct video_device *video;
 	struct v4l2_device *v4l2_dev;
-	bool subdev_nodes_created;
 	int count;
 	struct mutex dev_lock;
 	bool state;
@@ -47,12 +45,6 @@ int cam_req_mgr_notify_message(struct cam_req_mgr_message *msg,
  */
 int cam_req_mgr_init(void);
 
-/**
- * @brief : API to register all subdev with v4l2 framework.
- * @return struct platform_device pointer on on success, or ERR_PTR() on error.
- */
-int cam_req_mgr_late_init(void);
-
 /**
  * @brief : API to remove REQ_MGR from platform framework.
  */

+ 1 - 0
drivers/cam_req_mgr/cam_subdev.h

@@ -49,6 +49,7 @@ struct cam_subdev {
 	u32                                    sd_flags;
 	void                                  *token;
 	u32                                    ent_function;
+	bool                                   subdev_node_created;
 };
 
 /**

+ 0 - 9
drivers/camera_main.c

@@ -239,15 +239,6 @@ static int camera_init(void)
 		}
 	}
 
-	rc = cam_req_mgr_late_init();
-	if (rc) {
-		CAM_ERR(CAM_UTIL,
-			"Late_init Sequence/Subdev node creation fail: rc = %d",
-			rc);
-		camera_error_exit(i, j);
-		goto end_init;
-	}
-
 	CAM_INFO(CAM_UTIL, "Camera driver initialized");
 
 end_init: