diff --git a/drivers/cam_req_mgr/cam_req_mgr_dev.c b/drivers/cam_req_mgr/cam_req_mgr_dev.c index 3a2f1f72a4..4c4bb5afac 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_dev.c +++ b/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); diff --git a/drivers/cam_req_mgr/cam_req_mgr_dev.h b/drivers/cam_req_mgr/cam_req_mgr_dev.h index 0b7a1e9439..86381d9008 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_dev.h +++ b/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. */ diff --git a/drivers/cam_req_mgr/cam_subdev.h b/drivers/cam_req_mgr/cam_subdev.h index 05aee58797..ef8e9fbac7 100644 --- a/drivers/cam_req_mgr/cam_subdev.h +++ b/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; }; /** diff --git a/drivers/camera_main.c b/drivers/camera_main.c index 28b40dbd28..d79d5bd1be 100644 --- a/drivers/camera_main.c +++ b/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: