From f54a60cc9e6fd8d77120d58249a8210ff17885f5 Mon Sep 17 00:00:00 2001 From: Mukund Madhusudan Atre Date: Thu, 14 May 2020 16:37:10 -0700 Subject: [PATCH] msm: camera: reqmgr: Add subdev node at the time of register Some driver probes do not have a real dependency on other driver probes. Still, they are blocked from creating subdev nodes if that driver's probe comes after all nodes were created in master component bind. Add subdev node at the time of subdev register itself, to lift this requirement. CRs-Fixed: 2686729 Change-Id: I3505071a79296dd7d5665b13d533a9a022aa1a85 Signed-off-by: Mukund Madhusudan Atre --- drivers/cam_req_mgr/cam_req_mgr_dev.c | 70 +++++---------------------- drivers/cam_req_mgr/cam_req_mgr_dev.h | 2 - 2 files changed, 12 insertions(+), 60 deletions(-) diff --git a/drivers/cam_req_mgr/cam_req_mgr_dev.c b/drivers/cam_req_mgr/cam_req_mgr_dev.c index ba45dbd7b63f..555ad537b830 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_dev.c +++ b/drivers/cam_req_mgr/cam_req_mgr_dev.c @@ -656,14 +656,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); @@ -682,6 +674,18 @@ int cam_register_subdev(struct cam_subdev *csd) goto reg_fail; } + rc = v4l2_device_register_subdev_nodes(g_dev.v4l2_dev); + if (rc) { + CAM_ERR(CAM_CRM, "Failed to register subdev node: %s, rc: %d", + sd->name, 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); + } + g_dev.count++; reg_fail: @@ -706,47 +710,6 @@ int cam_unregister_subdev(struct cam_subdev *csd) } EXPORT_SYMBOL(cam_unregister_subdev); -static int cam_dev_mgr_create_subdev_nodes(void) -{ - int rc; - struct v4l2_subdev *sd; - - if (!g_dev.v4l2_dev) { - CAM_ERR(CAM_CRM, "V4L2 device not initialized"); - return -EINVAL; - } - - if (!g_dev.state) { - CAM_ERR(CAM_CRM, "camera root device not ready"); - 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; -} - static int cam_req_mgr_component_master_bind(struct device *dev) { int rc = 0; @@ -767,7 +730,6 @@ static int cam_req_mgr_component_master_bind(struct device *dev) 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(); @@ -806,13 +768,6 @@ static int cam_req_mgr_component_master_bind(struct device *dev) goto req_mgr_device_deinit; } - rc = cam_dev_mgr_create_subdev_nodes(); - if (rc) { - CAM_ERR(CAM_CRM, "failed in creating devices for subdevs %d", - rc); - goto req_mgr_device_deinit; - } - CAM_DBG(CAM_CRM, "All camera components bound successfully"); rc = sysfs_create_file(&dev->kobj, &camera_debug_sysfs_attr.attr); if (rc < 0) { @@ -855,7 +810,6 @@ static void cam_req_mgr_component_master_unbind(struct device *dev) cam_v4l2_device_cleanup(); mutex_destroy(&g_dev.dev_lock); g_dev.state = false; - g_dev.subdev_nodes_created = false; } static const struct component_master_ops cam_req_mgr_component_master_ops = { diff --git a/drivers/cam_req_mgr/cam_req_mgr_dev.h b/drivers/cam_req_mgr/cam_req_mgr_dev.h index 9b241e6f0a46..464720efb0a2 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: all subdev nodes are created for this device * @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;