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;
34424324d3SDavid Wu 	enum {
35424324d3SDavid Wu 		GPIO1B2_SHIFT		= 4,
36424324d3SDavid Wu 		GPIO1B2_MASK		= 3 << GPIO1B2_SHIFT,
37424324d3SDavid Wu 		GPIO1B2_GPIO            = 0,
38424324d3SDavid Wu 		GPIO1B2_UART1_SIN,
39424324d3SDavid Wu 		GPIO1B2_UART21_SIN,
40424324d3SDavid Wu 
41424324d3SDavid Wu 		GPIO1B1_SHIFT		= 2,
42424324d3SDavid Wu 		GPIO1B1_MASK		= 3 << GPIO1B1_SHIFT,
43424324d3SDavid Wu 		GPIO1B1_GPIO            = 0,
44424324d3SDavid Wu 		GPIO1B1_UART1_SOUT,
45424324d3SDavid Wu 		GPIO1B1_UART21_SOUT,
46424324d3SDavid Wu 	};
47424324d3SDavid Wu 	enum {
48424324d3SDavid Wu 		CON_IOMUX_UART2SEL_SHIFT= 8,
49424324d3SDavid Wu 		CON_IOMUX_UART2SEL_MASK	= 1 << CON_IOMUX_UART2SEL_SHIFT,
50424324d3SDavid Wu 		CON_IOMUX_UART2SEL_2	= 0,
51424324d3SDavid Wu 		CON_IOMUX_UART2SEL_21,
52424324d3SDavid Wu 	};
53424324d3SDavid Wu 
54168eef7aSKever Yang 	/* Enable early UART2 channel 1 on the RK322x */
55168eef7aSKever Yang 	rk_clrsetreg(&grf->gpio1b_iomux,
56168eef7aSKever Yang 		     GPIO1B1_MASK | GPIO1B2_MASK,
57168eef7aSKever Yang 		     GPIO1B2_UART21_SIN << GPIO1B2_SHIFT |
58168eef7aSKever Yang 		     GPIO1B1_UART21_SOUT << GPIO1B1_SHIFT);
59168eef7aSKever Yang 	/* Set channel C as UART2 input */
60168eef7aSKever Yang 	rk_clrsetreg(&grf->con_iomux,
61168eef7aSKever Yang 		     CON_IOMUX_UART2SEL_MASK,
62168eef7aSKever Yang 		     CON_IOMUX_UART2SEL_21 << CON_IOMUX_UART2SEL_SHIFT);
63168eef7aSKever Yang }
6418d38d3aSKever Yang 
6518d38d3aSKever Yang #define SGRF_DDR_CON0 0x10150000
66168eef7aSKever Yang void board_init_f(ulong dummy)
67168eef7aSKever Yang {
68168eef7aSKever Yang 	struct udevice *dev;
69168eef7aSKever Yang 	int ret;
70168eef7aSKever Yang 
71168eef7aSKever Yang 	/*
72168eef7aSKever Yang 	 * Debug UART can be used from here if required:
73168eef7aSKever Yang 	 *
74168eef7aSKever Yang 	 * debug_uart_init();
75168eef7aSKever Yang 	 * printch('a');
76168eef7aSKever Yang 	 * printhex8(0x1234);
77168eef7aSKever Yang 	 * printascii("string");
78168eef7aSKever Yang 	 */
79168eef7aSKever Yang 	debug_uart_init();
80168eef7aSKever Yang 	printascii("SPL Init");
81168eef7aSKever Yang 
82168eef7aSKever Yang 	ret = spl_early_init();
83168eef7aSKever Yang 	if (ret) {
84168eef7aSKever Yang 		debug("spl_early_init() failed: %d\n", ret);
85168eef7aSKever Yang 		hang();
86168eef7aSKever Yang 	}
87168eef7aSKever Yang 
88168eef7aSKever Yang 	rockchip_timer_init();
89168eef7aSKever Yang 	printf("timer init done\n");
90168eef7aSKever Yang 	ret = uclass_get_device(UCLASS_RAM, 0, &dev);
91168eef7aSKever Yang 	if (ret) {
92168eef7aSKever Yang 		printf("DRAM init failed: %d\n", ret);
93168eef7aSKever Yang 		return;
94168eef7aSKever Yang 	}
95168eef7aSKever Yang 
9618d38d3aSKever Yang 	/* Disable the ddr secure region setting to make it non-secure */
9718d38d3aSKever Yang 	rk_clrreg(SGRF_DDR_CON0, 0x4000);
98*cb7116afSKever Yang #if defined(CONFIG_SPL_ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT)
99b82bd1f8SPhilipp Tomsich 	back_to_bootrom(BROM_BOOT_NEXTSTAGE);
100168eef7aSKever Yang #endif
101168eef7aSKever Yang }
102