1*83d290c5STom 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 20daeed1dbSKever Yang __weak int rk_board_late_init(void) 21daeed1dbSKever Yang { 22daeed1dbSKever Yang return 0; 23daeed1dbSKever Yang } 24daeed1dbSKever Yang 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 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 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 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 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 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 114daeed1dbSKever Yang #if defined(CONFIG_USB_FUNCTION_FASTBOOT) 115daeed1dbSKever Yang int fb_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