OSDN Git Service

msm: camera: sensor: Add OIS read functionality
authorXu Han <hanxu@codeaurora.org>
Wed, 4 Jan 2017 18:43:47 +0000 (10:43 -0800)
committerGerrit - the friendly Code Review server <code-review@localhost>
Fri, 22 Sep 2017 06:35:03 +0000 (23:35 -0700)
Adding capability to read OIS data, provided in the driver
register settings.

CRs-Fixed: 2114654
Change-Id: Ie10b55f597a4daa29267c6d4333ce9d9c7702d63
Signed-off-by: Xu Han <hanxu@codeaurora.org>
drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c
drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c
drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c
include/uapi/media/msm_cam_sensor.h
include/uapi/media/msm_camera.h
include/uapi/media/msm_camsensor_sdk.h

index 3cb6b55..f2c765a 100644 (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;
index 6d9b0e9..fc6ceb1 100644 (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;
 
index 302a7b1..d3d48b0 100644 (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)
 {
index c6144cd..43d2e31 100644 (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;
index 10ee4b7..39e6927 100644 (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;
index a92c144..e7d4416 100644 (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,