xref: /openbmc/u-boot/arch/arm/mach-rockchip/rk3188-board.c (revision e5fd39c886485e3dec77f4438a6e364c2987cf5f)
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