board: ti: common: Handle the legacy eeprom address width properly
authorNishanth Menon <nm@ti.com>
Fri, 17 Jun 2022 18:26:11 +0000 (13:26 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 6 Jul 2022 18:30:08 +0000 (14:30 -0400)
Due to supply chain issues, we are starting to see a mixture of eeprom
usage including the smaller 7-bit addressing eeproms such as 24c04
used for eeproms.

These eeproms don't respond well to 2 byte addressing and fail the
read operation. We do have a check to ensure that we are reading the
alternate addressing size, however the valid failure prevents us
from checking at 1 byte anymore.

Rectify the same by falling through and depend on header data comparison
to ensure that we have valid data.

Signed-off-by: Nishanth Menon <nm@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
board/ti/common/board_detect.c

index 381cddc..0806dea 100644 (file)
@@ -86,7 +86,7 @@ __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 hdr_read;
+       u32 hdr_read = 0xdeadbeef;
        int rc;
 
 #if CONFIG_IS_ENABLED(DM_I2C)
@@ -107,9 +107,13 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
        if (rc)
                return rc;
 
-       rc = dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
-       if (rc)
-               return rc;
+       /*
+        * Skip checking result here since this could be a valid i2c read fail
+        * on some boards that use 1 byte addressing.
+        * We must allow for fall through to check the data if 1 byte
+        * addressing works
+        */
+       (void)dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
 
        /* Corrupted data??? */
        if (hdr_read != header) {
@@ -144,9 +148,13 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
         */
        byte = 2;
 
-       rc = i2c_read(dev_addr, 0x0, byte, (uint8_t *)&hdr_read, 4);
-       if (rc)
-               return rc;
+       /*
+        * Skip checking result here since this could be a valid i2c read fail
+        * on some boards that use 1 byte addressing.
+        * We must allow for fall through to check the data if 1 byte
+        * addressing works
+        */
+       (void)i2c_read(dev_addr, 0x0, byte, (uint8_t *)&hdr_read, 4);
 
        /* Corrupted data??? */
        if (hdr_read != header) {