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

Commit 1b50fb88 authored by Om Parkash's avatar Om Parkash Committed by Gerrit - the friendly Code Review server
Browse files

msm: camera: Add page read support for EEPROM



Add page read support for EEPROM.

Change-Id: I7e030f72f7398a98dde9c10740ae1bf7cdb52b28
Signed-off-by: default avatarOm Parkash <quic_oparkash@quicinc.com>
parent ad8e8306
Loading
Loading
Loading
Loading
+89 −3
Original line number Diff line number Diff line
@@ -56,7 +56,11 @@ static int msm_get_read_mem_size
		}
		for (i = 0; i < eeprom_map->memory_map_size; i++) {
			if (eeprom_map->mem_settings[i].i2c_operation ==
				MSM_CAM_READ) {
				MSM_CAM_READ ||
				eeprom_map->mem_settings[i].i2c_operation ==
				MSM_CAM_READ_CONTINUOUS ||
				eeprom_map->mem_settings[i].i2c_operation ==
				MSM_CAM_READ_PAGE) {
				size += eeprom_map->mem_settings[i].reg_data;
			}
		}
@@ -329,6 +333,7 @@ static int eeprom_parse_memory_map(struct msm_eeprom_ctrl_t *e_ctrl,
	int rc =  0, i, j;
	uint8_t *memptr;
	struct msm_eeprom_mem_map_t *eeprom_map;
	struct msm_camera_i2c_fn_t *i2c_func_tbl;

	e_ctrl->cal_data.mapdata = NULL;
	e_ctrl->cal_data.num_data = msm_get_read_mem_size(eeprom_map_array);
@@ -344,6 +349,7 @@ static int eeprom_parse_memory_map(struct msm_eeprom_ctrl_t *e_ctrl,
		return -ENOMEM;

	memptr = e_ctrl->cal_data.mapdata;
	i2c_func_tbl = e_ctrl->i2c_client.i2c_func_tbl;
	for (j = 0; j < eeprom_map_array->msm_size_of_max_mappings; j++) {
		eeprom_map = &(eeprom_map_array->memory_map[j]);
		if (e_ctrl->i2c_client.cci_client) {
@@ -354,9 +360,10 @@ static int eeprom_parse_memory_map(struct msm_eeprom_ctrl_t *e_ctrl,
				eeprom_map->slave_addr >> 1;
		}
		CDBG("Slave Addr: 0x%X\n", eeprom_map->slave_addr);
		CDBG("Memory map Size: %d",
			eeprom_map->memory_map_size);
		CDBG("Memory map Size: %d", eeprom_map->memory_map_size);
		for (i = 0; i < eeprom_map->memory_map_size; i++) {
			struct msm_camera_reg_settings_t mem_setting =
					eeprom_map->mem_settings[i];
			switch (eeprom_map->mem_settings[i].i2c_operation) {
			case MSM_CAM_WRITE: {
				e_ctrl->i2c_client.addr_type =
@@ -374,6 +381,24 @@ static int eeprom_parse_memory_map(struct msm_eeprom_ctrl_t *e_ctrl,
				}
			}
			break;
			case MSM_CAM_WRITE_DELAYUSEC: {
				e_ctrl->i2c_client.addr_type =
					mem_setting.addr_type;
				rc = e_ctrl->i2c_client.i2c_func_tbl->i2c_write(
					&(e_ctrl->i2c_client),
					mem_setting.reg_addr,
					mem_setting.reg_data,
					mem_setting.data_type);

				if (mem_setting.delay > 0)
					udelay(mem_setting.delay);
				if (rc < 0) {
					pr_err("%s: page write failed\n",
						__func__);
					goto clean_up;
				}
			}
			break;
			case MSM_CAM_POLL: {
				e_ctrl->i2c_client.addr_type =
					eeprom_map->mem_settings[i].addr_type;
@@ -408,6 +433,67 @@ static int eeprom_parse_memory_map(struct msm_eeprom_ctrl_t *e_ctrl,
				memptr += eeprom_map->mem_settings[i].reg_data;
			}
			break;
			case MSM_CAM_READ_PAGE: {
				int x = 0;
				const int inc = 5;
				const int nunit = 2;
				const cnBatch = inc * nunit;
				const cnLimit =
					mem_setting.reg_data / cnBatch * inc;
				const cnNotYet =
					mem_setting.reg_data % cnBatch;

				e_ctrl->i2c_client.addr_type =
					mem_setting.addr_type;

				for (x = 0; x < cnLimit; x += inc) {
					rc = i2c_func_tbl->i2c_read_seq(
						&(e_ctrl->i2c_client),
						mem_setting.reg_addr+x,
						memptr, cnBatch);

					if (rc < 0) {
						pr_err("%s: read failed\n",
							__func__);
						goto clean_up;
					}
					memptr += cnBatch;
				}

				if (cnNotYet > 0) {
					rc = i2c_func_tbl->i2c_read_seq(
						&(e_ctrl->i2c_client),
						mem_setting.reg_addr+x,
						memptr, cnNotYet);
					if (rc < 0) {
						pr_err("%s: read failed at final readout\n",
							__func__);
						goto clean_up;
					}
					memptr += cnNotYet;
				}
			}
			break;
			case MSM_CAM_READ_CONTINUOUS: {
				int j = 0;

				e_ctrl->i2c_client.addr_type =
					mem_setting.addr_type;
				for (j = 0; j < mem_setting.reg_data; j++) {
					rc = i2c_func_tbl->i2c_read_seq(
						&(e_ctrl->i2c_client),
						mem_setting.reg_addr+j,
						memptr, 1);
					msleep(mem_setting.delay);
					if (rc < 0) {
						pr_err("%s: read failed\n",
							__func__);
						goto clean_up;
					}
					memptr++;
				}
			}
			break;
			default:
				pr_err("%s: %d Invalid i2c operation LC:%d\n",
					__func__, __LINE__, i);
+5 −2
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@

#define MAX_LED_TRIGGERS          3

#define MSM_EEPROM_MEMORY_MAP_MAX_SIZE  80
#define MSM_EEPROM_MAX_MEM_MAP_CNT      8
#define MSM_EEPROM_MEMORY_MAP_MAX_SIZE  512
#define MSM_EEPROM_MAX_MEM_MAP_CNT      9

#define MSM_SENSOR_BYPASS_VIDEO_NODE    1

@@ -259,6 +259,9 @@ enum msm_camera_i2c_operation {
	MSM_CAM_WRITE = 0,
	MSM_CAM_POLL,
	MSM_CAM_READ,
	MSM_CAM_READ_PAGE,
	MSM_CAM_WRITE_DELAYUSEC,
	MSM_CAM_READ_CONTINUOUS,
};

struct msm_sensor_i2c_sync_params {