On 10/28/2015 05:45 PM, Steve Kipisz wrote:
> From: Lokesh Vutla <lokeshvu...@ti.com>
> 
> Add support for EEPROM init and read. The am57xx boards have EEPROMs
> that have board name, version, serial data and other data. The init
> routine will initialize an i2c bus and then probe for the EEPROM
> device. The read routine will read data from the EEPROM and store
> it in an omap_eeprom structure. The data read will be used later in
> board detection of TI EVMs.
> 
> This code is in omap-common since it can be reused by other TI EVMs
> that have EEPROMs that use the same format. The onboard EEPROM on the
> Beaglebone Black, Bealgebone, AM335x EVM, AM34x GP EVM, DRA-74 EVM also
> follows the same format. So its better to define a common function,
> insted of redefining everywhere.
> 
> Signed-off-by: Lokesh Vutla <lokeshvu...@ti.com>
> Signed-off-by: Steve Kipisz <s-kipi...@ti.com>
> ---
>  arch/arm/cpu/armv7/omap-common/Makefile      |  1 +
>  arch/arm/cpu/armv7/omap-common/omap_eeprom.c | 54 +++++++++++++++++++++++++++
>  arch/arm/include/asm/omap_common.h           | 55 
> ++++++++++++++++++++++++++++
>  include/configs/am57xx_evm.h                 | 10 +++++
>  4 files changed, 120 insertions(+)
>  create mode 100644 arch/arm/cpu/armv7/omap-common/omap_eeprom.c
> 
> diff --git a/arch/arm/cpu/armv7/omap-common/Makefile 
> b/arch/arm/cpu/armv7/omap-common/Makefile
> index 464a5d1..99ea897 100644
> --- a/arch/arm/cpu/armv7/omap-common/Makefile
> +++ b/arch/arm/cpu/armv7/omap-common/Makefile
> @@ -30,3 +30,4 @@ obj-y       += boot-common.o
>  obj-y        += lowlevel_init.o
>  
>  obj-y        += mem-common.o
> +obj-$(CONFIG_ENV_EEPROM_IS_ON_I2C) += omap_eeprom.o
> diff --git a/arch/arm/cpu/armv7/omap-common/omap_eeprom.c 
> b/arch/arm/cpu/armv7/omap-common/omap_eeprom.c
> new file mode 100644
> index 0000000..98de51e
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/omap-common/omap_eeprom.c
> @@ -0,0 +1,54 @@
> +/*
> + * omap_eeprom.c
> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated -
> + * http://www.ti.com/
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <i2c.h>
> +#include <asm/omap_common.h>
> +
> +int omap_eeprom_init(int i2c_bus, int dev_addr)
> +{
> +     int rc = 0;
> +
> +     rc = i2c_set_bus_num(i2c_bus);
> +     if (rc) {
> +             printf("I2C bus %d Initialization failed err=%d\n",
> +                    i2c_bus, rc);
> +             return -1;
> +     }
> +
> +     rc = i2c_probe(dev_addr);
> +     if (rc) {
> +             printf("I2c probe at address %d on bus %d failed err=%d\n",
> +                    dev_addr, i2c_bus, rc);
> +             return -1;
> +     }
> +
> +     return 0;
> +}
> +
> +int omap_eeprom_read(int dev_addr, int offset, struct omap_eeprom *ep)
> +{
> +     int ret = 0;
> +
> +     ret = i2c_read(dev_addr, offset, 2, (uchar *)ep,
> +             sizeof(struct omap_eeprom));
> +
> +     if (!ret) {
> +             /*
> +              * Return error if proper header
> +              * is not found.
> +              */
> +             if (ep->header != OMAP_EEPROM_HEADER)
> +                     ret = -1;
> +     } else {
> +             printf("i2c read error err=%d\n", ret);
> +     }
> +
> +     return ret;
> +}
> diff --git a/arch/arm/include/asm/omap_common.h 
> b/arch/arm/include/asm/omap_common.h
> index d7b81c1..9a9b154 100644
> --- a/arch/arm/include/asm/omap_common.h
> +++ b/arch/arm/include/asm/omap_common.h
> @@ -552,6 +552,61 @@ struct vcores_data {
>       struct volts iva;
>  };
>  
> +/*
> + * TI AM57xx EVMs define a system EEPROM that defines certain sub-fields.
> + * We use these fields to in turn see what board we are on, and what
> + * that might require us to set or not set.
> + */
> +
> +#define HDR_NO_OF_MAC_ADDR   3
> +#define HDR_ETH_ALEN         6
> +#define HDR_NAME_LEN         8
> +#define OMAP_EEPROM_HEADER   0xEE3355AA
> +
> +/**
> + * struct omap_eeprom - This structure holds data read in from the
> + *                   EEPROM.
> + * @header: This holds the magic number
> + * @name: The name of the board
> + * @version: Board revision
> + * @serail: Board serial number
> + * @config: Reserved
> + * @mac_addr: Any MAC addresses written in the EEPROM
> + *
> + * The data is this struction is read from the EEPROM on the board.
> + * It is used for board detection which is based on name. It is used
> + * to configure specific TI boards. This allows booting of multible
> + * TI boards with a single MLO and u-boot.
> + */
> +struct omap_eeprom {
> +     unsigned int header;
> +     char name[HDR_NAME_LEN];
> +     char version[4];
> +     char serial[12];
> +     char config[32];
> +     char mac_addr[HDR_NO_OF_MAC_ADDR][HDR_ETH_ALEN];
> +};

