183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2daeed1dbSKever Yang /*
3daeed1dbSKever Yang  * (C) Copyright 2017 Rockchip Electronics Co., Ltd.
4daeed1dbSKever Yang  */
5daeed1dbSKever Yang #include <common.h>
6daeed1dbSKever Yang #include <clk.h>
7daeed1dbSKever Yang #include <dm.h>
8daeed1dbSKever Yang #include <ram.h>
9daeed1dbSKever Yang #include <syscon.h>
10daeed1dbSKever Yang #include <asm/io.h>
11daeed1dbSKever Yang #include <asm/arch/clock.h>
12daeed1dbSKever Yang #include <asm/arch/periph.h>
13daeed1dbSKever Yang #include <asm/arch/grf_rk3128.h>
14daeed1dbSKever Yang #include <asm/arch/boot_mode.h>
15daeed1dbSKever Yang #include <asm/arch/timer.h>
16daeed1dbSKever Yang #include <power/regulator.h>
17daeed1dbSKever Yang 
18daeed1dbSKever Yang DECLARE_GLOBAL_DATA_PTR;
19daeed1dbSKever Yang 
rk_board_late_init(void)20daeed1dbSKever Yang __weak int rk_board_late_init(void)
21daeed1dbSKever Yang {
22daeed1dbSKever Yang 	return 0;
23daeed1dbSKever Yang }
24daeed1dbSKever Yang 
board_late_init(void)25daeed1dbSKever Yang int board_late_init(void)
26daeed1dbSKever Yang {
27daeed1dbSKever Yang 	setup_boot_mode();
28daeed1dbSKever Yang 
29daeed1dbSKever Yang 	return rk_board_late_init();
30daeed1dbSKever Yang }
31daeed1dbSKever Yang 
board_init(void)32daeed1dbSKever Yang int board_init(void)
33daeed1dbSKever Yang {
34daeed1dbSKever Yang 	int ret = 0;
35daeed1dbSKever Yang 
36daeed1dbSKever Yang 	rockchip_timer_init();
37daeed1dbSKever Yang 
38daeed1dbSKever Yang 	ret = regulators_enable_boot_on(false);
39daeed1dbSKever Yang 	if (ret) {
40daeed1dbSKever Yang 		debug("%s: Cannot enable boot on regulator\n", __func__);
41daeed1dbSKever Yang 		return ret;
42daeed1dbSKever Yang 	}
43daeed1dbSKever Yang 
44daeed1dbSKever Yang 	return 0;
45daeed1dbSKever Yang }
46daeed1dbSKever Yang 
dram_init_banksize(void)47daeed1dbSKever Yang int dram_init_banksize(void)
48daeed1dbSKever Yang {
49daeed1dbSKever Yang 	gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
50daeed1dbSKever Yang 	gd->bd->bi_dram[0].size = 0x8400000;
51daeed1dbSKever Yang 	/* Reserve 0xe00000(14MB) for OPTEE with TA enabled, otherwise 2MB */
52daeed1dbSKever Yang 	gd->bd->bi_dram[1].start = CONFIG_SYS_SDRAM_BASE
53daeed1dbSKever Yang 				+ gd->bd->bi_dram[0].size + 0xe00000;
54daeed1dbSKever Yang 	gd->bd->bi_dram[1].size = gd->bd->bi_dram[0].start
55daeed1dbSKever Yang 				+ gd->ram_size - gd->bd->bi_dram[1].start;
56daeed1dbSKever Yang 
57daeed1dbSKever Yang 	return 0;
58daeed1dbSKever Yang }
59daeed1dbSKever Yang 
60daeed1dbSKever Yang #ifndef CONFIG_SYS_DCACHE_OFF
enable_caches(void)61daeed1dbSKever Yang void enable_caches(void)
62daeed1dbSKever Yang {
63daeed1dbSKever Yang 	/* Enable D-cache. I-cache is already enabled in start.S */
64daeed1dbSKever Yang 	dcache_enable();
65daeed1dbSKever Yang }
66daeed1dbSKever Yang #endif
67daeed1dbSKever Yang 
68daeed1dbSKever Yang #if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
69daeed1dbSKever Yang #include <usb.h>
70daeed1dbSKever Yang #include <usb/dwc2_udc.h>
71daeed1dbSKever Yang 
72daeed1dbSKever Yang static struct dwc2_plat_otg_data rk3128_otg_data = {
73daeed1dbSKever Yang 	.rx_fifo_sz	= 512,
74daeed1dbSKever Yang 	.np_tx_fifo_sz	= 16,
75daeed1dbSKever Yang 	.tx_fifo_sz	= 128,
76daeed1dbSKever Yang };
77daeed1dbSKever Yang 
board_usb_init(int index,enum usb_init_type init)78daeed1dbSKever Yang int board_usb_init(int index, enum usb_init_type init)
79daeed1dbSKever Yang {
80daeed1dbSKever Yang 	int node;
81daeed1dbSKever Yang 	const char *mode;
82daeed1dbSKever Yang 	bool matched = false;
83daeed1dbSKever Yang 	const void *blob = gd->fdt_blob;
84daeed1dbSKever Yang 
85daeed1dbSKever Yang 	/* find the usb_otg node */
86daeed1dbSKever Yang 	node = fdt_node_offset_by_compatible(blob, -1,
87daeed1dbSKever Yang 					     "rockchip,rk3128-usb");
88daeed1dbSKever Yang 
89daeed1dbSKever Yang 	while (node > 0) {
90daeed1dbSKever Yang 		mode = fdt_getprop(blob, node, "dr_mode", NULL);
91daeed1dbSKever Yang 		if (mode && strcmp(mode, "otg") == 0) {
92daeed1dbSKever Yang 			matched = true;
93daeed1dbSKever Yang 			break;
94daeed1dbSKever Yang 		}
95daeed1dbSKever Yang 
96daeed1dbSKever Yang 		node = fdt_node_offset_by_compatible(blob, node,
97daeed1dbSKever Yang 						     "rockchip,rk3128-usb");
98daeed1dbSKever Yang 	}
99daeed1dbSKever Yang 	if (!matched) {
100daeed1dbSKever Yang 		debug("Not found usb_otg device\n");
101daeed1dbSKever Yang 		return -ENODEV;
102daeed1dbSKever Yang 	}
103daeed1dbSKever Yang 	rk3128_otg_data.regs_otg = fdtdec_get_addr(blob, node, "reg");
104daeed1dbSKever Yang 
105daeed1dbSKever Yang 	return dwc2_udc_probe(&rk3128_otg_data);
106daeed1dbSKever Yang }
107daeed1dbSKever Yang 
board_usb_cleanup(int index,enum usb_init_type init)108daeed1dbSKever Yang int board_usb_cleanup(int index, enum usb_init_type init)
109daeed1dbSKever Yang {
110daeed1dbSKever Yang 	return 0;
111daeed1dbSKever Yang }
112daeed1dbSKever Yang #endif
113daeed1dbSKever Yang 
114*8a65bd63SAlex Kiernan #if CONFIG_IS_ENABLED(FASTBOOT)
fastboot_set_reboot_flag(void)115*8a65bd63SAlex Kiernan int fastboot_set_reboot_flag(void)
116daeed1dbSKever Yang {
117daeed1dbSKever Yang 	struct rk3128_grf *grf;
118daeed1dbSKever Yang 
119daeed1dbSKever Yang 	printf("Setting reboot to fastboot flag ...\n");
120daeed1dbSKever Yang 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
121daeed1dbSKever Yang 	/* Set boot mode to fastboot */
122daeed1dbSKever Yang 	writel(BOOT_FASTBOOT, &grf->os_reg[0]);
123daeed1dbSKever Yang 
124daeed1dbSKever Yang 	return 0;
125daeed1dbSKever Yang }
126daeed1dbSKever Yang #endif
127