Re: [U-Boot] [PATCH 4/4] rockchip: add boot-mode support for rk3288, rk3036

2016-10-01 Thread Simon Glass
On 22 September 2016 at 20:58, Simon Glass  wrote:
> On 19 September 2016 at 04:46, Jacob Chen  wrote:
>> 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 
>> ---
>>
>>  arch/arm/include/asm/arch-rockchip/boot_mode.h | 19 ++
>>  arch/arm/mach-rockchip/rk3036-board.c  | 39 
>>  arch/arm/mach-rockchip/rk3288-board.c  | 50 
>> +++---
>>  board/rockchip/kylin_rk3036/kylin_rk3036.c | 14 ++--
>>  include/configs/kylin_rk3036.h |  3 --
>>  include/configs/rk3036_common.h|  3 ++
>>  include/configs/rk3288_common.h|  3 ++
>>  7 files changed, 111 insertions(+), 20 deletions(-)
>>  create mode 100644 arch/arm/include/asm/arch-rockchip/boot_mode.h
>
> Acked-by: Simon Glass 

Applied to u-boot-rockchip, thanks!
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH 4/4] rockchip: add boot-mode support for rk3288, rk3036

2016-09-22 Thread Simon Glass
On 19 September 2016 at 04:46, Jacob Chen  wrote:
> 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 
> ---
>
>  arch/arm/include/asm/arch-rockchip/boot_mode.h | 19 ++
>  arch/arm/mach-rockchip/rk3036-board.c  | 39 
>  arch/arm/mach-rockchip/rk3288-board.c  | 50 
> +++---
>  board/rockchip/kylin_rk3036/kylin_rk3036.c | 14 ++--
>  include/configs/kylin_rk3036.h |  3 --
>  include/configs/rk3036_common.h|  3 ++
>  include/configs/rk3288_common.h|  3 ++
>  7 files changed, 111 insertions(+), 20 deletions(-)
>  create mode 100644 arch/arm/include/asm/arch-rockchip/boot_mode.h

Acked-by: Simon Glass 
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH 4/4] rockchip: add boot-mode support for rk3288, rk3036

2016-09-19 Thread Jacob Chen
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 
---

 arch/arm/include/asm/arch-rockchip/boot_mode.h | 19 ++
 arch/arm/mach-rockchip/rk3036-board.c  | 39 
 arch/arm/mach-rockchip/rk3288-board.c  | 50 +++---
 board/rockchip/kylin_rk3036/kylin_rk3036.c | 14 ++--
 include/configs/kylin_rk3036.h |  3 --
 include/configs/rk3036_common.h|  3 ++
 include/configs/rk3288_common.h|  3 ++
 7 files changed, 111 insertions(+), 20 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-rockchip/boot_mode.h

diff --git a/arch/arm/include/asm/arch-rockchip/boot_mode.h 
b/arch/arm/include/asm/arch-rockchip/boot_mode.h
new file mode 100644
index 000..bd65f60
--- /dev/null
+++ b/arch/arm/include/asm/arch-rockchip/boot_mode.h
@@ -0,0 +1,19 @@
+#ifndef __REBOOT_MODE_H
+#define __REBOOT_MODE_H
+
+/* high 24 bits is tag, low 8 bits is type */
+#define REBOOT_FLAG0x5242C300
+/* normal boot */
+#define BOOT_NORMAL(REBOOT_FLAG + 0)
+/* enter loader rockusb mode */
+#define BOOT_LOADER(REBOOT_FLAG + 1)
+/* enter recovery */
+#define BOOT_RECOVERY  (REBOOT_FLAG + 3)
+/* enter fastboot mode */
+#define BOOT_FASTBOOT  (REBOOT_FLAG + 9)
+/* enter charging mode */
+#define BOOT_CHARGING  (REBOOT_FLAG + 11)
+/* enter usb mass storage mode */
+#define BOOT_UMS   (REBOOT_FLAG + 12)
+
+#endif
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 
 #include 
 #include 
+#include 
+#include 
+#include 
 #include 
 #include 
 
 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(>os_reg[4]);
+
+   debug("boot mode %x.\n", boot_mode);
+
+   /* Clear boot mode */
+   writel(BOOT_NORMAL, >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;
diff --git a/arch/arm/mach-rockchip/rk3288-board.c 
b/arch/arm/mach-rockchip/rk3288-board.c
index bec756d..d24c090 100644
--- a/arch/arm/mach-rockchip/rk3288-board.c
+++ b/arch/arm/mach-rockchip/rk3288-board.c
@@ -8,25 +8,65 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#define PMU_BASE   0xff73
+
+static void setup_boot_mode(void)
+{
+   struct rk3288_pmu *const pmu = (void *)PMU_BASE;
+   int boot_mode = readl(>sys_reg[0]);
+
+   debug("boot mode %x.\n", boot_mode);
+
+   /* Clear boot mode */
+   writel(BOOT_NORMAL, >sys_reg[0]);
+
+   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; if mmc dev 0;"
+  "then ums mmc 0; else ums mmc 1;fi");
+   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)
 {
 #ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
struct udevice *pinctrl;
int ret;
 
-/*
- * We need to implement sdcard iomux here for the further
- * initlization, otherwise, it'll hit sdcard command sending
- * timeout exception.
- */
+   /*
+* We need to implement sdcard iomux here for the further
+* initlization, otherwise, it'll hit sdcard command sending
+* timeout exception.
+*/
ret = uclass_get_device(UCLASS_PINCTRL, 0, );
if (ret) {
debug("%s: Cannot find pinctrl device\n", __func__);
diff --git