This structure is not generic to all platforms -> DRA7-evm for example
uses a completely different eeprom organization.
> +
> +/**
> + * omap_eeprom_init - Initialize an i2c bus and probe for a device
> + * @i2c_bus: i2c bus number to initialize
> + * @dev_addr: Device address to probe for
> + *
> + * Return: 0 on success or -1 on failure.
> + */
> +int omap_eeprom_init(int i2c_bus, int dev_addr);
> +
> +/**
> + * omap_eeprom_read - Read data from an EEPROM
> + * @dev_addr: The device address of the EEPROM
> + * @offset: Offset to start reading in the EEPROM
> + * @ep: Pointer to the omap_eeprom structure to read into
> + *
> + * Return: 0 on success, -1 if the header is invalid, or the non-zero
> + *         return code of a failed i2c_read
> + */
> +int omap_eeprom_read(int dev_addr, int offset, struct omap_eeprom *ep);
> +
>  extern struct prcm_regs const **prcm;
>  extern struct prcm_regs const omap5_es1_prcm;
>  extern struct prcm_regs const omap5_es2_prcm;
> diff --git a/include/configs/am57xx_evm.h b/include/configs/am57xx_evm.h
> index 6308cab..1b70923 100644
> --- a/include/configs/am57xx_evm.h
> +++ b/include/configs/am57xx_evm.h
> @@ -87,5 +87,15 @@
>  #define CONFIG_SYS_SCSI_MAX_LUN              1
>  #define CONFIG_SYS_SCSI_MAX_DEVICE   (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
>                                               CONFIG_SYS_SCSI_MAX_LUN)
> +/* EEPROM Support */
> +#undef CONFIG_SPI
> +#define CONFIG_CMD_EEPROM
> +#define CONFIG_ENV_EEPROM_IS_ON_I2C
> +#define CONFIG_SYS_I2C_MULTI_EEPROMS
> +#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
> +#define CONFIG_EEPROM_CHIP_ADDR 0x50
> +
> +#define CONFIG_SYS_OMAP_I2C0 0
> +#define CONFIG_SYS_OMAP24_I2C_SPEED4 400000
>  
>  #endif /* __CONFIG_AM57XX_EVM_H */
> 

Introduce this as part of AM57xx eeprom detection.



-- 
Regards,
Nishanth Menon
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to