From eadc13255c4f7679ad815a14df3abd26b5ebf7ca Mon Sep 17 00:00:00 2001 From: Jigar Agrawal Date: Tue, 18 Aug 2020 16:55:47 -0700 Subject: [PATCH] msm: camera: cdm: Fix parsing of supported cdm clients cdm client check for loading number of clients is not correct. It does not take error codes into account. The variable that holds the value is of incorrect data type. CRs-fixed: 2768636 Change-Id: Ie5b752aa6bc7a70fe777c16a70a5bdb2e5a663a4 Signed-off-by: Jigar Agrawal --- drivers/cam_cdm/cam_cdm_soc.c | 62 ++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/drivers/cam_cdm/cam_cdm_soc.c b/drivers/cam_cdm/cam_cdm_soc.c index ec8a9e096a..ba4ff1ac6e 100644 --- a/drivers/cam_cdm/cam_cdm_soc.c +++ b/drivers/cam_cdm/cam_cdm_soc.c @@ -78,51 +78,52 @@ permission_error: } int cam_cdm_soc_load_dt_private(struct platform_device *pdev, - struct cam_cdm_private_dt_data *ptr) + struct cam_cdm_private_dt_data *cdm_pvt_data) { - int i, rc = -EINVAL, num_fifo_entries = 0; + int i, rc = -EINVAL, num_fifo_entries = 0, num_clients = 0; - ptr->dt_num_supported_clients = of_property_count_strings( - pdev->dev.of_node, - "cdm-client-names"); - CAM_DBG(CAM_CDM, "Num supported cdm_client = %d", - ptr->dt_num_supported_clients); - if (ptr->dt_num_supported_clients > - CAM_PER_CDM_MAX_REGISTERED_CLIENTS) { + num_clients = of_property_count_strings( + pdev->dev.of_node, "cdm-client-names"); + if ((num_clients <= 0) || + (num_clients > CAM_PER_CDM_MAX_REGISTERED_CLIENTS)) { CAM_ERR(CAM_CDM, "Invalid count of client names count=%d", - ptr->dt_num_supported_clients); + num_clients); + rc = -EINVAL; goto end; } - if (ptr->dt_num_supported_clients < 0) { - CAM_DBG(CAM_CDM, "No cdm client names found"); - ptr->dt_num_supported_clients = 0; - ptr->dt_cdm_shared = false; - } else { - ptr->dt_cdm_shared = true; - } - for (i = 0; i < ptr->dt_num_supported_clients; i++) { + + cdm_pvt_data->dt_num_supported_clients = (uint32_t)num_clients; + CAM_DBG(CAM_CDM, "Num supported cdm_client = %u", + cdm_pvt_data->dt_num_supported_clients); + + cdm_pvt_data->dt_cdm_shared = true; + + for (i = 0; i < cdm_pvt_data->dt_num_supported_clients; i++) { rc = of_property_read_string_index(pdev->dev.of_node, - "cdm-client-names", i, &(ptr->dt_cdm_client_name[i])); - CAM_DBG(CAM_CDM, "cdm-client-names[%d] = %s", i, - ptr->dt_cdm_client_name[i]); + "cdm-client-names", i, + &(cdm_pvt_data->dt_cdm_client_name[i])); + CAM_DBG(CAM_CDM, "cdm-client-names[%d] = %s", i, + cdm_pvt_data->dt_cdm_client_name[i]); if (rc < 0) { - CAM_ERR(CAM_CDM, "Reading cdm-client-names failed"); + CAM_ERR(CAM_CDM, + "Reading cdm-client-names failed for client: %d", + i); goto end; } } rc = of_property_read_u8(pdev->dev.of_node, "cdm-priority-group", - &ptr->priority_group); + &cdm_pvt_data->priority_group); if (rc < 0) { - ptr->priority_group = 0; + cdm_pvt_data->priority_group = 0; rc = 0; } - ptr->config_fifo = of_property_read_bool(pdev->dev.of_node, + cdm_pvt_data->config_fifo = of_property_read_bool(pdev->dev.of_node, "config-fifo"); - if (ptr->config_fifo) { + if (cdm_pvt_data->config_fifo) { num_fifo_entries = of_property_count_u32_elems( pdev->dev.of_node, "fifo-depths"); @@ -135,7 +136,7 @@ int cam_cdm_soc_load_dt_private(struct platform_device *pdev, } for (i = 0; i < num_fifo_entries; i++) { rc = of_property_read_u32_index(pdev->dev.of_node, - "fifo-depths", i, &ptr->fifo_depth[i]); + "fifo-depths", i, &cdm_pvt_data->fifo_depth[i]); if (rc < 0) { CAM_ERR(CAM_CDM, "Unable to read fifo-depth rc %d", @@ -143,13 +144,14 @@ int cam_cdm_soc_load_dt_private(struct platform_device *pdev, goto end; } CAM_DBG(CAM_CDM, "FIFO%d depth is %d", - i, ptr->fifo_depth[i]); + i, cdm_pvt_data->fifo_depth[i]); } } else { for (i = 0; i < CAM_CDM_BL_FIFO_MAX; i++) { - ptr->fifo_depth[i] = CAM_CDM_BL_FIFO_LENGTH_MAX_DEFAULT; + cdm_pvt_data->fifo_depth[i] = + CAM_CDM_BL_FIFO_LENGTH_MAX_DEFAULT; CAM_DBG(CAM_CDM, "FIFO%d depth is %d", - i, ptr->fifo_depth[i]); + i, cdm_pvt_data->fifo_depth[i]); } } end: