Signed-off-by: Dashi Cao <dscao...@gmail.com>
---
 board/ti/am335x/board.c | 40 ++++++++++++++++++++++++++++++++++++++++
 common/spl/spl.c        |  6 ++++++
 drivers/mmc/mmc.c       |  4 ++++
 include/mmc.h           |  1 +
 4 files changed, 51 insertions(+)

diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c
index 7c0545892c..577e4f2b1f 100644
--- a/board/ti/am335x/board.c
+++ b/board/ti/am335x/board.c
@@ -1010,3 +1010,43 @@ U_BOOT_DRVINFO(am335x_mmc1) = {
        .plat = &am335x_mmc1_plat,
 };
 #endif
+
+#if  defined(CONFIG_SPL_MMC) && defined(CONFIG_AM33XX)
+struct uart_reg {
+       u16 resv0[4];
+       u16 uart_efr;
+       u16 resv1[3];
+       u16 uart_mcr;
+       u16 resv2[5];
+       u16 uart_spr;
+};
+
+int mmc_get_env_dev(void)
+{
+       u16 bdev = 0;
+       u16 efr, mcr;
+       volatile struct uart_reg *uart = (void *)UART0_BASE;
+
+       efr = uart->uart_efr;
+       mcr = uart->uart_mcr;
+       if ((efr & 0x10) == 0 || (mcr & 0x40) == 0)
+               bdev = uart->uart_spr;
+       else
+               printf("Cannot get mmc dev number from uart0 scratch reg\n");
+
+       return (bdev & 0x0ff);
+}
+
+void mmc_set_env_dev(u16 bdev)
+{
+       u16 efr, mcr;
+       volatile struct uart_reg *uart = (void *)UART0_BASE;
+
+       efr = uart->uart_efr;
+       mcr = uart->uart_mcr;
+       if ((efr & 0x10) == 0 || (mcr & 0x40) == 0)
+               uart->uart_spr = (bdev & 0x0ff);
+       else
+               printf("Cannot set mmc dev number to uart0 scratch reg\n");
+}
+#endif
diff --git a/common/spl/spl.c b/common/spl/spl.c
index c8c463f80b..a14ae76698 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -37,6 +37,7 @@
 #include <fdt_support.h>
 #include <bootcount.h>
 #include <wdt.h>
+#include <mmc.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -723,6 +724,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
        };
        struct spl_image_info spl_image;
        int ret;
+       short bootdev;
 
        debug(">>" SPL_TPL_PROMPT "board_init_r()\n");
 
@@ -798,6 +800,10 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                        puts(SPL_TPL_PROMPT "failed to boot from all boot 
devices\n");
                hang();
        }
+       bootdev = spl_image.boot_device - BOOT_DEVICE_MMC1;
+       if (bootdev < 0)
+               bootdev = -bootdev;
+       mmc_set_env_dev(bootdev);
 
        spl_perform_fixups(&spl_image);
        if (CONFIG_IS_ENABLED(HANDOFF)) {
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 8a7d073900..8c941b575a 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -3133,3 +3133,7 @@ __weak int mmc_get_env_dev(void)
        return 0;
 #endif
 }
+
+__weak void mmc_set_env_dev(u16 bootdev)
+{
+}
diff --git a/include/mmc.h b/include/mmc.h
index 9b4dc68311..3c09652382 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -943,6 +943,7 @@ int mmc_get_env_addr(struct mmc *mmc, int copy, u32 
*env_addr);
 extern uint mmc_get_env_part(struct mmc *mmc);
 # endif
 int mmc_get_env_dev(void);
+void mmc_set_env_dev(u16 bootdev);
 
 /* Minimum partition switch timeout in units of 10-milliseconds */
 #define MMC_MIN_PART_SWITCH_TIME       30 /* 300 ms */
-- 
2.20.1

Reply via email to