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