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 <liuyang81@lenovo.com>
Reviewed-on: https://gerrit.mot.com/2640367
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Ji Zhao <zhaoji1@lenovo.com>
Reviewed-by: Bolei Shang <shangbl1@lenovo.com>
Reviewed-by: <leixu1@motorola.com>
Reviewed-by: Zilong Zhang <zhangzl7@lenovo.com>
Reviewed-by: Hualong Zhu <zhuhl11@motorola.com>
Reviewed-by: <zhanys2@motorola.com>
Reviewed-by: Dongju He <hedj3@motorola.com>
Reviewed-by: <weilt2@motorola.com>
Reviewed-by: Zhuoran Xu <xuzr3@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
Liu Yang 2023-05-16 20:26:42 +08:00 • committed by Yang Liu
commit 12db07489b
3 changed files with 88 additions and 0 deletions

View file

@ -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;
}

View file

@ -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
};
/**

View file

@ -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