diff options
| author | Christophe Leroy <[email protected]> | 2023-04-05 16:05:36 +0200 |
|---|---|---|
| committer | Christophe Leroy <[email protected]> | 2023-04-28 17:52:23 +0200 |
| commit | 4b6a5388da774e68e0f6381faefc7a3b402c468a (patch) | |
| tree | c1e8b26034284369918412287391fd66914c7aaf /board/cssi/common | |
| parent | 3155b0af4eab045b145681a53ebec04bd836b17c (diff) | |
board: cssi: Refactor EEPROM read
On cmpc885 board, the ethernet addresses are stored in an
EEPROM that is accessed through SPI.
A 3 bytes command is sent to the chip then the content
gets read. At the time being a single block access is
performed, ignoring the first 3 bytes read.
Reword the SPI transfer to first send 3 bytes then
receive the content of the EEPROM so that there don't be
3 dummy bytes at the beginning of the buffer.
And move the function into common.c so that it can be
reused by the board that will be added in a future patch.
Signed-off-by: Christophe Leroy <[email protected]>
Diffstat (limited to 'board/cssi/common')
| -rw-r--r-- | board/cssi/common/common.c | 35 | ||||
| -rw-r--r-- | board/cssi/common/common.h | 1 |
2 files changed, 36 insertions, 0 deletions
diff --git a/board/cssi/common/common.c b/board/cssi/common/common.c index 71b35cc692f..de68e23fcd9 100644 --- a/board/cssi/common/common.c +++ b/board/cssi/common/common.c @@ -8,7 +8,11 @@ * Common specific routines for the CS Group boards */ +#include <dm.h> #include <fdt_support.h> +#include <spi.h> + +#define SPI_EEPROM_READ 0x03 static int fdt_set_node_and_value(void *blob, char *node, const char *prop, void *var, int size) @@ -60,3 +64,34 @@ void ft_cleanup(void *blob, unsigned long id, const char *prop, const char *comp fdt_set_node_and_value(blob, "/", prop, &id, sizeof(uint32_t)); } + +int read_eeprom(u8 *din, int len) +{ + struct udevice *eeprom; + struct spi_slave *slave; + uchar dout[3] = {SPI_EEPROM_READ, 0, 0}; + int ret; + + ret = uclass_get_device(UCLASS_SPI, 0, &eeprom); + if (ret) + return ret; + + ret = _spi_get_bus_and_cs(0, 0, 1000000, 0, "spi_generic_drv", + "generic_0:0", &eeprom, &slave); + if (ret) + return ret; + + ret = spi_claim_bus(slave); + + ret = spi_xfer(slave, sizeof(dout) << 3, dout, NULL, SPI_XFER_BEGIN); + if (ret) + return ret; + + ret = spi_xfer(slave, len << 3, NULL, din, SPI_XFER_END); + if (ret) + return ret; + + spi_release_bus(slave); + + return 0; +} diff --git a/board/cssi/common/common.h b/board/cssi/common/common.h index 16852b6076d..9660898cc9d 100644 --- a/board/cssi/common/common.h +++ b/board/cssi/common/common.h @@ -4,5 +4,6 @@ #define _BOARD_CSSI_COMMON_H void ft_cleanup(void *blob, unsigned long id, const char *prop, const char *compatible); +int read_eeprom(u8 *din, int len); #endif /* _BOARD_CSSI_COMMON_H */ |
