diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2014-02-06 02:28:27 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-02-06 02:28:26 -0800 |
| commit | 045f7c87d41496a1a06ee52a25e3da99442c30ec (patch) | |
| tree | 0daddcecae90cc00fb124764b9d20a7e749ce91b | |
| parent | db37ad59aa7fd3fb3b793555f0786795c6ec1d73 (diff) | |
| parent | fe291bf415be44e126bc9c75bef7489583064545 (diff) | |
Merge "msm: camera: Support for EEPROMS with multiple I2C addresses"
| -rw-r--r-- | Documentation/devicetree/bindings/media/video/msm-eeprom.txt | 2 | ||||
| -rw-r--r-- | arch/arm/mach-msm/include/mach/camera2.h | 7 | ||||
| -rw-r--r-- | drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c | 17 |
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); |
