From 69c819e66141a80a61aa6b7296aed19ee9ea0b73 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lothar=20Wa=C3=9Fmann?= Date: Fri, 21 Aug 2015 15:31:54 +0200 Subject: [PATCH] karo: tx6: probe for PMIC to determine module variant prior to initializing PMIC --- board/karo/tx6/pmic.c | 15 +++++++++++---- board/karo/tx6/pmic.h | 2 +- board/karo/tx6/tx6qdl.c | 35 +++++++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/board/karo/tx6/pmic.c b/board/karo/tx6/pmic.c index 2743dadd32..a29a74bd17 100644 --- a/board/karo/tx6/pmic.c +++ b/board/karo/tx6/pmic.c @@ -14,7 +14,6 @@ * GNU General Public License for more details. * */ - #include #include #include @@ -36,15 +35,23 @@ static struct { #endif }; -int tx6_pmic_init(void) +int tx6_pmic_init(int addr) { int ret = -ENODEV; int i; + debug("Probing for I2C dev 0x%02x\n", addr); for (i = 0; i < ARRAY_SIZE(i2c_addrs); i++) { - ret = i2c_probe(i2c_addrs[i].addr); + u8 i2c_addr = i2c_addrs[i].addr; + + if (i2c_addr != addr) + continue; + + debug("Probing for I2C dev 0x%02x\n", i2c_addr); + ret = i2c_probe(i2c_addr); if (ret == 0) { - i2c_addrs[i].init(i2c_addrs[i].addr); + debug("Initializing PMIC at I2C addr 0x%02x\n", i2c_addr); + ret = i2c_addrs[i].init(i2c_addr); break; } } diff --git a/board/karo/tx6/pmic.h b/board/karo/tx6/pmic.h index 4786eefc9b..1b301b7c4a 100644 --- a/board/karo/tx6/pmic.h +++ b/board/karo/tx6/pmic.h @@ -19,4 +19,4 @@ int ltc3676_pmic_setup(uchar addr); int rn5t618_pmic_setup(uchar addr); int rn5t567_pmic_setup(uchar addr); -int tx6_pmic_init(void); +int tx6_pmic_init(int addr); diff --git a/board/karo/tx6/tx6qdl.c b/board/karo/tx6/tx6qdl.c index 9dae410230..5d48b2b4bd 100644 --- a/board/karo/tx6/tx6qdl.c +++ b/board/karo/tx6/tx6qdl.c @@ -236,6 +236,7 @@ static bool tx6_temp_check_enabled = true; #else #define tx6_temp_check_enabled 0 #endif +static int pmic_addr __data; int board_init(void) { @@ -262,7 +263,7 @@ int board_init(void) return 0; } - ret = tx6_pmic_init(); + ret = tx6_pmic_init(pmic_addr); if (ret) { printf("Failed to setup PMIC voltages: %d\n", ret); hang(); @@ -1231,35 +1232,49 @@ static struct { { 0x33, 3, }, }; -static int tx6_get_mod_rev(void) +static int tx6_get_mod_rev(unsigned int pmic_id) +{ + if (pmic_id < ARRAY_SIZE(tx6_mod_revs)) + return tx6_mod_revs[pmic_id].rev; + + return 0; +} + +static int tx6_pmic_probe(void) { int i; + i2c_init_all(); + for (i = 0; i < ARRAY_SIZE(tx6_mod_revs); i++) { - int ret = i2c_probe(tx6_mod_revs[i].addr); + u8 i2c_addr = tx6_mod_revs[i].addr; + int ret = i2c_probe(i2c_addr); + if (ret == 0) { - debug("I2C probe succeeded for addr %02x\n", tx6_mod_revs[i].addr); - return tx6_mod_revs[i].rev; + debug("I2C probe succeeded for addr 0x%02x\n", i2c_addr); + return i; } - debug("I2C probe returned %d for addr %02x\n", ret, - tx6_mod_revs[i].addr); + debug("I2C probe returned %d for addr 0x%02x\n", ret, i2c_addr); } - return 0; + return -EINVAL; } int checkboard(void) { u32 cpurev = get_cpu_rev(); int cpu_variant = (cpurev >> 12) & 0xff; + int pmic_id; tx6qdl_print_cpuinfo(); - i2c_init(CONFIG_SYS_I2C_SPEED, 0 /* unused */); + pmic_id = tx6_pmic_probe(); + if (pmic_id >= 0) + pmic_addr = tx6_mod_revs[pmic_id].addr; printf("Board: Ka-Ro TX6%s-%d%d%d%c\n", tx6_mod_suffix, cpu_variant == MXC_CPU_MX6Q ? 1 : 8, - is_lvds(), tx6_get_mod_rev(), + is_lvds(), tx6_get_mod_rev(pmic_id), tx6_mem_suffix()); return 0; -- 2.39.2