The first byte of the string read from SPI bus from which Mox module
toplogy is detected contains ID of the CPU module. This ID can
differentiate between the version with SD card slot and the one with
eMMC card.

Signed-off-by: Marek Behun <marek.be...@nic.cz>

diff --git a/board/CZ.NIC/turris_mox/turris_mox.c 
b/board/CZ.NIC/turris_mox/turris_mox.c
index f7fb2c2955..c8ead5d67b 100644
--- a/board/CZ.NIC/turris_mox/turris_mox.c
+++ b/board/CZ.NIC/turris_mox/turris_mox.c
@@ -54,8 +54,16 @@ int board_init(void)
        return 0;
 }
 
-static int mox_read_topology(const u8 **ptopology, int *psize)
+typedef enum {
+       MOX_UNKNOWN,
+       MOX_EMMC,
+       MOX_SD
+} mox_version_t;
+
+static int mox_read_topology(const u8 **ptopology, int *psize,
+                            mox_version_t *pversion)
 {
+       static mox_version_t mox_version;
        static u8 topology[9];
        static int size = 0;
        struct spi_slave *slave;
@@ -64,8 +72,12 @@ static int mox_read_topology(const u8 **ptopology, int 
*psize)
        int ret, i;
 
        if (size) {
-               *ptopology = topology;
-               *psize = size;
+               if (ptopology)
+                       *ptopology = topology;
+               if (psize)
+                       *psize = size;
+               if (pversion)
+                       *pversion = mox_version;
                return 0;
        }
 
@@ -85,7 +97,17 @@ static int mox_read_topology(const u8 **ptopology, int 
*psize)
        if (ret)
                goto fail_release;
 
-       if (din[0] != 0x00 && din[0] != 0xff) {
+       switch (din[0]) {
+       case 0x00:
+               mox_version = MOX_EMMC;
+               break;
+       case 0x10:
+               mox_version = MOX_SD;
+               break;
+       case 0xff:
+               mox_version = MOX_UNKNOWN;
+               break;
+       default:
                ret = -ENODEV;
                goto fail_release;
        }
@@ -94,8 +116,12 @@ static int mox_read_topology(const u8 **ptopology, int 
*psize)
                topology[i-1] = din[i] & 0xf;
        size = i-1;
 
-       *ptopology = topology;
-       *psize = size;
+       if (ptopology)
+               *ptopology = topology;
+       if (psize)
+               *psize = size;
+       if (pversion)
+               *pversion = mox_version;
 
 fail_release:
        spi_release_bus(slave);
@@ -110,7 +136,7 @@ void board_update_comphy_map(struct comphy_map *serdes_map, 
int count)
        int ret, i, size, has = 0;
        const u8 *topology;
 
-       ret = mox_read_topology(&topology, &size);
+       ret = mox_read_topology(&topology, &size, NULL);
        if (ret)
                return;
 
@@ -139,13 +165,17 @@ int last_stage_init(void)
        size_t len = 0;
        const u8 *topology;
        char module_topology[128];
+       mox_version_t version;
 
-       ret = mox_read_topology(&topology, &size);
+       ret = mox_read_topology(&topology, &size, &version);
        if (ret) {
                printf("Cannot read module topology!\n");
                return 0;
        }
 
+       printf("Found Turris Mox %s version\n", version == MOX_SD ? "SD" :
+                                               version == MOX_EMMC ? "eMMC" :
+                                               "unknown");
        printf("Module Topology:\n");
        for (i = 0; i < size; ++i) {
                size_t mlen;
@@ -179,6 +209,8 @@ int last_stage_init(void)
        module_topology[len > 0 ? len - 1 : 0] = '\0';
 
        env_set("module_topology", module_topology);
+       env_set("mox_version", version == MOX_SD ? "sd" :
+                              version == MOX_EMMC ? "emmc" : "");
 
        return 0;
 }
-- 
2.16.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to