[U-Boot] PATCH 1/8 Multi-adapter multi-bus I2C

Signed-off-by: Sergey Kubushyn ksi@koi8.net --- board/keymile/common/common.c | 40 ++- board/keymile/mgcoge/mgcoge.c | 4 - board/keymile/mgsuvd/mgsuvd.c | 11 - board/lwmon/lwmon.c | 2 +- board/lwmon/pcmcia.c | 4 +- common/cmd_date.c | 9 + common/cmd_dtt.c | 9 + common/cmd_i2c.c | 340 ++++-------------- common/devices.c | 12 +- cpu/mpc8xx/video.c | 4 + drivers/hwmon/adm1021.c | 4 + drivers/hwmon/lm75.c | 9 + drivers/i2c/Makefile | 2 + drivers/i2c/fsl_i2c.c | 266 +++++++++------ drivers/i2c/soft_i2c.c | 736 +++++++++++++++++++++++---------------- include/configs/ATUM8548.h | 16 +- include/configs/CPU86.h | 10 +- include/configs/CPU87.h | 10 +- include/configs/GEN860T.h | 5 + include/configs/HIDDEN_DRAGON.h | 5 + include/configs/HMI10.h | 12 +- include/configs/IAD210.h | 12 +- include/configs/ICU862.h | 14 +- include/configs/IDS8247.h | 10 +- include/configs/IP860.h | 10 +- include/configs/IPHASE4539.h | 12 +- include/configs/KUP4K.h | 13 +- include/configs/M52277EVB.h | 12 +- include/configs/M5235EVB.h | 10 +- include/configs/M5253DEMO.h | 9 +- include/configs/M5271EVB.h | 10 +- include/configs/M5275EVB.h | 10 +- include/configs/M53017EVB.h | 10 +- include/configs/M5329EVB.h | 10 +- include/configs/M5373EVB.h | 10 +- include/configs/M54451EVB.h | 10 +- include/configs/M54455EVB.h | 10 +- include/configs/M5475EVB.h | 10 +- include/configs/M5485EVB.h | 10 +- include/configs/MHPC.h | 9 +- include/configs/MPC8313ERDB.h | 18 +- include/configs/MPC8315ERDB.h | 12 +- include/configs/MPC8323ERDB.h | 12 +- include/configs/MPC832XEMDS.h | 12 +- include/configs/MPC8349EMDS.h | 19 +- include/configs/MPC8349ITX.h | 38 +-- include/configs/MPC8360EMDS.h | 13 +- include/configs/MPC8360ERDK.h | 19 +- include/configs/MPC837XEMDS.h | 13 +- include/configs/MPC837XERDB.h | 13 +- include/configs/MPC8536DS.h | 21 +- include/configs/MPC8540ADS.h | 14 +- include/configs/MPC8540EVAL.h | 14 +- include/configs/MPC8541CDS.h | 14 +- include/configs/MPC8544DS.h | 14 +- include/configs/MPC8548CDS.h | 119 +++++-- include/configs/MPC8555CDS.h | 14 +- include/configs/MPC8560ADS.h | 14 +- include/configs/MPC8568MDS.h | 21 +- include/configs/MPC8572DS.h | 21 +- include/configs/MPC8610HPCD.h | 14 +- include/configs/MPC8641HPCN.h | 14 +- include/configs/MVBLM7.h | 19 +- include/configs/NC650.h | 10 +- include/configs/PM826.h | 9 +- include/configs/PM828.h | 9 +- include/configs/PM854.h | 14 +- include/configs/PM856.h | 14 +- include/configs/RRvision.h | 13 +- include/configs/SBC8540.h | 14 +- include/configs/SCM.h | 11 +- include/configs/SIMPC8313.h | 16 +- include/configs/SMN42.h | 22 +- include/configs/SXNI855T.h | 9 +- include/configs/Sandpoint8240.h | 5 + include/configs/Sandpoint8245.h | 5 + include/configs/TASREG.h | 28 +- include/configs/TK885D.h | 13 +- include/configs/TOP5200.h | 11 +- include/configs/TOP860.h | 12 +- include/configs/TQM8260.h | 9 +- include/configs/TQM8272.h | 10 +- include/configs/TQM834x.h | 10 +- include/configs/TQM855M.h | 13 +- include/configs/TQM85xx.h | 14 +- include/configs/TQM866M.h | 13 +- include/configs/TQM885D.h | 13 +- include/configs/XPEDITE5200.h | 18 +- include/configs/XPEDITE5370.h | 18 +- include/configs/barco.h | 5 + include/configs/bf533-ezkit.h | 10 +- include/configs/bf533-stamp.h | 83 ++--- include/configs/debris.h | 5 + include/configs/ep8260.h | 10 +- include/configs/lwmon.h | 13 +- include/configs/mgcoge.h | 28 +- include/configs/mgsuvd.h | 27 +- include/configs/pdnb3.h | 11 +- include/configs/rmu.h | 11 +- include/configs/sacsng.h | 12 +- include/configs/sbc8260.h | 12 +- include/configs/sbc8349.h | 16 +- include/configs/sbc8548.h | 12 +- include/configs/sbc8560.h | 14 +- include/configs/sbc8641d.h | 14 +- include/configs/socrates.h | 20 +- include/configs/spc1920.h | 13 +- include/configs/stxgp3.h | 18 +- include/configs/stxssa.h | 13 +- include/configs/uc100.h | 13 +- include/configs/vct.h | 11 +- include/i2c.h | 273 ++++++++------- lib_arm/board.c | 15 +- lib_blackfin/board.c | 8 + lib_m68k/board.c | 16 +- lib_mips/board.c | 8 + lib_ppc/board.c | 16 +- 117 files changed, 1737 insertions(+), 1496 deletions(-)
diff --git a/board/keymile/common/common.c b/board/keymile/common/common.c index 1338950..501d168 100644 --- a/board/keymile/common/common.c +++ b/board/keymile/common/common.c @@ -35,11 +35,9 @@ #include <libfdt.h> #endif
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_SYS_I2C_ADAPTERS) #include <i2c.h>
-extern int i2c_soft_read_pin (void); - int ivm_calc_crc (unsigned char *buf, int len) { const unsigned short crc_tab[16] = { @@ -295,32 +293,36 @@ int ivm_analyze_eeprom (unsigned char *buf, int len)
int ivm_read_eeprom (void) { - I2C_MUX_DEVICE *dev = NULL; uchar i2c_buffer[CONFIG_SYS_IVM_EEPROM_MAX_LEN]; + uint tmp = 0xffff; +#if !defined(CONFIG_SYS_IVM_EEPROM_BUS_NUM) || !defined(CONFIG_SYS_IVM_EEPROM_ADR) uchar *buf; - unsigned dev_addr = CONFIG_SYS_IVM_EEPROM_ADR; +#endif
/* First init the Bus, select the Bus */ -#if defined(CONFIG_SYS_I2C_IVM_BUS) - dev = i2c_mux_ident_muxstring ((uchar *)CONFIG_SYS_I2C_IVM_BUS); +#if defined(CONFIG_SYS_IVM_EEPROM_BUS_NUM) + tmp = CONFIG_SYS_IVM_EEPROM_BUS_NUM; #else - buf = (unsigned char *) getenv ("EEprom_ivm"); + buf = (unsigned char *) getenv ("EEprom_ivm_bus"); if (buf != NULL) - dev = i2c_mux_ident_muxstring (buf); + tmp = (uint)simple_strtoul((char *)buf, NULL, 16); #endif - if (dev == NULL) { - printf ("Error couldnt add Bus for IVM\n"); - return -1; + if (i2c_set_bus_num(tmp)) { + printf ("Error couldnt set Bus (%x) for IVM\n", tmp); + return(-1); } - i2c_set_bus_num (dev->busid);
- buf = (unsigned char *) getenv ("EEprom_ivm_addr"); - if (buf != NULL) - dev_addr = simple_strtoul ((char *)buf, NULL, 16); +#if defined(CONFIG_SYS_IVM_EEPROM_ADR) + tmp = CONFIG_SYS_IVM_EEPROM_ADR; +#else + buf = (unsigned char *) getenv ("EEprom_ivm_addr"); + if (buf != NULL) + tmp = (uint)simple_strtoul((char *)buf, NULL, 16); +#endif
- if (eeprom_read (dev_addr, 0, i2c_buffer, CONFIG_SYS_IVM_EEPROM_MAX_LEN) != 0) { - printf ("Error reading EEprom\n"); - return -2; + if (eeprom_read (tmp, 0, i2c_buffer, CONFIG_SYS_IVM_EEPROM_MAX_LEN) != 0) { + printf("Error reading EEprom\n"); + return(-2); }
return ivm_analyze_eeprom (i2c_buffer, CONFIG_SYS_IVM_EEPROM_MAX_LEN); diff --git a/board/keymile/mgcoge/mgcoge.c b/board/keymile/mgcoge/mgcoge.c index 5c50739..2150cd8 100644 --- a/board/keymile/mgcoge/mgcoge.c +++ b/board/keymile/mgcoge/mgcoge.c @@ -32,10 +32,6 @@ #include <libfdt.h> #endif
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) -#include <i2c.h> -#endif - #include "../common/common.h"
/* diff --git a/board/keymile/mgsuvd/mgsuvd.c b/board/keymile/mgsuvd/mgsuvd.c index 02baf62..232c3e5 100644 --- a/board/keymile/mgsuvd/mgsuvd.c +++ b/board/keymile/mgsuvd/mgsuvd.c @@ -195,14 +195,3 @@ void ft_board_setup(void *blob, bd_t *bd) ft_blob_update (blob, bd); } #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */ - -int i2c_soft_read_pin (void) -{ - int val; - - *(unsigned short *)(I2C_BASE_DIR) &= ~SDA_CONF; - udelay(1); - val = *(unsigned char *)(I2C_BASE_PORT); - - return ((val & SDA_BIT) == SDA_BIT); -} diff --git a/board/lwmon/lwmon.c b/board/lwmon/lwmon.c index 1b665a9..421009c 100644 --- a/board/lwmon/lwmon.c +++ b/board/lwmon/lwmon.c @@ -481,7 +481,7 @@ static void kbd_init (void) uchar val, errcd; int i;
- i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); + i2c_init_all();
gd->kbd_status = 0;
diff --git a/board/lwmon/pcmcia.c b/board/lwmon/pcmcia.c index ad2e60d..3268426 100644 --- a/board/lwmon/pcmcia.c +++ b/board/lwmon/pcmcia.c @@ -108,7 +108,7 @@ int pcmcia_hardware_enable(int slot)
/* switch VCC on */ val |= MAX1604_OP_SUS | MAX1604_VCCBON; - i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); + i2c_init_all(); i2c_write (CONFIG_SYS_I2C_POWER_A_ADDR, 0, 0, &val, 1);
udelay(500000); @@ -199,7 +199,7 @@ int pcmcia_voltage_set(int slot, int vcc, int vpp) */ debug ("PCMCIA power OFF\n"); val = MAX1604_VCCBHIZ | MAX1604_VPPBHIZ; - i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); + i2c_init_all(); i2c_write (CONFIG_SYS_I2C_POWER_A_ADDR, 0, 0, &val, 1);
val = 0; diff --git a/common/cmd_date.c b/common/cmd_date.c index 3d78be2..847ec27 100644 --- a/common/cmd_date.c +++ b/common/cmd_date.c @@ -46,8 +46,13 @@ int do_date (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int old_bus;
/* switch to correct I2C bus */ +#ifdef CONFIG_NEW_I2C + old_bus = i2c_get_bus_num(); + i2c_set_bus_num(CONFIG_SYS_RTC_BUS_NUM); +#else old_bus = I2C_GET_BUS(); I2C_SET_BUS(CONFIG_SYS_RTC_BUS_NUM); +#endif
switch (argc) { case 2: /* set date & time */ @@ -94,7 +99,11 @@ int do_date (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) }
/* switch back to original I2C bus */ +#ifdef CONFIG_NEW_I2C + i2c_set_bus_num(old_bus); +#else I2C_SET_BUS(old_bus); +#endif
return rcode; } diff --git a/common/cmd_dtt.c b/common/cmd_dtt.c index 7783c88..00f091e 100644 --- a/common/cmd_dtt.c +++ b/common/cmd_dtt.c @@ -35,8 +35,13 @@ int do_dtt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) int old_bus;
/* switch to correct I2C bus */ +#ifdef CONFIG_NEW_I2C + old_bus = i2c_get_bus_num(); + i2c_set_bus_num(CONFIG_SYS_DTT_BUS_NUM); +#else old_bus = I2C_GET_BUS(); I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM); +#endif
/* * Loop through sensors, read @@ -46,7 +51,11 @@ int do_dtt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) printf ("DTT%d: %i C\n", i + 1, dtt_get_temp (sensors[i]));
/* switch back to original I2C bus */ +#ifdef CONFIG_NEW_I2C + i2c_set_bus_num(old_bus); +#else I2C_SET_BUS(old_bus); +#endif
return 0; } /* do_dtt() */ diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c index 16439ac..1a5f79f 100644 --- a/common/cmd_i2c.c +++ b/common/cmd_i2c.c @@ -1,4 +1,9 @@ /* + * (C) Copyright 2009 + * Sergey Kubushyn, himself, ksi@koi8.net + * + * Changes for unified multibus/multiadapter I2C support. + * * (C) Copyright 2001 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com. * @@ -106,7 +111,7 @@ static uint i2c_mm_last_alen; * pairs. The following macros take care of this */
#if defined(CONFIG_SYS_I2C_NOPROBES) -#if defined(CONFIG_I2C_MULTI_BUS) +#if CONFIG_SYS_NUM_I2C_BUSSES > 1 static struct { uchar bus; @@ -122,19 +127,11 @@ static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES; #define COMPARE_BUS(b,i) ((b) == 0) /* Make compiler happy */ #define COMPARE_ADDR(a,i) (i2c_no_probes[(i)] == (a)) #define NO_PROBE_ADDR(i) i2c_no_probes[(i)] -#endif /* CONFIG_MULTI_BUS */ +#endif /* CONFIG_SYS_NUM_I2C_BUSSES > 1 */
#define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0])) #endif
-#if defined(CONFIG_I2C_MUX) -static I2C_MUX_DEVICE *i2c_mux_devices = NULL; -static int i2c_mux_busid = CONFIG_SYS_MAX_I2C_BUS; - -DECLARE_GLOBAL_DATA_PTR; - -#endif - static int mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[]);
@@ -548,10 +545,10 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[]) */ int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - int j; + int j; #if defined(CONFIG_SYS_I2C_NOPROBES) - int k, skip; - uchar bus = GET_BUS_NUM; + int k, skip; + unsigned int bus = GET_BUS_NUM; #endif /* NOPROBES */
puts ("Valid chip addresses:"); @@ -1189,59 +1186,79 @@ int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) #if defined(CONFIG_I2C_CMD_TREE) int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { - i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); + i2c_init (ADAP(i2c_get_bus_num())->speed, ADAP(i2c_get_bus_num())->slaveaddr); return 0; }
-#if defined(CONFIG_I2C_MUX) -int do_i2c_add_bus(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +int do_i2c_show_bus(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { - int ret=0; + int i; +#ifndef CONFIG_SYS_I2C_DIRECT_BUS + int j; +#endif
if (argc == 1) { /* show all busses */ - I2C_MUX *mux; - I2C_MUX_DEVICE *device = i2c_mux_devices; - - printf ("Busses reached over muxes:\n"); - while (device != NULL) { - printf ("Bus ID: %x\n", device->busid); - printf (" reached over Mux(es):\n"); - mux = device->mux; - while (mux != NULL) { - printf (" %s@%x ch: %x\n", mux->name, mux->chip, mux->channel); - mux = mux->next; + for (i = 0; i < CONFIG_SYS_NUM_I2C_BUSSES; i++) { + printf("Bus %d:\t%s", i, ADAP(i)->name); +#ifndef CONFIG_SYS_I2C_DIRECT_BUS + for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) { + if (i2c_bus[i].next_hop[j].chip == 0) break; + printf("->%s@0x%2x:%d", + i2c_bus[i].next_hop[j].mux.name, + i2c_bus[i].next_hop[j].chip, + i2c_bus[i].next_hop[j].channel); } - device = device->next; +#endif + printf("\n"); } - } else { - I2C_MUX_DEVICE *dev;
- dev = i2c_mux_ident_muxstring ((uchar *)argv[1]); - ret = 0; + } else { + /* show specific bus */ + i = simple_strtoul(argv[1], NULL, 10); + if (i >= CONFIG_SYS_NUM_I2C_BUSSES) { + printf("Invalid bus %d\n", i); + return(-1); + } + printf("Bus %d:\t%s", i, ADAP(i)->name); +#ifndef CONFIG_SYS_I2C_DIRECT_BUS + for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) { + if (i2c_bus[i].next_hop[j].chip == 0) break; + printf("->%s@0x%2x:%d", + i2c_bus[i].next_hop[j].mux.name, + i2c_bus[i].next_hop[j].chip, + i2c_bus[i].next_hop[j].channel); + } +#endif + printf("\n"); } - return ret; + + return(0); } -#endif /* CONFIG_I2C_MUX */
-#if defined(CONFIG_I2C_MULTI_BUS) +#if CONFIG_SYS_NUM_I2C_BUSSES > 1 int do_i2c_bus_num(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { - int bus_idx, ret=0; + int ret=0; + unsigned int bus_no;
if (argc == 1) /* querying current setting */ printf("Current bus is %d\n", i2c_get_bus_num()); else { - bus_idx = simple_strtoul(argv[1], NULL, 10); - printf("Setting bus to %d\n", bus_idx); - ret = i2c_set_bus_num(bus_idx); + bus_no = simple_strtoul(argv[1], NULL, 10); + if (bus_no >= CONFIG_SYS_NUM_I2C_BUSSES) { + printf("Invalid bus %d\n", bus_no); + return(-1); + } + printf("Setting bus to %d\n", bus_no); + ret = i2c_set_bus_num(bus_no); if (ret) printf("Failure changing bus number (%d)\n", ret); } return ret; } -#endif /* CONFIG_I2C_MULTI_BUS */ +#endif /* CONFIG_SYS_NUM_I2C_BUSSES > 1 */
int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { @@ -1262,16 +1279,16 @@ int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { -#if defined(CONFIG_I2C_MUX) +#if CONFIG_SYS_NUM_I2C_BUSSES > 1 if (!strncmp(argv[1], "bu", 2)) - return do_i2c_add_bus(cmdtp, flag, --argc, ++argv); -#endif /* CONFIG_I2C_MUX */ + return do_i2c_show_bus(cmdtp, flag, --argc, ++argv); +#endif /* CONFIG_SYS_NUM_I2C_BUSSES > 1 */ if (!strncmp(argv[1], "sp", 2)) return do_i2c_bus_speed(cmdtp, flag, --argc, ++argv); -#if defined(CONFIG_I2C_MULTI_BUS) +#if CONFIG_SYS_NUM_I2C_BUSSES > 1 if (!strncmp(argv[1], "de", 2)) return do_i2c_bus_num(cmdtp, flag, --argc, ++argv); -#endif /* CONFIG_I2C_MULTI_BUS */ +#endif /* CONFIG_SYS_NUM_I2C_BUSSES > 1 */ if (!strncmp(argv[1], "md", 2)) return do_i2c_md(cmdtp, flag, --argc, ++argv); if (!strncmp(argv[1], "mm", 2)) @@ -1304,13 +1321,11 @@ int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD( i2c, 6, 1, do_i2c, "I2C sub-system", -#if defined(CONFIG_I2C_MUX) - "bus [muxtype:muxaddr:muxchannel] - add a new bus reached over muxes.\n" -#endif /* CONFIG_I2C_MUX */ - "speed [speed] - show or set I2C bus speed\n" -#if defined(CONFIG_I2C_MULTI_BUS) +#if CONFIG_SYS_NUM_I2C_BUSSES > 1 + "bus [bus_no] - show I2C bus info.\n" "i2c dev [dev] - show or set current I2C bus\n" -#endif /* CONFIG_I2C_MULTI_BUS */ +#endif /* CONFIG_SYS_NUM_I2C_BUSSES > 1 */ + "i2c speed [speed] - show or set I2C bus speed\n" "i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n" "i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n" "i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n" @@ -1323,7 +1338,7 @@ U_BOOT_CMD( "i2c sdram chip - print SDRAM configuration information\n" #endif ); -#endif /* CONFIG_I2C_CMD_TREE */ +#else /* CONFIG_I2C_CMD_TREE */ U_BOOT_CMD( imd, 4, 1, do_i2c_md, \ "i2c memory display", \ @@ -1378,221 +1393,4 @@ U_BOOT_CMD( " (valid chip values 50..57)\n" ); #endif - -#if defined(CONFIG_I2C_MUX) - -int i2c_mux_add_device(I2C_MUX_DEVICE *dev) -{ - I2C_MUX_DEVICE *devtmp = i2c_mux_devices; - - if (i2c_mux_devices == NULL) { - i2c_mux_devices = dev; - return 0; - } - while (devtmp->next != NULL) - devtmp = devtmp->next; - - devtmp->next = dev; - return 0; -} - -I2C_MUX_DEVICE *i2c_mux_search_device(int id) -{ - I2C_MUX_DEVICE *device = i2c_mux_devices; - - while (device != NULL) { - if (device->busid == id) - return device; - device = device->next; - } - return NULL; -} - -/* searches in the buf from *pos the next ':'. - * returns: - * 0 if found (with *pos = where) - * < 0 if an error occured - * > 0 if the end of buf is reached - */ -static int i2c_mux_search_next (int *pos, uchar *buf, int len) -{ - while ((buf[*pos] != ':') && (*pos < len)) { - *pos += 1; - } - if (*pos >= len) - return 1; - if (buf[*pos] != ':') - return -1; - return 0; -} - -static int i2c_mux_get_busid (void) -{ - int tmp = i2c_mux_busid; - - i2c_mux_busid ++; - return tmp; -} - -/* Analyses a Muxstring and sends immediately the - Commands to the Muxes. Runs from Flash. - */ -int i2c_mux_ident_muxstring_f (uchar *buf) -{ - int pos = 0; - int oldpos; - int ret = 0; - int len = strlen((char *)buf); - int chip; - uchar channel; - int was = 0; - - while (ret == 0) { - oldpos = pos; - /* search name */ - ret = i2c_mux_search_next(&pos, buf, len); - if (ret != 0) - printf ("ERROR\n"); - /* search address */ - pos ++; - oldpos = pos; - ret = i2c_mux_search_next(&pos, buf, len); - if (ret != 0) - printf ("ERROR\n"); - buf[pos] = 0; - chip = simple_strtoul((char *)&buf[oldpos], NULL, 16); - buf[pos] = ':'; - /* search channel */ - pos ++; - oldpos = pos; - ret = i2c_mux_search_next(&pos, buf, len); - if (ret < 0) - printf ("ERROR\n"); - was = 0; - if (buf[pos] != 0) { - buf[pos] = 0; - was = 1; - } - channel = simple_strtoul((char *)&buf[oldpos], NULL, 16); - if (was) - buf[pos] = ':'; - if (i2c_write(chip, 0, 0, &channel, 1) != 0) { - printf ("Error setting Mux: chip:%x channel: \ - %x\n", chip, channel); - return -1; - } - pos ++; - oldpos = pos; - - } - - return 0; -} - -/* Analyses a Muxstring and if this String is correct - * adds a new I2C Bus. - */ -I2C_MUX_DEVICE *i2c_mux_ident_muxstring (uchar *buf) -{ - I2C_MUX_DEVICE *device; - I2C_MUX *mux; - int pos = 0; - int oldpos; - int ret = 0; - int len = strlen((char *)buf); - int was = 0; - - device = (I2C_MUX_DEVICE *)malloc (sizeof(I2C_MUX_DEVICE)); - device->mux = NULL; - device->busid = i2c_mux_get_busid (); - device->next = NULL; - while (ret == 0) { - mux = (I2C_MUX *)malloc (sizeof(I2C_MUX)); - mux->next = NULL; - /* search name of mux */ - oldpos = pos; - ret = i2c_mux_search_next(&pos, buf, len); - if (ret != 0) - printf ("%s no name.\n", __FUNCTION__); - mux->name = (char *)malloc (pos - oldpos + 1); - memcpy (mux->name, &buf[oldpos], pos - oldpos); - mux->name[pos - oldpos] = 0; - /* search address */ - pos ++; - oldpos = pos; - ret = i2c_mux_search_next(&pos, buf, len); - if (ret != 0) - printf ("%s no mux address.\n", __FUNCTION__); - buf[pos] = 0; - mux->chip = simple_strtoul((char *)&buf[oldpos], NULL, 16); - buf[pos] = ':'; - /* search channel */ - pos ++; - oldpos = pos; - ret = i2c_mux_search_next(&pos, buf, len); - if (ret < 0) - printf ("%s no mux channel.\n", __FUNCTION__); - was = 0; - if (buf[pos] != 0) { - buf[pos] = 0; - was = 1; - } - mux->channel = simple_strtoul((char *)&buf[oldpos], NULL, 16); - if (was) - buf[pos] = ':'; - if (device->mux == NULL) - device->mux = mux; - else { - I2C_MUX *muxtmp = device->mux; - while (muxtmp->next != NULL) { - muxtmp = muxtmp->next; - } - muxtmp->next = mux; - } - pos ++; - oldpos = pos; - } - if (ret > 0) { - /* Add Device */ - i2c_mux_add_device (device); - return device; - } - - return NULL; -} - -int i2x_mux_select_mux(int bus) -{ - I2C_MUX_DEVICE *dev; - I2C_MUX *mux; - - if ((gd->flags & GD_FLG_RELOC) != GD_FLG_RELOC) { - /* select Default Mux Bus */ -#if defined(CONFIG_SYS_I2C_IVM_BUS) - i2c_mux_ident_muxstring_f ((uchar *)CONFIG_SYS_I2C_IVM_BUS); -#else - { - unsigned char *buf; - buf = (unsigned char *) getenv("EEprom_ivm"); - if (buf != NULL) - i2c_mux_ident_muxstring_f (buf); - } -#endif - return 0; - } - dev = i2c_mux_search_device(bus); - if (dev == NULL) - return -1; - - mux = dev->mux; - while (mux != NULL) { - if (i2c_write(mux->chip, 0, 0, &mux->channel, 1) != 0) { - printf ("Error setting Mux: chip:%x channel: \ - %x\n", mux->chip, mux->channel); - return -1; - } - mux = mux->next; - } - return 0; -} -#endif /* CONFIG_I2C_MUX */ +#endif /* CONFIG_I2C_CMD_TREE */
participants (1)
-
ksi@koi8.net