Kaynağa Gözat

msm: camera: common: Fix enable/disable for dsp clock source

Currently, if dsp clock source is not found in device tree, still
we are trying to enable/disable clock source. Check for availability
of that optional clock before toggling it.

CRs-Fixed: 2762106
Change-Id: I2a4467f5383343bdf1e6607712270f574c76e51e
Signed-off-by: Mukund Madhusudan Atre <[email protected]>
Mukund Madhusudan Atre 4 yıl önce
ebeveyn
işleme
4f8f47ab0f

+ 21 - 5
drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/cam_vfe_soc.c

@@ -298,11 +298,18 @@ int cam_vfe_soc_enable_clk(struct cam_hw_soc_info *soc_info,
 	if (!soc_info) {
 		CAM_ERR(CAM_ISP, "Error Invalid params");
 		rc = -EINVAL;
-		return rc;
+		goto end;
 	}
 	soc_private = soc_info->soc_private;
 
-	if (strcmp(clk_name, CAM_VFE_DSP_CLK_NAME) == 0) {
+	if (!strcmp(clk_name, CAM_VFE_DSP_CLK_NAME)) {
+		if (soc_private->dsp_clk_index == -1) {
+			CAM_ERR(CAM_ISP,
+			"DSP clock not supported for vfe: %d", soc_info->index);
+			rc = -EPERM;
+			goto end;
+		}
+
 		rc = cam_soc_util_clk_enable(soc_private->dsp_clk,
 			CAM_VFE_DSP_CLK_NAME, soc_private->dsp_clk_rate);
 		if (rc)
@@ -310,6 +317,7 @@ int cam_vfe_soc_enable_clk(struct cam_hw_soc_info *soc_info,
 			"Error enable dsp clk failed rc=%d", rc);
 	}
 
+end:
 	return rc;
 }
 
@@ -322,18 +330,26 @@ int cam_vfe_soc_disable_clk(struct cam_hw_soc_info *soc_info,
 	if (!soc_info) {
 		CAM_ERR(CAM_ISP, "Error Invalid params");
 		rc = -EINVAL;
-		return rc;
+		goto end;
 	}
 	soc_private = soc_info->soc_private;
 
-	if (strcmp(clk_name, CAM_VFE_DSP_CLK_NAME) == 0) {
+	if (!strcmp(clk_name, CAM_VFE_DSP_CLK_NAME)) {
+		if (soc_private->dsp_clk_index == -1) {
+			CAM_ERR(CAM_ISP,
+			"DSP clock not supported for vfe: %d", soc_info->index);
+			rc = -EPERM;
+			goto end;
+		}
+
 		rc = cam_soc_util_clk_disable(soc_private->dsp_clk,
 			CAM_VFE_DSP_CLK_NAME);
 		if (rc)
 			CAM_ERR(CAM_ISP,
-			"Error enable dsp clk failed rc=%d", rc);
+			"Error disable dsp clk failed rc=%d", rc);
 	}
 
+end:
 	return rc;
 }
 

+ 1 - 1
drivers/cam_utils/cam_soc_util.c

@@ -544,7 +544,6 @@ int cam_soc_util_get_option_clk_by_name(struct cam_hw_soc_info *soc_info,
 
 	index = of_property_match_string(of_node, "clock-names-option",
 		clk_name);
-
 	if (index < 0) {
 		CAM_DBG(CAM_UTIL, "No clk data for %s", clk_name);
 		*clk_index = -1;
@@ -557,6 +556,7 @@ int cam_soc_util_get_option_clk_by_name(struct cam_hw_soc_info *soc_info,
 		CAM_ERR(CAM_UTIL, "No clk named %s found. Dev %s", clk_name,
 			soc_info->dev_name);
 		*clk_index = -1;
+		*clk = NULL;
 		return -EFAULT;
 	}
 	*clk_index = index;