From cd9403e96df5ef8eaefabdb67da22f0a9887964c Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 10 May 2016 15:16:01 -0700 Subject: [PATCH] msm: camera: sensor: Add support for 3B read Newer I2C slaves have 3bytes read address. Add support to read the data from slaves that support 3 byte address. CRs-Fixed: 1013787 Change-Id: Ieb0a7aa1b1b5f23220854092dcc2119d29c57146 Signed-off-by: Rajesh Bondugula --- .../platform/msm/camera_v2/sensor/cci/msm_cci.c | 13 ++++++------- .../platform/msm/camera_v2/sensor/cci/msm_cci.h | 2 +- .../msm/camera_v2/sensor/io/msm_camera_cci_i2c.c | 6 ++++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c index 1af1e3fe0d7c..b1c23823c122 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c @@ -841,13 +841,12 @@ static int32_t msm_cci_i2c_read(struct v4l2_subdev *sd, goto ERROR; } - if (read_cfg->addr_type == MSM_CAMERA_I2C_BYTE_ADDR) - val = CCI_I2C_WRITE_DISABLE_P_CMD | (read_cfg->addr_type << 4) | - ((read_cfg->addr & 0xFF) << 8); - if (read_cfg->addr_type == MSM_CAMERA_I2C_WORD_ADDR) - val = CCI_I2C_WRITE_DISABLE_P_CMD | (read_cfg->addr_type << 4) | - (((read_cfg->addr & 0xFF00) >> 8) << 8) | - ((read_cfg->addr & 0xFF) << 16); + val = CCI_I2C_WRITE_DISABLE_P_CMD | (read_cfg->addr_type << 4); + for (i = 0; i < read_cfg->addr_type; i++) { + val |= ((read_cfg->addr >> (i << 3)) & 0xFF) << + ((read_cfg->addr_type - i) << 3); + } + rc = msm_cci_write_i2c_queue(cci_dev, val, master, queue); if (rc < 0) { CDBG("%s failed line %d\n", __func__, __LINE__); diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h index 2cc03aedd22e..6e39d814bd73 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h @@ -90,7 +90,7 @@ struct msm_camera_cci_gpio_cfg { }; struct msm_camera_cci_i2c_read_cfg { - uint16_t addr; + uint32_t addr; enum msm_camera_i2c_reg_addr_type addr_type; uint8_t *data; uint16_t num_byte; diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c index 4a31b93ec37f..8f911d362477 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c @@ -27,7 +27,8 @@ int32_t msm_camera_cci_i2c_read(struct msm_camera_i2c_client *client, struct msm_camera_cci_ctrl cci_ctrl; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR - && client->addr_type != MSM_CAMERA_I2C_WORD_ADDR) + && client->addr_type != MSM_CAMERA_I2C_WORD_ADDR + && client->addr_type != MSM_CAMERA_I2C_3B_ADDR) || (data_type != MSM_CAMERA_I2C_BYTE_DATA && data_type != MSM_CAMERA_I2C_WORD_DATA)) return rc; @@ -63,7 +64,8 @@ int32_t msm_camera_cci_i2c_read_seq(struct msm_camera_i2c_client *client, struct msm_camera_cci_ctrl cci_ctrl; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR - && client->addr_type != MSM_CAMERA_I2C_WORD_ADDR) + && client->addr_type != MSM_CAMERA_I2C_WORD_ADDR + && client->addr_type != MSM_CAMERA_I2C_3B_ADDR) || num_byte == 0) return rc;