diff --git a/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_dev.c b/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_dev.c index 822fc9ede4..65b2079ba8 100644 --- a/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_dev.c +++ b/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_dev.c @@ -306,8 +306,14 @@ static void cam_eeprom_i2c_component_unbind(struct device *dev, CAM_INFO(CAM_EEPROM, "i2c driver remove invoked"); soc_info = &e_ctrl->soc_info; - for (i = 0; i < soc_info->num_clk; i++) + for (i = 0; i < soc_info->num_clk; i++) { + if (!soc_info->clk[i]) { + CAM_DBG(CAM_EEPROM, "%s handle is NULL skip put", + soc_info->clk_name[i]); + continue; + } devm_clk_put(soc_info->dev, soc_info->clk[i]); + } mutex_lock(&(e_ctrl->eeprom_mutex)); cam_eeprom_shutdown(e_ctrl); @@ -555,8 +561,14 @@ static void cam_eeprom_component_unbind(struct device *dev, CAM_DBG(CAM_EEPROM, "Component unbind called for: %s", pdev->name); soc_info = &e_ctrl->soc_info; - for (i = 0; i < soc_info->num_clk; i++) + for (i = 0; i < soc_info->num_clk; i++) { + if (!soc_info->clk[i]) { + CAM_DBG(CAM_EEPROM, "%s handle is NULL skip put", + soc_info->clk_name[i]); + continue; + } devm_clk_put(soc_info->dev, soc_info->clk[i]); + } mutex_lock(&(e_ctrl->eeprom_mutex)); cam_eeprom_shutdown(e_ctrl); diff --git a/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_soc.c b/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_soc.c index fcad1eb261..8fca8cf34d 100644 --- a/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_soc.c +++ b/drivers/cam_sensor_module/cam_eeprom/cam_eeprom_soc.c @@ -381,11 +381,15 @@ int cam_eeprom_parse_dt(struct cam_eeprom_ctrl_t *e_ctrl) for (i = 0; i < soc_info->num_clk; i++) { soc_info->clk[i] = devm_clk_get(soc_info->dev, soc_info->clk_name[i]); - if (!soc_info->clk[i]) { + if (IS_ERR(soc_info->clk[i])) { CAM_ERR(CAM_EEPROM, "get failed for %s", soc_info->clk_name[i]); rc = -ENOENT; return rc; + } else if (!soc_info->clk[i]) { + CAM_DBG(CAM_EEPROM, "%s handle is NULL skip get", + soc_info->clk_name[i]); + continue; } } diff --git a/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c b/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c index 53448bcbad..4309482da9 100644 --- a/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c +++ b/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c @@ -271,8 +271,14 @@ static void cam_ois_i2c_component_unbind(struct device *dev, CAM_INFO(CAM_OIS, "i2c driver remove invoked"); soc_info = &o_ctrl->soc_info; - for (i = 0; i < soc_info->num_clk; i++) + for (i = 0; i < soc_info->num_clk; i++) { + if (!soc_info->clk[i]) { + CAM_DBG(CAM_OIS, "%s handle is NULL skip put", + soc_info->clk_name[i]); + continue; + } devm_clk_put(soc_info->dev, soc_info->clk[i]); + } mutex_lock(&(o_ctrl->ois_mutex)); cam_ois_shutdown(o_ctrl); @@ -429,8 +435,14 @@ static void cam_ois_component_unbind(struct device *dev, CAM_INFO(CAM_OIS, "platform driver remove invoked"); soc_info = &o_ctrl->soc_info; - for (i = 0; i < soc_info->num_clk; i++) + for (i = 0; i < soc_info->num_clk; i++) { + if (!soc_info->clk[i]) { + CAM_DBG(CAM_OIS, "%s handle is NULL skip put", + soc_info->clk_name[i]); + continue; + } devm_clk_put(soc_info->dev, soc_info->clk[i]); + } mutex_lock(&(o_ctrl->ois_mutex)); cam_ois_shutdown(o_ctrl); diff --git a/drivers/cam_sensor_module/cam_ois/cam_ois_soc.c b/drivers/cam_sensor_module/cam_ois/cam_ois_soc.c index 0a37283d3b..734a282475 100644 --- a/drivers/cam_sensor_module/cam_ois/cam_ois_soc.c +++ b/drivers/cam_sensor_module/cam_ois/cam_ois_soc.c @@ -85,11 +85,15 @@ static int cam_ois_get_dt_data(struct cam_ois_ctrl_t *o_ctrl) for (i = 0; i < soc_info->num_clk; i++) { soc_info->clk[i] = devm_clk_get(soc_info->dev, soc_info->clk_name[i]); - if (!soc_info->clk[i]) { - CAM_ERR(CAM_SENSOR, "get failed for %s", + if (IS_ERR(soc_info->clk[i])) { + CAM_ERR(CAM_OIS, "get failed for %s", soc_info->clk_name[i]); rc = -ENOENT; return rc; + } else if (!soc_info->clk[i]) { + CAM_DBG(CAM_OIS, "%s handle is NULL skip get", + soc_info->clk_name[i]); + continue; } } diff --git a/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.c b/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.c index f3689825e2..33b09db4fb 100644 --- a/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.c +++ b/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.c @@ -503,8 +503,14 @@ static void cam_sensor_component_unbind(struct device *dev, mutex_unlock(&(s_ctrl->cam_sensor_mutex)); cam_unregister_subdev(&(s_ctrl->v4l2_dev_str)); soc_info = &s_ctrl->soc_info; - for (i = 0; i < soc_info->num_clk; i++) + for (i = 0; i < soc_info->num_clk; i++) { + if (!soc_info->clk[i]) { + CAM_DBG(CAM_SENSOR, "%s handle is NULL skip put", + soc_info->clk_name[i]); + continue; + } devm_clk_put(soc_info->dev, soc_info->clk[i]); + } kfree(s_ctrl->i2c_data.per_frame); kfree(s_ctrl->i2c_data.frame_skip); diff --git a/drivers/cam_sensor_module/cam_sensor/cam_sensor_soc.c b/drivers/cam_sensor_module/cam_sensor/cam_sensor_soc.c index 05ca0c6015..df992a70ca 100644 --- a/drivers/cam_sensor_module/cam_sensor/cam_sensor_soc.c +++ b/drivers/cam_sensor_module/cam_sensor/cam_sensor_soc.c @@ -296,11 +296,15 @@ int32_t cam_sensor_parse_dt(struct cam_sensor_ctrl_t *s_ctrl) for (i = 0; i < soc_info->num_clk; i++) { soc_info->clk[i] = devm_clk_get(soc_info->dev, soc_info->clk_name[i]); - if (!soc_info->clk[i]) { + if (IS_ERR(soc_info->clk[i])) { CAM_ERR(CAM_SENSOR, "get failed for %s", soc_info->clk_name[i]); rc = -ENOENT; return rc; + } else if (!soc_info->clk[i]) { + CAM_DBG(CAM_SENSOR, "%s handle is NULL skip get", + soc_info->clk_name[i]); + continue; } } /* Initialize regulators to default parameters */ diff --git a/drivers/cam_utils/cam_soc_util.c b/drivers/cam_utils/cam_soc_util.c index 3d29dec4e0..63d6d476ac 100644 --- a/drivers/cam_utils/cam_soc_util.c +++ b/drivers/cam_utils/cam_soc_util.c @@ -875,13 +875,15 @@ static int cam_soc_util_set_clk_rate(struct cam_hw_soc_info *soc_info, long clk_rate_round = -1; bool set_rate = false; - if (!clk || !clk_name) { + if (!clk_name) { CAM_ERR(CAM_UTIL, "Invalid input clk %pK clk_name %pK", clk, clk_name); return -EINVAL; } CAM_DBG(CAM_UTIL, "set %s, rate %lld", clk_name, clk_rate); + if (!clk) + return 0; if (clk_rate > 0) { clk_rate_round = clk_round_rate(clk, clk_rate); CAM_DBG(CAM_UTIL, "new_rate %ld", clk_rate_round); @@ -1231,7 +1233,8 @@ int cam_soc_util_clk_enable(struct cam_hw_soc_info *soc_info, if (clk_idx == soc_info->src_clk_idx) is_src_clk = true; } - + if (!clk) + return 0; rc = cam_soc_util_set_clk_rate(soc_info, clk, clk_name, clk_rate, CAM_IS_BIT_SET(shared_clk_mask, clk_idx), is_src_clk, clk_id, applied_clock_rate); @@ -1274,6 +1277,8 @@ int cam_soc_util_clk_disable(struct cam_hw_soc_info *soc_info, } CAM_DBG(CAM_UTIL, "disable %s", clk_name); + if (!clk) + return 0; clk_disable_unprepare(clk); if (CAM_IS_BIT_SET(shared_clk_mask, clk_idx)) { @@ -2660,11 +2665,15 @@ int cam_soc_util_request_platform_resource( for (i = 0; i < soc_info->num_clk; i++) { soc_info->clk[i] = clk_get(soc_info->dev, soc_info->clk_name[i]); - if (!soc_info->clk[i]) { + if (IS_ERR(soc_info->clk[i])) { CAM_ERR(CAM_UTIL, "get failed for %s", soc_info->clk_name[i]); rc = -ENOENT; goto put_clk; + } else if (!soc_info->clk[i]) { + CAM_DBG(CAM_UTIL, "%s handle is NULL skip get", + soc_info->clk_name[i]); + continue; } /* Create a wrapper entry if this is a shared clock */ @@ -2796,7 +2805,11 @@ int cam_soc_util_release_platform_resource(struct cam_hw_soc_info *soc_info) if (CAM_IS_BIT_SET(soc_info->shared_clk_mask, i)) cam_soc_util_clk_wrapper_unregister_entry( soc_info->clk_id[i], soc_info); - + if (!soc_info->clk[i]) { + CAM_DBG(CAM_UTIL, "%s handle is NULL skip put", + soc_info->clk_name[i]); + continue; + } clk_put(soc_info->clk[i]); soc_info->clk[i] = NULL; }