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