summaryrefslogtreecommitdiff
path: root/board/freescale/mx6qsabreauto/mx6qsabreauto.c
diff options
context:
space:
mode:
authorYe.Li <B37916@freescale.com>2014-06-26 19:25:09 +0800
committerYe.Li <B37916@freescale.com>2014-06-30 11:31:43 +0800
commit7feb8533f52677f641e3ff88a996cd3f1f722708 (patch)
treef70c5bb35d29dc63b94bdafeee31cd723c516b0e /board/freescale/mx6qsabreauto/mx6qsabreauto.c
parent987c48c07c9ef62fa3fe55faa6f7369b30637127 (diff)
downloadu-boot-imx-7feb8533f52677f641e3ff88a996cd3f1f722708.zip
u-boot-imx-7feb8533f52677f641e3ff88a996cd3f1f722708.tar.gz
u-boot-imx-7feb8533f52677f641e3ff88a996cd3f1f722708.tar.bz2
ENGR00320125 iMX6: Change to use dynamical mmcroot
The kernel changes to fix the mmcblk index with USDHC controllers as below: mmcblk0 ---> USDHC1 mmcblk1 ---> USDHC2 mmcblk2 ---> USDHC3 mmcblk3 ---> USDHC4 So in u-boot, the "mmcroot" must be updated together. When booting from SD/MMC device, change the "mmcroot" to dynamically set according to the boot USDHC controller. It is the same mechanism as "mmcdev" used for kernel image loading. Therefore, the uboot, kernel image, dtb and rootfs are required in same SD/MMC card. To disable the mmc dynamical detection, set the "mmcautodetect" to "no", then "mmcroot" and "mmcdev" will not be overwritten. When booting from other devices which needs to load kernel, dtb and rootfs from SD/MMC card, their "mmcdev" reset vaule is CONFIG_SYS_MMC_ENV_DEV and "mmcroot" reset value is CONFIG_MMCROOT. Signed-off-by: Ye.Li <B37916@freescale.com>
Diffstat (limited to 'board/freescale/mx6qsabreauto/mx6qsabreauto.c')
-rw-r--r--board/freescale/mx6qsabreauto/mx6qsabreauto.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/board/freescale/mx6qsabreauto/mx6qsabreauto.c b/board/freescale/mx6qsabreauto/mx6qsabreauto.c
index ca2b290..9663013 100644
--- a/board/freescale/mx6qsabreauto/mx6qsabreauto.c
+++ b/board/freescale/mx6qsabreauto/mx6qsabreauto.c
@@ -341,6 +341,13 @@ int mmc_get_env_devno(void)
{
u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4);
u32 dev_no;
+ u32 bootsel;
+
+ bootsel = (soc_sbmr & 0x000000FF) >> 6 ;
+
+ /* If not boot from sd/mmc, use default value */
+ if (bootsel != 1)
+ return CONFIG_SYS_MMC_ENV_DEV;
/* BOOT_CFG2[3] and BOOT_CFG2[4] */
dev_no = (soc_sbmr & 0x00001800) >> 11;
@@ -354,6 +361,14 @@ int mmc_get_env_devno(void)
return dev_no;
}
+int mmc_map_to_kernel_blk(int dev_no)
+{
+ if (1 == dev_no)
+ dev_no = 2;
+
+ return dev_no;
+}
+
int board_mmc_getcd(struct mmc *mmc)
{
struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
@@ -408,13 +423,34 @@ int board_mmc_init(bd_t *bis)
return 0;
}
+int check_mmc_autodetect(void)
+{
+ char *autodetect_str = getenv("mmcautodetect");
+
+ if ((autodetect_str != NULL) &&
+ (strcmp(autodetect_str, "yes") == 0)) {
+ return 1;
+ }
+
+ return 0;
+}
+
void board_late_mmc_env_init(void)
{
char cmd[32];
+ char mmcblk[32];
u32 dev_no = mmc_get_env_devno();
+ if (!check_mmc_autodetect())
+ return;
+
setenv_ulong("mmcdev", dev_no);
+ /* Set mmcblk env */
+ sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw",
+ mmc_map_to_kernel_blk(dev_no));
+ setenv("mmcroot", mmcblk);
+
sprintf(cmd, "mmc dev %d", dev_no);
run_command(cmd, 0);
}