Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 060b9850 authored by junwen.ye's avatar junwen.ye Committed by Rohit Sekhar
Browse files

techpack/camera: aicview optimization

[ALM:11087279] [FP4]:aicview optimization
&&&%%%comment:[FP4]:aicview optimization
&&&%%%bug number:10872982
&&&%%%jira id:FP4-1868
&&&%%%product name:sm7225_r_fp4
&&&%%%root cause:coding
&&&%%%Bug category:T2M
&&&%%%Module_Impact:chi-cdk
&&&%%%Test_Suggestion:NA
&&&%%%Solution:NA
&&&%%%Test_Report:ok in native
&&&%%%VAL Can Test:NA
parent 8e04feef
Loading
Loading
Loading
Loading
+194 −43
Original line number Diff line number Diff line
@@ -13,6 +13,26 @@
#include "cam_common_util.h"
#include "cam_packet_util.h"

int sensor_start_thread(void *ctrl);
struct cam_sensor_i2c_reg_setting_oem{
	struct cam_sensor_i2c_reg_array reg_setting[4600];
	uint32_t size;
	enum camera_sensor_i2c_type addr_type;
	enum camera_sensor_i2c_type data_type;
	unsigned short delay;
};

struct cam_all_sensor_initsetting {
	struct cam_sensor_i2c_reg_setting_oem  sensor576;
	struct cam_sensor_i2c_reg_setting_oem  sensor582;
	struct cam_sensor_i2c_reg_setting_oem  sensor582_sma;
};

struct cam_all_sensor_initsetting g_oem_sensor_setting =
{
#include "cam_sensor_initsetting.h.txt"
};

static void cam_sensor_update_req_mgr(
	struct cam_sensor_ctrl_t *s_ctrl,
	struct cam_packet *csl_packet)
@@ -720,8 +740,17 @@ void cam_sensor_shutdown(struct cam_sensor_ctrl_t *s_ctrl)
	cam_sensor_release_per_frame_resource(s_ctrl);

	if (s_ctrl->sensor_state != CAM_SENSOR_INIT)
	{
		if(s_ctrl->power_stat == CAM_SENSOR_POWER_ON)
		{
			cam_sensor_power_down(s_ctrl);

			s_ctrl->power_stat = CAM_SENSOR_POWER_OFF;
			s_ctrl->setting_stat = CAM_SENSOR_SETTING_INVALID;
		}
		else{
			CAM_ERR(CAM_SENSOR,"SENSOR already power off!!");
		}
	}
	if (s_ctrl->bridge_intf.device_hdl != -1) {
		rc = cam_destroy_device_hdl(s_ctrl->bridge_intf.device_hdl);
		if (rc < 0)
@@ -849,11 +878,18 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
		}

		/* Power up and probe sensor */
		if(s_ctrl->power_stat == CAM_SENSOR_POWER_OFF)
		{
			rc = cam_sensor_power_up(s_ctrl);
			if (rc < 0) {
					CAM_ERR(CAM_SENSOR, "power up failed");
					goto free_power_settings;
				}
			s_ctrl->power_stat = CAM_SENSOR_POWER_ON;
		}
		else{
			CAM_ERR(CAM_SENSOR,"SENSOR already power on !!");
		}
		if (s_ctrl->i2c_data.poweron_reg_settings.is_settings_valid) {
			rc = cam_sensor_apply_settings(s_ctrl, 0,
				CAM_SENSOR_PACKET_OPCODE_SENSOR_POWERON_REG);
@@ -866,7 +902,16 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
		/* Match sensor ID */
		rc = cam_sensor_match_id(s_ctrl);
		if (rc < 0) {
			if(s_ctrl->power_stat == CAM_SENSOR_POWER_ON)
			{
				cam_sensor_power_down(s_ctrl);
				s_ctrl->power_stat = CAM_SENSOR_POWER_OFF;
				s_ctrl->setting_stat = CAM_SENSOR_SETTING_INVALID;
			}
			else
			{
				CAM_ERR(CAM_SENSOR,"SENSOR already power off!!");
			}
			msleep(20);
			goto free_power_settings;
		}
@@ -905,12 +950,20 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
		       CAM_INFO(CAM_SENSOR, "match SONY_imx582_UW");
		       snprintf(aux_camera_status, sizeof(aux_camera_status), "SONY_IMX582_UW");
		}

        if(s_ctrl->power_stat == CAM_SENSOR_POWER_ON)
		{
			rc = cam_sensor_power_down(s_ctrl);
			if (rc < 0) {
				CAM_ERR(CAM_SENSOR, "fail in Sensor Power Down");
				goto free_power_settings;
			}
			s_ctrl->power_stat = CAM_SENSOR_POWER_OFF;
			s_ctrl->setting_stat = CAM_SENSOR_SETTING_INVALID;
		}
		else
		{
			CAM_ERR(CAM_SENSOR,"SENSOR already power off!!");
		}
		/*
		 * Set probe succeeded flag to 1 so that no other camera shall
		 * probed on this slot
@@ -972,12 +1025,19 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
		}

		/* MODIFIED-BEGIN by yixiang.wu, 2021-01-22,BUG-10277816*/
		if(s_ctrl->power_stat == CAM_SENSOR_POWER_OFF)
		{
			rc = cam_sensor_power_up(s_ctrl);
			if (rc < 0) {
				CAM_ERR(CAM_SENSOR, "Sensor Power up failed");
				goto release_mutex;
				/* MODIFIED-END by yixiang.wu,BUG-10277816*/
			}
			s_ctrl->power_stat = CAM_SENSOR_POWER_ON;
		}
		else{
			CAM_ERR(CAM_SENSOR,"SENSOR already power on!!");
		}

		s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
		s_ctrl->last_flush_req = 0;
