diff options
author | Andreas Dannenberg <dannenberg@ti.com> | 2018-12-07 14:50:47 +0100 |
---|---|---|
committer | Heiko Schocher <hs@denx.de> | 2018-12-10 06:20:17 +0100 |
commit | 2463f6728e821f7127914dac36733cbd6e089bcf (patch) | |
tree | dae2cdca927365c230081823cd85974effd921d6 /board/ti | |
parent | fb1b7712ad3f375f83e74629f03236c300b0b896 (diff) | |
download | u-boot-2463f6728e821f7127914dac36733cbd6e089bcf.zip u-boot-2463f6728e821f7127914dac36733cbd6e089bcf.tar.gz u-boot-2463f6728e821f7127914dac36733cbd6e089bcf.tar.bz2 |
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>
Diffstat (limited to 'board/ti')
-rw-r--r-- | board/ti/common/board_detect.c | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/board/ti/common/board_detect.c b/board/ti/common/board_detect.c index c475f10..085e732 100644 --- a/board/ti/common/board_detect.c +++ b/board/ti/common/board_detect.c @@ -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; } |