Felix Held has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/63791 )
Change subject: include/device/i2c_simple: add i2c_read_eeprom_bytes function ......................................................................
include/device/i2c_simple: add i2c_read_eeprom_bytes function
To read data from an I2C EEPROM, first the two offset bytes are sent to the EEPROM and then the data bytes are read from the EEPROM. The main difference to i2c_read_bytes is that that function will only send one offset byte to the I2C device.
TEST=Reading the contents of an EEPROM on the AMD Chausie board works
Signed-off-by: Felix Held felix-coreboot@felixheld.de Change-Id: I224e434bb2654aabef6302c1525112e44c4b21fa --- M src/include/device/i2c_simple.h 1 file changed, 28 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/91/63791/1
diff --git a/src/include/device/i2c_simple.h b/src/include/device/i2c_simple.h index 8f389b3..8d15474 100644 --- a/src/include/device/i2c_simple.h +++ b/src/include/device/i2c_simple.h @@ -142,4 +142,32 @@ return i2c_transfer(bus, &seg, 1); }
+/** + * Read multi-bytes from an eeprom with two address bytes with + * two segments in one frame + * + * [start][slave addr][w][register high addr][register low addr] + * [start][slave addr][r][data...][stop] + */ +static inline int i2c_read_eeprom_bytes(unsigned int bus, uint8_t slave, uint16_t offset, + uint8_t *data, int len) +{ + struct i2c_msg seg[2]; + uint8_t eeprom_offset[2]; + + eeprom_offset[0] = offset >> 8; + eeprom_offset[1] = offset & 0xff; + + seg[0].flags = 0; + seg[0].slave = slave; + seg[0].buf = eeprom_offset; + seg[0].len = sizeof(eeprom_offset); + seg[1].flags = I2C_M_RD; + seg[1].slave = slave; + seg[1].buf = data; + seg[1].len = len; + + return i2c_transfer(bus, seg, ARRAY_SIZE(seg)); +} + #endif /* _DEVICE_I2C_SIMPLE_H_ */