diff --git a/drivers/cam_sensor_module/cam_ois/cam_ois_core.c b/drivers/cam_sensor_module/cam_ois/cam_ois_core.c index fe3a50356011..8154c7695d67 100644 --- a/drivers/cam_sensor_module/cam_ois/cam_ois_core.c +++ b/drivers/cam_sensor_module/cam_ois/cam_ois_core.c @@ -965,6 +965,41 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg) return rc; } break; + case CAM_OIS_PACKET_OPCODE_OIS_GYRO_OFFSET: + if (o_ctrl->cam_ois_state < CAM_OIS_CONFIG) { + rc = -EINVAL; + CAM_WARN(CAM_OIS, + "Not in right state to control 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_gyro_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_apply_settings(o_ctrl, i2c_reg_settings); + if (rc < 0) { + CAM_ERR(CAM_OIS, "Cannot apply gyro offset settings"); + return rc; + } + + rc = delete_request(i2c_reg_settings); + if (rc < 0) { + CAM_ERR(CAM_OIS, + "Fail deleting gyro offset data: rc: %d", rc); + return rc; + } + break; case CAM_OIS_PACKET_OPCODE_READ: { struct cam_buf_io_cfg *io_cfg; struct i2c_settings_array i2c_read_settings; @@ -1541,6 +1576,9 @@ void cam_ois_shutdown(struct cam_ois_ctrl_t *o_ctrl) if (o_ctrl->i2c_mode_data.is_settings_valid == 1) delete_request(&o_ctrl->i2c_mode_data); + if (o_ctrl->i2c_gyro_data.is_settings_valid == 1) + delete_request(&o_ctrl->i2c_gyro_data); + if (o_ctrl->i2c_calib_data.is_settings_valid == 1) delete_request(&o_ctrl->i2c_calib_data); @@ -1668,6 +1706,9 @@ int cam_ois_driver_cmd(struct cam_ois_ctrl_t *o_ctrl, void *arg) if (o_ctrl->i2c_mode_data.is_settings_valid == 1) delete_request(&o_ctrl->i2c_mode_data); + if (o_ctrl->i2c_gyro_data.is_settings_valid == 1) + delete_request(&o_ctrl->i2c_gyro_data); + if (o_ctrl->i2c_calib_data.is_settings_valid == 1) delete_request(&o_ctrl->i2c_calib_data); diff --git a/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c b/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c index 689fd492ae47..f19832eaa824 100644 --- a/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c +++ b/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c @@ -490,6 +490,7 @@ static int cam_ois_component_bind(struct device *dev, INIT_LIST_HEAD(&(o_ctrl->i2c_calib_data.list_head)); INIT_LIST_HEAD(&(o_ctrl->i2c_postcalib_data.list_head)); INIT_LIST_HEAD(&(o_ctrl->i2c_mode_data.list_head)); + INIT_LIST_HEAD(&(o_ctrl->i2c_gyro_data.list_head)); mutex_init(&(o_ctrl->ois_mutex)); rc = cam_ois_driver_soc_init(o_ctrl); if (rc) { diff --git a/drivers/cam_sensor_module/cam_ois/cam_ois_dev.h b/drivers/cam_sensor_module/cam_ois/cam_ois_dev.h index 61abd92b9222..45ec896baa48 100644 --- a/drivers/cam_sensor_module/cam_ois/cam_ois_dev.h +++ b/drivers/cam_sensor_module/cam_ois/cam_ois_dev.h @@ -148,6 +148,7 @@ struct cam_ois_ctrl_t { struct i2c_settings_array i2c_calib_data; struct i2c_settings_array i2c_postcalib_data; struct i2c_settings_array i2c_mode_data; + struct i2c_settings_array i2c_gyro_data; struct i2c_settings_array i2c_time_data; enum msm_camera_device_type_t ois_device_type; enum cam_ois_state cam_ois_state; 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 863991792102..b6678389397e 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 @@ -177,7 +177,8 @@ enum cam_ois_packet_opcodes { CAM_OIS_PACKET_OPCODE_WRITE_TIME, CAM_OIS_PACKET_OPCODE_ACTIVE_OIS_ROHM, CAM_OIS_PACKET_OPCODE_ACTIVE_OIS_DONGWOON, - CAM_OIS_PACKET_OPCODE_ACTIVE_OIS_DONGWOON_QTIMER + CAM_OIS_PACKET_OPCODE_ACTIVE_OIS_DONGWOON_QTIMER, + CAM_OIS_PACKET_OPCODE_OIS_GYRO_OFFSET }; enum msm_bus_perf_setting {