msm: camera: common: Fixing memory leak issues and removing dead code

Fixed null pointer dereference, addressed memroy management issues and
removed unused variabels

CRs-Fixed: 3394193
Change-Id: I477d4b8ea781b20b5b2a66331bebb384e1c703c5
Signed-off-by: Atiya Kailany <quic_akailany@quicinc.com>
This commit is contained in:
Atiya Kailany
2023-03-16 15:56:29 -07:00
committed by Camera Software Integration
parent cdf8f9bace
commit a5e1ad91b4
17 changed files with 64 additions and 137 deletions

View File

@@ -892,19 +892,12 @@ int cam_cpas_configure_staling_llcc(
uint32_t staling_distance)
{
int rc;
struct cam_hw_info *cpas_hw = NULL;
struct cam_cpas_private_soc *soc_private = NULL;
uint32_t num_caches = 0;
struct cam_sys_cache_local_info sys_cache_info;
if (!CAM_CPAS_INTF_INITIALIZED()) {
CAM_ERR(CAM_CPAS, "cpas intf not initialized");
return -ENODEV;
}
cpas_hw = (struct cam_hw_info *) g_cpas_intf->hw_intf->hw_priv;
soc_private =
(struct cam_cpas_private_soc *)cpas_hw->soc_info.soc_private;
num_caches = soc_private->num_caches;
if (!cam_cpas_is_notif_staling_supported())
return -EOPNOTSUPP;

View File

@@ -1734,6 +1734,8 @@ int cam_cpas_soc_init_resources(struct cam_hw_soc_info *soc_info,
goto release_res;
}
soc_private = (struct cam_cpas_private_soc *)soc_info->soc_private;
rc = cam_cpas_get_custom_dt_info(cpas_hw, soc_info->pdev,
soc_info->soc_private);
if (rc) {
@@ -1741,8 +1743,6 @@ int cam_cpas_soc_init_resources(struct cam_hw_soc_info *soc_info,
goto free_soc_private;
}
soc_private = (struct cam_cpas_private_soc *)soc_info->soc_private;
soc_info->is_clk_drv_en = soc_private->enable_cam_clk_drv;
rc = cam_soc_util_get_option_clk_by_name(soc_info, CAM_ICP_CLK_NAME,
@@ -1766,6 +1766,8 @@ int cam_cpas_soc_init_resources(struct cam_hw_soc_info *soc_info,
return rc;
free_soc_private:
kfree(soc_private->llcc_info);
kfree(soc_private->smart_qos_info);
kfree(soc_info->soc_private);
release_res:
cam_soc_util_release_platform_resource(soc_info);

View File

@@ -2800,8 +2800,8 @@ static int cam_icp_mgr_process_ofe_indirect_ack_msg(uint32_t *msg_ptr)
ioconfig_ack = (struct hfi_msg_dev_async_ack *)msg_ptr;
ctx_data = U64_TO_PTR(ioconfig_ack->user_data1);
hw_mgr = ctx_data->hw_mgr_priv;
if (cam_presil_mode_enabled()) {
hw_mgr = ctx_data->hw_mgr_priv;
if (atomic_read(&hw_mgr->frame_in_process)) {
if (hw_mgr->frame_in_process_ctx_id == ctx_data->ctx_id) {
CAM_DBG(CAM_PRESIL, "presil: frame process abort ctx %d",
@@ -2862,9 +2862,9 @@ static int cam_icp_mgr_process_direct_ack_msg(uint32_t *msg_ptr)
ioconfig_ack = (struct hfi_msg_dev_async_ack *)msg_ptr;
ctx_data = (struct cam_icp_hw_ctx_data *)
U64_TO_PTR(ioconfig_ack->user_data1);
hw_mgr = ctx_data->hw_mgr_priv;
if (cam_presil_mode_enabled()) {
hw_mgr = ctx_data->hw_mgr_priv;
if (atomic_read(&hw_mgr->frame_in_process)) {
if (hw_mgr->frame_in_process_ctx_id == ctx_data->ctx_id) {
CAM_DBG(CAM_PRESIL, "%s: presil: frame process abort",
@@ -3073,9 +3073,6 @@ static void cam_icp_mgr_process_dbg_buf(struct cam_icp_hw_mgr *hw_mgr)
return;
msg_ptr += (pkt_ptr[ICP_PACKET_SIZE] >>
BYTE_WORD_SHIFT);
pkt_ptr = NULL;
dbg_msg = NULL;
dbg_buf = NULL;
}
}
@@ -7294,7 +7291,8 @@ static int cam_icp_mgr_alloc_devs(struct device_node *np,
CAM_ERR(CAM_ICP, "[%s] Invalid hw dev type: %u",
hw_mgr->hw_mgr_name, icp_hw_type);
rc = -EINVAL;
goto free_devs;
kfree(devices);
return rc;
}
hw_mgr->devices[icp_hw_type] = devices;

View File

@@ -3824,7 +3824,6 @@ end:
do {
if (list_empty(&ctx->pending_req_list)) {
error_request_id = ctx_isp->last_applied_req_id;
req_isp = NULL;
break;
}
req = list_first_entry(&ctx->pending_req_list,

View File

@@ -1949,7 +1949,6 @@ static int cam_ife_mgr_process_base_info(
struct cam_isp_hw_mgr_res *hw_mgr_res;
struct cam_isp_resource_node *res = NULL;
uint32_t i;
struct cam_ife_hw_mgr *hw_mgr;
bool hw_idx_map[CAM_IFE_CSID_HW_NUM_MAX] = {0};
if (list_empty(&ctx->res_list_ife_src) &&
@@ -1958,8 +1957,6 @@ static int cam_ife_mgr_process_base_info(
return -ENODEV;
}
hw_mgr = ctx->hw_mgr;
/* IFE mux in resources */
list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) {
if (hw_mgr_res->res_type == CAM_ISP_RESOURCE_UNINT)

View File

@@ -4201,8 +4201,6 @@ static int cam_ife_csid_ver1_bottom_half_handler(
if (!evt_payload->irq_status[i])
continue;
path_reg = NULL;
switch (i) {
case CAM_IFE_CSID_IRQ_REG_IPP:
path_reg = csid_reg->ipp_reg;
@@ -4225,6 +4223,7 @@ static int cam_ife_csid_ver1_bottom_half_handler(
path_reg = csid_reg->udi_reg[id];
break;
default:
path_reg = NULL;
break;
}

View File

@@ -501,7 +501,6 @@ static int cam_ife_csid_ver2_path_err_top_half(
struct cam_ife_csid_ver2_hw *csid_hw = NULL;
struct cam_ife_csid_ver2_evt_payload *evt_payload;
struct cam_isp_resource_node *res;
struct cam_ife_csid_ver2_reg_info *csid_reg = NULL;
const uint8_t **irq_reg_tag;
struct cam_ife_csid_ver2_path_cfg *path_cfg;
@@ -514,8 +513,6 @@ static int cam_ife_csid_ver2_path_err_top_half(
hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv;
csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info;
csid_reg = (struct cam_ife_csid_ver2_reg_info *)
csid_hw->core_info->csid_reg;
path_cfg = (struct cam_ife_csid_ver2_path_cfg *)res->res_priv;
rc = cam_ife_csid_ver2_get_evt_payload(csid_hw, &evt_payload,
@@ -553,7 +550,6 @@ static int cam_ife_csid_ver2_path_top_half(
struct cam_ife_csid_ver2_hw *csid_hw = NULL;
struct cam_ife_csid_ver2_evt_payload *evt_payload;
struct cam_isp_resource_node *res;
struct cam_ife_csid_ver2_reg_info *csid_reg = NULL;
const uint8_t **irq_reg_tag;
struct cam_ife_csid_ver2_path_cfg *path_cfg;
@@ -566,8 +562,6 @@ static int cam_ife_csid_ver2_path_top_half(
hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv;
csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info;
csid_reg = (struct cam_ife_csid_ver2_reg_info *)
csid_hw->core_info->csid_reg;
path_cfg = (struct cam_ife_csid_ver2_path_cfg *)res->res_priv;
rc = cam_ife_csid_ver2_get_evt_payload(csid_hw, &evt_payload,
@@ -784,12 +778,6 @@ end:
static int cam_ife_csid_ver2_stop_csi2_in_err(
struct cam_ife_csid_ver2_hw *csid_hw)
{
const struct cam_ife_csid_ver2_reg_info *csid_reg;
struct cam_hw_soc_info *soc_info;
soc_info = &csid_hw->hw_info->soc_info;
csid_reg = (struct cam_ife_csid_ver2_reg_info *)
csid_hw->core_info->csid_reg;
CAM_DBG(CAM_ISP, "CSID:%u Stop csi2 rx",
csid_hw->hw_intf->hw_idx);
@@ -904,12 +892,6 @@ static int cam_ife_csid_ver2_disable_csi2(
bool maskout_irqs,
struct cam_ife_csid_ver2_hw *csid_hw)
{
const struct cam_ife_csid_ver2_reg_info *csid_reg;
struct cam_hw_soc_info *soc_info;
soc_info = &csid_hw->hw_info->soc_info;
csid_reg = (struct cam_ife_csid_ver2_reg_info *)
csid_hw->core_info->csid_reg;
CAM_DBG(CAM_ISP, "CSID:%u Disable csi2 rx",
csid_hw->hw_intf->hw_idx);
@@ -1924,7 +1906,6 @@ static int cam_ife_csid_ver2_ipp_bottom_half(
uint32_t irq_status_ipp;
uint32_t err_mask;
uint32_t err_type = 0;
void __iomem *base;
int rc = 0;
bool out_of_sync_fatal = false;
@@ -1941,7 +1922,6 @@ static int cam_ife_csid_ver2_ipp_bottom_half(
csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info;
csid_reg = csid_hw->core_info->csid_reg;
soc_info = &csid_hw->hw_info->soc_info;
base = soc_info->reg_map[CAM_IFE_CSID_CLC_MEM_BASE_ID].mem_base;
path_cfg = (struct cam_ife_csid_ver2_path_cfg *)res->res_priv;
if (!path_cfg || (path_cfg->irq_reg_idx >= CAM_IFE_CSID_IRQ_REG_MAX)) {
@@ -2044,7 +2024,6 @@ static int cam_ife_csid_ver2_ppp_bottom_half(
struct cam_ife_csid_ver2_hw *csid_hw = NULL;
struct cam_hw_soc_info *soc_info;
struct cam_hw_info *hw_info;
void __iomem *base;
uint32_t irq_status_ppp;
uint32_t err_mask;
uint32_t err_type = 0;
@@ -2062,7 +2041,6 @@ static int cam_ife_csid_ver2_ppp_bottom_half(
hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv;
csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info;
soc_info = &csid_hw->hw_info->soc_info;
base = soc_info->reg_map[CAM_IFE_CSID_CLC_MEM_BASE_ID].mem_base;
path_cfg = (struct cam_ife_csid_ver2_path_cfg *)res->res_priv;
if (!path_cfg || (path_cfg->irq_reg_idx >= CAM_IFE_CSID_IRQ_REG_MAX)) {
@@ -2129,7 +2107,6 @@ static int cam_ife_csid_ver2_rdi_bottom_half(
const struct cam_ife_csid_ver2_path_reg_info *rdi_reg;
struct cam_hw_soc_info *soc_info;
struct cam_hw_info *hw_info;
void __iomem *base;
uint32_t irq_status_rdi;
uint32_t err_mask;
uint32_t err_type = 0;
@@ -2163,7 +2140,6 @@ static int cam_ife_csid_ver2_rdi_bottom_half(
csid_reg = (struct cam_ife_csid_ver2_reg_info *)
csid_hw->core_info->csid_reg;
soc_info = &csid_hw->hw_info->soc_info;
base = soc_info->reg_map[CAM_IFE_CSID_CLC_MEM_BASE_ID].mem_base;
irq_status_rdi = payload->irq_reg_val;
rdi_reg = csid_reg->path_reg[res->res_id];
@@ -3043,10 +3019,6 @@ static int cam_ife_csid_ver2_in_port_validate(
struct cam_ife_csid_ver2_hw *csid_hw)
{
int rc = 0;
struct cam_ife_csid_ver2_reg_info *csid_reg;
csid_reg = (struct cam_ife_csid_ver2_reg_info *)
csid_hw->core_info->csid_reg;
/* check in port args for RT streams*/
if (!reserve->is_offline) {
@@ -3596,7 +3568,6 @@ static int cam_ife_csid_ver2_init_config_pxl_path(
cam_io_w_mb(val, mem_base + path_reg->multi_vcdt_cfg0_addr);
}
val = 0;
/*configure cfg1 addr
* Binning
* Crop/Drop parameters
@@ -4381,7 +4352,6 @@ static int cam_ife_csid_ver2_enable_csi2(struct cam_ife_csid_ver2_hw *csid_hw)
CAM_DBG(CAM_ISP, "CSID[%u] rx_cfg0: 0x%x",
csid_hw->hw_intf->hw_idx, val);
val = 0;
/*Configure Rx cfg1*/
val = 1 << csi2_reg->misr_enable_shift_val;
val |= 1 << csi2_reg->ecc_correction_shift_en;
@@ -6064,8 +6034,6 @@ static int cam_ife_csid_ver2_user_dump(
struct cam_ife_csid_ver2_path_cfg *path_cfg;
struct cam_isp_resource_node *res;
struct cam_isp_hw_dump_args *dump_args;
struct cam_ife_csid_ver2_reg_info *csid_reg;
struct cam_hw_soc_info *soc_info;
int rc = 0;
if (!csid_hw || !cmd_args) {
@@ -6079,8 +6047,6 @@ static int cam_ife_csid_ver2_user_dump(
}
dump_args = (struct cam_isp_hw_dump_args *)cmd_args;
csid_reg = (struct cam_ife_csid_ver2_reg_info *)csid_hw->core_info->csid_reg;
soc_info = &csid_hw->hw_info->soc_info;
rc = cam_common_user_dump_helper(dump_args, cam_common_user_dump_clock,
csid_hw->hw_info, sizeof(uint64_t), "CLK_RATE_PRINT:");
@@ -6895,6 +6861,10 @@ int cam_ife_csid_hw_ver2_init(struct cam_hw_intf *hw_intf,
csid_hw->hw_intf->hw_ops.test_irq_line = cam_ife_csid_ver2_irq_line_test;
rc = cam_ife_csid_hw_init_irq(csid_hw);
if (rc) {
CAM_ERR(CAM_ISP, "Failed to init CSID irq");
return rc;
}
rc = cam_ife_csid_ver2_hw_init_path_res(csid_hw);

View File

@@ -1647,7 +1647,6 @@ int cam_sfe_top_start(
struct cam_isp_resource_node *sfe_res;
struct cam_hw_info *hw_info = NULL;
struct cam_sfe_path_data *path_data;
struct cam_hw_soc_info *soc_info = NULL;
uint32_t error_mask[CAM_SFE_IRQ_REGISTERS_MAX];
uint32_t sof_eof_mask[CAM_SFE_IRQ_REGISTERS_MAX];
uint32_t core_cfg = 0, i = 0;
@@ -1659,7 +1658,6 @@ int cam_sfe_top_start(
top_priv = (struct cam_sfe_top_priv *)priv;
sfe_res = (struct cam_isp_resource_node *) start_args;
soc_info = top_priv->common_data.soc_info;
hw_info = (struct cam_hw_info *)sfe_res->hw_intf->hw_priv;
if (!hw_info) {

View File

@@ -505,7 +505,7 @@ static int cam_vfe_fe_handle_irq_top_half(uint32_t evt_id,
static int cam_vfe_fe_handle_irq_bottom_half(void *handler_priv,
void *evt_payload_priv)
{
int ret = CAM_VFE_IRQ_STATUS_ERR;
int ret = CAM_VFE_IRQ_STATUS_SUCCESS;
struct cam_isp_resource_node *fe_node;
struct cam_vfe_mux_fe_data *fe_priv;
struct cam_vfe_top_irq_evt_payload *payload;
@@ -514,6 +514,7 @@ static int cam_vfe_fe_handle_irq_bottom_half(void *handler_priv,
if (!handler_priv || !evt_payload_priv) {
CAM_ERR(CAM_ISP, "Invalid params");
ret = CAM_VFE_IRQ_STATUS_ERR;
return ret;
}
@@ -541,31 +542,22 @@ static int cam_vfe_fe_handle_irq_bottom_half(void *handler_priv,
} else {
CAM_DBG(CAM_ISP, "Received SOF");
}
ret = CAM_VFE_IRQ_STATUS_SUCCESS;
}
if (irq_status0 & fe_priv->reg_data->epoch0_irq_mask) {
if (irq_status0 & fe_priv->reg_data->epoch0_irq_mask)
CAM_DBG(CAM_ISP, "Received EPOCH");
ret = CAM_VFE_IRQ_STATUS_SUCCESS;
}
if (irq_status0 & fe_priv->reg_data->reg_update_irq_mask) {
if (irq_status0 & fe_priv->reg_data->reg_update_irq_mask)
CAM_DBG(CAM_ISP, "Received REG_UPDATE_ACK");
ret = CAM_VFE_IRQ_STATUS_SUCCESS;
}
if (irq_status0 & fe_priv->reg_data->eof_irq_mask) {
if (irq_status0 & fe_priv->reg_data->eof_irq_mask)
CAM_DBG(CAM_ISP, "Received EOF");
ret = CAM_VFE_IRQ_STATUS_SUCCESS;
}
if (irq_status1 & fe_priv->reg_data->error_irq_mask1) {
CAM_DBG(CAM_ISP, "Received ERROR");
ret = CAM_ISP_HW_ERROR_OVERFLOW;
ret = CAM_VFE_IRQ_STATUS_ERR;
cam_vfe_fe_reg_dump(fe_node);
/* No HW mgr notification on error */
} else {
ret = CAM_ISP_HW_ERROR_NONE;
}
CAM_DBG(CAM_ISP, "returing status = %d", ret);

View File

@@ -591,8 +591,6 @@ int cam_vfe_top_ver3_stop(void *device_priv,
top_priv = (struct cam_vfe_top_ver3_priv *)device_priv;
mux_res = (struct cam_isp_resource_node *)stop_args;
soc_info = top_priv->top_common.soc_info;
soc_info = top_priv->top_common.soc_info;
soc_private = soc_info->soc_private;

View File

@@ -182,7 +182,7 @@ static int cam_vfe_top_ver4_pdaf_lcr_config(struct cam_vfe_top_ver4_priv *top_pr
}
reg_val_pair[reg_val_idx++] = hw_info->common_reg->pdaf_input_cfg_0;
reg_val_pair[reg_val_idx++] = hw_info->pdaf_lcr_res_mask[i].val;
reg_val_pair[reg_val_idx] = hw_info->pdaf_lcr_res_mask[i].val;
cdm_util_ops->cdm_write_regrandom(cdm_args->cmd.cmd_buf_addr,
num_reg_vals, reg_val_pair);
cdm_args->cmd.used_bytes = size * 4;

View File

@@ -601,6 +601,7 @@ static int32_t cam_eeprom_handle_continuous_write(
if (i2c_list == NULL ||
i2c_list->seq_settings.reg_data == NULL) {
CAM_ERR(CAM_SENSOR, "Failed in allocating i2c_list");
kfree(i2c_list);
return -ENOMEM;
}
@@ -643,6 +644,7 @@ static int32_t cam_eeprom_handle_continuous_write(
*list = &(i2c_list->list);
return rc;
deallocate_i2c_list:
kfree(i2c_list->seq_settings.reg_data);
kfree(i2c_list);
return rc;
}

View File

@@ -933,8 +933,6 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
int rc = 0, i = 0;
uintptr_t generic_ptr;
uint32_t total_cmd_buf_in_bytes = 0;
uint32_t processed_cmd_buf_in_bytes = 0;
uint16_t cmd_length_in_bytes = 0;
uint32_t *cmd_buf = NULL;
uint32_t *offset = NULL;
uint32_t frm_offset = 0;
@@ -1012,7 +1010,6 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
/* Loop through multiple command buffers */
for (i = 1; i < csl_packet->num_cmd_buf; i++) {
total_cmd_buf_in_bytes = cmd_desc[i].length;
processed_cmd_buf_in_bytes = 0;
if (!total_cmd_buf_in_bytes)
continue;
rc = cam_mem_get_cpu_buf(cmd_desc[i].mem_handle,
@@ -1040,9 +1037,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
/* Loop through cmd formats in one cmd buffer */
CAM_DBG(CAM_FLASH,
"command Type: %d,Processed: %d,Total: %d",
cmn_hdr->cmd_type, processed_cmd_buf_in_bytes,
total_cmd_buf_in_bytes);
"command Type: %d,Total: %d",
cmn_hdr->cmd_type, total_cmd_buf_in_bytes);
switch (cmn_hdr->cmd_type) {
case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_INFO:
if (len_of_buffer <
@@ -1053,12 +1049,6 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
flash_init = (struct cam_flash_init *)cmd_buf;
fctrl->flash_type = flash_init->flash_type;
cmd_length_in_bytes =
sizeof(struct cam_flash_init);
processed_cmd_buf_in_bytes +=
cmd_length_in_bytes;
cmd_buf += cmd_length_in_bytes/
sizeof(uint32_t);
break;
case CAMERA_SENSOR_CMD_TYPE_I2C_INFO:
rc = cam_flash_slaveInfo_pkt_parser(
@@ -1069,27 +1059,15 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
rc);
return rc;
}
cmd_length_in_bytes =
sizeof(struct cam_cmd_i2c_info);
processed_cmd_buf_in_bytes +=
cmd_length_in_bytes;
cmd_buf += cmd_length_in_bytes/
sizeof(uint32_t);
break;
case CAMERA_SENSOR_CMD_TYPE_PWR_UP:
case CAMERA_SENSOR_CMD_TYPE_PWR_DOWN:
CAM_DBG(CAM_FLASH,
"Received power settings");
cmd_length_in_bytes =
total_cmd_buf_in_bytes;
rc = cam_sensor_update_power_settings(
cmd_buf,
total_cmd_buf_in_bytes,
&fctrl->power_info, remain_len);
processed_cmd_buf_in_bytes +=
cmd_length_in_bytes;
cmd_buf += cmd_length_in_bytes/
sizeof(uint32_t);
if (rc) {
CAM_ERR(CAM_FLASH,
"Failed update power settings");
@@ -1113,13 +1091,6 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
"pkt parsing failed: %d", rc);
return rc;
}
cmd_length_in_bytes =
cmd_desc[i].length;
processed_cmd_buf_in_bytes +=
cmd_length_in_bytes;
cmd_buf += cmd_length_in_bytes/
sizeof(uint32_t);
break;
}
}

View File

@@ -641,7 +641,7 @@ static int cam_flash_i2c_component_bind(struct device *dev,
rc = rc ? rc : -EINVAL;
CAM_ERR(CAM_FLASH, "get failed for regulator %s %d",
soc_info->rgltr_name[i], rc);
goto free_ctrl;
goto free_ctrl_cci_client;
}
CAM_DBG(CAM_FLASH, "get for regulator %s",
soc_info->rgltr_name[i]);
@@ -653,7 +653,7 @@ static int cam_flash_i2c_component_bind(struct device *dev,
if (!soc_info->gpio_data->cam_gpio_common_tbl_size) {
CAM_DBG(CAM_FLASH, "No GPIO found");
rc = -EINVAL;
goto free_ctrl;
goto free_ctrl_cci_client;
}
rc = cam_sensor_util_init_gpio_pin_tbl(soc_info,
@@ -661,13 +661,13 @@ static int cam_flash_i2c_component_bind(struct device *dev,
if ((rc < 0) || (!fctrl->power_info.gpio_num_info)) {
CAM_ERR(CAM_FLASH, "No/Error Flash GPIOs");
rc = -EINVAL;
goto free_ctrl;
goto free_ctrl_cci_client;
}
}
rc = cam_flash_init_subdev(fctrl);
if (rc)
goto free_ctrl;
goto free_ctrl_cci_client;
fctrl->i2c_data.per_frame =
kzalloc(sizeof(struct i2c_settings_array) *
@@ -704,6 +704,8 @@ static int cam_flash_i2c_component_bind(struct device *dev,
unreg_subdev:
cam_unregister_subdev(&(fctrl->v4l2_dev_str));
free_ctrl_cci_client:
kfree(fctrl->io_master_info.cci_client);
free_ctrl:
kfree(fctrl);
fctrl = NULL;

View File

@@ -421,11 +421,19 @@ static int32_t cam_spi_page_program(struct camera_io_master *client,
memcpy(tx + header_len, data, len);
CAM_DBG(CAM_SENSOR, "tx(%u): %02x %02x %02x %02x",
len, tx[0], tx[1], tx[2], tx[3]);
while ((rc = spi_write(spi, tx, len + header_len)) && retries) {
rc = cam_spi_wait(client, pg, addr_type);
msleep(client->spi_client->retry_delay);
retries--;
}
do {
rc = spi_write(spi, tx, len + header_len);
if (rc) {
if (retries == 0) {
break;
} else {
retries--;
cam_spi_wait(client, pg, addr_type);
msleep(client->spi_client->retry_delay);
}
}
} while (rc);
if (rc < 0) {
CAM_ERR(CAM_SENSOR, "failed %d", rc);
return rc;

View File

@@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include <linux/kernel.h>
@@ -2470,7 +2470,6 @@ int cam_sensor_util_power_down(struct cam_sensor_power_ctrl_t *ctrl,
return -EINVAL;
}
ps = NULL;
CAM_DBG(CAM_SENSOR_UTIL, "seq_type %d", pd->seq_type);
switch (pd->seq_type) {
case SENSOR_MCLK:

View File

@@ -843,7 +843,7 @@ DEFINE_SIMPLE_ATTRIBUTE(cam_soc_util_clk_lvl_control_low,
static int cam_soc_util_create_clk_lvl_debugfs(struct cam_hw_soc_info *soc_info)
{
int rc = 0;
struct dentry *dbgfileptr = NULL, *clkdirptr = NULL;
struct dentry *clkdirptr = NULL;
if (!cam_debugfs_available())
return 0;
@@ -864,23 +864,20 @@ static int cam_soc_util_create_clk_lvl_debugfs(struct cam_hw_soc_info *soc_info)
}
}
dbgfileptr = debugfs_create_dir(soc_info->dev_name, clkdirptr);
if (IS_ERR_OR_NULL(dbgfileptr)) {
soc_info->dentry = debugfs_create_dir(soc_info->dev_name, clkdirptr);
if (IS_ERR_OR_NULL(soc_info->dentry)) {
CAM_ERR(CAM_UTIL, "DebugFS could not create directory for dev:%s!",
soc_info->dev_name);
rc = -ENOENT;
goto end;
}
/* Store parent inode for cleanup in caller */
soc_info->dentry = dbgfileptr;
dbgfileptr = debugfs_create_file("clk_lvl_options", 0444,
debugfs_create_file("clk_lvl_options", 0444,
soc_info->dentry, soc_info, &cam_soc_util_clk_lvl_options);
dbgfileptr = debugfs_create_file("clk_lvl_control", 0644,
debugfs_create_file("clk_lvl_control", 0644,
soc_info->dentry, soc_info, &cam_soc_util_clk_lvl_control);
dbgfileptr = debugfs_create_file("clk_lvl_control_low", 0644,
debugfs_create_file("clk_lvl_control_low", 0644,
soc_info->dentry, soc_info, &cam_soc_util_clk_lvl_control_low);
rc = PTR_ERR_OR_ZERO(dbgfileptr);
end:
return rc;
}
@@ -2102,8 +2099,10 @@ static int cam_soc_util_get_gpio_info(struct cam_hw_soc_info *soc_info)
CAM_DBG(CAM_UTIL, "gpio count %d", gpio_array_size);
gpio_array = kcalloc(gpio_array_size, sizeof(uint16_t), GFP_KERNEL);
if (!gpio_array)
goto free_gpio_conf;
if (!gpio_array) {
rc = -ENOMEM;
goto err;
}
for (i = 0; i < gpio_array_size; i++) {
gpio_array[i] = of_get_gpio(of_node, i);
@@ -2111,21 +2110,23 @@ static int cam_soc_util_get_gpio_info(struct cam_hw_soc_info *soc_info)
}
gconf = kzalloc(sizeof(*gconf), GFP_KERNEL);
if (!gconf)
return -ENOMEM;
if (!gconf) {
rc = -ENOMEM;
goto free_gpio_array;
}
rc = cam_soc_util_get_dt_gpio_req_tbl(of_node, gconf, gpio_array,
gpio_array_size);
if (rc) {
CAM_ERR(CAM_UTIL, "failed in msm_camera_get_dt_gpio_req_tbl");
goto free_gpio_array;
goto free_gpio_conf;
}
gconf->cam_gpio_common_tbl = kcalloc(gpio_array_size,
sizeof(struct gpio), GFP_KERNEL);
if (!gconf->cam_gpio_common_tbl) {
rc = -ENOMEM;
goto free_gpio_array;
goto free_gpio_conf;
}
for (i = 0; i < gpio_array_size; i++)
@@ -2137,10 +2138,11 @@ static int cam_soc_util_get_gpio_info(struct cam_hw_soc_info *soc_info)
return rc;
free_gpio_array:
kfree(gpio_array);
free_gpio_conf:
kfree(gconf);
free_gpio_array:
kfree(gpio_array);
err:
soc_info->gpio_data = NULL;
return rc;
@@ -2215,7 +2217,6 @@ static int cam_soc_util_get_dt_regulator_info
if (count != -EINVAL) {
if (count <= 0) {
CAM_ERR(CAM_UTIL, "no regulators found");
count = 0;
return -EINVAL;
}
@@ -2381,11 +2382,9 @@ int cam_soc_util_get_dt_properties(struct cam_hw_soc_info *soc_info)
rc = of_property_read_string_index(of_node, "compatible", 0,
(const char **)&soc_info->compatible);
if (rc) {
if (rc)
CAM_DBG(CAM_UTIL, "No compatible string present for: %s",
soc_info->dev_name);
rc = 0;
}
soc_info->is_nrt_dev = false;
if (of_property_read_bool(of_node, "nrt-device"))