From: Zhang Ying-22455 <ying.zhang22...@nxp.com> Add DM capable code into the sys_eeprom driver. The legacy non-DM, non-DT support is retained as there are still systems in the tree which are not DM or DT capable.
Signed-off-by: Zhang Ying-22455 <ying.zhang22...@nxp.com> --- board/freescale/common/sys_eeprom.c | 68 +++++++++++++++++++++++++++++++++++-- drivers/i2c/mxc_i2c.c | 8 +++++ 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/board/freescale/common/sys_eeprom.c b/board/freescale/common/sys_eeprom.c index ab0fe0b..932b711 100644 --- a/board/freescale/common/sys_eeprom.c +++ b/board/freescale/common/sys_eeprom.c @@ -10,6 +10,7 @@ #include <command.h> #include <i2c.h> #include <linux/ctype.h> +#include <dm.h> #ifdef CONFIG_SYS_I2C_EEPROM_CCID #include "../common/eeprom.h" @@ -154,13 +155,33 @@ static int read_eeprom(void) if (has_been_read) return 0; +#ifdef CONFIG_DM_I2C + struct udevice *dev, *udev; + + if (uclass_get_device_by_name(UCLASS_I2C, + FSL_I2C_EEPROM_DM_NAME, &udev)) { + puts("Cannot find EEPROM bus\n"); + return false; + } + + ret = i2c_get_chip(udev, CONFIG_SYS_I2C_EEPROM_ADDR, 1, &dev); + if (ret) { + puts("Cannot get EEPROM chip\n"); + return false; + } +#endif + #ifdef CONFIG_SYS_EEPROM_BUS_NUM bus = i2c_get_bus_num(); i2c_set_bus_num(CONFIG_SYS_EEPROM_BUS_NUM); #endif +#ifdef CONFIG_DM_I2C + ret = dm_i2c_read(dev, 0, (void *)&e, sizeof(e)); +#else ret = i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, (void *)&e, sizeof(e)); +#endif #ifdef CONFIG_SYS_EEPROM_BUS_NUM i2c_set_bus_num(bus); @@ -210,6 +231,21 @@ static int prog_eeprom(void) #endif update_crc(); +#ifdef CONFIG_DM_I2C + struct udevice *dev, *udev; + + if (uclass_get_device_by_name(UCLASS_I2C, + FSL_I2C_EEPROM_DM_NAME, &udev)) { + puts("Cannot find EEPROM bus\n"); + return false; + } + + ret = i2c_get_chip(udev, CONFIG_SYS_I2C_EEPROM_ADDR, 1, &dev); + if (ret) { + puts("Cannot get EEPROM chip\n"); + return false; + } +#endif #ifdef CONFIG_SYS_EEPROM_BUS_NUM bus = i2c_get_bus_num(); i2c_set_bus_num(CONFIG_SYS_EEPROM_BUS_NUM); @@ -221,8 +257,13 @@ static int prog_eeprom(void) * complete a given write. */ for (i = 0, p = &e; i < sizeof(e); i += 8, p += 8) { - ret = i2c_write(CONFIG_SYS_I2C_EEPROM_ADDR, i, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, +#ifdef CONFIG_DM_I2C + ret = dm_i2c_write(dev, i, p, 8); +#else + ret = i2c_write(CONFIG_SYS_I2C_EEPROM_ADDR, i, + CONFIG_SYS_I2C_EEPROM_ADDR_LEN, p, min((int)(sizeof(e) - i), 8)); +#endif if (ret) break; udelay(5000); /* 5ms write cycle timing */ @@ -231,9 +272,12 @@ static int prog_eeprom(void) if (!ret) { /* Verify the write by reading back the EEPROM and comparing */ struct eeprom e2; - +#ifdef CONFIG_DM_I2C + ret = dm_i2c_read(dev, 0, (void *)&e2, sizeof(e2)); +#else ret = i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, (void *)&e2, sizeof(e2)); +#endif if (!ret && memcmp(&e, &e2, sizeof(e))) ret = -1; } @@ -528,9 +572,27 @@ unsigned int get_cpu_board_revision(void) u8 minor; /* 0x05 Board revision, minor */ } be; +#ifdef CONFIG_DM_I2C + struct udevice *dev, *udev; + + if (uclass_get_device_by_name(UCLASS_I2C, + FSL_I2C_EEPROM_DM_NAME, &udev)) { + puts("Cannot find EEPROM bus\n"); + return false; + } + + ret = i2c_get_chip(udev, CONFIG_SYS_I2C_EEPROM_ADDR, 1, &dev); + if (ret) { + puts("Cannot get EEPROM chip\n"); + return false; + } + + dm_i2c_read(dev, 0, (void *)&be, sizeof(be)); +#else + i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, (void *)&be, sizeof(be)); - +#endif if (be.id != (('C' << 24) | ('C' << 16) | ('I' << 8) | 'D')) return MPC85XX_CPU_BOARD_REV(0, 0); diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c index 9999d9f..9bf8984 100644 --- a/drivers/i2c/mxc_i2c.c +++ b/drivers/i2c/mxc_i2c.c @@ -795,6 +795,14 @@ U_BOOT_I2C_ADAP_COMPLETE(mxc7, mxc_i2c_init, mxc_i2c_probe, #else +int __enable_i2c_clk(unsigned char enable, unsigned int i2c_num) +{ + return 1; +} + +int enable_i2c_clk(unsigned char enable, unsigned int i2c_num) + __attribute__((weak, alias("__enable_i2c_clk"))); + static int mxc_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) { struct mxc_i2c_bus *i2c_bus = dev_get_priv(bus); -- 2.7.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot