UBOOT_IMAGE:=u-boot-spl.kwb
endef
+define U-Boot/espressobin
+ NAME:=Marvell ESPRESSObin
+ BUILD_DEVICES:=globalscale_espressobin globalscale_espressobin-v7
+ BUILD_SUBTARGET:=cortexa53
+ UBOOT_CONFIG:=mvebu_espressobin-88f3720
+endef
+
+define U-Boot/espressobin-emmc
+ NAME:=Marvell ESPRESSObin
+ BUILD_DEVICES:=globalscale_espressobin-emmc globalscale_espressobin-v7-emmc
+ BUILD_SUBTARGET:=cortexa53
+ UBOOT_CONFIG:=mvebu_espressobin-88f3720
+ UBOOT_MAKE_FLAGS+=DEVICE_TREE=armada-3720-espressobin-emmc
+endef
+
define U-Boot/uDPU
NAME:=Methode uDPU
BUILD_DEVICES:=methode_udpu
UBOOT_TARGETS:= \
clearfog \
helios4 \
+ espressobin \
+ espressobin-emmc \
uDPU
Build/Exports:=$(Host/Exports)
--- /dev/null
+From 264c45575ec6a3d507dc4e43954b8a78283aca6c Mon Sep 17 00:00:00 2001
+From: Andre Heider <a.heider@gmail.com>
+Date: Thu, 10 Sep 2020 17:58:43 +0200
+Subject: [PATCH] mmc: xenon_sdhci: Add missing common host capabilities
+
+Use mmc_of_parse() to set the common host properties. That includes
+"bus-width", so parsing it can be removed from the driver.
+
+But more importantly, "non-removable" is now respected, which fixes
+the usage of eMMC.
+
+Signed-off-by: Andre Heider <a.heider@gmail.com>
+---
+ drivers/mmc/xenon_sdhci.c | 18 ++++--------------
+ 1 file changed, 4 insertions(+), 14 deletions(-)
+
+--- a/drivers/mmc/xenon_sdhci.c
++++ b/drivers/mmc/xenon_sdhci.c
+@@ -485,20 +485,10 @@ static int xenon_sdhci_probe(struct udev
+ armada_3700_soc_pad_voltage_set(host);
+
+ host->host_caps = MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_DDR_52MHz;
+- switch (fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev), "bus-width",
+- 1)) {
+- case 8:
+- host->host_caps |= MMC_MODE_8BIT;
+- break;
+- case 4:
+- host->host_caps |= MMC_MODE_4BIT;
+- break;
+- case 1:
+- break;
+- default:
+- printf("Invalid \"bus-width\" value\n");
+- return -EINVAL;
+- }
++
++ ret = mmc_of_parse(dev, &plat->cfg);
++ if (ret)
++ return ret;
+
+ host->ops = &xenon_sdhci_ops;
+
--- /dev/null
+From 753947e2c374820dcbc9c86626812aeb7d460653 Mon Sep 17 00:00:00 2001
+From: Andre Heider <a.heider@gmail.com>
+Date: Fri, 4 Sep 2020 16:34:22 +0200
+Subject: [PATCH] arm64: dts: armada-3720-espressobin: use Linux
+ model/compatible strings
+
+Fix the actual board vendor and ease synching dts files from Linux.
+---
+ arch/arm/dts/armada-3720-espressobin.dts | 4 ++--
+ board/Marvell/mvebu_armada-37xx/board.c | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/dts/armada-3720-espressobin.dts
++++ b/arch/arm/dts/armada-3720-espressobin.dts
+@@ -50,8 +50,8 @@
+ #include "armada-372x.dtsi"
+
+ / {
+- model = "Marvell Armada 3720 Community Board ESPRESSOBin";
+- compatible = "marvell,armada-3720-espressobin", "marvell,armada3720", "marvell,armada3710";
++ model = "Globalscale Marvell ESPRESSOBin Board";
++ compatible = "globalscale,espressobin", "marvell,armada3720", "marvell,armada3710";
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+--- a/board/Marvell/mvebu_armada-37xx/board.c
++++ b/board/Marvell/mvebu_armada-37xx/board.c
+@@ -201,7 +201,7 @@ static int mii_multi_chip_mode_write(str
+ /* Bring-up board-specific network stuff */
+ int board_network_enable(struct mii_dev *bus)
+ {
+- if (!of_machine_is_compatible("marvell,armada-3720-espressobin"))
++ if (!of_machine_is_compatible("globalscale,espressobin"))
+ return 0;
+
+ /*
+@@ -253,7 +253,7 @@ int ft_board_setup(void *blob, struct bd
+ int part_off;
+
+ /* Fill SPI MTD partitions for Linux kernel on Espressobin */
+- if (!of_machine_is_compatible("marvell,armada-3720-espressobin"))
++ if (!of_machine_is_compatible("globalscale,espressobin"))
+ return 0;
+
+ spi_off = fdt_node_offset_by_compatible(blob, -1, "jedec,spi-nor");
--- /dev/null
+From ee59573dd531df96de0d9dc8e79b34ed3716c864 Mon Sep 17 00:00:00 2001
+From: Andre Heider <a.heider@gmail.com>
+Date: Fri, 4 Sep 2020 15:38:58 +0200
+Subject: [PATCH] arm64: dts: armada-3720-espressobin: split common parts to
+ .dtsi
+
+Move most of the dts to the new common
+arch/arm/dts/armada-3720-espressobin.dtsi file, just like Linux has.
+
+The dts itself is imported from Linux.
+
+Signed-off-by: Andre Heider <a.heider@gmail.com>
+---
+ arch/arm/dts/armada-3720-espressobin.dts | 190 ++----------------
+ ...sobin.dts => armada-3720-espressobin.dtsi} | 3 -
+ 2 files changed, 20 insertions(+), 173 deletions(-)
+ rewrite arch/arm/dts/armada-3720-espressobin.dts (95%)
+ copy arch/arm/dts/{armada-3720-espressobin.dts => armada-3720-espressobin.dtsi} (96%)
+
+--- a/arch/arm/dts/armada-3720-espressobin.dts
++++ b/arch/arm/dts/armada-3720-espressobin.dts
+@@ -1,170 +1,20 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ /*
+- * Device Tree file for Marvell Armada 3720 community board
+- * (ESPRESSOBin)
++ * Device Tree file for Globalscale Marvell ESPRESSOBin Board
+ * Copyright (C) 2016 Marvell
+ *
+- * Gregory CLEMENT <gregory.clement@free-electrons.com>
+- * Konstantin Porotchkin <kostap@marvell.com>
++ * Romain Perier <romain.perier@free-electrons.com>
+ *
+- * This file is dual-licensed: you can use it either under the terms
+- * of the GPL or the X11 license, at your option. Note that this dual
+- * licensing only applies to this file, and not this project as a
+- * whole.
+- *
+- * a) This file is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of the
+- * License, or (at your option) any later version.
+- *
+- * This file is distributed in the hope that it will be useful
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * Or, alternatively
+- *
+- * b) Permission is hereby granted, free of charge, to any person
+- * obtaining a copy of this software and associated documentation
+- * files (the "Software"), to deal in the Software without
+- * restriction, including without limitation the rights to use
+- * copy, modify, merge, publish, distribute, sublicense, and/or
+- * sell copies of the Software, and to permit persons to whom the
+- * Software is furnished to do so, subject to the following
+- * conditions:
+- *
+- * The above copyright notice and this permission notice shall be
+- * included in all copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
+- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
+- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+- * OTHER DEALINGS IN THE SOFTWARE.
++ */
++/*
++ * Schematic available at http://espressobin.net/wp-content/uploads/2017/08/ESPRESSObin_V5_Schematics.pdf
+ */
+
+ /dts-v1/;
+
+-#include "armada-372x.dtsi"
++#include "armada-3720-espressobin.dtsi"
+
+ / {
+ model = "Globalscale Marvell ESPRESSOBin Board";
+ compatible = "globalscale,espressobin", "marvell,armada3720", "marvell,armada3710";
+-
+- chosen {
+- stdout-path = "serial0:115200n8";
+- };
+-
+- aliases {
+- ethernet0 = ð0;
+- i2c0 = &i2c0;
+- spi0 = &spi0;
+- };
+-
+- memory {
+- device_type = "memory";
+- reg = <0x00000000 0x00000000 0x00000000 0x20000000>;
+- };
+-
+- vcc_sd_reg0: regulator@0 {
+- compatible = "regulator-gpio";
+- regulator-name = "vcc_sd0";
+- regulator-min-microvolt = <1800000>;
+- regulator-max-microvolt = <3300000>;
+- regulator-type = "voltage";
+- states = <1800000 0x1
+- 3300000 0x0>;
+- gpios = <&gpionb 4 GPIO_ACTIVE_HIGH>;
+- };
+-};
+-
+-&comphy {
+- max-lanes = <3>;
+- phy0 {
+- phy-type = <PHY_TYPE_USB3_HOST0>;
+- phy-speed = <PHY_SPEED_5G>;
+- };
+-
+- phy1 {
+- phy-type = <PHY_TYPE_PEX0>;
+- phy-speed = <PHY_SPEED_2_5G>;
+- };
+-
+- phy2 {
+- phy-type = <PHY_TYPE_SATA0>;
+- phy-speed = <PHY_SPEED_5G>;
+- };
+-};
+-
+-ð0 {
+- status = "okay";
+- pinctrl-names = "default";
+- pinctrl-0 = <&rgmii_pins>, <&smi_pins>;
+- phy-mode = "rgmii";
+- phy_addr = <0x1>;
+- fixed-link {
+- speed = <1000>;
+- full-duplex;
+- };
+-};
+-
+-&i2c0 {
+- pinctrl-names = "default";
+- pinctrl-0 = <&i2c1_pins>;
+- status = "okay";
+-};
+-
+-/* CON3 */
+-&sata {
+- status = "okay";
+-};
+-
+-&sdhci0 {
+- pinctrl-names = "default";
+- pinctrl-0 = <&sdio_pins>;
+- bus-width = <4>;
+- cd-gpios = <&gpionb 3 GPIO_ACTIVE_LOW>;
+- vqmmc-supply = <&vcc_sd_reg0>;
+- status = "okay";
+-};
+-
+-&spi0 {
+- status = "okay";
+- pinctrl-names = "default";
+- pinctrl-0 = <&spi_quad_pins>;
+-
+- spi-flash@0 {
+- #address-cells = <1>;
+- #size-cells = <1>;
+- compatible = "st,m25p128", "jedec,spi-nor";
+- reg = <0>; /* Chip select 0 */
+- spi-max-frequency = <50000000>;
+- m25p,fast-read;
+- };
+-};
+-
+-/* Exported on the micro USB connector CON32 through an FTDI */
+-&uart0 {
+- pinctrl-names = "default";
+- pinctrl-0 = <&uart1_pins>;
+- status = "okay";
+-};
+-
+-/* CON29 */
+-&usb2 {
+- status = "okay";
+-};
+-
+-/* CON31 */
+-&usb3 {
+- status = "okay";
+-};
+-
+-&pcie0 {
+- pinctrl-names = "default";
+- pinctrl-0 = <&pcie_pins>;
+- reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>;
+- status = "okay";
+ };
+--- /dev/null
++++ b/arch/arm/dts/armada-3720-espressobin.dtsi
+@@ -0,0 +1,167 @@
++/*
++ * Device Tree file for Marvell Armada 3720 community board
++ * (ESPRESSOBin)
++ * Copyright (C) 2016 Marvell
++ *
++ * Gregory CLEMENT <gregory.clement@free-electrons.com>
++ * Konstantin Porotchkin <kostap@marvell.com>
++ *
++ * This file is dual-licensed: you can use it either under the terms
++ * of the GPL or the X11 license, at your option. Note that this dual
++ * licensing only applies to this file, and not this project as a
++ * whole.
++ *
++ * a) This file is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This file is distributed in the hope that it will be useful
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * Or, alternatively
++ *
++ * b) Permission is hereby granted, free of charge, to any person
++ * obtaining a copy of this software and associated documentation
++ * files (the "Software"), to deal in the Software without
++ * restriction, including without limitation the rights to use
++ * copy, modify, merge, publish, distribute, sublicense, and/or
++ * sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following
++ * conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++/dts-v1/;
++
++#include "armada-372x.dtsi"
++
++/ {
++ chosen {
++ stdout-path = "serial0:115200n8";
++ };
++
++ aliases {
++ ethernet0 = ð0;
++ i2c0 = &i2c0;
++ spi0 = &spi0;
++ };
++
++ memory {
++ device_type = "memory";
++ reg = <0x00000000 0x00000000 0x00000000 0x20000000>;
++ };
++
++ vcc_sd_reg0: regulator@0 {
++ compatible = "regulator-gpio";
++ regulator-name = "vcc_sd0";
++ regulator-min-microvolt = <1800000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-type = "voltage";
++ states = <1800000 0x1
++ 3300000 0x0>;
++ gpios = <&gpionb 4 GPIO_ACTIVE_HIGH>;
++ };
++};
++
++&comphy {
++ max-lanes = <3>;
++ phy0 {
++ phy-type = <PHY_TYPE_USB3_HOST0>;
++ phy-speed = <PHY_SPEED_5G>;
++ };
++
++ phy1 {
++ phy-type = <PHY_TYPE_PEX0>;
++ phy-speed = <PHY_SPEED_2_5G>;
++ };
++
++ phy2 {
++ phy-type = <PHY_TYPE_SATA0>;
++ phy-speed = <PHY_SPEED_5G>;
++ };
++};
++
++ð0 {
++ status = "okay";
++ pinctrl-names = "default";
++ pinctrl-0 = <&rgmii_pins>, <&smi_pins>;
++ phy-mode = "rgmii";
++ phy_addr = <0x1>;
++ fixed-link {
++ speed = <1000>;
++ full-duplex;
++ };
++};
++
++&i2c0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&i2c1_pins>;
++ status = "okay";
++};
++
++/* CON3 */
++&sata {
++ status = "okay";
++};
++
++&sdhci0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdio_pins>;
++ bus-width = <4>;
++ cd-gpios = <&gpionb 3 GPIO_ACTIVE_LOW>;
++ vqmmc-supply = <&vcc_sd_reg0>;
++ status = "okay";
++};
++
++&spi0 {
++ status = "okay";
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_quad_pins>;
++
++ spi-flash@0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "st,m25p128", "jedec,spi-nor";
++ reg = <0>; /* Chip select 0 */
++ spi-max-frequency = <50000000>;
++ m25p,fast-read;
++ };
++};
++
++/* Exported on the micro USB connector CON32 through an FTDI */
++&uart0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "okay";
++};
++
++/* CON29 */
++&usb2 {
++ status = "okay";
++};
++
++/* CON31 */
++&usb3 {
++ status = "okay";
++};
++
++&pcie0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pcie_pins>;
++ reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>;
++ status = "okay";
++};
--- /dev/null
+From 83908b6e2e5a7d7b0f4d040ffb4bf3ce6807b8fe Mon Sep 17 00:00:00 2001
+From: Andre Heider <a.heider@gmail.com>
+Date: Fri, 4 Sep 2020 15:44:41 +0200
+Subject: [PATCH] arm64: dts: a3720: add support for boards with populated emmc
+
+Import armada-3720-espressobin-emmc.dts from Linux, but use sdhc1 for
+emmc, since sdhc0 is used for the sd card.
+
+Signed-off-by: Andre Heider <a.heider@gmail.com>
+---
+ arch/arm/dts/Makefile | 1 +
+ arch/arm/dts/armada-3720-espressobin-emmc.dts | 44 +++++++++++++++++++
+ doc/README.marvell | 7 ++-
+ 3 files changed, 50 insertions(+), 2 deletions(-)
+ create mode 100644 arch/arm/dts/armada-3720-espressobin-emmc.dts
+
+--- a/arch/arm/dts/Makefile
++++ b/arch/arm/dts/Makefile
+@@ -202,6 +202,7 @@ dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harm
+ dtb-$(CONFIG_ARCH_MVEBU) += \
+ armada-3720-db.dtb \
+ armada-3720-espressobin.dtb \
++ armada-3720-espressobin-emmc.dtb \
+ armada-3720-turris-mox.dtb \
+ armada-3720-uDPU.dtb \
+ armada-375-db.dtb \
+--- /dev/null
++++ b/arch/arm/dts/armada-3720-espressobin-emmc.dts
+@@ -0,0 +1,44 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Device Tree file for Globalscale Marvell ESPRESSOBin Board with eMMC
++ * Copyright (C) 2018 Marvell
++ *
++ * Romain Perier <romain.perier@free-electrons.com>
++ * Konstantin Porotchkin <kostap@marvell.com>
++ *
++ */
++/*
++ * Schematic available at http://espressobin.net/wp-content/uploads/2017/08/ESPRESSObin_V5_Schematics.pdf
++ */
++
++/dts-v1/;
++
++#include "armada-3720-espressobin.dtsi"
++
++/ {
++ model = "Globalscale Marvell ESPRESSOBin Board (eMMC)";
++ compatible = "globalscale,espressobin-emmc", "globalscale,espressobin",
++ "marvell,armada3720", "marvell,armada3710";
++};
++
++/* U11 */
++&sdhci1 {
++ non-removable;
++ bus-width = <8>;
++ mmc-ddr-1_8v;
++ mmc-hs400-1_8v;
++ marvell,xenon-emmc;
++ marvell,xenon-tun-count = <9>;
++ marvell,pad-type = "fixed-1-8v";
++
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc_pins>;
++ status = "okay";
++
++ #address-cells = <1>;
++ #size-cells = <0>;
++ mmccard: mmccard@0 {
++ compatible = "mmc-card";
++ reg = <0>;
++ };
++};
+--- a/doc/README.marvell
++++ b/doc/README.marvell
+@@ -43,8 +43,11 @@ Build Procedure
+ In order to prevent this, the required device-tree MUST be set during compilation.
+ All device-tree files are located in ./arch/arm/dts/ folder.
+
+- For other DB boards (MacchiatoBin, EspressoBin and 3700 DB board) compile u-boot with
+- just default device-tree from defconfig using:
++ For the EspressoBin board with populated eMMC device use
++ # make DEVICE_TREE=armada-3720-espressobin-emmc
++
++ For other DB boards (MacchiatoBin, EspressoBin without soldered eMMC and 3700 DB board)
++ compile u-boot with just default device-tree from defconfig using:
+
+ # make
+
--- /dev/null
+From d59406482c1847959305a986376b35e57da28e69 Mon Sep 17 00:00:00 2001
+From: Andre Heider <a.heider@gmail.com>
+Date: Sat, 5 Sep 2020 12:45:59 +0200
+Subject: [PATCH] arm: mvebu: Espressobin: Set environment variable fdtfile
+
+Required for the generic distro mechanism.
+
+Linux ships with 4 variants:
+marvell/armada-3720-espressobin-v7-emmc.dtb
+marvell/armada-3720-espressobin-v7.dtb
+marvell/armada-3720-espressobin-emmc.dtb
+marvell/armada-3720-espressobin.dtb
+
+Use available information to determine the appropriate filename.
+
+Tested on a v5 board without eMMC.
+
+Signed-off-by: Andre Heider <a.heider@gmail.com>
+---
+ board/Marvell/mvebu_armada-37xx/board.c | 47 +++++++++++++++++++++
+ configs/mvebu_espressobin-88f3720_defconfig | 1 +
+ 2 files changed, 48 insertions(+)
+
+--- a/board/Marvell/mvebu_armada-37xx/board.c
++++ b/board/Marvell/mvebu_armada-37xx/board.c
+@@ -5,6 +5,7 @@
+
+ #include <common.h>
+ #include <dm.h>
++#include <env.h>
+ #include <i2c.h>
+ #include <init.h>
+ #include <phy.h>
+@@ -50,6 +51,22 @@ DECLARE_GLOBAL_DATA_PTR;
+ #define MVEBU_G2_SMI_PHY_CMD_REG (24)
+ #define MVEBU_G2_SMI_PHY_DATA_REG (25)
+
++/*
++ * Memory Controller Registers
++ *
++ * Assembled based on public information:
++ * https://gitlab.nic.cz/turris/mox-boot-builder/-/blob/master/wtmi/main.c#L332-336
++ * https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell/blob/mv_ddr-armada-18.12/drivers/mv_ddr_mc6.h#L309-L332
++ *
++ * And checked against the written register values for the various topologies:
++ * https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell/blob/mv_ddr-armada-atf-mainline/a3700/mv_ddr_tim.h
++ */
++#define A3700_CH0_MC_CTRL2_REG MVEBU_REGISTER(0x002c4)
++#define A3700_MC_CTRL2_SDRAM_TYPE_MASK 0xf
++#define A3700_MC_CTRL2_SDRAM_TYPE_OFFS 4
++#define A3700_MC_CTRL2_SDRAM_TYPE_DDR3 2
++#define A3700_MC_CTRL2_SDRAM_TYPE_DDR4 3
++
+ int board_early_init_f(void)
+ {
+ return 0;
+@@ -63,6 +80,36 @@ int board_init(void)
+ return 0;
+ }
+
++#ifdef CONFIG_BOARD_LATE_INIT
++int board_late_init(void)
++{
++ bool ddr4, emmc;
++
++ if (env_get("fdtfile"))
++ return 0;
++
++ if (!of_machine_is_compatible("globalscale,espressobin"))
++ return 0;
++
++ /* If the memory controller has been configured for DDR4, we're running on v7 */
++ ddr4 = ((readl(A3700_CH0_MC_CTRL2_REG) >> A3700_MC_CTRL2_SDRAM_TYPE_OFFS)
++ & A3700_MC_CTRL2_SDRAM_TYPE_MASK) == A3700_MC_CTRL2_SDRAM_TYPE_DDR4;
++
++ emmc = of_machine_is_compatible("globalscale,espressobin-emmc");
++
++ if (ddr4 && emmc)
++ env_set("fdtfile", "marvell/armada-3720-espressobin-v7-emmc.dtb");
++ else if (ddr4)
++ env_set("fdtfile", "marvell/armada-3720-espressobin-v7.dtb");
++ else if (emmc)
++ env_set("fdtfile", "marvell/armada-3720-espressobin-emmc.dtb");
++ else
++ env_set("fdtfile", "marvell/armada-3720-espressobin.dtb");
++
++ return 0;
++}
++#endif
++
+ /* Board specific AHCI / SATA enable code */
+ int board_ahci_enable(void)
+ {
+--- a/configs/mvebu_espressobin-88f3720_defconfig
++++ b/configs/mvebu_espressobin-88f3720_defconfig
+@@ -84,3 +84,4 @@ CONFIG_USB_ETHER_RTL8152=y
+ CONFIG_USB_ETHER_SMSC95XX=y
+ CONFIG_SHA1=y
+ CONFIG_SHA256=y
++CONFIG_BOARD_LATE_INIT=y