aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-02-06 02:28:27 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2014-02-06 02:28:26 -0800
commit045f7c87d41496a1a06ee52a25e3da99442c30ec (patch)
tree0daddcecae90cc00fb124764b9d20a7e749ce91b
parentdb37ad59aa7fd3fb3b793555f0786795c6ec1d73 (diff)
parentfe291bf415be44e126bc9c75bef7489583064545 (diff)
Merge "msm: camera: Support for EEPROMS with multiple I2C addresses"
-rw-r--r--Documentation/devicetree/bindings/media/video/msm-eeprom.txt2
-rw-r--r--arch/arm/mach-msm/include/mach/camera2.h7
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c17
3 files changed, 25 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/media/video/msm-eeprom.txt b/Documentation/devicetree/bindings/media/video/msm-eeprom.txt
index c7821f535e4..09a5c91b985 100644
--- a/Documentation/devicetree/bindings/media/video/msm-eeprom.txt
+++ b/Documentation/devicetree/bindings/media/video/msm-eeprom.txt
@@ -57,6 +57,7 @@ Optional properties:
- qcom,pageen%d : number %d page enable reg size, start address, address type,
data, data type, delay in ms. size 0 stand for not used.
- cam_vdig-supply : should contain regulator to be used for the digital vdd.
+- qcom,saddr%d : property should specify the slave address for block (%d).
Example:
@@ -75,6 +76,7 @@ Example:
qcom,pageen1 = <1 0x0202 2 0x01 1 10>;
qcom,poll1 = <0 0x0 2 0 1 1>;
qcom,mem1 = <32 0x3000 2 0 1 0>;
+ qcom,saddr1 = <0x62>;
cam_vdig-supply = <&pm8226_l5>;
cam_vio-supply = <&pm8226_lvs1>;
diff --git a/arch/arm/mach-msm/include/mach/camera2.h b/arch/arm/mach-msm/include/mach/camera2.h
index a7baa5ba826..4bcaf6ed580 100644
--- a/arch/arm/mach-msm/include/mach/camera2.h
+++ b/arch/arm/mach-msm/include/mach/camera2.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -119,11 +119,16 @@ struct eeprom_map_t {
uint32_t delay;
};
+struct eeprom_slave_add_t {
+ uint32_t addr;
+};
+
struct msm_eeprom_memory_map_t {
struct eeprom_map_t page;
struct eeprom_map_t pageen;
struct eeprom_map_t poll;
struct eeprom_map_t mem;
+ struct eeprom_slave_add_t saddr;
};
struct msm_eeprom_memory_block_t {
diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
index 6da91c1af8e..7329654471b 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
@@ -268,6 +268,7 @@ static int read_eeprom_memory(struct msm_eeprom_ctrl_t *e_ctrl,
int rc = 0;
int j;
struct msm_eeprom_memory_map_t *emap = block->map;
+ struct msm_eeprom_board_info *eb_info;
uint8_t *memptr = block->mapdata;
if (!e_ctrl) {
@@ -275,7 +276,17 @@ static int read_eeprom_memory(struct msm_eeprom_ctrl_t *e_ctrl,
return -EINVAL;
}
+ eb_info = e_ctrl->eboard_info;
+
for (j = 0; j < block->num_map; j++) {
+ if (emap[j].saddr.addr) {
+ eb_info->i2c_slaveaddr = emap[j].saddr.addr;
+ e_ctrl->i2c_client.cci_client->sid =
+ eb_info->i2c_slaveaddr >> 1;
+ pr_err("qcom,slave-addr = 0x%X\n",
+ eb_info->i2c_slaveaddr);
+ }
+
if (emap[j].page.valid_size) {
e_ctrl->i2c_client.addr_type = emap[j].page.addr_t;
rc = e_ctrl->i2c_client.i2c_func_tbl->i2c_write(
@@ -382,6 +393,12 @@ static int msm_eeprom_parse_memory_map(struct device_node *of,
if (rc < 0)
pr_err("%s: pageen not needed\n", __func__);
+ snprintf(property, PROPERTY_MAXSIZE, "qcom,saddr%d", i);
+ rc = of_property_read_u32_array(of, property,
+ (uint32_t *) &map[i].saddr.addr, 1);
+ if (rc < 0)
+ CDBG("%s: saddr not needed - block %d\n", __func__, i);
+
snprintf(property, PROPERTY_MAXSIZE, "qcom,poll%d", i);
rc = of_property_read_u32_array(of, property,
(uint32_t *) &map[i].poll, count);