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

Commit 296d0d7b authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: sensor: Add OIS read functionality"

parents 7ad01a43 c0213070
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -331,6 +331,9 @@ static int32_t msm_cci_addr_to_num_bytes(
	case MSM_CAMERA_I2C_3B_ADDR:
		retVal = 3;
		break;
	case MSM_CAMERA_I2C_DWORD_ADDR:
		retVal = 4;
		break;
	default:
		pr_err("%s: %d failed: %d\n", __func__, __LINE__, addr_type);
		retVal = 1;
+2 −1
Original line number Diff line number Diff line
@@ -67,7 +67,8 @@ int32_t msm_camera_cci_i2c_read_seq(struct msm_camera_i2c_client *client,

	if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR
		&& client->addr_type != MSM_CAMERA_I2C_WORD_ADDR
		&& client->addr_type != MSM_CAMERA_I2C_3B_ADDR)
		&& client->addr_type != MSM_CAMERA_I2C_3B_ADDR
		&& client->addr_type != MSM_CAMERA_I2C_DWORD_ADDR)
		|| num_byte == 0)
		return rc;

+79 −4
Original line number Diff line number Diff line
@@ -33,6 +33,30 @@ static int32_t msm_ois_power_down(struct msm_ois_ctrl_t *o_ctrl);

static struct i2c_driver msm_ois_i2c_driver;

static int32_t data_type_to_num_bytes(
	enum msm_camera_i2c_data_type data_type)
{
	int32_t ret_val;

	switch (data_type) {
	case MSM_CAMERA_I2C_BYTE_DATA:
		ret_val = 1;
		break;
	case MSM_CAMERA_I2C_WORD_DATA:
		ret_val = 2;
		break;
	case MSM_CAMERA_I2C_DWORD_DATA:
		ret_val = 4;
		break;
	default:
		pr_err("unsupported data type: %d\n",
			data_type);
		ret_val = 1;
		break;
	}
	return ret_val;
}

static int32_t msm_ois_download(struct msm_ois_ctrl_t *o_ctrl)
{
	uint16_t bytes_in_tx = 0;
@@ -155,7 +179,9 @@ static int32_t msm_ois_write_settings(struct msm_ois_ctrl_t *o_ctrl,
	uint16_t size, struct reg_settings_ois_t *settings)
{
	int32_t rc = -EFAULT;
	int32_t i = 0;
	int32_t i = 0, num_byte_seq = 0;
	uint8_t *reg_data_seq;

	struct msm_camera_i2c_seq_reg_array *reg_setting;
	CDBG("Enter\n");

@@ -233,13 +259,51 @@ static int32_t msm_ois_write_settings(struct msm_ois_ctrl_t *o_ctrl,
					settings[i].data_type);
				break;
			}
			break;
		}
		case MSM_OIS_READ: {
			switch (settings[i].data_type) {
			case MSM_CAMERA_I2C_BYTE_DATA:
			case MSM_CAMERA_I2C_WORD_DATA:
			case MSM_CAMERA_I2C_DWORD_DATA:

				num_byte_seq =
					data_type_to_num_bytes
					(settings[i].data_type);
				reg_data_seq = kzalloc(sizeof(uint32_t),
						GFP_KERNEL);
				if (!reg_data_seq)
					return -ENOMEM;

				rc = msm_camera_cci_i2c_read_seq
					(&o_ctrl->i2c_client,
					settings[i].reg_addr,
					reg_data_seq,
					num_byte_seq);

				memcpy(&settings[i].reg_data,
					reg_data_seq, sizeof(uint32_t));

				CDBG("ois data read 0x%x from address 0x%x",
					settings[i].reg_addr,
					settings[i].reg_data);

				kfree(reg_data_seq);
				reg_data_seq = NULL;

				break;
			default:
				pr_err("Unsupport data type for MSM_OIS_READ: %d\n",
					settings[i].data_type);
				break;
			}
			break;
		}

		if (rc < 0)
			break;
		}

	}
	CDBG("Exit\n");
	return rc;
}
@@ -348,7 +412,7 @@ static int32_t msm_ois_control(struct msm_ois_ctrl_t *o_ctrl,
	struct msm_ois_set_info_t *set_info)
{
	struct reg_settings_ois_t *settings = NULL;
	int32_t rc = 0;
	int32_t rc = 0, i = 0;
	struct msm_camera_cci_client *cci_client = NULL;
	CDBG("Enter\n");

@@ -390,6 +454,18 @@ static int32_t msm_ois_control(struct msm_ois_ctrl_t *o_ctrl,
		rc = msm_ois_write_settings(o_ctrl,
			set_info->ois_params.setting_size,
			settings);

		for (i = 0; i < set_info->ois_params.setting_size; i++) {
			if (set_info->ois_params.settings[i].i2c_operation
				== MSM_OIS_READ) {
				set_info->ois_params.settings[i].reg_data =
					settings[i].reg_data;
				CDBG("ois_data at addr 0x%x is 0x%x",
				set_info->ois_params.settings[i].reg_addr,
				set_info->ois_params.settings[i].reg_data);
			}
		}

		kfree(settings);
		if (rc < 0) {
			pr_err("Error\n");
@@ -402,7 +478,6 @@ static int32_t msm_ois_control(struct msm_ois_ctrl_t *o_ctrl,
	return rc;
}


static int32_t msm_ois_config(struct msm_ois_ctrl_t *o_ctrl,
	void __user *argp)
{
+2 −0
Original line number Diff line number Diff line
@@ -381,7 +381,9 @@ enum msm_ois_cfg_download_type_t {
enum msm_ois_i2c_operation {
	MSM_OIS_WRITE = 0,
	MSM_OIS_POLL,
	MSM_OIS_READ,
};
#define MSM_OIS_READ MSM_OIS_READ

struct reg_settings_ois_t {
	uint16_t reg_addr;
+2 −0
Original line number Diff line number Diff line
@@ -1541,7 +1541,9 @@ enum msm_camera_i2c_reg_addr_type {
	MSM_CAMERA_I2C_BYTE_ADDR = 1,
	MSM_CAMERA_I2C_WORD_ADDR,
	MSM_CAMERA_I2C_3B_ADDR,
	MSM_CAMERA_I2C_DWORD_ADDR,
};
#define MSM_CAMERA_I2C_DWORD_ADDR MSM_CAMERA_I2C_DWORD_ADDR

struct msm_camera_i2c_reg_array {
	uint16_t reg_addr;
Loading