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