@@ -1006,11 +1066,20 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
			goto release_mutex;
		}
		
		if(s_ctrl->power_stat == CAM_SENSOR_POWER_ON)
		{
			rc = cam_sensor_power_down(s_ctrl);
			if (rc < 0) {
				CAM_ERR(CAM_SENSOR, "Sensor Power Down failed");
				goto release_mutex;
			}
			s_ctrl->power_stat = CAM_SENSOR_POWER_OFF;
			s_ctrl->setting_stat = CAM_SENSOR_SETTING_INVALID;
		}
		else
		{
			CAM_ERR(CAM_SENSOR,"SENSOR already power off!!");
		}

		cam_sensor_release_per_frame_resource(s_ctrl);
		cam_sensor_release_stream_rsc(s_ctrl);
@@ -1118,6 +1187,8 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,

			pkt_opcode =
				CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG;
			if(s_ctrl->setting_stat != CAM_SENSOR_SETTING_SUCCESS)
			{
				rc = cam_sensor_apply_settings(s_ctrl, 0,
								pkt_opcode);

@@ -1133,7 +1204,6 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
										pkt_opcode);
				}
				s_ctrl->i2c_data.init_settings.request_id = -1;

				if (rc < 0) {
						CAM_ERR(CAM_SENSOR,
										"cannot apply init settings rc= %d",
@@ -1141,6 +1211,12 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
						delete_request(&s_ctrl->i2c_data.init_settings);
						goto release_mutex;
				}
				s_ctrl->setting_stat = CAM_SENSOR_SETTING_SUCCESS;
			}
			else
			{
				CAM_ERR(CAM_SENSOR,"sensor already init setting !!!!");
			}
			rc = delete_request(&s_ctrl->i2c_data.init_settings);
			if (rc < 0) {
				CAM_ERR(CAM_SENSOR,
@@ -1197,6 +1273,26 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
			s_ctrl->sensordata->slave_info.sensor_slave_addr);
	}
		break;
	case CAM_GET_ID:{
        rc = copy_to_user((void __user *)cmd->handle,&s_ctrl->soc_info.index,sizeof(uint32_t));
        if(rc < 0){
            CAM_ERR(CAM_SENSOR,"get_id err");
            goto release_mutex;
        }
    }
        break;
	case CAM_SENSOR_POWERON:{
				struct task_struct *thread_hand = NULL;
				thread_hand = kthread_run(sensor_start_thread,s_ctrl,s_ctrl->device_name);
				if(thread_hand == NULL)
				{
					CAM_ERR(CAM_SENSOR,"sensor power on thread run err!!");
					rc = -EINVAL;
					goto release_mutex;
				}
		}
		break;
							
	default:
		CAM_ERR(CAM_SENSOR, "Invalid Opcode: %d", cmd->op_code);
		rc = -EINVAL;
@@ -1279,7 +1375,15 @@ int cam_sensor_power(struct v4l2_subdev *sd, int on)

	mutex_lock(&(s_ctrl->cam_sensor_mutex));
	if (!on && s_ctrl->sensor_state == CAM_SENSOR_START) {
		if(s_ctrl->power_stat == CAM_SENSOR_POWER_ON)
		{
			cam_sensor_power_down(s_ctrl);
			s_ctrl->power_stat = CAM_SENSOR_POWER_OFF;
			s_ctrl->setting_stat = CAM_SENSOR_SETTING_INVALID;
		}
		else{
			CAM_ERR(CAM_SENSOR,"SENSOR already power off!!");
		}
		s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
	}
	mutex_unlock(&(s_ctrl->cam_sensor_mutex));
