From 12db07489bb66b3d730d826b30061fefb4074569 Mon Sep 17 00:00:00 2001 From: Liu Yang Date: Tue, 16 May 2023 20:26:42 +0800 Subject: [PATCH] bangkk: Powerup and initialize sensor early [3/4] Powering on and initializing main sensor in camera open instead of streams configuration to optimize the startup KPI. It is a common feature and depends on sensor setting. It can save about 30ms. Porting this func from (CR) and (CR). mot-cam-category: KPI Change-Id: Iab7653a3598cd5816b9700c90cea920b1d172001 Signed-off-by: Liu Yang Reviewed-on: https://gerrit.mot.com/2640367 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Ji Zhao Reviewed-by: Bolei Shang Reviewed-by: Reviewed-by: Zilong Zhang Reviewed-by: Hualong Zhu Reviewed-by: Reviewed-by: Dongju He Reviewed-by: Reviewed-by: Zhuoran Xu Submit-Approved: Jira Key --- .../cam_sensor/cam_sensor_core.c | 79 +++++++++++++++++++ .../cam_sensor/cam_sensor_dev.h | 3 + include/uapi/camera/media/cam_defs.h | 6 ++ 3 files changed, 88 insertions(+) diff --git a/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c b/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c index 9e32a73719bd..a9f1d813a3a0 100644 --- a/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c +++ b/drivers/cam_sensor_module/cam_sensor/cam_sensor_core.c @@ -1033,6 +1033,9 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, */ s_ctrl->is_probe_succeed = 1; s_ctrl->sensor_state = CAM_SENSOR_INIT; +#ifdef CONFIG_MOT_SENSOR_PRE_POWERUP + s_ctrl->sensor_power_up_done = 0; +#endif } break; case CAM_ACQUIRE_DEV: { @@ -1322,6 +1325,69 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, } } break; +#ifdef CONFIG_MOT_SENSOR_PRE_POWERUP + case CAM_MOT_PRE_POWER_UP: { + if (!s_ctrl->sensor_power_up_done) + { + rc = cam_sensor_power_up(s_ctrl); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, + "MotPreAct - Sensor Power up failed for sensor_id:0x%x, slave_addr:0x%x", + s_ctrl->sensordata->slave_info.sensor_id, + s_ctrl->sensordata->slave_info.sensor_slave_addr); + goto release_mutex; + } + s_ctrl->sensor_power_up_done = 1; + CAM_DBG(CAM_SENSOR, "MotPreAct - Camera sensor_id:0x%x, slave_addr:0x%x, pre power on done = %d", + s_ctrl->sensordata->slave_info.sensor_id, + s_ctrl->sensordata->slave_info.sensor_slave_addr, + s_ctrl->sensor_power_up_done); + } + } + break; + case CAM_MOT_PRE_POWER_DOWN: { + if (s_ctrl->sensor_power_up_done) + { + rc = cam_sensor_power_down(s_ctrl); + if (rc < 0) { + CAM_ERR(CAM_SENSOR, + "Sensor Power Down failed sensor_id: 0x%x, slave_addr:0x%x", + s_ctrl->sensordata->slave_info.sensor_id, + s_ctrl->sensordata->slave_info.sensor_slave_addr); + goto release_mutex; + } + CAM_DBG(CAM_SENSOR, "MotPreAct - Camera sensor_id:0x%x, slave_addr:0x%x, pre power on done = %d", + s_ctrl->sensordata->slave_info.sensor_id, + s_ctrl->sensordata->slave_info.sensor_slave_addr, + s_ctrl->sensor_power_up_done); + } + } + break; + case CAM_MOT_QUERY_SENSOR_STATUS: { + uint32_t isSensorActive = 0; + + if (s_ctrl->sensor_power_up_done) + { + isSensorActive = 1; + } + else + { + isSensorActive = 0; + } + + if (copy_to_user(u64_to_user_ptr(cmd->handle), + &isSensorActive, sizeof(uint32_t))) { + CAM_ERR(CAM_SENSOR, "MotPreAct - Failed Copy to User"); + rc = -EFAULT; + goto release_mutex; + } + CAM_DBG(CAM_SENSOR, "MotPreAct - Query camera sensor_id:0x%x, slave_addr:0x%x, status = %d", + s_ctrl->sensordata->slave_info.sensor_id, + s_ctrl->sensordata->slave_info.sensor_slave_addr, + isSensorActive); + } + break; +#endif default: CAM_ERR(CAM_SENSOR, "Invalid Opcode: %d", cmd->op_code); rc = -EINVAL; @@ -1424,6 +1490,16 @@ int cam_sensor_power_up(struct cam_sensor_ctrl_t *s_ctrl) return -EINVAL; } +#ifdef CONFIG_MOT_SENSOR_PRE_POWERUP + if (s_ctrl->sensor_power_up_done) + { + CAM_INFO(CAM_SENSOR, "MotPreAct - sensor has power on done for sensor_id:0x%x, slave_addr:0x%x", + s_ctrl->sensordata->slave_info.sensor_id, + s_ctrl->sensordata->slave_info.sensor_slave_addr); + return 0; + } +#endif + power_info = &s_ctrl->sensordata->power_info; slave_info = &(s_ctrl->sensordata->slave_info); @@ -1498,6 +1574,9 @@ int cam_sensor_power_down(struct cam_sensor_ctrl_t *s_ctrl) } camera_io_release(&(s_ctrl->io_master_info)); +#ifdef CONFIG_MOT_SENSOR_PRE_POWERUP + s_ctrl->sensor_power_up_done = 0; +#endif return rc; } diff --git a/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.h b/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.h index 96c1cf9bc6fd..486574164f56 100644 --- a/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.h +++ b/drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.h @@ -128,6 +128,9 @@ struct cam_sensor_ctrl_t { uint16_t i2c_switch_reg_addr; uint16_t i2c_switch_reg_data; uint16_t i2c_switch_reg_delayMs; +#ifdef CONFIG_MOT_SENSOR_PRE_POWERUP + bool sensor_power_up_done; +#endif }; /** diff --git a/include/uapi/camera/media/cam_defs.h b/include/uapi/camera/media/cam_defs.h index 9da3a636ab0e..b76d67e43028 100644 --- a/include/uapi/camera/media/cam_defs.h +++ b/include/uapi/camera/media/cam_defs.h @@ -32,6 +32,12 @@ #define CAM_EXT_OPCODE_BASE 0x200 #define CAM_CONFIG_DEV_EXTERNAL (CAM_EXT_OPCODE_BASE + 0x1) +/* CONFIG_MOT_SENSOR_PRE_POWERUP */ +#define CAM_MOT_OPCODE_BASE 0x250 +#define CAM_MOT_PRE_POWER_UP (CAM_MOT_OPCODE_BASE + 0x1) +#define CAM_MOT_PRE_POWER_DOWN (CAM_MOT_OPCODE_BASE + 0x2) +#define CAM_MOT_QUERY_SENSOR_STATUS (CAM_MOT_OPCODE_BASE + 0x3) + /* camera handle type */ #define CAM_HANDLE_USER_POINTER 1 #define CAM_HANDLE_MEM_HANDLE 2