summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ford <aford173@gmail.com>2019-11-03 16:58:40 +0300
committerStefano Babic <sbabic@denx.de>2019-12-27 16:30:52 +0300
commit576434b2056b3fb01438da2ee210048ea80233bf (patch)
treeb996be371b9bbb26cdf4714c6e341b4e21789307
parent61d7e2bcc717da7d9b4774411f0903a3747797b0 (diff)
downloadu-boot-576434b2056b3fb01438da2ee210048ea80233bf.tar.xz
ARM: imx6q_logic: Cleanup boot sequence check
The board_boot_order() function currenly assumes that the boot source is MMC/eMMC, but this isn't true for the NAND devices. This patch cleans up board_boot_order() to check for NAND, SD, ESD, MMC or EMMC. Anything beyond these are not supported, so it will default back to the serial downloader if any of those devices are not available. Fixes: 9fb50c68daa6 ("ARM: imx6q_logic: Fix MMC2 booting") Signed-off-by: Adam Ford <aford173@gmail.com>
-rw-r--r--board/logicpd/imx6/imx6logic.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/board/logicpd/imx6/imx6logic.c b/board/logicpd/imx6/imx6logic.c
index 5b6584720b..ba69c96686 100644
--- a/board/logicpd/imx6/imx6logic.c
+++ b/board/logicpd/imx6/imx6logic.c
@@ -156,29 +156,49 @@ void board_boot_order(u32 *spl_boot_list)
{
struct src *psrc = (struct src *)SRC_BASE_ADDR;
unsigned int reg = readl(&psrc->sbmr1) >> 11;
- /*
- * Upon reading BOOT_CFG register the following map is done:
- * Bit 11 and 12 of BOOT_CFG register can determine the current
- * mmc port
- * 0x1 SD1-SOM
- * 0x2 SD2-Baseboard
- */
-
- reg &= 0x3; /* Only care about bottom 2 bits */
- switch (reg) {
- case 0:
- spl_boot_list[0] = BOOT_DEVICE_MMC1;
+ u32 boot_mode = imx6_src_get_boot_mode() & IMX6_BMODE_MASK;
+ unsigned int bmode = readl(&src_base->sbmr2);
+
+ /* If bmode is serial or USB phy is active, return serial */
+ if (((bmode >> 24) & 0x03) == 0x01 || is_usbotg_phy_active()) {
+ spl_boot_list[0] = BOOT_DEVICE_BOARD;
+ return;
+ }
+
+ switch (boot_mode >> IMX6_BMODE_SHIFT) {
+ case IMX6_BMODE_NAND_MIN ... IMX6_BMODE_NAND_MAX:
+ spl_boot_list[0] = BOOT_DEVICE_NAND;
break;
- case 1:
- spl_boot_list[0] = BOOT_DEVICE_MMC2;
+ case IMX6_BMODE_SD:
+ case IMX6_BMODE_ESD:
+ case IMX6_BMODE_MMC:
+ case IMX6_BMODE_EMMC:
+ /*
+ * Upon reading BOOT_CFG register the following map is done:
+ * Bit 11 and 12 of BOOT_CFG register can determine the current
+ * mmc port
+ * 0x1 SD1-SOM
+ * 0x2 SD2-Baseboard
+ */
+
+ reg &= 0x3; /* Only care about bottom 2 bits */
+ switch (reg) {
+ case 0:
+ spl_boot_list[0] = BOOT_DEVICE_MMC1;
+ break;
+ case 1:
+ spl_boot_list[0] = BOOT_DEVICE_MMC2;
+ break;
+ }
+ break;
+ default:
+ /* By default use USB downloader */
+ spl_boot_list[0] = BOOT_DEVICE_BOARD;
break;
}
- /* If we cannot find a valid MMC/SD card, try NAND */
- spl_boot_list[1] = BOOT_DEVICE_NAND;
-
/* As a last resort, use serial downloader */
- spl_boot_list[2] = BOOT_DEVICE_BOARD;
+ spl_boot_list[1] = BOOT_DEVICE_BOARD;
}
static void ccgr_init(void)