@@ -1589,3 +1693,50 @@ int32_t cam_sensor_flush_request(struct cam_req_mgr_flush_request *flush_req)
	mutex_unlock(&(s_ctrl->cam_sensor_mutex));
	return rc;
}
int sensor_start_thread(void *ctrl)
{
	struct cam_sensor_ctrl_t *s_ctrl = ctrl;
	int rc;
	mutex_lock(&(s_ctrl->cam_sensor_mutex));
	if(s_ctrl->power_stat == CAM_SENSOR_POWER_OFF)
	{
		rc = cam_sensor_power_up(s_ctrl);
			if(rc < 0)
			{
				CAM_ERR(CAM_SENSOR,"sensor power up error");
			}
			else{
				s_ctrl->power_stat = CAM_SENSOR_POWER_ON;
				if(s_ctrl->setting_stat != CAM_SENSOR_SETTING_SUCCESS)
				{
					if(s_ctrl->soc_info.index == 0 && s_ctrl->sensordata->slave_info.sensor_id == 0x582)//main
					{
							struct cam_sensor_i2c_reg_setting sensor_setting;
							sensor_setting.reg_setting = g_oem_sensor_setting.sensor582_sma.reg_setting;
							sensor_setting.size = g_oem_sensor_setting.sensor582_sma.size;
							sensor_setting.addr_type = g_oem_sensor_setting.sensor582_sma.addr_type;
							sensor_setting.data_type = g_oem_sensor_setting.sensor582_sma.data_type;
							sensor_setting.delay = g_oem_sensor_setting.sensor582_sma.delay;
							rc = camera_io_dev_write(&(s_ctrl->io_master_info),&sensor_setting);
							if(rc < 0)
							{
									CAM_ERR(CAM_SENSOR,"sensor init setting error!!!!");
							}
							else
							{
									CAM_ERR(CAM_SENSOR,"sensor init setting success");
									s_ctrl->setting_stat = CAM_SENSOR_SETTING_SUCCESS;
							}
					}
				}
				else{
					CAM_ERR(CAM_SENSOR,"sensor already init setting !!!!");
				}
			}
	}
	else{
		CAM_ERR(CAM_SENSOR,"sensor already power on!!");
	}
	mutex_unlock(&(s_ctrl->cam_sensor_mutex));
	return 0;
}
+2 −1
Original line number Diff line number Diff line
@@ -225,7 +225,8 @@ static int32_t cam_sensor_driver_i2c_probe(struct i2c_client *client,
	s_ctrl->bridge_intf.ops.flush_req = cam_sensor_flush_request;

	s_ctrl->sensordata->power_info.dev = soc_info->dev;

	s_ctrl->power_stat = CAM_SENSOR_POWER_OFF;
	s_ctrl->setting_stat = CAM_SENSOR_SETTING_INVALID;
	return rc;
unreg_subdev:
	cam_unregister_subdev(&(s_ctrl->v4l2_dev_str));
+11 −0
Original line number Diff line number Diff line
@@ -45,6 +45,15 @@ enum cam_sensor_state_t {
	CAM_SENSOR_START,
};

enum cam_sensor_power_state_t{
	CAM_SENSOR_POWER_OFF,
	CAM_SENSOR_POWER_ON
};
enum cam_sensor_setting_state_t{
	CAM_SENSOR_SETTING_INVALID,
	CAM_SENSOR_SETTING_SUCCESS,
};

/**
 * struct intf_params
 * @device_hdl: Device Handle
@@ -115,6 +124,8 @@ struct cam_sensor_ctrl_t {
	uint16_t pipeline_delay;
	int32_t open_cnt;
	bool force_low_priority_for_init_setting;
	enum cam_sensor_power_state_t power_stat;
	enum cam_sensor_setting_state_t setting_stat;
};

#endif /* _CAM_SENSOR_DEV_H_ */
+751 −0

File added.

Preview size limit exceeded, changes collapsed.

+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@
#define CAM_FLUSH_REQ                           (CAM_COMMON_OPCODE_BASE + 0x8)
#define CAM_COMMON_OPCODE_MAX                   (CAM_COMMON_OPCODE_BASE + 0x9)

#define CAM_GET_ID                              0x900
#define CAM_SENSOR_POWERON                      0x901

#define CAM_COMMON_OPCODE_BASE_v2           0x150
#define CAM_ACQUIRE_HW                      (CAM_COMMON_OPCODE_BASE_v2 + 0x1)
#define CAM_RELEASE_HW                      (CAM_COMMON_OPCODE_BASE_v2 + 0x2)