global: Move remaining CONFIG_SYS_SDRAM_* to CFG_SYS_SDRAM_*
[platform/kernel/u-boot.git] / board / Marvell / mvebu_armada-37xx / board.c
index eacee15..45fe3e5 100644 (file)
@@ -5,10 +5,15 @@
 
 #include <common.h>
 #include <dm.h>
+#include <dm/device-internal.h>
 #include <env.h>
+#include <env_internal.h>
 #include <i2c.h>
 #include <init.h>
+#include <mmc.h>
+#include <miiphy.h>
 #include <phy.h>
+#include <asm/global_data.h>
 #include <asm/io.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/soc.h>
@@ -55,11 +60,11 @@ DECLARE_GLOBAL_DATA_PTR;
  * Memory Controller Registers
  *
  * Assembled based on public information:
- * https://gitlab.nic.cz/turris/mox-boot-builder/-/blob/master/wtmi/main.c#L332-336
+ * https://gitlab.nic.cz/turris/mox-boot-builder/-/blob/v2020.11.26/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
+ * https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell/blob/master/a3700/mv_ddr_tim.h
  */
 #define A3700_CH0_MC_CTRL2_REG         MVEBU_REGISTER(0x002c4)
 #define A3700_MC_CTRL2_SDRAM_TYPE_MASK 0xf
@@ -75,7 +80,7 @@ int board_early_init_f(void)
 int board_init(void)
 {
        /* adress of boot parameters */
-       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+       gd->bd->bi_boot_params = CFG_SYS_SDRAM_BASE + 0x100;
 
        return 0;
 }
@@ -83,28 +88,63 @@ int board_init(void)
 #ifdef CONFIG_BOARD_LATE_INIT
 int board_late_init(void)
 {
+       char *ptr = &default_environment[0];
+       struct udevice *dev;
+       struct mmc *mmc_dev;
        bool ddr4, emmc;
-
-       if (env_get("fdtfile"))
-               return 0;
+       const char *mac;
+       char eth[10];
+       int i;
 
        if (!of_machine_is_compatible("globalscale,espressobin"))
                return 0;
 
+       /* Find free buffer in default_environment[] for new variables */
+       while (*ptr != '\0' && *(ptr+1) != '\0') ptr++;
+       ptr += 2;
+
+       /*
+        * Ensure that 'env default -a' does not erase permanent MAC addresses
+        * stored in env variables: $ethaddr, $eth1addr, $eth2addr and $eth3addr
+        */
+
+       mac = env_get("ethaddr");
+       if (mac && strlen(mac) <= 17)
+               ptr += sprintf(ptr, "ethaddr=%s", mac) + 1;
+
+       for (i = 1; i <= 3; i++) {
+               sprintf(eth, "eth%daddr", i);
+               mac = env_get(eth);
+               if (mac && strlen(mac) <= 17)
+                       ptr += sprintf(ptr, "%s=%s", eth, mac) + 1;
+       }
+
        /* 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");
+       /* eMMC is mmc dev num 1 */
+       mmc_dev = find_mmc_device(1);
+       emmc = (mmc_dev && mmc_get_op_cond(mmc_dev, true) == 0);
+
+       /* if eMMC is not present then remove it from DM */
+       if (!emmc && mmc_dev) {
+               dev = mmc_dev->dev;
+               device_remove(dev, DM_REMOVE_NORMAL);
+               device_unbind(dev);
+               if (of_live_active())
+                       ofnode_set_enabled(dev_ofnode(dev), false);
+       }
 
+       /* Ensure that 'env default -a' set correct value to $fdtfile */
        if (ddr4 && emmc)
-               env_set("fdtfile", "marvell/armada-3720-espressobin-v7-emmc.dtb");
+               strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-v7-emmc.dtb");
        else if (ddr4)
-               env_set("fdtfile", "marvell/armada-3720-espressobin-v7.dtb");
+               strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-v7.dtb");
        else if (emmc)
-               env_set("fdtfile", "marvell/armada-3720-espressobin-emmc.dtb");
+               strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin-emmc.dtb");
        else
-               env_set("fdtfile", "marvell/armada-3720-espressobin.dtb");
+               strcpy(ptr, "fdtfile=marvell/armada-3720-espressobin.dtb");
 
        return 0;
 }
@@ -217,14 +257,15 @@ int board_xhci_enable(fdt_addr_t base)
        return 0;
 }
 
+#ifdef CONFIG_LAST_STAGE_INIT
 /* Helper function for accessing switch devices in multi-chip connection mode */
-static int mii_multi_chip_mode_write(struct mii_dev *bus, int dev_smi_addr,
+static int mii_multi_chip_mode_write(struct udevice *bus, int dev_smi_addr,
                                     int smi_addr, int reg, u16 value)
 {
        u16 smi_cmd = 0;
 
-       if (bus->write(bus, dev_smi_addr, 0,
-                      MVEBU_SW_SMI_DATA_REG, value) != 0) {
+       if (dm_mdio_write(bus, dev_smi_addr, MDIO_DEVAD_NONE,
+                         MVEBU_SW_SMI_DATA_REG, value) != 0) {
                printf("Error writing to the PHY addr=%02x reg=%02x\n",
                       smi_addr, reg);
                return -EFAULT;
@@ -235,8 +276,8 @@ static int mii_multi_chip_mode_write(struct mii_dev *bus, int dev_smi_addr,
                  (1 << SW_SMI_CMD_SMI_OP_OFF) |
                  (smi_addr << SW_SMI_CMD_DEV_ADDR_OFF) |
                  (reg << SW_SMI_CMD_REG_ADDR_OFF);
-       if (bus->write(bus, dev_smi_addr, 0,
-                      MVEBU_SW_SMI_CMD_REG, smi_cmd) != 0) {
+       if (dm_mdio_write(bus, dev_smi_addr, MDIO_DEVAD_NONE,
+                         MVEBU_SW_SMI_CMD_REG, smi_cmd) != 0) {
                printf("Error writing to the PHY addr=%02x reg=%02x\n",
                       smi_addr, reg);
                return -EFAULT;
@@ -246,11 +287,22 @@ static int mii_multi_chip_mode_write(struct mii_dev *bus, int dev_smi_addr,
 }
 
 /* Bring-up board-specific network stuff */
-int board_network_enable(struct mii_dev *bus)
+int last_stage_init(void)
 {
-       if (!of_machine_is_compatible("marvell,armada-3720-espressobin"))
+       struct udevice *bus;
+       ofnode node;
+
+       if (!of_machine_is_compatible("globalscale,espressobin"))
                return 0;
 
+       node = ofnode_by_compatible(ofnode_null(), "marvell,orion-mdio");
+       if (!ofnode_valid(node) ||
+           uclass_get_device_by_ofnode(UCLASS_MDIO, node, &bus) ||
+           device_probe(bus)) {
+               printf("Cannot find MDIO bus\n");
+               return 0;
+       }
+
        /*
         * FIXME: remove this code once Topaz driver gets available
         * A3720 Community Board Only
@@ -290,17 +342,19 @@ int board_network_enable(struct mii_dev *bus)
 
        return 0;
 }
+#endif
 
-#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_ENV_IS_IN_SPI_FLASH)
+#ifdef CONFIG_OF_BOARD_SETUP
 int ft_board_setup(void *blob, struct bd_info *bd)
 {
+#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
        int ret;
        int spi_off;
        int parts_off;
        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");
@@ -387,6 +441,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
                return 0;
        }
 
+#endif
        return 0;
 }
 #endif