183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2df9041ecSHeiko Stübner /*
3df9041ecSHeiko Stübner * (C) Copyright 2015 Google, Inc
4df9041ecSHeiko Stübner */
5df9041ecSHeiko Stübner
6df9041ecSHeiko Stübner #include <common.h>
7df9041ecSHeiko Stübner #include <clk.h>
8df9041ecSHeiko Stübner #include <dm.h>
9df9041ecSHeiko Stübner #include <ram.h>
10df9041ecSHeiko Stübner #include <syscon.h>
11*c35f8e50SSimon Glass #include <asm/gpio.h>
12df9041ecSHeiko Stübner #include <asm/io.h>
13df9041ecSHeiko Stübner #include <asm/arch/clock.h>
14008a610bSHeiko Stübner #include <asm/arch/grf_rk3188.h>
15df9041ecSHeiko Stübner #include <asm/arch/periph.h>
16df9041ecSHeiko Stübner #include <asm/arch/pmu_rk3288.h>
17df9041ecSHeiko Stübner #include <asm/arch/boot_mode.h>
18df9041ecSHeiko Stübner #include <dm/pinctrl.h>
19df9041ecSHeiko Stübner
rk_board_late_init(void)20706afa46SAlexander Kochetkov __weak int rk_board_late_init(void)
21706afa46SAlexander Kochetkov {
22706afa46SAlexander Kochetkov return 0;
23706afa46SAlexander Kochetkov }
24706afa46SAlexander Kochetkov
board_late_init(void)25008a610bSHeiko Stübner int board_late_init(void)
26008a610bSHeiko Stübner {
27008a610bSHeiko Stübner struct rk3188_grf *grf;
28008a610bSHeiko Stübner
29e3067793SAndy Yan setup_boot_mode();
30008a610bSHeiko Stübner grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
31008a610bSHeiko Stübner if (IS_ERR(grf)) {
329b643e31SMasahiro Yamada pr_err("grf syscon returned %ld\n", PTR_ERR(grf));
33008a610bSHeiko Stübner } else {
34008a610bSHeiko Stübner /* enable noc remap to mimic legacy loaders */
35008a610bSHeiko Stübner rk_clrsetreg(&grf->soc_con0,
36008a610bSHeiko Stübner NOC_REMAP_MASK << NOC_REMAP_SHIFT,
37008a610bSHeiko Stübner NOC_REMAP_MASK << NOC_REMAP_SHIFT);
38008a610bSHeiko Stübner }
39008a610bSHeiko Stübner
40706afa46SAlexander Kochetkov return rk_board_late_init();
41008a610bSHeiko Stübner }
42008a610bSHeiko Stübner
board_init(void)43df9041ecSHeiko Stübner int board_init(void)
44df9041ecSHeiko Stübner {
45ee14d29dSPhilipp Tomsich #if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM)
46df9041ecSHeiko Stübner struct udevice *pinctrl;
47df9041ecSHeiko Stübner int ret;
48df9041ecSHeiko Stübner
49df9041ecSHeiko Stübner /*
50df9041ecSHeiko Stübner * We need to implement sdcard iomux here for the further
51df9041ecSHeiko Stübner * initialization, otherwise, it'll hit sdcard command sending
52df9041ecSHeiko Stübner * timeout exception.
53df9041ecSHeiko Stübner */
54df9041ecSHeiko Stübner ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
55df9041ecSHeiko Stübner if (ret) {
56df9041ecSHeiko Stübner debug("%s: Cannot find pinctrl device\n", __func__);
57df9041ecSHeiko Stübner goto err;
58df9041ecSHeiko Stübner }
59df9041ecSHeiko Stübner ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
60df9041ecSHeiko Stübner if (ret) {
61df9041ecSHeiko Stübner debug("%s: Failed to set up SD card\n", __func__);
62df9041ecSHeiko Stübner goto err;
63df9041ecSHeiko Stübner }
64df9041ecSHeiko Stübner
65df9041ecSHeiko Stübner return 0;
66df9041ecSHeiko Stübner err:
67df9041ecSHeiko Stübner printf("board_init: Error %d\n", ret);
68df9041ecSHeiko Stübner
69df9041ecSHeiko Stübner /* No way to report error here */
70df9041ecSHeiko Stübner hang();
71df9041ecSHeiko Stübner
72df9041ecSHeiko Stübner return -1;
73df9041ecSHeiko Stübner #else
74df9041ecSHeiko Stübner return 0;
75df9041ecSHeiko Stübner #endif
76df9041ecSHeiko Stübner }
77df9041ecSHeiko Stübner
78df9041ecSHeiko Stübner #ifndef CONFIG_SYS_DCACHE_OFF
enable_caches(void)79df9041ecSHeiko Stübner void enable_caches(void)
80df9041ecSHeiko Stübner {
81df9041ecSHeiko Stübner /* Enable D-cache. I-cache is already enabled in start.S */
82df9041ecSHeiko Stübner dcache_enable();
83df9041ecSHeiko Stübner }
84df9041ecSHeiko Stübner #endif
85