Merge "msm: camera: sensor: support for OIS FW init settings" into camera-kernel.lnx.5.0
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
597806fe2b
78
drivers/cam_sensor_module/cam_ois/cam_ois_core.c
Normal file → Executable file
78
drivers/cam_sensor_module/cam_ois/cam_ois_core.c
Normal file → Executable 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) {
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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",
|
||||
|
Reference in New Issue
Block a user