]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
ti: common: board_detect: Allow DM I2C without CONFIG_DM_I2C_COMPAT
authorAndreas Dannenberg <dannenberg@ti.com>
Fri, 7 Dec 2018 13:50:47 +0000 (14:50 +0100)
committerHeiko Schocher <hs@denx.de>
Mon, 10 Dec 2018 05:20:17 +0000 (06:20 +0100)
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>
board/ti/common/board_detect.c

index c475f106b2fd976badb946644e27a280e608adc9..085e7320bd8f426c6913418bf2deef154d9086f0 100644 (file)
@@ -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;
 }