1168eef7aSKever Yang /* 2168eef7aSKever Yang * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3168eef7aSKever Yang * 4168eef7aSKever Yang * SPDX-License-Identifier: GPL-2.0+ 5168eef7aSKever Yang */ 6168eef7aSKever Yang 7168eef7aSKever Yang #include <common.h> 8168eef7aSKever Yang #include <debug_uart.h> 9168eef7aSKever Yang #include <dm.h> 10168eef7aSKever Yang #include <ram.h> 11168eef7aSKever Yang #include <spl.h> 12168eef7aSKever Yang #include <asm/io.h> 13168eef7aSKever Yang #include <asm/arch/bootrom.h> 14168eef7aSKever Yang #include <asm/arch/cru_rk322x.h> 15168eef7aSKever Yang #include <asm/arch/grf_rk322x.h> 16168eef7aSKever Yang #include <asm/arch/hardware.h> 17168eef7aSKever Yang #include <asm/arch/timer.h> 18168eef7aSKever Yang #include <asm/arch/uart.h> 19168eef7aSKever Yang 20168eef7aSKever Yang u32 spl_boot_device(void) 21168eef7aSKever Yang { 22168eef7aSKever Yang return BOOT_DEVICE_MMC1; 23168eef7aSKever Yang } 24168eef7aSKever Yang DECLARE_GLOBAL_DATA_PTR; 25168eef7aSKever Yang 26168eef7aSKever Yang #define GRF_BASE 0x11000000 27168eef7aSKever Yang #define SGRF_BASE 0x10140000 28168eef7aSKever Yang 29168eef7aSKever Yang #define DEBUG_UART_BASE 0x11030000 30168eef7aSKever Yang 31168eef7aSKever Yang void board_debug_uart_init(void) 32168eef7aSKever Yang { 33168eef7aSKever Yang static struct rk322x_grf * const grf = (void *)GRF_BASE; 34168eef7aSKever Yang /* Enable early UART2 channel 1 on the RK322x */ 35168eef7aSKever Yang rk_clrsetreg(&grf->gpio1b_iomux, 36168eef7aSKever Yang GPIO1B1_MASK | GPIO1B2_MASK, 37168eef7aSKever Yang GPIO1B2_UART21_SIN << GPIO1B2_SHIFT | 38168eef7aSKever Yang GPIO1B1_UART21_SOUT << GPIO1B1_SHIFT); 39168eef7aSKever Yang /* Set channel C as UART2 input */ 40168eef7aSKever Yang rk_clrsetreg(&grf->con_iomux, 41168eef7aSKever Yang CON_IOMUX_UART2SEL_MASK, 42168eef7aSKever Yang CON_IOMUX_UART2SEL_21 << CON_IOMUX_UART2SEL_SHIFT); 43168eef7aSKever Yang } 4418d38d3aSKever Yang 4518d38d3aSKever Yang #define SGRF_DDR_CON0 0x10150000 46168eef7aSKever Yang void board_init_f(ulong dummy) 47168eef7aSKever Yang { 48168eef7aSKever Yang struct udevice *dev; 49168eef7aSKever Yang int ret; 50168eef7aSKever Yang 51168eef7aSKever Yang /* 52168eef7aSKever Yang * Debug UART can be used from here if required: 53168eef7aSKever Yang * 54168eef7aSKever Yang * debug_uart_init(); 55168eef7aSKever Yang * printch('a'); 56168eef7aSKever Yang * printhex8(0x1234); 57168eef7aSKever Yang * printascii("string"); 58168eef7aSKever Yang */ 59168eef7aSKever Yang debug_uart_init(); 60168eef7aSKever Yang printascii("SPL Init"); 61168eef7aSKever Yang 62168eef7aSKever Yang ret = spl_early_init(); 63168eef7aSKever Yang if (ret) { 64168eef7aSKever Yang debug("spl_early_init() failed: %d\n", ret); 65168eef7aSKever Yang hang(); 66168eef7aSKever Yang } 67168eef7aSKever Yang 68168eef7aSKever Yang rockchip_timer_init(); 69168eef7aSKever Yang printf("timer init done\n"); 70168eef7aSKever Yang ret = uclass_get_device(UCLASS_RAM, 0, &dev); 71168eef7aSKever Yang if (ret) { 72168eef7aSKever Yang printf("DRAM init failed: %d\n", ret); 73168eef7aSKever Yang return; 74168eef7aSKever Yang } 75168eef7aSKever Yang 7618d38d3aSKever Yang /* Disable the ddr secure region setting to make it non-secure */ 7718d38d3aSKever Yang rk_clrreg(SGRF_DDR_CON0, 0x4000); 78168eef7aSKever Yang #if defined(CONFIG_ROCKCHIP_SPL_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT) 79*b82bd1f8SPhilipp Tomsich back_to_bootrom(BROM_BOOT_NEXTSTAGE); 80168eef7aSKever Yang #endif 81168eef7aSKever Yang } 82