Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c +3 −3 Original line number Diff line number Diff line Loading @@ -317,7 +317,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, cmd_buf += (sizeof(struct cam_cmd_i2c_info)/sizeof(uint32_t)); i2c_data->init_settings.request_id = 0; i2c_reg_settings->is_settings_valid = 1; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, &cmd_desc[1], 1); if (rc < 0) { CAM_ERR(CAM_ACTUATOR, "Actuator pkt parsing failed: %d", Loading @@ -338,7 +338,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, offset = (uint32_t *)&csl_packet->payload; offset += csl_packet->cmd_buf_offset / sizeof(uint32_t); cmd_desc = (struct cam_cmd_buf_desc *)(offset); rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_ACTUATOR, "Actuator pkt parsing failed: %d", Loading @@ -358,7 +358,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, offset = (uint32_t *)&csl_packet->payload; offset += csl_packet->cmd_buf_offset / sizeof(uint32_t); cmd_desc = (struct cam_cmd_buf_desc *)(offset); rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_ACTUATOR, "Actuator pkt parsing failed: %d", Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c +3 −3 Original line number Diff line number Diff line Loading @@ -434,7 +434,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg) i2c_reg_settings = &(o_ctrl->i2c_init_data); i2c_reg_settings->is_settings_valid = 1; i2c_reg_settings->request_id = 0; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, &cmd_desc[1], 1); if (rc < 0) { CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", Loading @@ -446,7 +446,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg) i2c_reg_settings = &(o_ctrl->i2c_calib_data); i2c_reg_settings->is_settings_valid = 1; i2c_reg_settings->request_id = 0; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, &cmd_desc[2], 1); if (rc < 0) { CAM_ERR(CAM_OIS, Loading @@ -462,7 +462,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg) i2c_reg_settings = &(o_ctrl->i2c_mode_data); i2c_reg_settings->is_settings_valid = 1; i2c_reg_settings->request_id = 0; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc); Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c +155 −51 Original line number Diff line number Diff line Loading @@ -17,6 +17,27 @@ #include "cam_soc_util.h" #include "cam_trace.h" static void cam_sensor_update_req_mgr( struct cam_sensor_ctrl_t *s_ctrl, struct cam_packet *csl_packet) { struct cam_req_mgr_add_request add_req; add_req.link_hdl = s_ctrl->bridge_intf.link_hdl; add_req.req_id = csl_packet->header.request_id; CAM_DBG(CAM_SENSOR, " Rxed Req Id: %lld", csl_packet->header.request_id); add_req.dev_hdl = s_ctrl->bridge_intf.device_hdl; add_req.skip_before_applying = 0; if (s_ctrl->bridge_intf.crm_cb && s_ctrl->bridge_intf.crm_cb->add_req) s_ctrl->bridge_intf.crm_cb->add_req(&add_req); CAM_DBG(CAM_SENSOR, " add req to req mgr: %lld", add_req.req_id); } static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, void *arg) { Loading @@ -30,7 +51,6 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, uint32_t *offset = NULL; struct cam_config_dev_cmd config; struct i2c_data_settings *i2c_data = NULL; struct cam_req_mgr_add_request add_req; ioctl_ctrl = (struct cam_control *)arg; Loading Loading @@ -63,13 +83,32 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, i2c_data = &(s_ctrl->i2c_data); CAM_DBG(CAM_SENSOR, "Header OpCode: %d", csl_packet->header.op_code); if ((csl_packet->header.op_code & 0xFFFFFF) == CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG) { switch (csl_packet->header.op_code & 0xFFFFFF) { case CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG: { i2c_reg_settings = &i2c_data->init_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; } else if ((csl_packet->header.op_code & 0xFFFFFF) == CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE) { break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_RESCONFIG: { i2c_reg_settings = &i2c_data->res_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON: { i2c_reg_settings = &i2c_data->streamon_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF: { i2c_reg_settings = &i2c_data->streamoff_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE: { i2c_reg_settings = &i2c_data-> per_frame[csl_packet->header.request_id % Loading @@ -91,10 +130,14 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, i2c_reg_settings->request_id = csl_packet->header.request_id; i2c_reg_settings->is_settings_valid = 1; } else if ((csl_packet->header.op_code & 0xFFFFFF) == CAM_PKT_NOP_OPCODE) { goto update_req_mgr; } else { cam_sensor_update_req_mgr(s_ctrl, csl_packet); break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_NOP: { cam_sensor_update_req_mgr(s_ctrl, csl_packet); return rc; } default: CAM_ERR(CAM_SENSOR, "Invalid Packet Header"); return -EINVAL; } Loading @@ -103,28 +146,11 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, offset += csl_packet->cmd_buf_offset / 4; cmd_desc = (struct cam_cmd_buf_desc *)(offset); rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, cmd_desc, 1); rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail parsing I2C Pkt: %d", rc); return rc; } update_req_mgr: if (((csl_packet->header.op_code & 0xFFFFFF) == CAM_PKT_NOP_OPCODE) || (csl_packet->header.op_code == CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE)) { add_req.link_hdl = s_ctrl->bridge_intf.link_hdl; add_req.req_id = csl_packet->header.request_id; CAM_DBG(CAM_SENSOR, " Rxed Req Id: %lld", csl_packet->header.request_id); add_req.dev_hdl = s_ctrl->bridge_intf.device_hdl; add_req.skip_before_applying = 0; if (s_ctrl->bridge_intf.crm_cb && s_ctrl->bridge_intf.crm_cb->add_req) s_ctrl->bridge_intf.crm_cb->add_req(&add_req); CAM_DBG(CAM_SENSOR, " add req to req mgr: %lld", add_req.req_id); } return rc; } Loading Loading @@ -595,26 +621,46 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, break; } case CAM_START_DEV: { rc = cam_sensor_power_up(s_ctrl); if (s_ctrl->i2c_data.streamon_settings.is_settings_valid && (s_ctrl->i2c_data.streamon_settings.request_id == 0)) { rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Sensor Power up failed"); CAM_ERR(CAM_SENSOR, "cannot apply streamon settings"); goto release_mutex; } rc = cam_sensor_apply_settings(s_ctrl, 0); rc = delete_request( &s_ctrl->i2c_data.streamon_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "cannot apply settings"); CAM_ERR(CAM_SENSOR, "Fail in deleting the streamon settings"); goto release_mutex; } rc = delete_request(&s_ctrl->i2c_data.init_settings); s_ctrl->i2c_data.streamon_settings.request_id = -1; } } break; case CAM_STOP_DEV: { if (s_ctrl->i2c_data.streamoff_settings.is_settings_valid && (s_ctrl->i2c_data.streamoff_settings.request_id == 0)) { rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the Init settings"); "cannot apply streamoff settings"); goto release_mutex; } rc = delete_request( &s_ctrl->i2c_data.streamoff_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the Streaomoff settings"); rc = -EINVAL; goto release_mutex; } s_ctrl->i2c_data.streamoff_settings.request_id = -1; } break; case CAM_STOP_DEV: { rc = cam_sensor_power_down(s_ctrl); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Sensor Power Down failed"); Loading @@ -628,6 +674,46 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, CAM_ERR(CAM_SENSOR, "Failed CCI Config: %d", rc); goto release_mutex; } if (s_ctrl->i2c_data.init_settings.is_settings_valid && (s_ctrl->i2c_data.init_settings.request_id == 0)) { rc = cam_sensor_power_up(s_ctrl); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Sensor Power up failed"); goto release_mutex; } rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG); if (rc < 0) { CAM_ERR(CAM_SENSOR, "cannot apply init settings"); goto release_mutex; } rc = delete_request(&s_ctrl->i2c_data.init_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the Init settings"); goto release_mutex; } s_ctrl->i2c_data.init_settings.request_id = -1; } if (s_ctrl->i2c_data.res_settings.is_settings_valid && (s_ctrl->i2c_data.res_settings.request_id == 0)) { rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_RESCONFIG); if (rc < 0) { CAM_ERR(CAM_SENSOR, "cannot apply res settings"); goto release_mutex; } rc = delete_request(&s_ctrl->i2c_data.res_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the res settings"); goto release_mutex; } s_ctrl->i2c_data.res_settings.request_id = -1; } } break; case CAM_SD_SHUTDOWN: Loading Loading @@ -769,14 +855,35 @@ int cam_sensor_power_down(struct cam_sensor_ctrl_t *s_ctrl) } int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, int64_t req_id) int64_t req_id, enum cam_sensor_packet_opcodes opcode) { int rc = 0, offset, del_req_id; struct i2c_settings_array *i2c_set = NULL; struct i2c_settings_list *i2c_list; if (req_id == 0) { switch (opcode) { case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON: { i2c_set = &s_ctrl->i2c_data.streamon_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG: { i2c_set = &s_ctrl->i2c_data.init_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_RESCONFIG: { i2c_set = &s_ctrl->i2c_data.res_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF: { i2c_set = &s_ctrl->i2c_data.streamoff_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE: case CAM_SENSOR_PACKET_OPCODE_SENSOR_PROBE: default: return 0; } if (i2c_set->is_settings_valid == 1) { list_for_each_entry(i2c_list, &(i2c_set->list_head), list) { Loading @@ -790,12 +897,7 @@ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, return rc; } } rc = delete_request(&(s_ctrl->i2c_data.init_settings)); i2c_set->is_settings_valid = 0; if (rc < 0) { CAM_ERR(CAM_SENSOR, "Failed in deleting the Init request: %d", rc); } } } else { offset = req_id % MAX_PER_FRAME_ARRAY; Loading Loading @@ -836,6 +938,7 @@ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, del_req_id, rc); } } return rc; } Loading @@ -855,7 +958,8 @@ int32_t cam_sensor_apply_request(struct cam_req_mgr_apply_request *apply) } CAM_DBG(CAM_SENSOR, " Req Id: %lld", apply->request_id); trace_cam_apply_req("Sensor", apply->request_id); rc = cam_sensor_apply_settings(s_ctrl, apply->request_id); rc = cam_sensor_apply_settings(s_ctrl, apply->request_id, CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE); return rc; } Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.h +3 −1 Original line number Diff line number Diff line Loading @@ -40,10 +40,12 @@ int cam_sensor_power(struct v4l2_subdev *sd, int on); /** * @s_ctrl: Sensor ctrl structure * @req_id: Request id * @opcode: opcode for settings * * This API applies the req_id settings to sensor */ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, int64_t req_id); int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, int64_t req_id, enum cam_sensor_packet_opcodes opcode); /** * @apply: Req mgr structure for applying request Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_dev.c +6 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,9 @@ static int32_t cam_sensor_driver_i2c_probe(struct i2c_client *client, } INIT_LIST_HEAD(&(s_ctrl->i2c_data.init_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.res_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)); for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) INIT_LIST_HEAD(&(s_ctrl->i2c_data.per_frame[i].list_head)); Loading Loading @@ -269,6 +272,9 @@ static int32_t cam_sensor_driver_platform_probe( } INIT_LIST_HEAD(&(s_ctrl->i2c_data.init_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.res_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)); for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) INIT_LIST_HEAD(&(s_ctrl->i2c_data.per_frame[i].list_head)); Loading Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c +3 −3 Original line number Diff line number Diff line Loading @@ -317,7 +317,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, cmd_buf += (sizeof(struct cam_cmd_i2c_info)/sizeof(uint32_t)); i2c_data->init_settings.request_id = 0; i2c_reg_settings->is_settings_valid = 1; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, &cmd_desc[1], 1); if (rc < 0) { CAM_ERR(CAM_ACTUATOR, "Actuator pkt parsing failed: %d", Loading @@ -338,7 +338,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, offset = (uint32_t *)&csl_packet->payload; offset += csl_packet->cmd_buf_offset / sizeof(uint32_t); cmd_desc = (struct cam_cmd_buf_desc *)(offset); rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_ACTUATOR, "Actuator pkt parsing failed: %d", Loading @@ -358,7 +358,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, offset = (uint32_t *)&csl_packet->payload; offset += csl_packet->cmd_buf_offset / sizeof(uint32_t); cmd_desc = (struct cam_cmd_buf_desc *)(offset); rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_ACTUATOR, "Actuator pkt parsing failed: %d", Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c +3 −3 Original line number Diff line number Diff line Loading @@ -434,7 +434,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg) i2c_reg_settings = &(o_ctrl->i2c_init_data); i2c_reg_settings->is_settings_valid = 1; i2c_reg_settings->request_id = 0; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, &cmd_desc[1], 1); if (rc < 0) { CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", Loading @@ -446,7 +446,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg) i2c_reg_settings = &(o_ctrl->i2c_calib_data); i2c_reg_settings->is_settings_valid = 1; i2c_reg_settings->request_id = 0; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, &cmd_desc[2], 1); if (rc < 0) { CAM_ERR(CAM_OIS, Loading @@ -462,7 +462,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg) i2c_reg_settings = &(o_ctrl->i2c_mode_data); i2c_reg_settings->is_settings_valid = 1; i2c_reg_settings->request_id = 0; rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc); Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c +155 −51 Original line number Diff line number Diff line Loading @@ -17,6 +17,27 @@ #include "cam_soc_util.h" #include "cam_trace.h" static void cam_sensor_update_req_mgr( struct cam_sensor_ctrl_t *s_ctrl, struct cam_packet *csl_packet) { struct cam_req_mgr_add_request add_req; add_req.link_hdl = s_ctrl->bridge_intf.link_hdl; add_req.req_id = csl_packet->header.request_id; CAM_DBG(CAM_SENSOR, " Rxed Req Id: %lld", csl_packet->header.request_id); add_req.dev_hdl = s_ctrl->bridge_intf.device_hdl; add_req.skip_before_applying = 0; if (s_ctrl->bridge_intf.crm_cb && s_ctrl->bridge_intf.crm_cb->add_req) s_ctrl->bridge_intf.crm_cb->add_req(&add_req); CAM_DBG(CAM_SENSOR, " add req to req mgr: %lld", add_req.req_id); } static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, void *arg) { Loading @@ -30,7 +51,6 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, uint32_t *offset = NULL; struct cam_config_dev_cmd config; struct i2c_data_settings *i2c_data = NULL; struct cam_req_mgr_add_request add_req; ioctl_ctrl = (struct cam_control *)arg; Loading Loading @@ -63,13 +83,32 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, i2c_data = &(s_ctrl->i2c_data); CAM_DBG(CAM_SENSOR, "Header OpCode: %d", csl_packet->header.op_code); if ((csl_packet->header.op_code & 0xFFFFFF) == CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG) { switch (csl_packet->header.op_code & 0xFFFFFF) { case CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG: { i2c_reg_settings = &i2c_data->init_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; } else if ((csl_packet->header.op_code & 0xFFFFFF) == CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE) { break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_RESCONFIG: { i2c_reg_settings = &i2c_data->res_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON: { i2c_reg_settings = &i2c_data->streamon_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF: { i2c_reg_settings = &i2c_data->streamoff_settings; i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = 1; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE: { i2c_reg_settings = &i2c_data-> per_frame[csl_packet->header.request_id % Loading @@ -91,10 +130,14 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, i2c_reg_settings->request_id = csl_packet->header.request_id; i2c_reg_settings->is_settings_valid = 1; } else if ((csl_packet->header.op_code & 0xFFFFFF) == CAM_PKT_NOP_OPCODE) { goto update_req_mgr; } else { cam_sensor_update_req_mgr(s_ctrl, csl_packet); break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_NOP: { cam_sensor_update_req_mgr(s_ctrl, csl_packet); return rc; } default: CAM_ERR(CAM_SENSOR, "Invalid Packet Header"); return -EINVAL; } Loading @@ -103,28 +146,11 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl, offset += csl_packet->cmd_buf_offset / 4; cmd_desc = (struct cam_cmd_buf_desc *)(offset); rc = cam_sensor_i2c_pkt_parser(i2c_reg_settings, cmd_desc, 1); rc = cam_sensor_i2c_command_parser(i2c_reg_settings, cmd_desc, 1); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail parsing I2C Pkt: %d", rc); return rc; } update_req_mgr: if (((csl_packet->header.op_code & 0xFFFFFF) == CAM_PKT_NOP_OPCODE) || (csl_packet->header.op_code == CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE)) { add_req.link_hdl = s_ctrl->bridge_intf.link_hdl; add_req.req_id = csl_packet->header.request_id; CAM_DBG(CAM_SENSOR, " Rxed Req Id: %lld", csl_packet->header.request_id); add_req.dev_hdl = s_ctrl->bridge_intf.device_hdl; add_req.skip_before_applying = 0; if (s_ctrl->bridge_intf.crm_cb && s_ctrl->bridge_intf.crm_cb->add_req) s_ctrl->bridge_intf.crm_cb->add_req(&add_req); CAM_DBG(CAM_SENSOR, " add req to req mgr: %lld", add_req.req_id); } return rc; } Loading Loading @@ -595,26 +621,46 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, break; } case CAM_START_DEV: { rc = cam_sensor_power_up(s_ctrl); if (s_ctrl->i2c_data.streamon_settings.is_settings_valid && (s_ctrl->i2c_data.streamon_settings.request_id == 0)) { rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Sensor Power up failed"); CAM_ERR(CAM_SENSOR, "cannot apply streamon settings"); goto release_mutex; } rc = cam_sensor_apply_settings(s_ctrl, 0); rc = delete_request( &s_ctrl->i2c_data.streamon_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "cannot apply settings"); CAM_ERR(CAM_SENSOR, "Fail in deleting the streamon settings"); goto release_mutex; } rc = delete_request(&s_ctrl->i2c_data.init_settings); s_ctrl->i2c_data.streamon_settings.request_id = -1; } } break; case CAM_STOP_DEV: { if (s_ctrl->i2c_data.streamoff_settings.is_settings_valid && (s_ctrl->i2c_data.streamoff_settings.request_id == 0)) { rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the Init settings"); "cannot apply streamoff settings"); goto release_mutex; } rc = delete_request( &s_ctrl->i2c_data.streamoff_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the Streaomoff settings"); rc = -EINVAL; goto release_mutex; } s_ctrl->i2c_data.streamoff_settings.request_id = -1; } break; case CAM_STOP_DEV: { rc = cam_sensor_power_down(s_ctrl); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Sensor Power Down failed"); Loading @@ -628,6 +674,46 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, CAM_ERR(CAM_SENSOR, "Failed CCI Config: %d", rc); goto release_mutex; } if (s_ctrl->i2c_data.init_settings.is_settings_valid && (s_ctrl->i2c_data.init_settings.request_id == 0)) { rc = cam_sensor_power_up(s_ctrl); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Sensor Power up failed"); goto release_mutex; } rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG); if (rc < 0) { CAM_ERR(CAM_SENSOR, "cannot apply init settings"); goto release_mutex; } rc = delete_request(&s_ctrl->i2c_data.init_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the Init settings"); goto release_mutex; } s_ctrl->i2c_data.init_settings.request_id = -1; } if (s_ctrl->i2c_data.res_settings.is_settings_valid && (s_ctrl->i2c_data.res_settings.request_id == 0)) { rc = cam_sensor_apply_settings(s_ctrl, 0, CAM_SENSOR_PACKET_OPCODE_SENSOR_RESCONFIG); if (rc < 0) { CAM_ERR(CAM_SENSOR, "cannot apply res settings"); goto release_mutex; } rc = delete_request(&s_ctrl->i2c_data.res_settings); if (rc < 0) { CAM_ERR(CAM_SENSOR, "Fail in deleting the res settings"); goto release_mutex; } s_ctrl->i2c_data.res_settings.request_id = -1; } } break; case CAM_SD_SHUTDOWN: Loading Loading @@ -769,14 +855,35 @@ int cam_sensor_power_down(struct cam_sensor_ctrl_t *s_ctrl) } int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, int64_t req_id) int64_t req_id, enum cam_sensor_packet_opcodes opcode) { int rc = 0, offset, del_req_id; struct i2c_settings_array *i2c_set = NULL; struct i2c_settings_list *i2c_list; if (req_id == 0) { switch (opcode) { case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON: { i2c_set = &s_ctrl->i2c_data.streamon_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG: { i2c_set = &s_ctrl->i2c_data.init_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_RESCONFIG: { i2c_set = &s_ctrl->i2c_data.res_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF: { i2c_set = &s_ctrl->i2c_data.streamoff_settings; break; } case CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE: case CAM_SENSOR_PACKET_OPCODE_SENSOR_PROBE: default: return 0; } if (i2c_set->is_settings_valid == 1) { list_for_each_entry(i2c_list, &(i2c_set->list_head), list) { Loading @@ -790,12 +897,7 @@ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, return rc; } } rc = delete_request(&(s_ctrl->i2c_data.init_settings)); i2c_set->is_settings_valid = 0; if (rc < 0) { CAM_ERR(CAM_SENSOR, "Failed in deleting the Init request: %d", rc); } } } else { offset = req_id % MAX_PER_FRAME_ARRAY; Loading Loading @@ -836,6 +938,7 @@ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, del_req_id, rc); } } return rc; } Loading @@ -855,7 +958,8 @@ int32_t cam_sensor_apply_request(struct cam_req_mgr_apply_request *apply) } CAM_DBG(CAM_SENSOR, " Req Id: %lld", apply->request_id); trace_cam_apply_req("Sensor", apply->request_id); rc = cam_sensor_apply_settings(s_ctrl, apply->request_id); rc = cam_sensor_apply_settings(s_ctrl, apply->request_id, CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE); return rc; } Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.h +3 −1 Original line number Diff line number Diff line Loading @@ -40,10 +40,12 @@ int cam_sensor_power(struct v4l2_subdev *sd, int on); /** * @s_ctrl: Sensor ctrl structure * @req_id: Request id * @opcode: opcode for settings * * This API applies the req_id settings to sensor */ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, int64_t req_id); int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl, int64_t req_id, enum cam_sensor_packet_opcodes opcode); /** * @apply: Req mgr structure for applying request Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_dev.c +6 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,9 @@ static int32_t cam_sensor_driver_i2c_probe(struct i2c_client *client, } INIT_LIST_HEAD(&(s_ctrl->i2c_data.init_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.res_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)); for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) INIT_LIST_HEAD(&(s_ctrl->i2c_data.per_frame[i].list_head)); Loading Loading @@ -269,6 +272,9 @@ static int32_t cam_sensor_driver_platform_probe( } INIT_LIST_HEAD(&(s_ctrl->i2c_data.init_settings.list_head)); INIT_LIST_HEAD(&(s_ctrl->i2c_data.res_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)); for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) INIT_LIST_HEAD(&(s_ctrl->i2c_data.per_frame[i].list_head)); Loading