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

This commit is contained in:
Linux Build Service Account 2017-09-22 09:13:45 -07:00 committed by Gerrit - the friendly Code Review server
commit 18dd1a7105
6 changed files with 90 additions and 5 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -85,8 +85,10 @@ 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,
MSM_CAMERA_I2C_ADDR_TYPE_MAX,
};
#define MSM_CAMERA_I2C_DWORD_ADDR MSM_CAMERA_I2C_DWORD_ADDR
enum msm_camera_i2c_data_type {
MSM_CAMERA_I2C_BYTE_DATA = 1,