Re: [PATCH v5 04/10] ti/common: add support for extension_scan_board function

2021-05-13 Thread Tom Rini
On Tue, May 04, 2021 at 07:31:24PM +0200, Kory Maincent wrote:

> The BeagleBone platforms all use a common mechanism to discover and
> identify extension boards (called "capes"): each extension board has an
> I2C-connected EEPROM describing itself.
> 
> This patch implements a generic extension_scan_board() feature that can
> be used by all BeagleBone platforms to read those I2C EEPROMs and fill
> in the list of "extension" structures.
> 
> Following commits will enable this common logic on two BeagleBone
> platforms.
> 
> Signed-off-by: Kory Maincent 

Applied to u-boot/master, thanks!

-- 
Tom


signature.asc
Description: PGP signature


[PATCH v5 04/10] ti/common: add support for extension_scan_board function

2021-05-04 Thread Kory Maincent
The BeagleBone platforms all use a common mechanism to discover and
identify extension boards (called "capes"): each extension board has an
I2C-connected EEPROM describing itself.

This patch implements a generic extension_scan_board() feature that can
be used by all BeagleBone platforms to read those I2C EEPROMs and fill
in the list of "extension" structures.

Following commits will enable this common logic on two BeagleBone
platforms.

Signed-off-by: Kory Maincent 
---

Change Since v1:
 - Use CAPE_EEPROM_BUS_NUM in Kconfig in place of the board header

 board/ti/common/Kconfig   |  6 +++
 board/ti/common/Makefile  |  1 +
 board/ti/common/cape_detect.c | 96 +++
 board/ti/common/cape_detect.h | 28 ++
 4 files changed, 131 insertions(+)
 create mode 100644 board/ti/common/cape_detect.c
 create mode 100644 board/ti/common/cape_detect.h

diff --git a/board/ti/common/Kconfig b/board/ti/common/Kconfig
index 9ead7ca038..49edd98014 100644
--- a/board/ti/common/Kconfig
+++ b/board/ti/common/Kconfig
@@ -16,6 +16,12 @@ config EEPROM_CHIP_ADDRESS
default 0x50
depends on TI_I2C_BOARD_DETECT
 
+config CAPE_EEPROM_BUS_NUM
+   int "Cape EEPROM's I2C bus address"
+   range 0 8
+   default 2
+   depends on CMD_EXTENSION
+
 config TI_COMMON_CMD_OPTIONS
bool "Enable cmd options on TI platforms"
imply CMD_ASKENV
diff --git a/board/ti/common/Makefile b/board/ti/common/Makefile
index cb97f226ae..3172d87b46 100644
--- a/board/ti/common/Makefile
+++ b/board/ti/common/Makefile
@@ -2,3 +2,4 @@
 # Copyright (C) 2015-2016 Texas Instruments Incorporated - http://www.ti.com/
 
 obj-${CONFIG_TI_I2C_BOARD_DETECT} += board_detect.o
+obj-${CONFIG_CMD_EXTENSION} += cape_detect.o
diff --git a/board/ti/common/cape_detect.c b/board/ti/common/cape_detect.c
new file mode 100644
index 00..2e6105cfbf
--- /dev/null
+++ b/board/ti/common/cape_detect.c
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2021
+ * Köry Maincent, Bootlin, 
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "cape_detect.h"
+
+static void sanitize_field(char *text, size_t size)
+{
+   char *c = NULL;
+
+   for (c = text; c < text + (int)size; c++) {
+   if (*c == 0xFF)
+   *c = 0;
+   }
+}
+
+int extension_board_scan(struct list_head *extension_list)
+{
+   struct extension *cape;
+   struct am335x_cape_eeprom_id eeprom_header;
+
+   int num_capes = 0;
+   int ret, i;
+   struct udevice *dev;
+   unsigned char addr;
+
+   char process_cape_part_number[17] = {'0'};
+   char process_cape_version[5] = {'0'};
+   uint8_t cursor = 0;
+
+   for (addr = CAPE_EEPROM_FIRST_ADDR; addr <= CAPE_EEPROM_LAST_ADDR; 
addr++) {
+   ret = i2c_get_chip_for_busnum(CONFIG_CAPE_EEPROM_BUS_NUM, addr, 
1, );
+   if (ret)
+   continue;
+
+   /* Move the read cursor to the beginning of the EEPROM */
+   dm_i2c_write(dev, 0, , 1);
+   ret = dm_i2c_read(dev, 0, (uint8_t *)_header,
+ sizeof(struct am335x_cape_eeprom_id));
+   if (ret) {
+   printf("Cannot read i2c EEPROM\n");
+   continue;
+   }
+
+   if (eeprom_header.header != CAPE_MAGIC)
+   continue;
+
+   sanitize_field(eeprom_header.board_name, 
sizeof(eeprom_header.board_name));
+   sanitize_field(eeprom_header.version, 
sizeof(eeprom_header.version));
+   sanitize_field(eeprom_header.manufacturer, 
sizeof(eeprom_header.manufacturer));
+   sanitize_field(eeprom_header.part_number, 
sizeof(eeprom_header.part_number));
+
+   /* Process cape part_number */
+   memset(process_cape_part_number, 0, 
sizeof(process_cape_part_number));
+   strncpy(process_cape_part_number, eeprom_header.part_number, 
16);
+   /* Some capes end with '.' */
+   for (i = 15; i >= 0; i--) {
+   if (process_cape_part_number[i] == '.')
+   process_cape_part_number[i] = '\0';
+   else
+   break;
+   }
+
+   /* Process cape version */
+   memset(process_cape_version, 0, sizeof(process_cape_version));
+   strncpy(process_cape_version, eeprom_header.version, 4);
+   for (i = 0; i < 4; i++) {
+   if (process_cape_version[i] == 0)
+   process_cape_version[i] = '0';
+   }
+
+   printf("BeagleBone Cape: %s (0x%x)\n", 
eeprom_header.board_name, addr);
+
+   cape = calloc(1, sizeof(struct extension));
+   if (!cape) {
+   printf("Error in memory allocation\n");
+