diff --git a/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c b/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c index ae9986976d..f4ff63757e 100644 --- a/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c +++ b/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c @@ -490,7 +490,7 @@ int32_t cam_handle_cmd_buffers_for_probe(void *cmd_buf, struct cam_sensor_ctrl_t *s_ctrl, int32_t cmd_buf_num, uint32_t cmd, uint32_t cmd_buf_length, size_t remain_len, - uint32_t probe_ver) + uint32_t probe_ver, struct cam_cmd_buf_desc *cmd_desc) { int32_t rc = 0; size_t required_size = 0; @@ -539,6 +539,44 @@ int32_t cam_handle_cmd_buffers_for_probe(void *cmd_buf, } } break; + + case 2: { + struct i2c_settings_array *i2c_reg_settings = NULL; + struct i2c_data_settings *i2c_data = NULL; + struct cam_buf_io_cfg *io_cfg = NULL; + + CAM_DBG(CAM_SENSOR, "reg_bank unlock settings"); + i2c_data = &(s_ctrl->i2c_data); + i2c_reg_settings = &i2c_data->reg_bank_unlock_settings; + i2c_reg_settings->request_id = 0; + rc = cam_sensor_i2c_command_parser(&s_ctrl->io_master_info, + i2c_reg_settings, cmd_desc, 1, io_cfg); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, + "Failed in updating reg_bank unlock settings"); + return rc; + } + } + break; + case 3: { + struct i2c_settings_array *i2c_reg_settings = NULL; + struct i2c_data_settings *i2c_data = NULL; + struct cam_buf_io_cfg *io_cfg = NULL; + + CAM_DBG(CAM_SENSOR, "reg_bank lock settings"); + i2c_data = &(s_ctrl->i2c_data); + i2c_reg_settings = &i2c_data->reg_bank_lock_settings; + i2c_reg_settings->request_id = 0; + rc = cam_sensor_i2c_command_parser(&s_ctrl->io_master_info, + i2c_reg_settings, cmd_desc, 1, io_cfg); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, + "Failed in updating reg_bank lock settings"); + return rc; + } + } + break; + default: CAM_ERR(CAM_SENSOR, "Invalid command buffer"); break; @@ -588,12 +626,6 @@ int32_t cam_handle_mem_ptr(uint64_t handle, uint32_t cmd, rc = -EINVAL; goto end; } - if (pkt->num_cmd_buf != 2) { - CAM_ERR(CAM_SENSOR, "Expected More Command Buffers : %d", - pkt->num_cmd_buf); - rc = -EINVAL; - goto end; - } probe_ver = pkt->header.op_code & 0xFFFFFF; CAM_DBG(CAM_SENSOR, "Received Header opcode: %u", probe_ver); @@ -626,7 +658,8 @@ int32_t cam_handle_mem_ptr(uint64_t handle, uint32_t cmd, ptr = (void *) cmd_buf; rc = cam_handle_cmd_buffers_for_probe(ptr, s_ctrl, - i, cmd, cmd_desc[i].length, remain_len, probe_ver); + i, cmd, cmd_desc[i].length, remain_len, probe_ver, &cmd_desc[i]); + if (rc < 0) { CAM_ERR(CAM_SENSOR, "Failed to parse the command Buffer Header"); @@ -832,7 +865,20 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, ); goto free_power_settings; } - + if (s_ctrl->i2c_data.reg_bank_unlock_settings.is_settings_valid) { + rc = cam_sensor_apply_settings(s_ctrl, 0, + CAM_SENSOR_PACKET_OPCODE_SENSOR_REG_BANK_UNLOCK); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, "REG_bank unlock failed"); + goto free_power_settings; + } + rc = delete_request(&(s_ctrl->i2c_data.reg_bank_unlock_settings)); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, + "failed while deleting REG_bank unlock settings"); + goto free_power_settings; + } + } /* Match sensor ID */ rc = cam_sensor_match_id(s_ctrl); if (rc < 0) { @@ -847,6 +893,21 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, goto free_power_settings; } + if (s_ctrl->i2c_data.reg_bank_lock_settings.is_settings_valid) { + rc = cam_sensor_apply_settings(s_ctrl, 0, + CAM_SENSOR_PACKET_OPCODE_SENSOR_REG_BANK_LOCK); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, "REG_bank lock failed"); + goto free_power_settings; + } + rc = delete_request(&(s_ctrl->i2c_data.reg_bank_lock_settings)); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, + "failed while deleting REG_bank lock settings"); + goto free_power_settings; + } + } + rc = cam_sensor_power_down(s_ctrl); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in %s sensor Power Down", @@ -1437,6 +1498,14 @@ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, i2c_set = &s_ctrl->i2c_data.streamoff_settings; break; } + case CAM_SENSOR_PACKET_OPCODE_SENSOR_REG_BANK_UNLOCK: { + i2c_set = &s_ctrl->i2c_data.reg_bank_unlock_settings; + break; + } + case CAM_SENSOR_PACKET_OPCODE_SENSOR_REG_BANK_LOCK: { + i2c_set = &s_ctrl->i2c_data.reg_bank_lock_settings; + break; + } case CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE: case CAM_SENSOR_PACKET_OPCODE_SENSOR_FRAME_SKIP_UPDATE: case CAM_SENSOR_PACKET_OPCODE_SENSOR_PROBE: 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 ddfb0c79d6..8e1946f01c 100644 --- a/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.c +++ b/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.c @@ -223,6 +223,8 @@ static int cam_sensor_i2c_component_bind(struct device *dev, INIT_LIST_HEAD(&(s_ctrl->i2c_data.config_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.streamon_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.streamoff_settings.list_head)); + INIT_LIST_HEAD(&(s_ctrl->i2c_data.reg_bank_unlock_settings.list_head)); + INIT_LIST_HEAD(&(s_ctrl->i2c_data.reg_bank_lock_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.read_settings.list_head)); for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) { @@ -383,6 +385,8 @@ static int cam_sensor_component_bind(struct device *dev, INIT_LIST_HEAD(&(s_ctrl->i2c_data.config_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.streamon_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.streamoff_settings.list_head)); + INIT_LIST_HEAD(&(s_ctrl->i2c_data.reg_bank_unlock_settings.list_head)); + INIT_LIST_HEAD(&(s_ctrl->i2c_data.reg_bank_lock_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.read_settings.list_head)); for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) { diff --git a/drivers/cam_sensor_module/cam_sensor_utils/cam_sensor_cmn_header.h b/drivers/cam_sensor_module/cam_sensor_utils/cam_sensor_cmn_header.h index 1fb54f57df..9e4759d22e 100644 --- a/drivers/cam_sensor_module/cam_sensor_utils/cam_sensor_cmn_header.h +++ b/drivers/cam_sensor_module/cam_sensor_utils/cam_sensor_cmn_header.h @@ -1,6 +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. */ #ifndef _CAM_SENSOR_CMN_HEADER_ @@ -241,6 +242,8 @@ struct i2c_data_settings { struct i2c_settings_array read_settings; struct i2c_settings_array *per_frame; struct i2c_settings_array *frame_skip; + struct i2c_settings_array reg_bank_unlock_settings; + struct i2c_settings_array reg_bank_lock_settings; }; struct cam_sensor_power_ctrl_t { diff --git a/include/uapi/camera/media/cam_sensor.h b/include/uapi/camera/media/cam_sensor.h index 63f24c4282..fe7bd64afa 100644 --- a/include/uapi/camera/media/cam_sensor.h +++ b/include/uapi/camera/media/cam_sensor.h @@ -96,7 +96,9 @@ enum cam_sensor_packet_opcodes { CAM_SENSOR_PACKET_OPCODE_SENSOR_READ, CAM_SENSOR_PACKET_OPCODE_SENSOR_FRAME_SKIP_UPDATE, CAM_SENSOR_PACKET_OPCODE_SENSOR_PROBE_V2, - CAM_SENSOR_PACKET_OPCODE_SENSOR_NOP = 127 + CAM_SENSOR_PACKET_OPCODE_SENSOR_REG_BANK_UNLOCK, + CAM_SENSOR_PACKET_OPCODE_SENSOR_REG_BANK_LOCK, + CAM_SENSOR_PACKET_OPCODE_SENSOR_NOP = 127, }; enum tpg_command_type_t {