summaryrefslogtreecommitdiff
path: root/board/ti/am335x/board.c
diff options
context:
space:
mode:
authorSteve Kipisz <s-kipisz2@ti.com>2013-07-18 15:13:04 -0400
committerTom Rini <trini@ti.com>2013-07-30 09:21:41 -0400
commitc5c7a7c32d552592ac49749e5c184c89bd50c098 (patch)
tree69c906c589a0a6c5e9c02a35a3719699cb7397f6 /board/ti/am335x/board.c
parentcd8845d7a49687e9e7f727c9d821accf22854dd3 (diff)
downloadu-boot-imx-c5c7a7c32d552592ac49749e5c184c89bd50c098.zip
u-boot-imx-c5c7a7c32d552592ac49749e5c184c89bd50c098.tar.gz
u-boot-imx-c5c7a7c32d552592ac49749e5c184c89bd50c098.tar.bz2
am335x_evm: Add support to boot from NOR.
NOR requires that s_init be within the first 4KiB of the image so that we can perform the rest of the required pinmuxing to talk with the rest of NOR that we are found on. When NOR_BOOT is set we save our environment in NOR at 512KiB and a redundant copy at 768KiB. We avoid using SPL for this case and u-boot.bin is written directly to the start of NOR. We enclose the DMM-related parts of arch/arm/cpu/armv7/am33xx/emif4.c with TI81xx checks as at this time U-Boot does not discard unused sections in the main build and this code relies on functions specific to (and only provided in) ti81xx-related code. Cc: Albert ARIBAUD <albert.u.boot@aribaud.net> Signed-off-by: Steve Kipisz <s-kipisz2@ti.com> Signed-off-by: Tom Rini <trini@ti.com>
Diffstat (limited to 'board/ti/am335x/board.c')
-rw-r--r--board/ti/am335x/board.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c
index b12341d..728afc2 100644
--- a/board/ti/am335x/board.c
+++ b/board/ti/am335x/board.c
@@ -83,7 +83,7 @@ static int read_eeprom(struct am335x_baseboard_id *header)
return 0;
}
-#ifdef CONFIG_SPL_BUILD
+#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT)
static const struct ddr_data ddr2_data = {
.datardsratio0 = ((MT47H128M16RT25E_RD_DQS<<30) |
(MT47H128M16RT25E_RD_DQS<<20) |
@@ -249,10 +249,28 @@ int spl_start_uboot(void)
*/
void s_init(void)
{
-#ifdef CONFIG_SPL_BUILD
- struct am335x_baseboard_id header;
+ __maybe_unused struct am335x_baseboard_id header;
/*
+ * The ROM will only have set up sufficient pinmux to allow for the
+ * first 4KiB NOR to be read, we must finish doing what we know of
+ * the NOR mux in this space in order to continue.
+ */
+#ifdef CONFIG_NOR_BOOT
+ asm("stmfd sp!, {r2 - r4}");
+ asm("movw r4, #0x8A4");
+ asm("movw r3, #0x44E1");
+ asm("orr r4, r4, r3, lsl #16");
+ asm("mov r2, #9");
+ asm("mov r3, #8");
+ asm("gpmc_mux: str r2, [r4], #4");
+ asm("subs r3, r3, #1");
+ asm("bne gpmc_mux");
+ asm("ldmfd sp!, {r2 - r4}");
+#endif
+
+#ifdef CONFIG_SPL_BUILD
+ /*
* Save the boot parameters passed from romcode.
* We cannot delay the saving further than this,
* to prevent overwrites.
@@ -270,7 +288,7 @@ void s_init(void)
while (readl(&wdtimer->wdtwwps) != 0x0)
;
-#ifdef CONFIG_SPL_BUILD
+#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT)
/* Setup the PLLs and the clocks for the peripherals */
pll_init();
@@ -298,9 +316,16 @@ void s_init(void)
uart_soft_reset();
+#if defined(CONFIG_NOR_BOOT)
+ /* We want our console now. */
+ gd->baudrate = CONFIG_BAUDRATE;
+ serial_init();
+ gd->have_console = 1;
+#else
gd = &gdata;
preloader_console_init();
+#endif
/* Initalize the board header */
enable_i2c0_pin_mux();