|
@@ -198,6 +198,49 @@ static int cam_ois_power_down(struct cam_ois_ctrl_t *o_ctrl)
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int cam_ois_update_time(struct i2c_settings_array *i2c_set)
|
|
|
|
+{
|
|
|
|
+ struct i2c_settings_list *i2c_list;
|
|
|
|
+ int32_t rc = 0;
|
|
|
|
+ uint32_t size = 0;
|
|
|
|
+ uint32_t i = 0;
|
|
|
|
+ uint64_t qtime_ns = 0;
|
|
|
|
+
|
|
|
|
+ if (i2c_set == NULL) {
|
|
|
|
+ CAM_ERR(CAM_OIS, "Invalid Args");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rc = cam_sensor_util_get_current_qtimer_ns(&qtime_ns);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_OIS,
|
|
|
|
+ "Failed to get current qtimer value: %d",
|
|
|
|
+ rc);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(i2c_list,
|
|
|
|
+ &(i2c_set->list_head), list) {
|
|
|
|
+ if (i2c_list->op_code == CAM_SENSOR_I2C_WRITE_SEQ) {
|
|
|
|
+ size = i2c_list->i2c_settings.size;
|
|
|
|
+ /* qtimer is 8 bytes so validate here*/
|
|
|
|
+ if (size < 8) {
|
|
|
|
+ CAM_ERR(CAM_OIS, "Invalid write time settings");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ for (i = 0; i < size; i++) {
|
|
|
|
+ CAM_DBG(CAM_OIS, "time: reg_data[%d]: 0x%x",
|
|
|
|
+ i, (qtime_ns & 0xFF));
|
|
|
|
+ i2c_list->i2c_settings.reg_setting[i].reg_data =
|
|
|
|
+ (qtime_ns & 0xFF);
|
|
|
|
+ qtime_ns >>= 8;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
static int cam_ois_apply_settings(struct cam_ois_ctrl_t *o_ctrl,
|
|
static int cam_ois_apply_settings(struct cam_ois_ctrl_t *o_ctrl,
|
|
struct i2c_settings_array *i2c_set)
|
|
struct i2c_settings_array *i2c_set)
|
|
{
|
|
{
|
|
@@ -225,6 +268,17 @@ static int cam_ois_apply_settings(struct cam_ois_ctrl_t *o_ctrl,
|
|
"Failed in Applying i2c wrt settings");
|
|
"Failed in Applying i2c wrt settings");
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
+ } else if (i2c_list->op_code == CAM_SENSOR_I2C_WRITE_SEQ) {
|
|
|
|
+ rc = camera_io_dev_write_continuous(
|
|
|
|
+ &(o_ctrl->io_master_info),
|
|
|
|
+ &(i2c_list->i2c_settings),
|
|
|
|
+ 0);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_OIS,
|
|
|
|
+ "Failed to seq write I2C settings: %d",
|
|
|
|
+ rc);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
} else if (i2c_list->op_code == CAM_SENSOR_I2C_POLL) {
|
|
} else if (i2c_list->op_code == CAM_SENSOR_I2C_POLL) {
|
|
size = i2c_list->i2c_settings.size;
|
|
size = i2c_list->i2c_settings.size;
|
|
for (i = 0; i < size; i++) {
|
|
for (i = 0; i < size; i++) {
|
|
@@ -680,6 +734,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
|
|
&csl_packet->payload +
|
|
&csl_packet->payload +
|
|
csl_packet->io_configs_offset);
|
|
csl_packet->io_configs_offset);
|
|
|
|
|
|
|
|
+ /* validate read data io config */
|
|
if (io_cfg == NULL) {
|
|
if (io_cfg == NULL) {
|
|
CAM_ERR(CAM_OIS, "I/O config is invalid(NULL)");
|
|
CAM_ERR(CAM_OIS, "I/O config is invalid(NULL)");
|
|
rc = -EINVAL;
|
|
rc = -EINVAL;
|
|
@@ -693,7 +748,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
|
|
i2c_read_settings.request_id = 0;
|
|
i2c_read_settings.request_id = 0;
|
|
rc = cam_sensor_i2c_command_parser(&o_ctrl->io_master_info,
|
|
rc = cam_sensor_i2c_command_parser(&o_ctrl->io_master_info,
|
|
&i2c_read_settings,
|
|
&i2c_read_settings,
|
|
- cmd_desc, 1, io_cfg);
|
|
|
|
|
|
+ cmd_desc, 1, &io_cfg[0]);
|
|
if (rc < 0) {
|
|
if (rc < 0) {
|
|
CAM_ERR(CAM_OIS, "OIS read pkt parsing failed: %d", rc);
|
|
CAM_ERR(CAM_OIS, "OIS read pkt parsing failed: %d", rc);
|
|
return rc;
|
|
return rc;
|
|
@@ -708,6 +763,17 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (csl_packet->num_io_configs > 1) {
|
|
|
|
+ rc = cam_sensor_util_write_qtimer_to_io_buffer(
|
|
|
|
+ &io_cfg[1]);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_OIS,
|
|
|
|
+ "write qtimer failed rc: %d", rc);
|
|
|
|
+ delete_request(&i2c_read_settings);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
rc = delete_request(&i2c_read_settings);
|
|
rc = delete_request(&i2c_read_settings);
|
|
if (rc < 0) {
|
|
if (rc < 0) {
|
|
CAM_ERR(CAM_OIS,
|
|
CAM_ERR(CAM_OIS,
|
|
@@ -716,6 +782,48 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ case CAM_OIS_PACKET_OPCODE_WRITE_TIME: {
|
|
|
|
+ if (o_ctrl->cam_ois_state < CAM_OIS_CONFIG) {
|
|
|
|
+ rc = -EINVAL;
|
|
|
|
+ CAM_ERR(CAM_OIS,
|
|
|
|
+ "Not in right state to write time to OIS: %d",
|
|
|
|
+ o_ctrl->cam_ois_state);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+ offset = (uint32_t *)&csl_packet->payload;
|
|
|
|
+ offset += (csl_packet->cmd_buf_offset / sizeof(uint32_t));
|
|
|
|
+ cmd_desc = (struct cam_cmd_buf_desc *)(offset);
|
|
|
|
+ i2c_reg_settings = &(o_ctrl->i2c_time_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, 1, NULL);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rc = cam_ois_update_time(i2c_reg_settings);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_OIS, "Cannot update time");
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rc = cam_ois_apply_settings(o_ctrl, i2c_reg_settings);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_OIS, "Cannot apply mode settings");
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rc = delete_request(i2c_reg_settings);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ CAM_ERR(CAM_OIS,
|
|
|
|
+ "Fail deleting Mode data: rc: %d", rc);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
default:
|
|
default:
|
|
CAM_ERR(CAM_OIS, "Invalid Opcode: %d",
|
|
CAM_ERR(CAM_OIS, "Invalid Opcode: %d",
|
|
(csl_packet->header.op_code & 0xFFFFFF));
|
|
(csl_packet->header.op_code & 0xFFFFFF));
|