i2c, multibus: get rid of CONFIG_I2C_MUX
CONFIG_I2C_MUX is replaced through the new i2c multibus/multiadapter framework, configured through CONFIG_SYS_I2C. As CONFIG_I2C_MUX is only used on the keymile boards, and they are now completely moved to the new framework, remove CONFIG_I2C_MUX. Signed-off-by: Heiko Schocher <hs@denx.de> Cc: Holger Brunck <holger.brunck@keymile.com> Tested-By: Holger Brunck <holger.brunck@keymile.com>
This commit is contained in:
parent
00f792e0df
commit
9a2accb44f
47
README
47
README
@ -2225,53 +2225,6 @@ CBFS (Coreboot Filesystem) support
|
||||
If not defined, then U-Boot uses predefined value for
|
||||
specified DTT device.
|
||||
|
||||
CONFIG_I2C_MUX
|
||||
|
||||
Define this option if you have I2C devices reached over 1 .. n
|
||||
I2C Muxes like the pca9544a. This option addes a new I2C
|
||||
Command "i2c bus [muxtype:muxaddr:muxchannel]" which adds a
|
||||
new I2C Bus to the existing I2C Busses. If you select the
|
||||
new Bus with "i2c dev", u-bbot sends first the commandos for
|
||||
the muxes to activate this new "bus".
|
||||
|
||||
CONFIG_I2C_MULTI_BUS must be also defined, to use this
|
||||
feature!
|
||||
|
||||
Example:
|
||||
Adding a new I2C Bus reached over 2 pca9544a muxes
|
||||
The First mux with address 70 and channel 6
|
||||
The Second mux with address 71 and channel 4
|
||||
|
||||
=> i2c bus pca9544a:70:6:pca9544a:71:4
|
||||
|
||||
Use the "i2c bus" command without parameter, to get a list
|
||||
of I2C Busses with muxes:
|
||||
|
||||
=> i2c bus
|
||||
Busses reached over muxes:
|
||||
Bus ID: 2
|
||||
reached over Mux(es):
|
||||
pca9544a@70 ch: 4
|
||||
Bus ID: 3
|
||||
reached over Mux(es):
|
||||
pca9544a@70 ch: 6
|
||||
pca9544a@71 ch: 4
|
||||
=>
|
||||
|
||||
If you now switch to the new I2C Bus 3 with "i2c dev 3"
|
||||
u-boot first sends the command to the mux@70 to enable
|
||||
channel 6, and then the command to the mux@71 to enable
|
||||
the channel 4.
|
||||
|
||||
After that, you can use the "normal" i2c commands as
|
||||
usual to communicate with your I2C devices behind
|
||||
the 2 muxes.
|
||||
|
||||
This option is actually implemented for the bitbanging
|
||||
algorithm in common/soft_i2c.c and for the Hardware I2C
|
||||
Bus on the MPC8260. But it should be not so difficult
|
||||
to add this option to other architectures.
|
||||
|
||||
CONFIG_SOFT_I2C_READ_REPEATED_START
|
||||
|
||||
defining this will force the i2c_read() function in
|
||||
|
@ -746,23 +746,9 @@ unsigned int i2c_get_bus_num(void)
|
||||
|
||||
int i2c_set_bus_num(unsigned int bus)
|
||||
{
|
||||
#if defined(CONFIG_I2C_MUX)
|
||||
if (bus < CONFIG_SYS_MAX_I2C_BUS) {
|
||||
i2c_bus_num = bus;
|
||||
} else {
|
||||
int ret;
|
||||
|
||||
ret = i2x_mux_select_mux(bus);
|
||||
if (ret == 0)
|
||||
i2c_bus_num = bus;
|
||||
else
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
if (bus >= CONFIG_SYS_MAX_I2C_BUS)
|
||||
return -1;
|
||||
i2c_bus_num = bus;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
234
common/cmd_i2c.c
234
common/cmd_i2c.c
@ -110,8 +110,7 @@ static uint i2c_mm_last_alen;
|
||||
* pairs. The following macros take care of this */
|
||||
|
||||
#if defined(CONFIG_SYS_I2C_NOPROBES)
|
||||
#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MUX) || \
|
||||
defined(CONFIG_I2C_MULTI_BUS)
|
||||
#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MULTI_BUS)
|
||||
static struct
|
||||
{
|
||||
uchar bus;
|
||||
@ -132,11 +131,6 @@ static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
|
||||
#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;
|
||||
#endif
|
||||
|
||||
#define DISP_LINE_LEN 16
|
||||
|
||||
/**
|
||||
@ -1554,7 +1548,7 @@ static int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv
|
||||
static cmd_tbl_t cmd_i2c_sub[] = {
|
||||
#if defined(CONFIG_SYS_I2C)
|
||||
U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_show_bus, "", ""),
|
||||
#endif /* CONFIG_I2C_MUX */
|
||||
#endif
|
||||
U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""),
|
||||
#if defined(CONFIG_SYS_I2C) || \
|
||||
defined(CONFIG_I2C_MULTI_BUS)
|
||||
@ -1618,7 +1612,7 @@ static int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
||||
static char i2c_help_text[] =
|
||||
#if defined(CONFIG_SYS_I2C)
|
||||
"bus [muxtype:muxaddr:muxchannel] - show I2C bus info\n"
|
||||
#endif /* CONFIG_I2C_MUX */
|
||||
#endif
|
||||
"crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
|
||||
#if defined(CONFIG_SYS_I2C) || \
|
||||
defined(CONFIG_I2C_MULTI_BUS)
|
||||
@ -1647,225 +1641,3 @@ U_BOOT_CMD(
|
||||
"I2C sub-system",
|
||||
i2c_help_text
|
||||
);
|
||||
|
||||
#if defined(CONFIG_I2C_MUX)
|
||||
static 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 immediately sends 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;
|
||||
|
||||
}
|
||||
i2c_init_board();
|
||||
|
||||
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) {
|
||||
/* do deblocking on each level of mux, before mux config */
|
||||
i2c_init_board();
|
||||
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;
|
||||
}
|
||||
/* do deblocking on each level of mux and after mux config */
|
||||
i2c_init_board();
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_I2C_MUX */
|
||||
|
@ -49,41 +49,17 @@ static int eeprom_bus_read(unsigned dev_addr, unsigned offset,
|
||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||
int old_bus = i2c_get_bus_num();
|
||||
|
||||
#if defined(CONFIG_SYS_I2C)
|
||||
if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS)
|
||||
i2c_set_bus_num(CONFIG_I2C_ENV_EEPROM_BUS);
|
||||
#else
|
||||
if (gd->flags & GD_FLG_RELOC) {
|
||||
if (env_eeprom_bus == -1) {
|
||||
I2C_MUX_DEVICE *dev = NULL;
|
||||
dev = i2c_mux_ident_muxstring(
|
||||
(uchar *)CONFIG_I2C_ENV_EEPROM_BUS);
|
||||
if (dev != NULL)
|
||||
env_eeprom_bus = dev->busid;
|
||||
else
|
||||
printf("error adding env eeprom bus.\n");
|
||||
}
|
||||
if (old_bus != env_eeprom_bus) {
|
||||
i2c_set_bus_num(env_eeprom_bus);
|
||||
old_bus = env_eeprom_bus;
|
||||
}
|
||||
} else {
|
||||
rcode = i2c_mux_ident_muxstring_f(
|
||||
(uchar *)CONFIG_I2C_ENV_EEPROM_BUS);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
rcode = eeprom_read(dev_addr, offset, buffer, cnt);
|
||||
|
||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||
#if defined(CONFIG_SYS_I2C)
|
||||
if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS)
|
||||
#else
|
||||
if (old_bus != env_eeprom_bus)
|
||||
#endif
|
||||
i2c_set_bus_num(old_bus);
|
||||
#endif
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
@ -94,14 +70,12 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,
|
||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||
int old_bus = i2c_get_bus_num();
|
||||
|
||||
#if defined(CONFIG_SYS_I2C)
|
||||
if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS)
|
||||
i2c_set_bus_num(CONFIG_I2C_ENV_EEPROM_BUS);
|
||||
#else
|
||||
rcode = i2c_mux_ident_muxstring_f((uchar *)CONFIG_I2C_ENV_EEPROM_BUS);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
rcode = eeprom_write(dev_addr, offset, buffer, cnt);
|
||||
|
||||
#if defined(CONFIG_I2C_ENV_EEPROM_BUS)
|
||||
i2c_set_bus_num(old_bus);
|
||||
#endif
|
||||
|
@ -197,27 +197,6 @@ void i2c_init_board(void);
|
||||
void i2c_board_late_init(void);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_I2C_MUX)
|
||||
|
||||
typedef struct _mux {
|
||||
uchar chip;
|
||||
uchar channel;
|
||||
char *name;
|
||||
struct _mux *next;
|
||||
} I2C_MUX;
|
||||
|
||||
typedef struct _mux_device {
|
||||
int busid;
|
||||
I2C_MUX *mux; /* List of muxes, to reach the device */
|
||||
struct _mux_device *next;
|
||||
} I2C_MUX_DEVICE;
|
||||
|
||||
I2C_MUX_DEVICE *i2c_mux_search_device(int id);
|
||||
I2C_MUX_DEVICE *i2c_mux_ident_muxstring (uchar *buf);
|
||||
int i2x_mux_select_mux(int bus);
|
||||
int i2c_mux_ident_muxstring_f (uchar *buf);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYS_I2C
|
||||
/*
|
||||
* i2c_get_bus_num:
|
||||
|
Loading…
Reference in New Issue
Block a user