1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2168eef7aSKever Yang /*
3168eef7aSKever Yang * (C) Copyright 2017 Rockchip Electronics Co., Ltd
4168eef7aSKever Yang */
5168eef7aSKever Yang
6168eef7aSKever Yang #include <common.h>
7168eef7aSKever Yang #include <debug_uart.h>
8168eef7aSKever Yang #include <dm.h>
9168eef7aSKever Yang #include <ram.h>
10168eef7aSKever Yang #include <spl.h>
11168eef7aSKever Yang #include <asm/io.h>
12168eef7aSKever Yang #include <asm/arch/bootrom.h>
13168eef7aSKever Yang #include <asm/arch/cru_rk322x.h>
14168eef7aSKever Yang #include <asm/arch/grf_rk322x.h>
15168eef7aSKever Yang #include <asm/arch/hardware.h>
16168eef7aSKever Yang #include <asm/arch/timer.h>
17168eef7aSKever Yang #include <asm/arch/uart.h>
18168eef7aSKever Yang
spl_boot_device(void)19168eef7aSKever Yang u32 spl_boot_device(void)
20168eef7aSKever Yang {
21168eef7aSKever Yang return BOOT_DEVICE_MMC1;
22168eef7aSKever Yang }
23168eef7aSKever Yang #define GRF_BASE 0x11000000
24168eef7aSKever Yang #define SGRF_BASE 0x10140000
25168eef7aSKever Yang
26168eef7aSKever Yang #define DEBUG_UART_BASE 0x11030000
27168eef7aSKever Yang
board_debug_uart_init(void)28168eef7aSKever Yang void board_debug_uart_init(void)
29168eef7aSKever Yang {
30168eef7aSKever Yang static struct rk322x_grf * const grf = (void *)GRF_BASE;
31424324d3SDavid Wu enum {
32424324d3SDavid Wu GPIO1B2_SHIFT = 4,
33424324d3SDavid Wu GPIO1B2_MASK = 3 << GPIO1B2_SHIFT,
34424324d3SDavid Wu GPIO1B2_GPIO = 0,
35424324d3SDavid Wu GPIO1B2_UART1_SIN,
36424324d3SDavid Wu GPIO1B2_UART21_SIN,
37424324d3SDavid Wu
38424324d3SDavid Wu GPIO1B1_SHIFT = 2,
39424324d3SDavid Wu GPIO1B1_MASK = 3 << GPIO1B1_SHIFT,
40424324d3SDavid Wu GPIO1B1_GPIO = 0,
41424324d3SDavid Wu GPIO1B1_UART1_SOUT,
42424324d3SDavid Wu GPIO1B1_UART21_SOUT,
43424324d3SDavid Wu };
44424324d3SDavid Wu enum {
45424324d3SDavid Wu CON_IOMUX_UART2SEL_SHIFT= 8,
46424324d3SDavid Wu CON_IOMUX_UART2SEL_MASK = 1 << CON_IOMUX_UART2SEL_SHIFT,
47424324d3SDavid Wu CON_IOMUX_UART2SEL_2 = 0,
48424324d3SDavid Wu CON_IOMUX_UART2SEL_21,
49424324d3SDavid Wu };
50424324d3SDavid Wu
51168eef7aSKever Yang /* Enable early UART2 channel 1 on the RK322x */
52168eef7aSKever Yang rk_clrsetreg(&grf->gpio1b_iomux,
53168eef7aSKever Yang GPIO1B1_MASK | GPIO1B2_MASK,
54168eef7aSKever Yang GPIO1B2_UART21_SIN << GPIO1B2_SHIFT |
55168eef7aSKever Yang GPIO1B1_UART21_SOUT << GPIO1B1_SHIFT);
56168eef7aSKever Yang /* Set channel C as UART2 input */
57168eef7aSKever Yang rk_clrsetreg(&grf->con_iomux,
58168eef7aSKever Yang CON_IOMUX_UART2SEL_MASK,
59168eef7aSKever Yang CON_IOMUX_UART2SEL_21 << CON_IOMUX_UART2SEL_SHIFT);
60168eef7aSKever Yang }
6118d38d3aSKever Yang
6218d38d3aSKever Yang #define SGRF_DDR_CON0 0x10150000
board_init_f(ulong dummy)63168eef7aSKever Yang void board_init_f(ulong dummy)
64168eef7aSKever Yang {
65168eef7aSKever Yang struct udevice *dev;
66168eef7aSKever Yang int ret;
67168eef7aSKever Yang
68168eef7aSKever Yang /*
69168eef7aSKever Yang * Debug UART can be used from here if required:
70168eef7aSKever Yang *
71168eef7aSKever Yang * debug_uart_init();
72168eef7aSKever Yang * printch('a');
73168eef7aSKever Yang * printhex8(0x1234);
74168eef7aSKever Yang * printascii("string");
75168eef7aSKever Yang */
76168eef7aSKever Yang debug_uart_init();
77168eef7aSKever Yang printascii("SPL Init");
78168eef7aSKever Yang
79168eef7aSKever Yang ret = spl_early_init();
80168eef7aSKever Yang if (ret) {
81168eef7aSKever Yang debug("spl_early_init() failed: %d\n", ret);
82168eef7aSKever Yang hang();
83168eef7aSKever Yang }
84168eef7aSKever Yang
85168eef7aSKever Yang rockchip_timer_init();
86168eef7aSKever Yang printf("timer init done\n");
87168eef7aSKever Yang ret = uclass_get_device(UCLASS_RAM, 0, &dev);
88168eef7aSKever Yang if (ret) {
89168eef7aSKever Yang printf("DRAM init failed: %d\n", ret);
90168eef7aSKever Yang return;
91168eef7aSKever Yang }
92168eef7aSKever Yang
9318d38d3aSKever Yang /* Disable the ddr secure region setting to make it non-secure */
9418d38d3aSKever Yang rk_clrreg(SGRF_DDR_CON0, 0x4000);
95cb7116afSKever Yang #if defined(CONFIG_SPL_ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT)
96b82bd1f8SPhilipp Tomsich back_to_bootrom(BROM_BOOT_NEXTSTAGE);
97168eef7aSKever Yang #endif
98168eef7aSKever Yang }
99