summaryrefslogtreecommitdiff
path: root/arch/arm/mach-rockchip/rk3036-board.c
diff options
context:
space:
mode:
authorJacob Chen <jacob2.chen@rock-chips.com>2016-09-19 18:46:28 +0800
committerSimon Glass <sjg@chromium.org>2016-10-01 18:36:55 -0600
commit67171e13a3e0665b18c657a6704a22ca7900f4c3 (patch)
tree0924777d9ee7054c55114050d32e06a033814291 /arch/arm/mach-rockchip/rk3036-board.c
parentf48f2b729bf891aa6c1f752d5f8e06e44dd8b0b4 (diff)
downloadu-boot-imx-67171e13a3e0665b18c657a6704a22ca7900f4c3.zip
u-boot-imx-67171e13a3e0665b18c657a6704a22ca7900f4c3.tar.gz
u-boot-imx-67171e13a3e0665b18c657a6704a22ca7900f4c3.tar.bz2
rockchip: add boot-mode support for rk3288, rk3036
rockchip platform have a protocol to pass the the kernel reboot mode to bootloader by some special registers when system reboot. In bootloader we should read it and take action. We can only setup boot_mode in board_late_init becasue "setenv" need env setuped. So add CONFIG_BOARD_LATE_INIT to common header and use a entry "rk_board_late_init" to replace "board_late_init" in board file. Signed-off-by: Jacob Chen <jacob2.chen@rock-chips.com> Acked-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'arch/arm/mach-rockchip/rk3036-board.c')
-rw-r--r--arch/arm/mach-rockchip/rk3036-board.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/arch/arm/mach-rockchip/rk3036-board.c b/arch/arm/mach-rockchip/rk3036-board.c
index b63f9c0..bf2b268 100644
--- a/arch/arm/mach-rockchip/rk3036-board.c
+++ b/arch/arm/mach-rockchip/rk3036-board.c
@@ -11,11 +11,50 @@
#include <asm/io.h>
#include <asm/arch/clock.h>
#include <asm/arch/periph.h>
+#include <asm/arch/grf_rk3036.h>
+#include <asm/arch/boot_mode.h>
+#include <asm/arch/sdram_rk3036.h>
#include <asm/gpio.h>
#include <dm/pinctrl.h>
DECLARE_GLOBAL_DATA_PTR;
+#define GRF_BASE 0x20008000
+
+static void setup_boot_mode(void)
+{
+ struct rk3036_grf *const grf = (void *)GRF_BASE;
+ int boot_mode = readl(&grf->os_reg[4]);
+
+ debug("boot mode %x.\n", boot_mode);
+
+ /* Clear boot mode */
+ writel(BOOT_NORMAL, &grf->os_reg[4]);
+
+ switch (boot_mode) {
+ case BOOT_FASTBOOT:
+ printf("enter fastboot!\n");
+ setenv("preboot", "setenv preboot; fastboot usb0");
+ break;
+ case BOOT_UMS:
+ printf("enter UMS!\n");
+ setenv("preboot", "setenv preboot; ums mmc 0");
+ break;
+ }
+}
+
+__weak int rk_board_late_init(void)
+{
+ return 0;
+}
+
+int board_late_init(void)
+{
+ setup_boot_mode();
+
+ return rk_board_late_init();
+}
+
int board_init(void)
{
return 0;