[U-Boot] [PATCH 03/10] board:samsung: check the mmc boot device and init the right mmc driver.

Przemyslaw Marczak p.marczak at samsung.com
Tue Jun 10 13:32:57 CEST 2014


It is possible to boot from a few media devices, especially using a micro
SD or eMMC slots. In this situation, boot device should be registered
as block device 0 in the MMC framework, because CONFIG_SYS_MMC_ENV_DEV
is usually set to "0" in the most config cases.

Signed-off-by: Przemyslaw Marczak <p.marczak at samsung.com>
Cc: Piotr Wilczek <p.wilczek at samsung.com>
Cc: Minkyu Kang <mk7.kang at samsung.com>
---
 board/samsung/common/board.c | 32 ++++++++++++++++++++++++--------
 include/samsung/misc.h       |  5 +++++
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
index 9dc7c83..2970340 100644
--- a/board/samsung/common/board.c
+++ b/board/samsung/common/board.c
@@ -25,6 +25,8 @@
 #include <lcd.h>
 #include <samsung/misc.h>
 
+static int bootmode;
+
 DECLARE_GLOBAL_DATA_PTR;
 
 int __exynos_early_init_f(void)
@@ -243,19 +245,33 @@ int board_eth_init(bd_t *bis)
 int board_mmc_init(bd_t *bis)
 {
 	int ret;
+	struct exynos4_power *pwr = (struct exynos4_power *)
+					samsung_get_base_power();
+
+	bootmode = BOOT_MODE(readl(&pwr->om_stat));
+	if (bootmode == BOOT_SDMMC) {
+#ifdef CONFIG_SDHCI
+		/* mmc initializattion for available channels */
+		ret = exynos_mmc_init(gd->fdt_blob);
+#endif
 #ifdef CONFIG_DWMMC
-	/* dwmmc initializattion for available channels */
-	ret = exynos_dwmmc_init(gd->fdt_blob);
-	if (ret)
-		debug("dwmmc init failed\n");
+		/* dwmmc initializattion for available channels */
+		ret = exynos_dwmmc_init(gd->fdt_blob);
+#endif
+	} else {
+#ifdef CONFIG_DWMMC
+		/* dwmmc initializattion for available channels */
+		ret = exynos_dwmmc_init(gd->fdt_blob);
 #endif
-
 #ifdef CONFIG_SDHCI
-	/* mmc initializattion for available channels */
-	ret = exynos_mmc_init(gd->fdt_blob);
+		/* mmc initializattion for available channels */
+		ret = exynos_mmc_init(gd->fdt_blob);
+#endif
+	}
+
 	if (ret)
 		debug("mmc init failed\n");
-#endif
+
 	return ret;
 }
 #endif
diff --git a/include/samsung/misc.h b/include/samsung/misc.h
index 10653a1..87b53ec 100644
--- a/include/samsung/misc.h
+++ b/include/samsung/misc.h
@@ -28,4 +28,9 @@ void check_boot_mode(void);
 void draw_logo(void);
 #endif
 
+#define BOOT_SDMMC	0x2
+#define BOOT_MODE_MASK	(0x1f)
+#define BOOT_MODE_SHIFT	(0x1)
+#define BOOT_MODE(x)	((x >> BOOT_MODE_SHIFT) & BOOT_MODE_MASK)
+
 #endif /* __SAMSUNG_MISC_COMMON_H__ */
-- 
1.9.1



More information about the U-Boot mailing list