Merge "msm: camera: sensor: support for OIS FW init settings" into camera-kernel.lnx.5.0

This commit is contained in:
Haritha Chintalapati
2021-01-19 15:06:53 -08:00
committed by Gerrit - the friendly Code Review server
4 changed files with 83 additions and 10 deletions

78
drivers/cam_sensor_module/cam_ois/cam_ois_core.c Normal file → Executable file
View File

@@ -398,6 +398,8 @@ static int cam_ois_fw_download(struct cam_ois_ctrl_t *o_ctrl)
return -ENOMEM;
}
CAM_DBG(CAM_OIS, "FW prog size:%d.", total_bytes);
i2c_reg_setting.reg_setting = (struct cam_sensor_i2c_reg_array *) (
vaddr);
@@ -413,7 +415,8 @@ static int cam_ois_fw_download(struct cam_ois_ctrl_t *o_ctrl)
rc = camera_io_dev_write_continuous(&(o_ctrl->io_master_info),
&i2c_reg_setting, 1);
if (rc < 0) {
CAM_ERR(CAM_OIS, "OIS FW download failed %d", rc);
CAM_ERR(CAM_OIS, "OIS FW(prog) size(%d) download failed. %d",
total_bytes, rc);
goto release_firmware;
}
vfree(vaddr);
@@ -441,6 +444,8 @@ static int cam_ois_fw_download(struct cam_ois_ctrl_t *o_ctrl)
return -ENOMEM;
}
CAM_DBG(CAM_OIS, "FW coeff size:%d", total_bytes);
i2c_reg_setting.reg_setting = (struct cam_sensor_i2c_reg_array *) (
vaddr);
@@ -455,8 +460,10 @@ static int cam_ois_fw_download(struct cam_ois_ctrl_t *o_ctrl)
rc = camera_io_dev_write_continuous(&(o_ctrl->io_master_info),
&i2c_reg_setting, 1);
if (rc < 0)
CAM_ERR(CAM_OIS, "OIS FW download failed %d", rc);
CAM_ERR(CAM_OIS, "OIS FW(coeff) size(%d) download failed rc: %d",
total_bytes, rc);
release_firmware:
vfree(vaddr);
@@ -527,13 +534,15 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
return -EINVAL;
}
switch (csl_packet->header.op_code & 0xFFFFFF) {
case CAM_OIS_PACKET_OPCODE_INIT:
offset = (uint32_t *)&csl_packet->payload;
offset += (csl_packet->cmd_buf_offset / sizeof(uint32_t));
cmd_desc = (struct cam_cmd_buf_desc *)(offset);
CAM_DBG(CAM_OIS, "num_cmd_buf %d",
csl_packet->num_cmd_buf);
/* Loop through multiple command buffers */
for (i = 0; i < csl_packet->num_cmd_buf; i++) {
total_cmd_buf_in_bytes = cmd_desc[i].length;
@@ -591,7 +600,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
default:
if (o_ctrl->i2c_init_data.is_settings_valid == 0) {
CAM_DBG(CAM_OIS,
"Received init settings");
"Received init/config settings");
i2c_reg_settings =
&(o_ctrl->i2c_init_data);
i2c_reg_settings->is_settings_valid = 1;
@@ -622,6 +631,21 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
"Calib parsing failed: %d", rc);
return rc;
}
} else if (o_ctrl->i2c_fwinit_data.is_settings_valid == 0) {
CAM_DBG(CAM_OIS, "received fwinit settings");
i2c_reg_settings =
&(o_ctrl->i2c_fwinit_data);
i2c_reg_settings->is_settings_valid = 1;
i2c_reg_settings->request_id = 0;
rc = cam_sensor_i2c_command_parser(
&o_ctrl->io_master_info,
i2c_reg_settings,
&cmd_desc[i], 1, NULL);
if (rc < 0) {
CAM_ERR(CAM_OIS,
"fw init parsing failed: %d", rc);
return rc;
}
}
break;
}
@@ -636,6 +660,27 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
o_ctrl->cam_ois_state = CAM_OIS_CONFIG;
}
if (o_ctrl->i2c_fwinit_data.is_settings_valid == 1) {
rc = cam_ois_apply_settings(o_ctrl,
&o_ctrl->i2c_fwinit_data);
if ((rc == -EAGAIN) &&
(o_ctrl->io_master_info.master_type == CCI_MASTER)) {
CAM_WARN(CAM_OIS,
"CCI HW is restting: Reapplying fwinit settings");
usleep_range(1000, 1010);
rc = cam_ois_apply_settings(o_ctrl,
&o_ctrl->i2c_fwinit_data);
}
if (rc) {
CAM_ERR(CAM_OIS,
"Cannot apply fwinit data %d",
rc);
goto pwr_dwn;
} else {
CAM_DBG(CAM_OIS, "OIS fwinit settings success");
}
}
if (o_ctrl->ois_fw_flag) {
rc = cam_ois_fw_download(o_ctrl);
if (rc) {
@@ -658,17 +703,36 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
"Cannot apply Init settings: rc = %d",
rc);
goto pwr_dwn;
} else {
CAM_DBG(CAM_OIS, "apply Init settings success");
}
if (o_ctrl->is_ois_calib) {
rc = cam_ois_apply_settings(o_ctrl,
&o_ctrl->i2c_calib_data);
if ((rc == -EAGAIN) &&
(o_ctrl->io_master_info.master_type == CCI_MASTER)) {
CAM_WARN(CAM_OIS,
"CCI HW is restting: Reapplying calib settings");
usleep_range(1000, 1010);
rc = cam_ois_apply_settings(o_ctrl,
&o_ctrl->i2c_calib_data);
}
if (rc) {
CAM_ERR(CAM_OIS, "Cannot apply calib data");
goto pwr_dwn;
} else {
CAM_DBG(CAM_OIS, "apply calib data settings success");
}
}
rc = delete_request(&o_ctrl->i2c_fwinit_data);
if (rc < 0) {
CAM_WARN(CAM_OIS,
"Fail deleting fwinit data: rc: %d", rc);
rc = 0;
}
rc = delete_request(&o_ctrl->i2c_init_data);
if (rc < 0) {
CAM_WARN(CAM_OIS,
@@ -871,6 +935,9 @@ void cam_ois_shutdown(struct cam_ois_ctrl_t *o_ctrl)
o_ctrl->bridge_intf.session_hdl = -1;
}
if (o_ctrl->i2c_fwinit_data.is_settings_valid == 1)
delete_request(&o_ctrl->i2c_fwinit_data);
if (o_ctrl->i2c_mode_data.is_settings_valid == 1)
delete_request(&o_ctrl->i2c_mode_data);
@@ -1007,6 +1074,9 @@ int cam_ois_driver_cmd(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (o_ctrl->i2c_init_data.is_settings_valid == 1)
delete_request(&o_ctrl->i2c_init_data);
if (o_ctrl->i2c_fwinit_data.is_settings_valid == 1)
delete_request(&o_ctrl->i2c_fwinit_data);
break;
case CAM_STOP_DEV:
if (o_ctrl->cam_ois_state != CAM_OIS_START) {

View File

@@ -286,6 +286,7 @@ static int cam_ois_component_bind(struct device *dev,
INIT_LIST_HEAD(&(o_ctrl->i2c_init_data.list_head));
INIT_LIST_HEAD(&(o_ctrl->i2c_calib_data.list_head));
INIT_LIST_HEAD(&(o_ctrl->i2c_fwinit_data.list_head));
INIT_LIST_HEAD(&(o_ctrl->i2c_mode_data.list_head));
mutex_init(&(o_ctrl->ois_mutex));
rc = cam_ois_driver_soc_init(o_ctrl);

View File

@@ -92,6 +92,7 @@ struct cam_ois_intf_params {
* @cci_i2c_master : I2C structure
* @v4l2_dev_str : V4L2 device structure
* @bridge_intf : bridge interface params
* @i2c_fwinit_data : ois i2c firmware init settings
* @i2c_init_data : ois i2c init settings
* @i2c_mode_data : ois i2c mode settings
* @i2c_time_data : ois i2c time write settings
@@ -114,6 +115,7 @@ struct cam_ois_ctrl_t {
enum cci_device_num cci_num;
struct cam_subdev v4l2_dev_str;
struct cam_ois_intf_params bridge_intf;
struct i2c_settings_array i2c_fwinit_data;
struct i2c_settings_array i2c_init_data;
struct i2c_settings_array i2c_calib_data;
struct i2c_settings_array i2c_mode_data;

View File

@@ -315,6 +315,12 @@ int32_t cam_sensor_util_write_qtimer_to_io_buffer(
return -EINVAL;
}
rc = cam_sensor_util_get_current_qtimer_ns(&qtime_ns);
if (rc < 0) {
CAM_ERR(CAM_SENSOR, "failed to get qtimer rc:%d");
return rc;
}
if (io_cfg->direction == CAM_BUF_OUTPUT) {
rc = cam_mem_get_cpu_buf(io_cfg->mem_handle[0],
&buf_addr, &buf_size);
@@ -344,12 +350,6 @@ int32_t cam_sensor_util_write_qtimer_to_io_buffer(
return -EINVAL;
}
rc = cam_sensor_util_get_current_qtimer_ns(&qtime_ns);
if (rc < 0) {
CAM_ERR(CAM_SENSOR, "failed to get qtimer rc:%d");
return rc;
}
memcpy((void *)target_buf, &qtime_ns, sizeof(uint64_t));
} else {
CAM_ERR(CAM_SENSOR, "Invalid direction: %d",