blob: 05ae3eca98ebfa6ab027f5ff1283b07470a6b75e [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Heiko Stübner0b3c26a2017-02-18 19:46:38 +01002/*
3 * (C) Copyright 2015 Google, Inc
Heiko Stübner0b3c26a2017-02-18 19:46:38 +01004 */
5
Heiko Stübnerba188bb2017-03-20 12:40:33 +01006#include <clk.h>
Heiko Stübner0b3c26a2017-02-18 19:46:38 +01007#include <common.h>
8#include <debug_uart.h>
9#include <dm.h>
10#include <fdtdec.h>
11#include <led.h>
12#include <malloc.h>
13#include <ram.h>
14#include <spl.h>
Simon Glassf473eba2019-01-21 14:53:31 -070015#include <syscon.h>
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010016#include <asm/gpio.h>
17#include <asm/io.h>
Kever Yang9fbe17c2019-03-28 11:01:23 +080018#include <asm/arch-rockchip/bootrom.h>
19#include <asm/arch-rockchip/clock.h>
Kever Yang9fbe17c2019-03-28 11:01:23 +080020#include <asm/arch-rockchip/periph.h>
Kever Yang9fbe17c2019-03-28 11:01:23 +080021#include <asm/arch-rockchip/sdram.h>
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010022#include <dm/root.h>
23#include <dm/test.h>
24#include <dm/util.h>
25#include <power/regulator.h>
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010026
27DECLARE_GLOBAL_DATA_PTR;
28
29u32 spl_boot_device(void)
30{
31#if !CONFIG_IS_ENABLED(OF_PLATDATA)
32 const void *blob = gd->fdt_blob;
33 struct udevice *dev;
34 const char *bootdev;
35 int node;
36 int ret;
37
38 bootdev = fdtdec_get_config_string(blob, "u-boot,boot0");
39 debug("Boot device %s\n", bootdev);
40 if (!bootdev)
41 goto fallback;
42
43 node = fdt_path_offset(blob, bootdev);
44 if (node < 0) {
45 debug("node=%d\n", node);
46 goto fallback;
47 }
Jean-Jacques Hiblota7b0d6a2018-08-09 16:17:44 +020048 ret = device_get_global_by_ofnode(offset_to_ofnode(node), &dev);
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010049 if (ret) {
50 debug("device at node %s/%d not found: %d\n", bootdev, node,
51 ret);
52 goto fallback;
53 }
54 debug("Found device %s\n", dev->name);
55 switch (device_get_uclass_id(dev)) {
56 case UCLASS_SPI_FLASH:
57 return BOOT_DEVICE_SPI;
58 case UCLASS_MMC:
59 return BOOT_DEVICE_MMC1;
60 default:
61 debug("Booting from device uclass '%s' not supported\n",
62 dev_get_uclass_name(dev));
63 }
64
65fallback:
66#endif
67 return BOOT_DEVICE_MMC1;
68}
69
Kever Yang8fd60192019-07-22 19:59:14 +080070__weak int arch_cpu_init(void)
71{
72 return 0;
73}
74
Kever Yangd2af98b2018-11-29 10:07:38 +080075void board_init_f(ulong dummy)
76{
David Wucee4c822019-01-02 20:50:58 +080077 struct udevice *dev;
Kever Yangd2af98b2018-11-29 10:07:38 +080078 int ret;
79
Kever Yang0a2a5e12019-03-29 09:09:01 +080080#ifdef CONFIG_DEBUG_UART
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010081 /*
82 * Debug UART can be used from here if required:
83 *
84 * debug_uart_init();
85 * printch('a');
86 * printhex8(0x1234);
87 * printascii("string");
88 */
89 debug_uart_init();
David Wucee4c822019-01-02 20:50:58 +080090 printascii("U-Boot SPL board init");
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010091#endif
92
Kever Yang8fd60192019-07-22 19:59:14 +080093 arch_cpu_init();
Heiko Stuebner9cc8feb2018-10-08 13:01:56 +020094
Kever Yange603a3d2017-03-20 14:47:16 +080095 ret = spl_early_init();
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010096 if (ret) {
Kever Yange603a3d2017-03-20 14:47:16 +080097 debug("spl_early_init() failed: %d\n", ret);
Heiko Stübner0b3c26a2017-02-18 19:46:38 +010098 hang();
99 }
100
Heiko Stübner0b3c26a2017-02-18 19:46:38 +0100101 ret = rockchip_get_clk(&dev);
102 if (ret) {
103 debug("CLK init failed: %d\n", ret);
104 return;
105 }
106
Heiko Stübner0b3c26a2017-02-18 19:46:38 +0100107 ret = uclass_get_device(UCLASS_RAM, 0, &dev);
108 if (ret) {
109 debug("DRAM init failed: %d\n", ret);
110 return;
111 }
112
Philipp Tomsich798370f2017-06-29 11:21:15 +0200113#if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT)
Philipp Tomsich7234c732017-10-10 16:21:16 +0200114 back_to_bootrom(BROM_BOOT_NEXTSTAGE);
Heiko Stübner0b3c26a2017-02-18 19:46:38 +0100115#endif
116}
117
118static int setup_led(void)
119{
120#ifdef CONFIG_SPL_LED
121 struct udevice *dev;
122 char *led_name;
123 int ret;
124
125 led_name = fdtdec_get_config_string(gd->fdt_blob, "u-boot,boot-led");
126 if (!led_name)
127 return 0;
128 ret = led_get_by_label(led_name, &dev);
129 if (ret) {
130 debug("%s: get=%d\n", __func__, ret);
131 return ret;
132 }
133 ret = led_set_on(dev, 1);
134 if (ret)
135 return ret;
136#endif
137
138 return 0;
139}
140
141void spl_board_init(void)
142{
Heiko Stübner0b3c26a2017-02-18 19:46:38 +0100143 int ret;
144
145 ret = setup_led();
146 if (ret) {
147 debug("LED ret=%d\n", ret);
148 hang();
149 }
150
Heiko Stübner0b3c26a2017-02-18 19:46:38 +0100151 preloader_console_init();
Philipp Tomsich798370f2017-06-29 11:21:15 +0200152#if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM)
Philipp Tomsich7234c732017-10-10 16:21:16 +0200153 back_to_bootrom(BROM_BOOT_NEXTSTAGE);
Heiko Stübner0b3c26a2017-02-18 19:46:38 +0100154#endif
155 return;
Heiko Stübner0b3c26a2017-02-18 19:46:38 +0100156}