mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-30 00:21:06 +00:00
ti: common: board_detect: Allow DM I2C without CONFIG_DM_I2C_COMPAT
The EEPROM reading in the board detection code is done through legacy I2C functions which on platforms using DM_I2C this functionality is provided via the CONFIG_DM_I2C_COMPAT layer. To allow newer platforms to use the board detection code without relying on CONFIG_DM_I2C_COMPAT go ahead and add an I2C handling implementation that directly uses the I2C DM functionality. Signed-off-by: Andreas Dannenberg <dannenberg@ti.com> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> Reviewed-by: Heiko Schocher <hs@denx.de>
This commit is contained in:
parent
fb1b7712ad
commit
2463f6728e
1 changed files with 52 additions and 2 deletions
|
@ -50,6 +50,7 @@ int __maybe_unused ti_i2c_set_alen(int bus_addr, int dev_addr, int alen)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_DM_I2C) || defined(CONFIG_DM_I2C_COMPAT)
|
||||
/**
|
||||
* ti_i2c_eeprom_init - Initialize an i2c bus and probe for a device
|
||||
* @i2c_bus: i2c bus number to initialize
|
||||
|
@ -94,6 +95,7 @@ static int __maybe_unused ti_i2c_eeprom_read(int dev_addr, int offset,
|
|||
|
||||
return i2c_read(dev_addr, offset, alen, ep, epsize);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ti_eeprom_string_cleanup() - Handle eeprom programming errors
|
||||
|
@ -122,9 +124,57 @@ __weak void gpi2c_init(void)
|
|||
static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
|
||||
u32 header, u32 size, uint8_t *ep)
|
||||
{
|
||||
u32 byte, hdr_read;
|
||||
u32 hdr_read;
|
||||
int rc;
|
||||
|
||||
#if defined(CONFIG_DM_I2C) && !defined(CONFIG_DM_I2C_COMPAT)
|
||||
struct udevice *dev;
|
||||
struct udevice *bus;
|
||||
|
||||
rc = uclass_get_device_by_seq(UCLASS_I2C, bus_addr, &bus);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = i2c_get_chip(bus, dev_addr, 1, &dev);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/*
|
||||
* Read the header first then only read the other contents.
|
||||
*/
|
||||
rc = i2c_set_chip_offset_len(dev, 2);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* Corrupted data??? */
|
||||
if (hdr_read != header) {
|
||||
rc = dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
|
||||
/*
|
||||
* read the eeprom header using i2c again, but use only a
|
||||
* 1 byte address (some legacy boards need this..)
|
||||
*/
|
||||
if (rc) {
|
||||
rc = i2c_set_chip_offset_len(dev, 1);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
|
||||
}
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
if (hdr_read != header)
|
||||
return -1;
|
||||
|
||||
rc = dm_i2c_read(dev, 0, ep, size);
|
||||
if (rc)
|
||||
return rc;
|
||||
#else
|
||||
u32 byte;
|
||||
|
||||
gpi2c_init();
|
||||
rc = ti_i2c_eeprom_init(bus_addr, dev_addr);
|
||||
if (rc)
|
||||
|
@ -168,7 +218,7 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
|
|||
rc = i2c_read(dev_addr, 0x0, byte, ep, size);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue