1*168eef7aSKever Yang /* 2*168eef7aSKever Yang * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3*168eef7aSKever Yang * 4*168eef7aSKever Yang * SPDX-License-Identifier: GPL-2.0+ 5*168eef7aSKever Yang */ 6*168eef7aSKever Yang 7*168eef7aSKever Yang #include <common.h> 8*168eef7aSKever Yang #include <debug_uart.h> 9*168eef7aSKever Yang #include <dm.h> 10*168eef7aSKever Yang #include <ram.h> 11*168eef7aSKever Yang #include <spl.h> 12*168eef7aSKever Yang #include <asm/io.h> 13*168eef7aSKever Yang #include <asm/arch/bootrom.h> 14*168eef7aSKever Yang #include <asm/arch/cru_rk322x.h> 15*168eef7aSKever Yang #include <asm/arch/grf_rk322x.h> 16*168eef7aSKever Yang #include <asm/arch/hardware.h> 17*168eef7aSKever Yang #include <asm/arch/timer.h> 18*168eef7aSKever Yang #include <asm/arch/uart.h> 19*168eef7aSKever Yang 20*168eef7aSKever Yang u32 spl_boot_device(void) 21*168eef7aSKever Yang { 22*168eef7aSKever Yang return BOOT_DEVICE_MMC1; 23*168eef7aSKever Yang } 24*168eef7aSKever Yang DECLARE_GLOBAL_DATA_PTR; 25*168eef7aSKever Yang 26*168eef7aSKever Yang #define GRF_BASE 0x11000000 27*168eef7aSKever Yang #define SGRF_BASE 0x10140000 28*168eef7aSKever Yang 29*168eef7aSKever Yang #define DEBUG_UART_BASE 0x11030000 30*168eef7aSKever Yang 31*168eef7aSKever Yang void board_debug_uart_init(void) 32*168eef7aSKever Yang { 33*168eef7aSKever Yang static struct rk322x_grf * const grf = (void *)GRF_BASE; 34*168eef7aSKever Yang /* Enable early UART2 channel 1 on the RK322x */ 35*168eef7aSKever Yang rk_clrsetreg(&grf->gpio1b_iomux, 36*168eef7aSKever Yang GPIO1B1_MASK | GPIO1B2_MASK, 37*168eef7aSKever Yang GPIO1B2_UART21_SIN << GPIO1B2_SHIFT | 38*168eef7aSKever Yang GPIO1B1_UART21_SOUT << GPIO1B1_SHIFT); 39*168eef7aSKever Yang /* Set channel C as UART2 input */ 40*168eef7aSKever Yang rk_clrsetreg(&grf->con_iomux, 41*168eef7aSKever Yang CON_IOMUX_UART2SEL_MASK, 42*168eef7aSKever Yang CON_IOMUX_UART2SEL_21 << CON_IOMUX_UART2SEL_SHIFT); 43*168eef7aSKever Yang } 44*168eef7aSKever Yang void board_init_f(ulong dummy) 45*168eef7aSKever Yang { 46*168eef7aSKever Yang struct udevice *dev; 47*168eef7aSKever Yang int ret; 48*168eef7aSKever Yang 49*168eef7aSKever Yang /* 50*168eef7aSKever Yang * Debug UART can be used from here if required: 51*168eef7aSKever Yang * 52*168eef7aSKever Yang * debug_uart_init(); 53*168eef7aSKever Yang * printch('a'); 54*168eef7aSKever Yang * printhex8(0x1234); 55*168eef7aSKever Yang * printascii("string"); 56*168eef7aSKever Yang */ 57*168eef7aSKever Yang debug_uart_init(); 58*168eef7aSKever Yang printascii("SPL Init"); 59*168eef7aSKever Yang 60*168eef7aSKever Yang ret = spl_early_init(); 61*168eef7aSKever Yang if (ret) { 62*168eef7aSKever Yang debug("spl_early_init() failed: %d\n", ret); 63*168eef7aSKever Yang hang(); 64*168eef7aSKever Yang } 65*168eef7aSKever Yang 66*168eef7aSKever Yang rockchip_timer_init(); 67*168eef7aSKever Yang printf("timer init done\n"); 68*168eef7aSKever Yang ret = uclass_get_device(UCLASS_RAM, 0, &dev); 69*168eef7aSKever Yang if (ret) { 70*168eef7aSKever Yang printf("DRAM init failed: %d\n", ret); 71*168eef7aSKever Yang return; 72*168eef7aSKever Yang } 73*168eef7aSKever Yang 74*168eef7aSKever Yang #if defined(CONFIG_ROCKCHIP_SPL_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT) 75*168eef7aSKever Yang back_to_bootrom(); 76*168eef7aSKever Yang #endif 77*168eef7aSKever Yang } 78