/* * (C) Copyright 2016 Rockchip Electronics Co., Ltd * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include DECLARE_GLOBAL_DATA_PTR; u32 spl_boot_device(void) { return BOOT_DEVICE_MMC1; } u32 spl_boot_mode(const u32 boot_device) { return MMCSD_MODE_RAW; } #define TIMER_CHN10_BASE 0xff8680a0 #define TIMER_END_COUNT_L 0x00 #define TIMER_END_COUNT_H 0x04 #define TIMER_INIT_COUNT_L 0x10 #define TIMER_INIT_COUNT_H 0x14 #define TIMER_CONTROL_REG 0x1c #define TIMER_EN 0x1 #define TIMER_FMODE (0 << 1) #define TIMER_RMODE (1 << 1) void secure_timer_init(void) { writel(0xffffffff, TIMER_CHN10_BASE + TIMER_END_COUNT_L); writel(0xffffffff, TIMER_CHN10_BASE + TIMER_END_COUNT_H); writel(0, TIMER_CHN10_BASE + TIMER_INIT_COUNT_L); writel(0, TIMER_CHN10_BASE + TIMER_INIT_COUNT_H); writel(TIMER_EN | TIMER_FMODE, TIMER_CHN10_BASE + TIMER_CONTROL_REG); } #define GRF_EMMCCORE_CON11 0xff77f02c void board_init_f(ulong dummy) { struct udevice *pinctrl; struct udevice *dev; int ret; /* Example code showing how to enable the debug UART on RK3288 */ #include /* Enable early UART2 channel C on the RK3399 */ #define GRF_BASE 0xff770000 struct rk3399_grf_regs * const grf = (void *)GRF_BASE; rk_clrsetreg(&grf->gpio4c_iomux, GRF_GPIO4C3_SEL_MASK, GRF_UART2DGBC_SIN << GRF_GPIO4C3_SEL_SHIFT); rk_clrsetreg(&grf->gpio4c_iomux, GRF_GPIO4C4_SEL_MASK, GRF_UART2DBGC_SOUT << GRF_GPIO4C4_SEL_SHIFT); /* Set channel C as UART2 input */ rk_clrsetreg(&grf->soc_con7, GRF_UART_DBG_SEL_MASK, GRF_UART_DBG_SEL_C << GRF_UART_DBG_SEL_SHIFT); #define EARLY_UART #ifdef EARLY_UART /* * Debug UART can be used from here if required: * * debug_uart_init(); * printch('a'); * printhex8(0x1234); * printascii("string"); */ debug_uart_init(); printascii("U-Boot SPL board init"); #endif /* Emmc clock generator: disable the clock multipilier */ rk_clrreg(GRF_EMMCCORE_CON11, 0x0ff); ret = spl_early_init(); if (ret) { debug("spl_early_init() failed: %d\n", ret); hang(); } secure_timer_init(); ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl); if (ret) { debug("Pinctrl init failed: %d\n", ret); return; } ret = uclass_get_device(UCLASS_RAM, 0, &dev); if (ret) { debug("DRAM init failed: %d\n", ret); return; } } void spl_board_init(void) { struct udevice *pinctrl; int ret; ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl); if (ret) { debug("%s: Cannot find pinctrl device\n", __func__); goto err; } /* Enable debug UART */ ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_UART_DBG); if (ret) { debug("%s: Failed to set up console UART\n", __func__); goto err; } preloader_console_init(); #ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM back_to_bootrom(); #endif return; err: printf("spl_board_init: Error %d\n", ret); /* No way to report error here */ hang(); } #ifdef CONFIG_SPL_LOAD_FIT int board_fit_config_name_match(const char *name) { /* Just empty function now - can't decide what to choose */ debug("%s: %s\n", __func__, name); return 0; } #endif