提交 2463f672 编写于 作者: A Andreas Dannenberg 提交者: Heiko Schocher

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: NAndreas Dannenberg <dannenberg@ti.com>
Signed-off-by: NJean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: NTom Rini <trini@konsulko.com>
Reviewed-by: NHeiko Schocher <hs@denx.de>
上级 fb1b7712
...@@ -50,6 +50,7 @@ int __maybe_unused ti_i2c_set_alen(int bus_addr, int dev_addr, int alen) ...@@ -50,6 +50,7 @@ int __maybe_unused ti_i2c_set_alen(int bus_addr, int dev_addr, int alen)
} }
#endif #endif
#if !defined(CONFIG_DM_I2C) || defined(CONFIG_DM_I2C_COMPAT)
/** /**
* ti_i2c_eeprom_init - Initialize an i2c bus and probe for a device * ti_i2c_eeprom_init - Initialize an i2c bus and probe for a device
* @i2c_bus: i2c bus number to initialize * @i2c_bus: i2c bus number to initialize
...@@ -94,6 +95,7 @@ static int __maybe_unused ti_i2c_eeprom_read(int dev_addr, int offset, ...@@ -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); return i2c_read(dev_addr, offset, alen, ep, epsize);
} }
#endif
/** /**
* ti_eeprom_string_cleanup() - Handle eeprom programming errors * ti_eeprom_string_cleanup() - Handle eeprom programming errors
...@@ -122,9 +124,57 @@ __weak void gpi2c_init(void) ...@@ -122,9 +124,57 @@ __weak void gpi2c_init(void)
static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr, static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
u32 header, u32 size, uint8_t *ep) u32 header, u32 size, uint8_t *ep)
{ {
u32 byte, hdr_read; u32 hdr_read;
int rc; 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(); gpi2c_init();
rc = ti_i2c_eeprom_init(bus_addr, dev_addr); rc = ti_i2c_eeprom_init(bus_addr, dev_addr);
if (rc) if (rc)
...@@ -168,7 +218,7 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr, ...@@ -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); rc = i2c_read(dev_addr, 0x0, byte, ep, size);
if (rc) if (rc)
return rc; return rc;
#endif
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册