ARM: rockchip: rk3228: implement function rk3228_restart
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rockchip / rk3228.c
index 91410376d461c786c937cc432ad7826df468d035..bd5c434f92145a952c7f65d85c7a7c12c1d167fd 100644 (file)
@@ -54,6 +54,7 @@ static struct map_desc rk3228_io_desc[] __initdata = {
        RK3228_DEVICE(CRU),
        RK3228_DEVICE(GRF),
        RK3228_DEVICE(TIMER),
+       RK3228_DEVICE(EFUSE),
        RK3228_DEVICE(CPU_AXI_BUS),
        RK_DEVICE(RK_DEBUG_UART_VIRT, RK3228_UART2_PHYS, RK3228_UART_SIZE),
        RK_DEVICE(RK_DDR_VIRT, RK3228_DDR_PCTL_PHYS, RK3228_DDR_PCTL_SIZE),
@@ -75,6 +76,8 @@ void __init rk3228_dt_map_io(void)
 
        iotable_init(rk3228_io_desc, ARRAY_SIZE(rk3228_io_desc));
        debug_ll_io_init();
+
+       rockchip_efuse_init();
 }
 
 static void __init rk3228_dt_init_timer(void)
@@ -101,6 +104,22 @@ static void __init rk3228_init_late(void)
 
 static void rk3228_restart(char mode, const char *cmd)
 {
+       u32 boot_flag, boot_mode;
+
+       rockchip_restart_get_boot_mode(cmd, &boot_flag, &boot_mode);
+
+       /* for loader */
+       writel_relaxed(boot_flag, RK_PMU_VIRT + RK3228_GRF_OS_REG0);
+       /* for linux */
+       writel_relaxed(boot_mode, RK_PMU_VIRT + RK3228_GRF_OS_REG1);
+
+       dsb();
+
+       /* pll enter slow mode */
+       writel_relaxed(0x11010000, RK_CRU_VIRT + RK3228_CRU_MODE_CON);
+       dsb();
+       writel_relaxed(0xeca8, RK_CRU_VIRT + RK3228_CRU_GLB_SRST_SND_VALUE);
+       dsb();
 }
 
 DT_MACHINE_START(RK3228_DT, "Rockchip RK3228")