xref: /rk3399_ARM-atf/plat/st/common/stm32mp_dt.c (revision f805594d39a7beb1920fbf0e1146ba96399e708b)
1c9d75b3cSYann Gautier /*
2c9d75b3cSYann Gautier  * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
3c9d75b3cSYann Gautier  *
4c9d75b3cSYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
5c9d75b3cSYann Gautier  */
6c9d75b3cSYann Gautier 
7c9d75b3cSYann Gautier #include <assert.h>
8c9d75b3cSYann Gautier #include <errno.h>
9c9d75b3cSYann Gautier 
10c9d75b3cSYann Gautier #include <libfdt.h>
11c9d75b3cSYann Gautier 
12c9d75b3cSYann Gautier #include <platform_def.h>
13c9d75b3cSYann Gautier 
14c9d75b3cSYann Gautier #include <common/debug.h>
15c9d75b3cSYann Gautier #include <drivers/st/stm32_gpio.h>
16c9d75b3cSYann Gautier #include <drivers/st/stm32mp1_ddr.h>
17c9d75b3cSYann Gautier #include <drivers/st/stm32mp1_ram.h>
18c9d75b3cSYann Gautier 
19c9d75b3cSYann Gautier #include <stm32mp_dt.h>
20c9d75b3cSYann Gautier 
21c9d75b3cSYann Gautier static int fdt_checked;
22c9d75b3cSYann Gautier 
233f9c9784SYann Gautier static void *fdt = (void *)(uintptr_t)STM32MP_DTB_BASE;
24c9d75b3cSYann Gautier 
25c9d75b3cSYann Gautier /*******************************************************************************
26c9d75b3cSYann Gautier  * This function checks device tree file with its header.
27c9d75b3cSYann Gautier  * Returns 0 on success and a negative FDT error code on failure.
28c9d75b3cSYann Gautier  ******************************************************************************/
29c9d75b3cSYann Gautier int dt_open_and_check(void)
30c9d75b3cSYann Gautier {
31c9d75b3cSYann Gautier 	int ret = fdt_check_header(fdt);
32c9d75b3cSYann Gautier 
33c9d75b3cSYann Gautier 	if (ret == 0) {
34c9d75b3cSYann Gautier 		fdt_checked = 1;
35c9d75b3cSYann Gautier 	}
36c9d75b3cSYann Gautier 
37c9d75b3cSYann Gautier 	return ret;
38c9d75b3cSYann Gautier }
39c9d75b3cSYann Gautier 
40c9d75b3cSYann Gautier /*******************************************************************************
41c9d75b3cSYann Gautier  * This function gets the address of the DT.
42c9d75b3cSYann Gautier  * If DT is OK, fdt_addr is filled with DT address.
43c9d75b3cSYann Gautier  * Returns 1 if success, 0 otherwise.
44c9d75b3cSYann Gautier  ******************************************************************************/
45c9d75b3cSYann Gautier int fdt_get_address(void **fdt_addr)
46c9d75b3cSYann Gautier {
47c9d75b3cSYann Gautier 	if (fdt_checked == 1) {
48c9d75b3cSYann Gautier 		*fdt_addr = fdt;
49c9d75b3cSYann Gautier 	}
50c9d75b3cSYann Gautier 
51c9d75b3cSYann Gautier 	return fdt_checked;
52c9d75b3cSYann Gautier }
53c9d75b3cSYann Gautier 
54c9d75b3cSYann Gautier /*******************************************************************************
55c9d75b3cSYann Gautier  * This function check the presence of a node (generic use of fdt library).
56c9d75b3cSYann Gautier  * Returns true if present, else return false.
57c9d75b3cSYann Gautier  ******************************************************************************/
58c9d75b3cSYann Gautier bool fdt_check_node(int node)
59c9d75b3cSYann Gautier {
60c9d75b3cSYann Gautier 	int len;
61c9d75b3cSYann Gautier 	const char *cchar;
62c9d75b3cSYann Gautier 
63c9d75b3cSYann Gautier 	cchar = fdt_get_name(fdt, node, &len);
64c9d75b3cSYann Gautier 
65c9d75b3cSYann Gautier 	return (cchar != NULL) && (len >= 0);
66c9d75b3cSYann Gautier }
67c9d75b3cSYann Gautier 
68c9d75b3cSYann Gautier /*******************************************************************************
69c9d75b3cSYann Gautier  * This function return global node status (generic use of fdt library).
70c9d75b3cSYann Gautier  ******************************************************************************/
71c9d75b3cSYann Gautier uint8_t fdt_get_status(int node)
72c9d75b3cSYann Gautier {
73c9d75b3cSYann Gautier 	uint8_t status = DT_DISABLED;
74c9d75b3cSYann Gautier 	int len;
75c9d75b3cSYann Gautier 	const char *cchar;
76c9d75b3cSYann Gautier 
77c9d75b3cSYann Gautier 	cchar = fdt_getprop(fdt, node, "status", &len);
78c9d75b3cSYann Gautier 	if ((cchar == NULL) ||
79c9d75b3cSYann Gautier 	    (strncmp(cchar, "okay", (size_t)len) == 0)) {
80c9d75b3cSYann Gautier 		status |= DT_NON_SECURE;
81c9d75b3cSYann Gautier 	}
82c9d75b3cSYann Gautier 
83c9d75b3cSYann Gautier 	cchar = fdt_getprop(fdt, node, "secure-status", &len);
84c9d75b3cSYann Gautier 	if (cchar == NULL) {
85c9d75b3cSYann Gautier 		if (status == DT_NON_SECURE) {
86c9d75b3cSYann Gautier 			status |= DT_SECURE;
87c9d75b3cSYann Gautier 		}
88c9d75b3cSYann Gautier 	} else if (strncmp(cchar, "okay", (size_t)len) == 0) {
89c9d75b3cSYann Gautier 		status |= DT_SECURE;
90c9d75b3cSYann Gautier 	}
91c9d75b3cSYann Gautier 
92c9d75b3cSYann Gautier 	return status;
93c9d75b3cSYann Gautier }
94c9d75b3cSYann Gautier 
95c9d75b3cSYann Gautier /*******************************************************************************
96c9d75b3cSYann Gautier  * This function reads a value of a node property (generic use of fdt
97c9d75b3cSYann Gautier  * library).
98c9d75b3cSYann Gautier  * Returns value if success, and a default value if property not found.
99c9d75b3cSYann Gautier  * Default value is passed as parameter.
100c9d75b3cSYann Gautier  ******************************************************************************/
101c9d75b3cSYann Gautier uint32_t fdt_read_uint32_default(int node, const char *prop_name,
102c9d75b3cSYann Gautier 				 uint32_t dflt_value)
103c9d75b3cSYann Gautier {
104c9d75b3cSYann Gautier 	const fdt32_t *cuint;
105c9d75b3cSYann Gautier 	int lenp;
106c9d75b3cSYann Gautier 
107c9d75b3cSYann Gautier 	cuint = fdt_getprop(fdt, node, prop_name, &lenp);
108c9d75b3cSYann Gautier 	if (cuint == NULL) {
109c9d75b3cSYann Gautier 		return dflt_value;
110c9d75b3cSYann Gautier 	}
111c9d75b3cSYann Gautier 
112c9d75b3cSYann Gautier 	return fdt32_to_cpu(*cuint);
113c9d75b3cSYann Gautier }
114c9d75b3cSYann Gautier 
115c9d75b3cSYann Gautier /*******************************************************************************
116c9d75b3cSYann Gautier  * This function reads a series of parameters in a node property
117c9d75b3cSYann Gautier  * (generic use of fdt library).
118c9d75b3cSYann Gautier  * It reads the values inside the device tree, from property name and node.
119c9d75b3cSYann Gautier  * The number of parameters is also indicated as entry parameter.
120c9d75b3cSYann Gautier  * Returns 0 on success and a negative FDT error code on failure.
121c9d75b3cSYann Gautier  * If success, values are stored at the third parameter address.
122c9d75b3cSYann Gautier  ******************************************************************************/
123c9d75b3cSYann Gautier int fdt_read_uint32_array(int node, const char *prop_name, uint32_t *array,
124c9d75b3cSYann Gautier 			  uint32_t count)
125c9d75b3cSYann Gautier {
126c9d75b3cSYann Gautier 	const fdt32_t *cuint;
127c9d75b3cSYann Gautier 	int len;
128c9d75b3cSYann Gautier 	uint32_t i;
129c9d75b3cSYann Gautier 
130c9d75b3cSYann Gautier 	cuint = fdt_getprop(fdt, node, prop_name, &len);
131c9d75b3cSYann Gautier 	if (cuint == NULL) {
132c9d75b3cSYann Gautier 		return -FDT_ERR_NOTFOUND;
133c9d75b3cSYann Gautier 	}
134c9d75b3cSYann Gautier 
135c9d75b3cSYann Gautier 	if ((uint32_t)len != (count * sizeof(uint32_t))) {
136c9d75b3cSYann Gautier 		return -FDT_ERR_BADLAYOUT;
137c9d75b3cSYann Gautier 	}
138c9d75b3cSYann Gautier 
139c9d75b3cSYann Gautier 	for (i = 0; i < ((uint32_t)len / sizeof(uint32_t)); i++) {
140c9d75b3cSYann Gautier 		*array = fdt32_to_cpu(*cuint);
141c9d75b3cSYann Gautier 		array++;
142c9d75b3cSYann Gautier 		cuint++;
143c9d75b3cSYann Gautier 	}
144c9d75b3cSYann Gautier 
145c9d75b3cSYann Gautier 	return 0;
146c9d75b3cSYann Gautier }
147c9d75b3cSYann Gautier 
148c9d75b3cSYann Gautier /*******************************************************************************
149*f805594dSYann Gautier  * This function gets the stdout path node.
150*f805594dSYann Gautier  * It reads the value indicated inside the device tree.
151*f805594dSYann Gautier  * Returns node offset on success and a negative FDT error code on failure.
152*f805594dSYann Gautier  ******************************************************************************/
153*f805594dSYann Gautier static int dt_get_stdout_node_offset(void)
154*f805594dSYann Gautier {
155*f805594dSYann Gautier 	int node;
156*f805594dSYann Gautier 	const char *cchar;
157*f805594dSYann Gautier 
158*f805594dSYann Gautier 	node = fdt_path_offset(fdt, "/secure-chosen");
159*f805594dSYann Gautier 	if (node < 0) {
160*f805594dSYann Gautier 		node = fdt_path_offset(fdt, "/chosen");
161*f805594dSYann Gautier 		if (node < 0) {
162*f805594dSYann Gautier 			return -FDT_ERR_NOTFOUND;
163*f805594dSYann Gautier 		}
164*f805594dSYann Gautier 	}
165*f805594dSYann Gautier 
166*f805594dSYann Gautier 	cchar = fdt_getprop(fdt, node, "stdout-path", NULL);
167*f805594dSYann Gautier 	if (cchar == NULL) {
168*f805594dSYann Gautier 		return -FDT_ERR_NOTFOUND;
169*f805594dSYann Gautier 	}
170*f805594dSYann Gautier 
171*f805594dSYann Gautier 	node = -FDT_ERR_NOTFOUND;
172*f805594dSYann Gautier 	if (strchr(cchar, (int)':') != NULL) {
173*f805594dSYann Gautier 		const char *name;
174*f805594dSYann Gautier 		char *str = (char *)cchar;
175*f805594dSYann Gautier 		int len = 0;
176*f805594dSYann Gautier 
177*f805594dSYann Gautier 		while (strncmp(":", str, 1)) {
178*f805594dSYann Gautier 			len++;
179*f805594dSYann Gautier 			str++;
180*f805594dSYann Gautier 		}
181*f805594dSYann Gautier 
182*f805594dSYann Gautier 		name = fdt_get_alias_namelen(fdt, cchar, len);
183*f805594dSYann Gautier 
184*f805594dSYann Gautier 		if (name != NULL) {
185*f805594dSYann Gautier 			node = fdt_path_offset(fdt, name);
186*f805594dSYann Gautier 		}
187*f805594dSYann Gautier 	} else {
188*f805594dSYann Gautier 		node = fdt_path_offset(fdt, cchar);
189*f805594dSYann Gautier 	}
190*f805594dSYann Gautier 
191*f805594dSYann Gautier 	return node;
192*f805594dSYann Gautier }
193*f805594dSYann Gautier 
194*f805594dSYann Gautier /*******************************************************************************
195c9d75b3cSYann Gautier  * This function gets the stdout pin configuration information from the DT.
196c9d75b3cSYann Gautier  * And then calls the sub-function to treat it and set GPIO registers.
197c9d75b3cSYann Gautier  * Returns 0 on success and a negative FDT error code on failure.
198c9d75b3cSYann Gautier  ******************************************************************************/
199c9d75b3cSYann Gautier int dt_set_stdout_pinctrl(void)
200c9d75b3cSYann Gautier {
201c9d75b3cSYann Gautier 	int node;
202c9d75b3cSYann Gautier 
203c9d75b3cSYann Gautier 	node = dt_get_stdout_node_offset();
204c9d75b3cSYann Gautier 	if (node < 0) {
205c9d75b3cSYann Gautier 		return -FDT_ERR_NOTFOUND;
206c9d75b3cSYann Gautier 	}
207c9d75b3cSYann Gautier 
208c9d75b3cSYann Gautier 	return dt_set_pinctrl_config(node);
209c9d75b3cSYann Gautier }
210c9d75b3cSYann Gautier 
211c9d75b3cSYann Gautier /*******************************************************************************
212c9d75b3cSYann Gautier  * This function fills the generic information from a given node.
213c9d75b3cSYann Gautier  ******************************************************************************/
214c9d75b3cSYann Gautier void dt_fill_device_info(struct dt_node_info *info, int node)
215c9d75b3cSYann Gautier {
216c9d75b3cSYann Gautier 	const fdt32_t *cuint;
217c9d75b3cSYann Gautier 
218c9d75b3cSYann Gautier 	cuint = fdt_getprop(fdt, node, "reg", NULL);
219c9d75b3cSYann Gautier 	if (cuint != NULL) {
220c9d75b3cSYann Gautier 		info->base = fdt32_to_cpu(*cuint);
221c9d75b3cSYann Gautier 	} else {
222c9d75b3cSYann Gautier 		info->base = 0;
223c9d75b3cSYann Gautier 	}
224c9d75b3cSYann Gautier 
225c9d75b3cSYann Gautier 	cuint = fdt_getprop(fdt, node, "clocks", NULL);
226c9d75b3cSYann Gautier 	if (cuint != NULL) {
227c9d75b3cSYann Gautier 		cuint++;
228c9d75b3cSYann Gautier 		info->clock = (int)fdt32_to_cpu(*cuint);
229c9d75b3cSYann Gautier 	} else {
230c9d75b3cSYann Gautier 		info->clock = -1;
231c9d75b3cSYann Gautier 	}
232c9d75b3cSYann Gautier 
233c9d75b3cSYann Gautier 	cuint = fdt_getprop(fdt, node, "resets", NULL);
234c9d75b3cSYann Gautier 	if (cuint != NULL) {
235c9d75b3cSYann Gautier 		cuint++;
236c9d75b3cSYann Gautier 		info->reset = (int)fdt32_to_cpu(*cuint);
237c9d75b3cSYann Gautier 	} else {
238c9d75b3cSYann Gautier 		info->reset = -1;
239c9d75b3cSYann Gautier 	}
240c9d75b3cSYann Gautier 
241c9d75b3cSYann Gautier 	info->status = fdt_get_status(node);
242c9d75b3cSYann Gautier }
243c9d75b3cSYann Gautier 
244c9d75b3cSYann Gautier /*******************************************************************************
245c9d75b3cSYann Gautier  * This function retrieve the generic information from DT.
246c9d75b3cSYann Gautier  * Returns node on success and a negative FDT error code on failure.
247c9d75b3cSYann Gautier  ******************************************************************************/
248c9d75b3cSYann Gautier int dt_get_node(struct dt_node_info *info, int offset, const char *compat)
249c9d75b3cSYann Gautier {
250c9d75b3cSYann Gautier 	int node;
251c9d75b3cSYann Gautier 
252c9d75b3cSYann Gautier 	node = fdt_node_offset_by_compatible(fdt, offset, compat);
253c9d75b3cSYann Gautier 	if (node < 0) {
254c9d75b3cSYann Gautier 		return -FDT_ERR_NOTFOUND;
255c9d75b3cSYann Gautier 	}
256c9d75b3cSYann Gautier 
257c9d75b3cSYann Gautier 	dt_fill_device_info(info, node);
258c9d75b3cSYann Gautier 
259c9d75b3cSYann Gautier 	return node;
260c9d75b3cSYann Gautier }
261c9d75b3cSYann Gautier 
262c9d75b3cSYann Gautier /*******************************************************************************
263c9d75b3cSYann Gautier  * This function gets the UART instance info of stdout from the DT.
264c9d75b3cSYann Gautier  * Returns node on success and a negative FDT error code on failure.
265c9d75b3cSYann Gautier  ******************************************************************************/
266c9d75b3cSYann Gautier int dt_get_stdout_uart_info(struct dt_node_info *info)
267c9d75b3cSYann Gautier {
268c9d75b3cSYann Gautier 	int node;
269c9d75b3cSYann Gautier 
270c9d75b3cSYann Gautier 	node = dt_get_stdout_node_offset();
271c9d75b3cSYann Gautier 	if (node < 0) {
272c9d75b3cSYann Gautier 		return -FDT_ERR_NOTFOUND;
273c9d75b3cSYann Gautier 	}
274c9d75b3cSYann Gautier 
275c9d75b3cSYann Gautier 	dt_fill_device_info(info, node);
276c9d75b3cSYann Gautier 
277c9d75b3cSYann Gautier 	return node;
278c9d75b3cSYann Gautier }
279c9d75b3cSYann Gautier 
280c9d75b3cSYann Gautier /*******************************************************************************
281c9d75b3cSYann Gautier  * This function gets DDR size information from the DT.
282c9d75b3cSYann Gautier  * Returns value in bytes on success, and 0 on failure.
283c9d75b3cSYann Gautier  ******************************************************************************/
284c9d75b3cSYann Gautier uint32_t dt_get_ddr_size(void)
285c9d75b3cSYann Gautier {
286c9d75b3cSYann Gautier 	int node;
287c9d75b3cSYann Gautier 
288c9d75b3cSYann Gautier 	node = fdt_node_offset_by_compatible(fdt, -1, DT_DDR_COMPAT);
289c9d75b3cSYann Gautier 	if (node < 0) {
290c9d75b3cSYann Gautier 		INFO("%s: Cannot read DDR node in DT\n", __func__);
291c9d75b3cSYann Gautier 		return 0;
292c9d75b3cSYann Gautier 	}
293c9d75b3cSYann Gautier 
294c9d75b3cSYann Gautier 	return fdt_read_uint32_default(node, "st,mem-size", 0);
295c9d75b3cSYann Gautier }
296c9d75b3cSYann Gautier 
297c9d75b3cSYann Gautier /*******************************************************************************
2987ae58c6bSYann Gautier  * This function gets DDRCTRL base address information from the DT.
2997ae58c6bSYann Gautier  * Returns value on success, and 0 on failure.
3007ae58c6bSYann Gautier  ******************************************************************************/
3017ae58c6bSYann Gautier uintptr_t dt_get_ddrctrl_base(void)
3027ae58c6bSYann Gautier {
3037ae58c6bSYann Gautier 	int node;
3047ae58c6bSYann Gautier 	uint32_t array[4];
3057ae58c6bSYann Gautier 
3067ae58c6bSYann Gautier 	node = fdt_node_offset_by_compatible(fdt, -1, DT_DDR_COMPAT);
3077ae58c6bSYann Gautier 	if (node < 0) {
3087ae58c6bSYann Gautier 		INFO("%s: Cannot read DDR node in DT\n", __func__);
3097ae58c6bSYann Gautier 		return 0;
3107ae58c6bSYann Gautier 	}
3117ae58c6bSYann Gautier 
3127ae58c6bSYann Gautier 	if (fdt_read_uint32_array(node, "reg", array, 4) < 0) {
3137ae58c6bSYann Gautier 		return 0;
3147ae58c6bSYann Gautier 	}
3157ae58c6bSYann Gautier 
3167ae58c6bSYann Gautier 	return array[0];
3177ae58c6bSYann Gautier }
3187ae58c6bSYann Gautier 
3197ae58c6bSYann Gautier /*******************************************************************************
3207ae58c6bSYann Gautier  * This function gets DDRPHYC base address information from the DT.
3217ae58c6bSYann Gautier  * Returns value on success, and 0 on failure.
3227ae58c6bSYann Gautier  ******************************************************************************/
3237ae58c6bSYann Gautier uintptr_t dt_get_ddrphyc_base(void)
3247ae58c6bSYann Gautier {
3257ae58c6bSYann Gautier 	int node;
3267ae58c6bSYann Gautier 	uint32_t array[4];
3277ae58c6bSYann Gautier 
3287ae58c6bSYann Gautier 	node = fdt_node_offset_by_compatible(fdt, -1, DT_DDR_COMPAT);
3297ae58c6bSYann Gautier 	if (node < 0) {
3307ae58c6bSYann Gautier 		INFO("%s: Cannot read DDR node in DT\n", __func__);
3317ae58c6bSYann Gautier 		return 0;
3327ae58c6bSYann Gautier 	}
3337ae58c6bSYann Gautier 
3347ae58c6bSYann Gautier 	if (fdt_read_uint32_array(node, "reg", array, 4) < 0) {
3357ae58c6bSYann Gautier 		return 0;
3367ae58c6bSYann Gautier 	}
3377ae58c6bSYann Gautier 
3387ae58c6bSYann Gautier 	return array[2];
3397ae58c6bSYann Gautier }
3407ae58c6bSYann Gautier 
3417ae58c6bSYann Gautier /*******************************************************************************
3427ae58c6bSYann Gautier  * This function gets PWR base address information from the DT.
3437ae58c6bSYann Gautier  * Returns value on success, and 0 on failure.
3447ae58c6bSYann Gautier  ******************************************************************************/
3457ae58c6bSYann Gautier uintptr_t dt_get_pwr_base(void)
3467ae58c6bSYann Gautier {
3477ae58c6bSYann Gautier 	int node;
3487ae58c6bSYann Gautier 	const fdt32_t *cuint;
3497ae58c6bSYann Gautier 
3507ae58c6bSYann Gautier 	node = fdt_node_offset_by_compatible(fdt, -1, DT_PWR_COMPAT);
3517ae58c6bSYann Gautier 	if (node < 0) {
3527ae58c6bSYann Gautier 		INFO("%s: Cannot read PWR node in DT\n", __func__);
3537ae58c6bSYann Gautier 		return 0;
3547ae58c6bSYann Gautier 	}
3557ae58c6bSYann Gautier 
3567ae58c6bSYann Gautier 	cuint = fdt_getprop(fdt, node, "reg", NULL);
3577ae58c6bSYann Gautier 	if (cuint == NULL) {
3587ae58c6bSYann Gautier 		return 0;
3597ae58c6bSYann Gautier 	}
3607ae58c6bSYann Gautier 
3617ae58c6bSYann Gautier 	return fdt32_to_cpu(*cuint);
3627ae58c6bSYann Gautier }
3637ae58c6bSYann Gautier 
3647ae58c6bSYann Gautier /*******************************************************************************
365f33b2433SYann Gautier  * This function gets PWR VDD regulator voltage information from the DT.
366f33b2433SYann Gautier  * Returns value in microvolts on success, and 0 on failure.
367f33b2433SYann Gautier  ******************************************************************************/
368f33b2433SYann Gautier uint32_t dt_get_pwr_vdd_voltage(void)
369f33b2433SYann Gautier {
370f33b2433SYann Gautier 	int node, pwr_regulators_node;
371f33b2433SYann Gautier 	const fdt32_t *cuint;
372f33b2433SYann Gautier 
373f33b2433SYann Gautier 	node = fdt_node_offset_by_compatible(fdt, -1, DT_PWR_COMPAT);
374f33b2433SYann Gautier 	if (node < 0) {
375f33b2433SYann Gautier 		INFO("%s: Cannot read PWR node in DT\n", __func__);
376f33b2433SYann Gautier 		return 0;
377f33b2433SYann Gautier 	}
378f33b2433SYann Gautier 
379f33b2433SYann Gautier 	pwr_regulators_node = fdt_subnode_offset(fdt, node, "pwr-regulators");
380f33b2433SYann Gautier 	if (node < 0) {
381f33b2433SYann Gautier 		INFO("%s: Cannot read pwr-regulators node in DT\n", __func__);
382f33b2433SYann Gautier 		return 0;
383f33b2433SYann Gautier 	}
384f33b2433SYann Gautier 
385f33b2433SYann Gautier 	cuint = fdt_getprop(fdt, pwr_regulators_node, "vdd-supply", NULL);
386f33b2433SYann Gautier 	if (cuint == NULL) {
387f33b2433SYann Gautier 		return 0;
388f33b2433SYann Gautier 	}
389f33b2433SYann Gautier 
390f33b2433SYann Gautier 	node = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint));
391f33b2433SYann Gautier 	if (node < 0) {
392f33b2433SYann Gautier 		return 0;
393f33b2433SYann Gautier 	}
394f33b2433SYann Gautier 
395f33b2433SYann Gautier 	cuint = fdt_getprop(fdt, node, "regulator-min-microvolt", NULL);
396f33b2433SYann Gautier 	if (cuint == NULL) {
397f33b2433SYann Gautier 		return 0;
398f33b2433SYann Gautier 	}
399f33b2433SYann Gautier 
400f33b2433SYann Gautier 	return fdt32_to_cpu(*cuint);
401f33b2433SYann Gautier }
402f33b2433SYann Gautier 
403f33b2433SYann Gautier /*******************************************************************************
404f33b2433SYann Gautier  * This function gets SYSCFG base address information from the DT.
405f33b2433SYann Gautier  * Returns value on success, and 0 on failure.
406f33b2433SYann Gautier  ******************************************************************************/
407f33b2433SYann Gautier uintptr_t dt_get_syscfg_base(void)
408f33b2433SYann Gautier {
409f33b2433SYann Gautier 	int node;
410f33b2433SYann Gautier 	const fdt32_t *cuint;
411f33b2433SYann Gautier 
412f33b2433SYann Gautier 	node = fdt_node_offset_by_compatible(fdt, -1, DT_SYSCFG_COMPAT);
413f33b2433SYann Gautier 	if (node < 0) {
414f33b2433SYann Gautier 		INFO("%s: Cannot read SYSCFG node in DT\n", __func__);
415f33b2433SYann Gautier 		return 0;
416f33b2433SYann Gautier 	}
417f33b2433SYann Gautier 
418f33b2433SYann Gautier 	cuint = fdt_getprop(fdt, node, "reg", NULL);
419f33b2433SYann Gautier 	if (cuint == NULL) {
420f33b2433SYann Gautier 		return 0;
421f33b2433SYann Gautier 	}
422f33b2433SYann Gautier 
423f33b2433SYann Gautier 	return fdt32_to_cpu(*cuint);
424f33b2433SYann Gautier }
425f33b2433SYann Gautier 
426f33b2433SYann Gautier /*******************************************************************************
427c9d75b3cSYann Gautier  * This function retrieves board model from DT
428c9d75b3cSYann Gautier  * Returns string taken from model node, NULL otherwise
429c9d75b3cSYann Gautier  ******************************************************************************/
430c9d75b3cSYann Gautier const char *dt_get_board_model(void)
431c9d75b3cSYann Gautier {
432c9d75b3cSYann Gautier 	int node = fdt_path_offset(fdt, "/");
433c9d75b3cSYann Gautier 
434c9d75b3cSYann Gautier 	if (node < 0) {
435c9d75b3cSYann Gautier 		return NULL;
436c9d75b3cSYann Gautier 	}
437c9d75b3cSYann Gautier 
438c9d75b3cSYann Gautier 	return (const char *)fdt_getprop(fdt, node, "model", NULL);
439c9d75b3cSYann Gautier }
440