diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2015-04-20 12:54:59 +0200 |
---|---|---|
committer | Stefan Agner <stefan.agner@toradex.com> | 2015-04-20 12:54:59 +0200 |
commit | 8e1eeb4337d575cf5f7b28842dc84361e35592dd (patch) | |
tree | 78097e4979526d691c2162ebb8756d91b85ed856 | |
parent | 495f0b538b8e35f560d613a80fbccdd57cf622d3 (diff) |
ARM: vf610: add bmode for Vybrid SoC
Implement boot mode for Vybrid SoC. Boot mode selection works much
like the i.MX6 implementation. Provide a standard set of boot modes
for the two eSDHC instances and use the reserved mode to jump into
SoC's recovery mechanism, the serial downloader.
-rw-r--r-- | arch/arm/cpu/armv7/vf610/generic.c | 30 | ||||
-rw-r--r-- | board/toradex/colibri_vf/colibri_vf.c | 12 | ||||
-rw-r--r-- | include/configs/colibri_vf.h | 1 |
3 files changed, 43 insertions, 0 deletions
diff --git a/arch/arm/cpu/armv7/vf610/generic.c b/arch/arm/cpu/armv7/vf610/generic.c index 1bb9b8ed1d0..1b17fdf74d0 100644 --- a/arch/arm/cpu/armv7/vf610/generic.c +++ b/arch/arm/cpu/armv7/vf610/generic.c @@ -9,6 +9,7 @@ #include <asm/arch/imx-regs.h> #include <asm/arch/clock.h> #include <asm/arch/crm_regs.h> +#include <asm/imx-common/boot_mode.h> #include <netdev.h> #ifdef CONFIG_FSL_ESDHC #include <fsl_esdhc.h> @@ -304,6 +305,35 @@ int arch_cpu_init(void) return 0; } +void boot_mode_apply(unsigned cfg_val) +{ + unsigned reg; + struct src *psrc = (struct src *)SRC_BASE_ADDR; + writel(cfg_val, &psrc->hab3); + reg = readl(&psrc->hab4); + if (cfg_val) + reg |= 1 << 28; + else + reg &= ~(1 << 28); + writel(reg, &psrc->hab4); +} + +/* + * cfg_val will be used for + * Boot_cfg4[7:0]:Boot_cfg3[7:0]:Boot_cfg2[7:0]:Boot_cfg1[7:0] + * After reset, if GPR10[28] is 1, ROM will use GPR9[25:0] + * instead of SBMR1 to determine the boot device. + */ +const struct boot_mode soc_boot_modes[] = { + {"normal", MAKE_CFGVAL(0x00, 0x00, 0x00, 0x00)}, + /* reserved value should start ROM's serial loader */ + {"ser", MAKE_CFGVAL(0x40, 0x00, 0x00, 0x00)}, + /* 4 bit bus width */ + {"esdhc0", MAKE_CFGVAL(0x60, 0x20, 0x00, 0x00)}, + {"esdhc1", MAKE_CFGVAL(0x60, 0x28, 0x00, 0x00)}, + {NULL, 0}, +}; + #ifdef CONFIG_ARCH_MISC_INIT int arch_misc_init(void) { diff --git a/board/toradex/colibri_vf/colibri_vf.c b/board/toradex/colibri_vf/colibri_vf.c index 7027c4457c3..5158346f18a 100644 --- a/board/toradex/colibri_vf/colibri_vf.c +++ b/board/toradex/colibri_vf/colibri_vf.c @@ -14,6 +14,7 @@ #include <asm/arch/ddrmc-vf610.h> #include <asm/arch/crm_regs.h> #include <asm/arch/clock.h> +#include <asm/imx-common/boot_mode.h> #include <mmc.h> #include <fsl_esdhc.h> #include <miiphy.h> @@ -313,6 +314,13 @@ int board_early_init_f(void) return 0; } +#ifdef CONFIG_CMD_BMODE +static const struct boot_mode board_boot_modes[] = { + {"nand", MAKE_CFGVAL(0x80, 0x02, 0x00, 0x00)}, + {NULL, 0}, +}; +#endif + #ifdef CONFIG_BOARD_LATE_INIT int board_late_init(void) { @@ -340,6 +348,10 @@ int board_late_init(void) setenv("bootdelay", "-1"); } +#ifdef CONFIG_CMD_BMODE + add_board_boot_modes(board_boot_modes); +#endif + return 0; } #endif /* CONFIG_BOARD_LATE_INIT */ diff --git a/include/configs/colibri_vf.h b/include/configs/colibri_vf.h index c099bed05be..982a4e5391b 100644 --- a/include/configs/colibri_vf.h +++ b/include/configs/colibri_vf.h @@ -28,6 +28,7 @@ #define CONFIG_SKIP_LOWLEVEL_INIT +#define CONFIG_CMD_BMODE #define CONFIG_CMD_FUSE #ifdef CONFIG_CMD_FUSE #define CONFIG_MXC_OCOTP |