]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
f11c7ab9 SG |
2 | /* |
3 | * Function to read values from the device tree node attached to a udevice. | |
4 | * | |
5 | * Copyright (c) 2017 Google, Inc | |
6 | * Written by Simon Glass <[email protected]> | |
f11c7ab9 SG |
7 | */ |
8 | ||
9 | #ifndef _DM_READ_H | |
10 | #define _DM_READ_H | |
11 | ||
9beacb6c DM |
12 | #include <linux/errno.h> |
13 | ||
2a64ada7 | 14 | #include <dm/device.h> |
f11c7ab9 SG |
15 | #include <dm/fdtaddr.h> |
16 | #include <dm/ofnode.h> | |
17 | #include <dm/uclass.h> | |
18 | ||
a4481012 SG |
19 | struct resource; |
20 | ||
f11c7ab9 | 21 | #if CONFIG_IS_ENABLED(OF_LIVE) |
88b3a37e | 22 | static inline const struct device_node *dev_np(const struct udevice *dev) |
f11c7ab9 | 23 | { |
f10643cf | 24 | return ofnode_to_np(dev_ofnode(dev)); |
f11c7ab9 SG |
25 | } |
26 | #else | |
88b3a37e | 27 | static inline const struct device_node *dev_np(const struct udevice *dev) |
f11c7ab9 SG |
28 | { |
29 | return NULL; | |
30 | } | |
31 | #endif | |
32 | ||
ef79ef21 | 33 | #if !defined(CONFIG_DM_DEV_READ_INLINE) || CONFIG_IS_ENABLED(OF_PLATDATA) |
b471bdc4 SH |
34 | /** |
35 | * dev_read_u8() - read a 8-bit integer from a device's DT property | |
36 | * | |
37 | * @dev: device to read DT property from | |
38 | * @propname: name of the property to read from | |
39 | * @outp: place to put value (if found) | |
40 | * Return: 0 if OK, -ve on error | |
41 | */ | |
42 | int dev_read_u8(const struct udevice *dev, const char *propname, u8 *outp); | |
43 | ||
44 | /** | |
45 | * dev_read_u8_default() - read a 8-bit integer from a device's DT property | |
46 | * | |
47 | * @dev: device to read DT property from | |
48 | * @propname: name of the property to read from | |
49 | * @def: default value to return if the property has no value | |
50 | * Return: property value, or @def if not found | |
51 | */ | |
52 | u8 dev_read_u8_default(const struct udevice *dev, const char *propname, u8 def); | |
53 | ||
54 | /** | |
55 | * dev_read_u16() - read a 16-bit integer from a device's DT property | |
56 | * | |
57 | * @dev: device to read DT property from | |
58 | * @propname: name of the property to read from | |
59 | * @outp: place to put value (if found) | |
60 | * Return: 0 if OK, -ve on error | |
61 | */ | |
62 | int dev_read_u16(const struct udevice *dev, const char *propname, u16 *outp); | |
63 | ||
64 | /** | |
65 | * dev_read_u16_default() - read a 16-bit integer from a device's DT property | |
66 | * | |
67 | * @dev: device to read DT property from | |
68 | * @propname: name of the property to read from | |
69 | * @def: default value to return if the property has no value | |
70 | * Return: property value, or @def if not found | |
71 | */ | |
72 | u16 dev_read_u16_default(const struct udevice *dev, const char *propname, | |
73 | u16 def); | |
74 | ||
3ab48f62 MY |
75 | /** |
76 | * dev_read_u32() - read a 32-bit integer from a device's DT property | |
77 | * | |
78 | * @dev: device to read DT property from | |
79 | * @propname: name of the property to read from | |
80 | * @outp: place to put value (if found) | |
6de6a615 | 81 | * Return: 0 if OK, -ve on error |
3ab48f62 | 82 | */ |
88b3a37e | 83 | int dev_read_u32(const struct udevice *dev, const char *propname, u32 *outp); |
3ab48f62 | 84 | |
47a0fd3b SG |
85 | /** |
86 | * dev_read_u32_default() - read a 32-bit integer from a device's DT property | |
87 | * | |
88 | * @dev: device to read DT property from | |
89 | * @propname: name of the property to read from | |
90 | * @def: default value to return if the property has no value | |
6de6a615 | 91 | * Return: property value, or @def if not found |
47a0fd3b | 92 | */ |
88b3a37e SG |
93 | int dev_read_u32_default(const struct udevice *dev, const char *propname, |
94 | int def); | |
f11c7ab9 | 95 | |
4bb7075c DB |
96 | /** |
97 | * dev_read_u32_index() - read an indexed 32-bit integer from a device's DT | |
98 | * property | |
99 | * | |
100 | * @dev: device to read DT property from | |
101 | * @propname: name of the property to read from | |
102 | * @index: index of the integer to return | |
103 | * @outp: place to put value (if found) | |
6de6a615 | 104 | * Return: 0 if OK, -ve on error |
4bb7075c DB |
105 | */ |
106 | int dev_read_u32_index(struct udevice *dev, const char *propname, int index, | |
107 | u32 *outp); | |
108 | ||
109 | /** | |
110 | * dev_read_u32_index_default() - read an indexed 32-bit integer from a device's | |
111 | * DT property | |
112 | * | |
113 | * @dev: device to read DT property from | |
114 | * @propname: name of the property to read from | |
115 | * @index: index of the integer to return | |
116 | * @def: default value to return if the property has no value | |
6de6a615 | 117 | * Return: property value, or @def if not found |
4bb7075c DB |
118 | */ |
119 | u32 dev_read_u32_index_default(struct udevice *dev, const char *propname, | |
120 | int index, u32 def); | |
121 | ||
a1b17e4f SG |
122 | /** |
123 | * dev_read_s32() - read a signed 32-bit integer from a device's DT property | |
124 | * | |
125 | * @dev: device to read DT property from | |
126 | * @propname: name of the property to read from | |
127 | * @outp: place to put value (if found) | |
6de6a615 | 128 | * Return: 0 if OK, -ve on error |
a1b17e4f | 129 | */ |
88b3a37e | 130 | int dev_read_s32(const struct udevice *dev, const char *propname, s32 *outp); |
a1b17e4f SG |
131 | |
132 | /** | |
133 | * dev_read_s32_default() - read a signed 32-bit int from a device's DT property | |
134 | * | |
135 | * @dev: device to read DT property from | |
136 | * @propname: name of the property to read from | |
137 | * @def: default value to return if the property has no value | |
6de6a615 | 138 | * Return: property value, or @def if not found |
a1b17e4f | 139 | */ |
88b3a37e SG |
140 | int dev_read_s32_default(const struct udevice *dev, const char *propname, |
141 | int def); | |
a1b17e4f SG |
142 | |
143 | /** | |
144 | * dev_read_u32u() - read a 32-bit integer from a device's DT property | |
145 | * | |
146 | * This version uses a standard uint type. | |
147 | * | |
148 | * @dev: device to read DT property from | |
149 | * @propname: name of the property to read from | |
150 | * @outp: place to put value (if found) | |
6de6a615 | 151 | * Return: 0 if OK, -ve on error |
a1b17e4f | 152 | */ |
88b3a37e | 153 | int dev_read_u32u(const struct udevice *dev, const char *propname, uint *outp); |
a1b17e4f | 154 | |
3f3d7715 KR |
155 | /** |
156 | * dev_read_u64() - read a 64-bit integer from a device's DT property | |
157 | * | |
158 | * @dev: device to read DT property from | |
159 | * @propname: name of the property to read from | |
160 | * @outp: place to put value (if found) | |
6de6a615 | 161 | * Return: 0 if OK, -ve on error |
3f3d7715 | 162 | */ |
88b3a37e | 163 | int dev_read_u64(const struct udevice *dev, const char *propname, u64 *outp); |
3f3d7715 KR |
164 | |
165 | /** | |
166 | * dev_read_u64_default() - read a 64-bit integer from a device's DT property | |
167 | * | |
168 | * @dev: device to read DT property from | |
169 | * @propname: name of the property to read from | |
170 | * @def: default value to return if the property has no value | |
6de6a615 | 171 | * Return: property value, or @def if not found |
3f3d7715 | 172 | */ |
88b3a37e SG |
173 | u64 dev_read_u64_default(const struct udevice *dev, const char *propname, |
174 | u64 def); | |
3f3d7715 | 175 | |
f11c7ab9 SG |
176 | /** |
177 | * dev_read_string() - Read a string from a device's DT property | |
178 | * | |
179 | * @dev: device to read DT property from | |
180 | * @propname: name of the property to read | |
6de6a615 | 181 | * Return: string from property value, or NULL if there is no such property |
f11c7ab9 | 182 | */ |
88b3a37e | 183 | const char *dev_read_string(const struct udevice *dev, const char *propname); |
f11c7ab9 SG |
184 | |
185 | /** | |
186 | * dev_read_bool() - read a boolean value from a device's DT property | |
187 | * | |
188 | * @dev: device to read DT property from | |
189 | * @propname: name of property to read | |
6de6a615 | 190 | * Return: true if property is present (meaning true), false if not present |
f11c7ab9 | 191 | */ |
88b3a37e | 192 | bool dev_read_bool(const struct udevice *dev, const char *propname); |
f11c7ab9 SG |
193 | |
194 | /** | |
195 | * dev_read_subnode() - find a named subnode of a device | |
196 | * | |
197 | * @dev: device whose DT node contains the subnode | |
198 | * @subnode_name: name of subnode to find | |
6de6a615 | 199 | * Return: reference to subnode (which can be invalid if there is no such |
f11c7ab9 SG |
200 | * subnode) |
201 | */ | |
6de6a615 | 202 | ofnode dev_read_subnode(const struct udevice *dev, const char *subnode_name); |
f11c7ab9 SG |
203 | |
204 | /** | |
205 | * dev_read_size() - read the size of a property | |
206 | * | |
207 | * @dev: device to check | |
208 | * @propname: property to check | |
6de6a615 | 209 | * Return: size of property if present, or -EINVAL if not |
f11c7ab9 | 210 | */ |
88b3a37e | 211 | int dev_read_size(const struct udevice *dev, const char *propname); |
f11c7ab9 SG |
212 | |
213 | /** | |
214 | * dev_read_addr_index() - Get the indexed reg property of a device | |
215 | * | |
216 | * @dev: Device to read from | |
217 | * @index: the 'reg' property can hold a list of <addr, size> pairs | |
218 | * and @index is used to select which one is required | |
219 | * | |
6de6a615 | 220 | * Return: address or FDT_ADDR_T_NONE if not found |
f11c7ab9 | 221 | */ |
88b3a37e | 222 | fdt_addr_t dev_read_addr_index(const struct udevice *dev, int index); |
f11c7ab9 | 223 | |
bdce9031 BM |
224 | /** |
225 | * dev_read_addr_index_ptr() - Get the indexed reg property of a device | |
226 | * as a pointer | |
227 | * | |
228 | * @dev: Device to read from | |
229 | * @index: the 'reg' property can hold a list of <addr, size> pairs | |
230 | * and @index is used to select which one is required | |
231 | * | |
6de6a615 | 232 | * Return: pointer or NULL if not found |
bdce9031 BM |
233 | */ |
234 | void *dev_read_addr_index_ptr(const struct udevice *dev, int index); | |
235 | ||
f5b90479 SN |
236 | /** |
237 | * dev_read_addr_size_index() - Get the indexed reg property of a device | |
238 | * | |
239 | * @dev: Device to read from | |
240 | * @index: the 'reg' property can hold a list of <addr, size> pairs | |
241 | * and @index is used to select which one is required | |
242 | * @size: place to put size value (on success) | |
243 | * | |
6de6a615 | 244 | * Return: address or FDT_ADDR_T_NONE if not found |
f5b90479 | 245 | */ |
88b3a37e | 246 | fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, int index, |
f5b90479 SN |
247 | fdt_size_t *size); |
248 | ||
5e030632 JK |
249 | /** |
250 | * dev_read_addr_size_index_ptr() - Get the indexed reg property of a device | |
251 | * as a pointer | |
252 | * | |
253 | * @dev: Device to read from | |
254 | * @index: the 'reg' property can hold a list of <addr, size> pairs | |
255 | * and @index is used to select which one is required | |
256 | * @size: place to put size value (on success) | |
257 | * | |
258 | * Return: pointer or NULL if not found | |
259 | */ | |
260 | void *dev_read_addr_size_index_ptr(const struct udevice *dev, int index, | |
261 | fdt_size_t *size); | |
262 | ||
30a90f56 ĂFR |
263 | /** |
264 | * dev_remap_addr_index() - Get the indexed reg property of a device | |
265 | * as a memory-mapped I/O pointer | |
266 | * | |
267 | * @dev: Device to read from | |
268 | * @index: the 'reg' property can hold a list of <addr, size> pairs | |
269 | * and @index is used to select which one is required | |
270 | * | |
6de6a615 | 271 | * Return: pointer or NULL if not found |
30a90f56 | 272 | */ |
88b3a37e | 273 | void *dev_remap_addr_index(const struct udevice *dev, int index); |
30a90f56 | 274 | |
79598820 ĂFR |
275 | /** |
276 | * dev_read_addr_name() - Get the reg property of a device, indexed by name | |
277 | * | |
278 | * @dev: Device to read from | |
279 | * @name: the 'reg' property can hold a list of <addr, size> pairs, with the | |
e42c4d6d | 280 | * 'reg-names' property providing named-based identification. @name |
79598820 ĂFR |
281 | * indicates the value to search for in 'reg-names'. |
282 | * | |
6de6a615 | 283 | * Return: address or FDT_ADDR_T_NONE if not found |
79598820 | 284 | */ |
88b3a37e | 285 | fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name); |
79598820 | 286 | |
bc8fa1cb MS |
287 | /** |
288 | * dev_read_addr_name_ptr() - Get the reg property of a device as a pointer, | |
289 | * indexed by name | |
290 | * | |
291 | * @dev: Device to read from | |
292 | * @name: the 'reg' property can hold a list of <addr, size> pairs, with the | |
293 | * 'reg-names' property providing named-based identification. @name | |
294 | * indicates the value to search for in 'reg-names'. | |
295 | * | |
296 | * Return: pointer or NULL if not found | |
297 | */ | |
298 | void *dev_read_addr_name_ptr(const struct udevice *dev, const char *name); | |
299 | ||
f5b90479 SN |
300 | /** |
301 | * dev_read_addr_size_name() - Get the reg property of a device, indexed by name | |
302 | * | |
303 | * @dev: Device to read from | |
304 | * @name: the 'reg' property can hold a list of <addr, size> pairs, with the | |
e42c4d6d | 305 | * 'reg-names' property providing named-based identification. @name |
f5b90479 SN |
306 | * indicates the value to search for in 'reg-names'. |
307 | * @size: place to put size value (on success) | |
308 | * | |
6de6a615 | 309 | * Return: address or FDT_ADDR_T_NONE if not found |
f5b90479 | 310 | */ |
88b3a37e | 311 | fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name, |
f5b90479 SN |
312 | fdt_size_t *size); |
313 | ||
bc8fa1cb MS |
314 | /** |
315 | * dev_read_addr_size_name_ptr() - Get the reg property of a device as a pointer, | |
316 | * indexed by name | |
317 | * | |
318 | * @dev: Device to read from | |
319 | * @name: the 'reg' property can hold a list of <addr, size> pairs, with the | |
320 | * 'reg-names' property providing named-based identification. @name | |
321 | * indicates the value to search for in 'reg-names'. | |
322 | * @size: place to put size value (on success) | |
323 | * | |
324 | * Return: pointer or NULL if not found | |
325 | */ | |
326 | void *dev_read_addr_size_name_ptr(const struct udevice *dev, const char *name, | |
327 | fdt_size_t *size); | |
328 | ||
79598820 ĂFR |
329 | /** |
330 | * dev_remap_addr_name() - Get the reg property of a device, indexed by name, | |
331 | * as a memory-mapped I/O pointer | |
332 | * | |
333 | * @dev: Device to read from | |
334 | * @name: the 'reg' property can hold a list of <addr, size> pairs, with the | |
e42c4d6d | 335 | * 'reg-names' property providing named-based identification. @name |
79598820 ĂFR |
336 | * indicates the value to search for in 'reg-names'. |
337 | * | |
6de6a615 | 338 | * Return: pointer or NULL if not found |
79598820 | 339 | */ |
88b3a37e | 340 | void *dev_remap_addr_name(const struct udevice *dev, const char *name); |
79598820 | 341 | |
f11c7ab9 SG |
342 | /** |
343 | * dev_read_addr() - Get the reg property of a device | |
344 | * | |
345 | * @dev: Device to read from | |
346 | * | |
6de6a615 | 347 | * Return: address or FDT_ADDR_T_NONE if not found |
f11c7ab9 | 348 | */ |
88b3a37e | 349 | fdt_addr_t dev_read_addr(const struct udevice *dev); |
f11c7ab9 | 350 | |
c131c8bc PT |
351 | /** |
352 | * dev_read_addr_ptr() - Get the reg property of a device | |
353 | * as a pointer | |
354 | * | |
355 | * @dev: Device to read from | |
356 | * | |
6de6a615 | 357 | * Return: pointer or NULL if not found |
c131c8bc | 358 | */ |
88b3a37e | 359 | void *dev_read_addr_ptr(const struct udevice *dev); |
c131c8bc | 360 | |
33c215af SG |
361 | /** |
362 | * dev_read_addr_pci() - Read an address and handle PCI address translation | |
363 | * | |
364 | * At present U-Boot does not have address translation logic for PCI in the | |
365 | * livetree implementation (of_addr.c). This special function supports this for | |
366 | * the flat tree implementation. | |
367 | * | |
368 | * This function should be removed (and code should use dev_read() instead) | |
369 | * once: | |
370 | * | |
371 | * 1. PCI address translation is added; and either | |
372 | * 2. everything uses livetree where PCI translation is used (which is feasible | |
373 | * in SPL and U-Boot proper) or PCI address translation is added to | |
374 | * fdtdec_get_addr() and friends. | |
375 | * | |
376 | * @dev: Device to read from | |
f69d3d6d | 377 | * @sizep: If non-NULL, returns size of address space found |
6de6a615 | 378 | * Return: address or FDT_ADDR_T_NONE if not found |
33c215af | 379 | */ |
f69d3d6d | 380 | fdt_addr_t dev_read_addr_pci(const struct udevice *dev, fdt_size_t *sizep); |
33c215af | 381 | |
30a90f56 ĂFR |
382 | /** |
383 | * dev_remap_addr() - Get the reg property of a device as a | |
384 | * memory-mapped I/O pointer | |
385 | * | |
386 | * @dev: Device to read from | |
387 | * | |
6de6a615 | 388 | * Return: pointer or NULL if not found |
30a90f56 | 389 | */ |
88b3a37e | 390 | void *dev_remap_addr(const struct udevice *dev); |
30a90f56 | 391 | |
f11c7ab9 | 392 | /** |
77224320 | 393 | * dev_read_addr_size() - Get the reg property of a device |
f11c7ab9 SG |
394 | * |
395 | * @dev: Device to read from | |
f11c7ab9 | 396 | * @sizep: place to put size value (on success) |
6de6a615 | 397 | * Return: address value, or FDT_ADDR_T_NONE on error |
f11c7ab9 | 398 | */ |
77224320 | 399 | fdt_addr_t dev_read_addr_size(const struct udevice *dev, fdt_size_t *sizep); |
f11c7ab9 SG |
400 | |
401 | /** | |
402 | * dev_read_name() - get the name of a device's node | |
403 | * | |
15d61d04 | 404 | * @dev: Device to read from |
6de6a615 | 405 | * Return: name of node |
f11c7ab9 | 406 | */ |
88b3a37e | 407 | const char *dev_read_name(const struct udevice *dev); |
f11c7ab9 SG |
408 | |
409 | /** | |
410 | * dev_read_stringlist_search() - find string in a string list and return index | |
411 | * | |
412 | * Note that it is possible for this function to succeed on property values | |
413 | * that are not NUL-terminated. That's because the function will stop after | |
414 | * finding the first occurrence of @string. This can for example happen with | |
415 | * small-valued cell properties, such as #address-cells, when searching for | |
416 | * the empty string. | |
417 | * | |
418 | * @dev: device to check | |
419 | * @propname: name of the property containing the string list | |
420 | * @string: string to look up in the string list | |
421 | * | |
6de6a615 | 422 | * Return: |
f11c7ab9 SG |
423 | * the index of the string in the list of strings |
424 | * -ENODATA if the property is not found | |
425 | * -EINVAL on some other error | |
426 | */ | |
6de6a615 | 427 | int dev_read_stringlist_search(const struct udevice *dev, const char *propname, |
88b3a37e | 428 | const char *string); |
f11c7ab9 | 429 | |
b5a144a5 JJH |
430 | /** |
431 | * dev_read_string_index() - obtain an indexed string from a string list | |
432 | * | |
433 | * @dev: device to examine | |
434 | * @propname: name of the property containing the string list | |
435 | * @index: index of the string to return | |
6de6a615 | 436 | * @outp: return location for the string |
b5a144a5 | 437 | * |
6de6a615 | 438 | * Return: |
b5a144a5 JJH |
439 | * length of string, if found or -ve error value if not found |
440 | */ | |
88b3a37e SG |
441 | int dev_read_string_index(const struct udevice *dev, const char *propname, |
442 | int index, const char **outp); | |
b5a144a5 JJH |
443 | |
444 | /** | |
445 | * dev_read_string_count() - find the number of strings in a string list | |
446 | * | |
447 | * @dev: device to examine | |
448 | * @propname: name of the property containing the string list | |
6de6a615 | 449 | * Return: |
b5a144a5 JJH |
450 | * number of strings in the list, or -ve error value if not found |
451 | */ | |
88b3a37e | 452 | int dev_read_string_count(const struct udevice *dev, const char *propname); |
075bfc95 SG |
453 | |
454 | /** | |
455 | * dev_read_string_list() - read a list of strings | |
456 | * | |
457 | * This produces a list of string pointers with each one pointing to a string | |
458 | * in the string list. If the property does not exist, it returns {NULL}. | |
459 | * | |
460 | * The data is allocated and the caller is reponsible for freeing the return | |
461 | * value (the list of string pointers). The strings themselves may not be | |
462 | * changed as they point directly into the devicetree property. | |
463 | * | |
464 | * @dev: device to examine | |
465 | * @propname: name of the property containing the string list | |
466 | * @listp: returns an allocated, NULL-terminated list of strings if the return | |
467 | * value is > 0, else is set to NULL | |
6de6a615 PD |
468 | * Return: |
469 | * number of strings in list, 0 if none, -ENOMEM if out of memory, | |
470 | * -ENOENT if no such property | |
075bfc95 SG |
471 | */ |
472 | int dev_read_string_list(const struct udevice *dev, const char *propname, | |
473 | const char ***listp); | |
474 | ||
f11c7ab9 SG |
475 | /** |
476 | * dev_read_phandle_with_args() - Find a node pointed by phandle in a list | |
477 | * | |
478 | * This function is useful to parse lists of phandles and their arguments. | |
479 | * Returns 0 on success and fills out_args, on error returns appropriate | |
480 | * errno value. | |
481 | * | |
482 | * Caller is responsible to call of_node_put() on the returned out_args->np | |
483 | * pointer. | |
484 | * | |
485 | * Example: | |
486 | * | |
6de6a615 | 487 | * .. code-block:: |
f11c7ab9 | 488 | * |
6de6a615 PD |
489 | * phandle1: node1 { |
490 | * #list-cells = <2>; | |
491 | * }; | |
492 | * phandle2: node2 { | |
493 | * #list-cells = <1>; | |
494 | * }; | |
495 | * node3 { | |
496 | * list = <&phandle1 1 2 &phandle2 3>; | |
497 | * }; | |
f11c7ab9 SG |
498 | * |
499 | * To get a device_node of the `node2' node you may call this: | |
500 | * dev_read_phandle_with_args(dev, "list", "#list-cells", 0, 1, &args); | |
501 | * | |
502 | * @dev: device whose node containing a list | |
503 | * @list_name: property name that contains a list | |
504 | * @cells_name: property name that specifies phandles' arguments count | |
6de6a615 | 505 | * @cell_count: Cell count to use if @cells_name is NULL |
f11c7ab9 SG |
506 | * @index: index of a phandle to parse out |
507 | * @out_args: optional pointer to output arguments structure (will be filled) | |
6de6a615 | 508 | * Return: 0 on success (with @out_args filled out if not NULL), -ENOENT if |
f11c7ab9 SG |
509 | * @list_name does not exist, -EINVAL if a phandle was not found, |
510 | * @cells_name could not be found, the arguments were truncated or there | |
511 | * were too many arguments. | |
512 | */ | |
88b3a37e SG |
513 | int dev_read_phandle_with_args(const struct udevice *dev, const char *list_name, |
514 | const char *cells_name, int cell_count, | |
515 | int index, struct ofnode_phandle_args *out_args); | |
f11c7ab9 | 516 | |
642346ae PC |
517 | /** |
518 | * dev_count_phandle_with_args() - Return phandle number in a list | |
519 | * | |
520 | * This function is usefull to get phandle number contained in a property list. | |
521 | * For example, this allows to allocate the right amount of memory to keep | |
522 | * clock's reference contained into the "clocks" property. | |
523 | * | |
642346ae PC |
524 | * @dev: device whose node containing a list |
525 | * @list_name: property name that contains a list | |
526 | * @cells_name: property name that specifies phandles' arguments count | |
6de6a615 PD |
527 | * @cell_count: Cell count to use if @cells_name is NULL |
528 | * Return: number of phandle found on success, on error returns appropriate | |
642346ae PC |
529 | * errno value. |
530 | */ | |
531 | ||
88b3a37e | 532 | int dev_count_phandle_with_args(const struct udevice *dev, |
89f68302 PD |
533 | const char *list_name, const char *cells_name, |
534 | int cell_count); | |
642346ae | 535 | |
f11c7ab9 SG |
536 | /** |
537 | * dev_read_addr_cells() - Get the number of address cells for a device's node | |
538 | * | |
539 | * This walks back up the tree to find the closest #address-cells property | |
540 | * which controls the given node. | |
541 | * | |
7ba50418 | 542 | * @dev: device to check |
6de6a615 | 543 | * Return: number of address cells this node uses |
f11c7ab9 | 544 | */ |
88b3a37e | 545 | int dev_read_addr_cells(const struct udevice *dev); |
f11c7ab9 SG |
546 | |
547 | /** | |
548 | * dev_read_size_cells() - Get the number of size cells for a device's node | |
549 | * | |
550 | * This walks back up the tree to find the closest #size-cells property | |
551 | * which controls the given node. | |
552 | * | |
7ba50418 | 553 | * @dev: device to check |
6de6a615 | 554 | * Return: number of size cells this node uses |
f11c7ab9 | 555 | */ |
88b3a37e | 556 | int dev_read_size_cells(const struct udevice *dev); |
f11c7ab9 | 557 | |
878d68c0 SG |
558 | /** |
559 | * dev_read_addr_cells() - Get the address cells property in a node | |
560 | * | |
561 | * This function matches fdt_address_cells(). | |
562 | * | |
7ba50418 | 563 | * @dev: device to check |
6de6a615 | 564 | * Return: number of address cells this node uses |
878d68c0 | 565 | */ |
88b3a37e | 566 | int dev_read_simple_addr_cells(const struct udevice *dev); |
878d68c0 SG |
567 | |
568 | /** | |
569 | * dev_read_size_cells() - Get the size cells property in a node | |
570 | * | |
571 | * This function matches fdt_size_cells(). | |
572 | * | |
7ba50418 | 573 | * @dev: device to check |
6de6a615 | 574 | * Return: number of size cells this node uses |
878d68c0 | 575 | */ |
88b3a37e | 576 | int dev_read_simple_size_cells(const struct udevice *dev); |
878d68c0 | 577 | |
f11c7ab9 SG |
578 | /** |
579 | * dev_read_phandle() - Get the phandle from a device | |
580 | * | |
581 | * @dev: device to check | |
6de6a615 | 582 | * Return: phandle (1 or greater), or 0 if no phandle or other error |
f11c7ab9 | 583 | */ |
88b3a37e | 584 | int dev_read_phandle(const struct udevice *dev); |
f11c7ab9 SG |
585 | |
586 | /** | |
587 | * dev_read_prop()- - read a property from a device's node | |
588 | * | |
589 | * @dev: device to check | |
590 | * @propname: property to read | |
591 | * @lenp: place to put length on success | |
6de6a615 | 592 | * Return: pointer to property, or NULL if not found |
f11c7ab9 | 593 | */ |
88b3a37e SG |
594 | const void *dev_read_prop(const struct udevice *dev, const char *propname, |
595 | int *lenp); | |
f11c7ab9 | 596 | |
ce891fca PD |
597 | /** |
598 | * dev_read_first_prop()- get the reference of the first property | |
599 | * | |
600 | * Get reference to the first property of the node, it is used to iterate | |
601 | * and read all the property with dev_read_prop_by_prop(). | |
602 | * | |
603 | * @dev: device to check | |
604 | * @prop: place to put argument reference | |
6de6a615 | 605 | * Return: 0 if OK, -ve on error. -FDT_ERR_NOTFOUND if not found |
ce891fca PD |
606 | */ |
607 | int dev_read_first_prop(const struct udevice *dev, struct ofprop *prop); | |
608 | ||
609 | /** | |
4b1f5714 | 610 | * ofnode_next_property() - get the reference of the next property |
ce891fca PD |
611 | * |
612 | * Get reference to the next property of the node, it is used to iterate | |
613 | * and read all the property with dev_read_prop_by_prop(). | |
614 | * | |
615 | * @prop: reference of current argument and place to put reference of next one | |
6de6a615 | 616 | * Return: 0 if OK, -ve on error. -FDT_ERR_NOTFOUND if not found |
ce891fca PD |
617 | */ |
618 | int dev_read_next_prop(struct ofprop *prop); | |
619 | ||
620 | /** | |
621 | * dev_read_prop_by_prop() - get a pointer to the value of a property | |
622 | * | |
623 | * Get value for the property identified by the provided reference. | |
624 | * | |
625 | * @prop: reference on property | |
626 | * @propname: If non-NULL, place to property name on success, | |
627 | * @lenp: If non-NULL, place to put length on success | |
6de6a615 | 628 | * Return: 0 if OK, -ve on error. -FDT_ERR_NOTFOUND if not found |
ce891fca PD |
629 | */ |
630 | const void *dev_read_prop_by_prop(struct ofprop *prop, | |
631 | const char **propname, int *lenp); | |
632 | ||
f11c7ab9 SG |
633 | /** |
634 | * dev_read_alias_seq() - Get the alias sequence number of a node | |
635 | * | |
636 | * This works out whether a node is pointed to by an alias, and if so, the | |
637 | * sequence number of that alias. Aliases are of the form <base><num> where | |
638 | * <num> is the sequence number. For example spi2 would be sequence number 2. | |
639 | * | |
640 | * @dev: device to look up | |
641 | * @devnump: set to the sequence number if one is found | |
6de6a615 | 642 | * Return: 0 if a sequence was found, -ve if not |
f11c7ab9 | 643 | */ |
88b3a37e | 644 | int dev_read_alias_seq(const struct udevice *dev, int *devnump); |
f11c7ab9 SG |
645 | |
646 | /** | |
647 | * dev_read_u32_array() - Find and read an array of 32 bit integers | |
648 | * | |
649 | * Search for a property in a device node and read 32-bit value(s) from | |
650 | * it. | |
651 | * | |
652 | * The out_values is modified only if a valid u32 value can be decoded. | |
653 | * | |
654 | * @dev: device to look up | |
655 | * @propname: name of the property to read | |
656 | * @out_values: pointer to return value, modified only if return value is 0 | |
657 | * @sz: number of array elements to read | |
6de6a615 | 658 | * Return: 0 on success, -EINVAL if the property does not exist, -ENODATA if |
f11c7ab9 SG |
659 | * property does not have a value, and -EOVERFLOW if the property data isn't |
660 | * large enough. | |
661 | */ | |
88b3a37e | 662 | int dev_read_u32_array(const struct udevice *dev, const char *propname, |
47a0fd3b | 663 | u32 *out_values, size_t sz); |
f11c7ab9 SG |
664 | |
665 | /** | |
666 | * dev_read_first_subnode() - find the first subnode of a device's node | |
667 | * | |
668 | * @dev: device to look up | |
6de6a615 | 669 | * Return: reference to the first subnode (which can be invalid if the device's |
f11c7ab9 SG |
670 | * node has no subnodes) |
671 | */ | |
88b3a37e | 672 | ofnode dev_read_first_subnode(const struct udevice *dev); |
f11c7ab9 SG |
673 | |
674 | /** | |
675 | * ofnode_next_subnode() - find the next sibling of a subnode | |
676 | * | |
677 | * @node: valid reference to previous node (sibling) | |
6de6a615 | 678 | * Return: reference to the next subnode (which can be invalid if the node |
f11c7ab9 SG |
679 | * has no more siblings) |
680 | */ | |
47a0fd3b | 681 | ofnode dev_read_next_subnode(ofnode node); |
f11c7ab9 SG |
682 | |
683 | /** | |
684 | * dev_read_u8_array_ptr() - find an 8-bit array | |
685 | * | |
686 | * Look up a device's node property and return a pointer to its contents as a | |
687 | * byte array of given length. The property must have at least enough data | |
688 | * for the array (count bytes). It may have more, but this will be ignored. | |
689 | * The data is not copied. | |
690 | * | |
691 | * @dev: device to look up | |
692 | * @propname: name of property to find | |
693 | * @sz: number of array elements | |
6de6a615 PD |
694 | * Return: |
695 | * pointer to byte array if found, or NULL if the property is not found or | |
696 | * there is not enough data | |
f11c7ab9 | 697 | */ |
88b3a37e SG |
698 | const uint8_t *dev_read_u8_array_ptr(const struct udevice *dev, |
699 | const char *propname, size_t sz); | |
47a0fd3b | 700 | |
f7d6fcf7 SG |
701 | /** |
702 | * dev_read_enabled() - check whether a node is enabled | |
703 | * | |
704 | * This looks for a 'status' property. If this exists, then returns 1 if | |
705 | * the status is 'ok' and 0 otherwise. If there is no status property, | |
706 | * it returns 1 on the assumption that anything mentioned should be enabled | |
707 | * by default. | |
708 | * | |
709 | * @dev: device to examine | |
6de6a615 | 710 | * Return: integer value 0 (not enabled) or 1 (enabled) |
f7d6fcf7 | 711 | */ |
88b3a37e | 712 | int dev_read_enabled(const struct udevice *dev); |
f7d6fcf7 | 713 | |
dcf98852 SG |
714 | /** |
715 | * dev_read_resource() - obtain an indexed resource from a device. | |
716 | * | |
7b8b47bd | 717 | * @dev: device to examine |
6de6a615 PD |
718 | * @index: index of the resource to retrieve (0 = first) |
719 | * @res: returns the resource | |
720 | * Return: 0 if ok, negative on error | |
dcf98852 | 721 | */ |
88b3a37e SG |
722 | int dev_read_resource(const struct udevice *dev, uint index, |
723 | struct resource *res); | |
dcf98852 | 724 | |
7b8b47bd MY |
725 | /** |
726 | * dev_read_resource_byname() - obtain a named resource from a device. | |
727 | * | |
728 | * @dev: device to examine | |
729 | * @name: name of the resource to retrieve | |
730 | * @res: returns the resource | |
6de6a615 | 731 | * Return: 0 if ok, negative on error |
7b8b47bd | 732 | */ |
88b3a37e | 733 | int dev_read_resource_byname(const struct udevice *dev, const char *name, |
7b8b47bd MY |
734 | struct resource *res); |
735 | ||
147c6074 | 736 | /** |
641067fb | 737 | * dev_translate_address() - Translate a device-tree address |
147c6074 MS |
738 | * |
739 | * Translate an address from the device-tree into a CPU physical address. This | |
740 | * function walks up the tree and applies the various bus mappings along the | |
741 | * way. | |
742 | * | |
743 | * @dev: device giving the context in which to translate the address | |
744 | * @in_addr: pointer to the address to translate | |
6de6a615 | 745 | * Return: the translated address; OF_BAD_ADDR on error |
147c6074 | 746 | */ |
88b3a37e | 747 | u64 dev_translate_address(const struct udevice *dev, const fdt32_t *in_addr); |
83e4c7e9 | 748 | |
641067fb FD |
749 | /** |
750 | * dev_translate_dma_address() - Translate a device-tree DMA address | |
751 | * | |
752 | * Translate a DMA address from the device-tree into a CPU physical address. | |
753 | * This function walks up the tree and applies the various bus mappings along | |
754 | * the way. | |
755 | * | |
756 | * @dev: device giving the context in which to translate the DMA address | |
757 | * @in_addr: pointer to the DMA address to translate | |
6de6a615 | 758 | * Return: the translated DMA address; OF_BAD_ADDR on error |
641067fb | 759 | */ |
88b3a37e SG |
760 | u64 dev_translate_dma_address(const struct udevice *dev, |
761 | const fdt32_t *in_addr); | |
641067fb | 762 | |
51bdb509 NSJ |
763 | /** |
764 | * dev_get_dma_range() - Get a device's DMA constraints | |
765 | * | |
766 | * Provide the address bases and size of the linear mapping between the CPU and | |
767 | * a device's BUS address space. | |
768 | * | |
769 | * @dev: device giving the context in which to translate the DMA address | |
770 | * @cpu: base address for CPU's view of memory | |
771 | * @bus: base address for BUS's view of memory | |
772 | * @size: size of the address space | |
6de6a615 | 773 | * Return: 0 if ok, negative on error |
51bdb509 NSJ |
774 | */ |
775 | int dev_get_dma_range(const struct udevice *dev, phys_addr_t *cpu, | |
776 | dma_addr_t *bus, u64 *size); | |
777 | ||
83e4c7e9 MS |
778 | /** |
779 | * dev_read_alias_highest_id - Get highest alias id for the given stem | |
780 | * @stem: Alias stem to be examined | |
781 | * | |
782 | * The function travels the lookup table to get the highest alias id for the | |
783 | * given alias stem. | |
6de6a615 | 784 | * Return: alias ID, if found, else -1 |
83e4c7e9 MS |
785 | */ |
786 | int dev_read_alias_highest_id(const char *stem); | |
787 | ||
89b84b85 CY |
788 | /** |
789 | * dev_get_child_count() - get the child count of a device | |
790 | * | |
6de6a615 PD |
791 | * @dev: device to use for interation (`struct udevice *`) |
792 | * Return: the count of child subnode | |
89b84b85 CY |
793 | */ |
794 | int dev_get_child_count(const struct udevice *dev); | |
795 | ||
68f81b85 SR |
796 | /** |
797 | * dev_read_pci_bus_range - Read PCI bus-range resource | |
798 | * | |
799 | * Look at the bus range property of a device node and return the pci bus | |
800 | * range for this node. | |
801 | * | |
802 | * @dev: device to examine | |
6de6a615 PD |
803 | * @res: returns the resource |
804 | * Return: 0 if ok, negative on error | |
68f81b85 SR |
805 | */ |
806 | int dev_read_pci_bus_range(const struct udevice *dev, struct resource *res); | |
807 | ||
15daa486 DB |
808 | /** |
809 | * dev_decode_display_timing() - decode display timings | |
810 | * | |
811 | * Decode display timings from the supplied 'display-timings' node. | |
812 | * See doc/device-tree-bindings/video/display-timing.txt for binding | |
813 | * information. | |
814 | * | |
815 | * @dev: device to read DT display timings from. The node linked to the device | |
816 | * contains a child node called 'display-timings' which in turn contains | |
817 | * one or more display timing nodes. | |
818 | * @index: index number to read (0=first timing subnode) | |
819 | * @config: place to put timings | |
6de6a615 | 820 | * Return: 0 if OK, -FDT_ERR_NOTFOUND if not found |
15daa486 DB |
821 | */ |
822 | int dev_decode_display_timing(const struct udevice *dev, int index, | |
823 | struct display_timing *config); | |
824 | ||
0347cc77 NJ |
825 | /** |
826 | * dev_decode_panel_timing() - decode panel timings | |
827 | * | |
828 | * Decode display timings from the supplied 'panel-timings' node. | |
829 | * | |
830 | * @dev: device to read DT display timings from. The node linked to the device | |
831 | * contains a child node called 'display-timings' which in turn contains | |
832 | * one or more display timing nodes. | |
833 | * @config: place to put timings | |
834 | * Return: 0 if OK, -FDT_ERR_NOTFOUND if not found | |
835 | */ | |
836 | int dev_decode_panel_timing(const struct udevice *dev, | |
837 | struct display_timing *config); | |
838 | ||
f3dd213e MB |
839 | /** |
840 | * dev_get_phy_node() - Get PHY node for a MAC (if not fixed-link) | |
841 | * | |
842 | * This function parses PHY handle from the Ethernet controller's ofnode | |
843 | * (trying all possible PHY handle property names), and returns the PHY ofnode. | |
844 | * | |
845 | * Before this is used, ofnode_phy_is_fixed_link() should be checked first, and | |
846 | * if the result to that is true, this function should not be called. | |
847 | * | |
848 | * @dev: device representing the MAC | |
849 | * Return: ofnode of the PHY, if it exists, otherwise an invalid ofnode | |
850 | */ | |
851 | ofnode dev_get_phy_node(const struct udevice *dev); | |
852 | ||
123ca114 MB |
853 | /** |
854 | * dev_read_phy_mode() - Read PHY connection type from a MAC | |
855 | * | |
856 | * This function parses the "phy-mode" / "phy-connection-type" property and | |
857 | * returns the corresponding PHY interface type. | |
858 | * | |
859 | * @dev: device representing the MAC | |
ffb0f6f4 | 860 | * Return: one of PHY_INTERFACE_MODE_* constants, PHY_INTERFACE_MODE_NA on |
123ca114 MB |
861 | * error |
862 | */ | |
863 | phy_interface_t dev_read_phy_mode(const struct udevice *dev); | |
864 | ||
47a0fd3b | 865 | #else /* CONFIG_DM_DEV_READ_INLINE is enabled */ |
401d1c4f | 866 | #include <asm/global_data.h> |
47a0fd3b | 867 | |
b471bdc4 SH |
868 | static inline int dev_read_u8(const struct udevice *dev, |
869 | const char *propname, u8 *outp) | |
870 | { | |
871 | return ofnode_read_u8(dev_ofnode(dev), propname, outp); | |
872 | } | |
873 | ||
874 | static inline int dev_read_u8_default(const struct udevice *dev, | |
875 | const char *propname, u8 def) | |
876 | { | |
877 | return ofnode_read_u8_default(dev_ofnode(dev), propname, def); | |
878 | } | |
879 | ||
880 | static inline int dev_read_u16(const struct udevice *dev, | |
881 | const char *propname, u16 *outp) | |
882 | { | |
883 | return ofnode_read_u16(dev_ofnode(dev), propname, outp); | |
884 | } | |
885 | ||
886 | static inline int dev_read_u16_default(const struct udevice *dev, | |
887 | const char *propname, u16 def) | |
888 | { | |
889 | return ofnode_read_u16_default(dev_ofnode(dev), propname, def); | |
890 | } | |
891 | ||
88b3a37e | 892 | static inline int dev_read_u32(const struct udevice *dev, |
3ab48f62 MY |
893 | const char *propname, u32 *outp) |
894 | { | |
895 | return ofnode_read_u32(dev_ofnode(dev), propname, outp); | |
896 | } | |
897 | ||
88b3a37e | 898 | static inline int dev_read_u32_default(const struct udevice *dev, |
47a0fd3b SG |
899 | const char *propname, int def) |
900 | { | |
901 | return ofnode_read_u32_default(dev_ofnode(dev), propname, def); | |
902 | } | |
903 | ||
4bb7075c DB |
904 | static inline int dev_read_u32_index(struct udevice *dev, |
905 | const char *propname, int index, u32 *outp) | |
906 | { | |
907 | return ofnode_read_u32_index(dev_ofnode(dev), propname, index, outp); | |
908 | } | |
909 | ||
910 | static inline u32 dev_read_u32_index_default(struct udevice *dev, | |
911 | const char *propname, int index, | |
912 | u32 def) | |
913 | { | |
914 | return ofnode_read_u32_index_default(dev_ofnode(dev), propname, index, | |
915 | def); | |
916 | } | |
917 | ||
88b3a37e | 918 | static inline int dev_read_s32(const struct udevice *dev, |
a1b17e4f SG |
919 | const char *propname, s32 *outp) |
920 | { | |
921 | return ofnode_read_s32(dev_ofnode(dev), propname, outp); | |
922 | } | |
923 | ||
88b3a37e | 924 | static inline int dev_read_s32_default(const struct udevice *dev, |
a1b17e4f SG |
925 | const char *propname, int def) |
926 | { | |
927 | return ofnode_read_s32_default(dev_ofnode(dev), propname, def); | |
928 | } | |
929 | ||
88b3a37e | 930 | static inline int dev_read_u32u(const struct udevice *dev, |
a1b17e4f SG |
931 | const char *propname, uint *outp) |
932 | { | |
933 | u32 val; | |
934 | int ret; | |
935 | ||
936 | ret = ofnode_read_u32(dev_ofnode(dev), propname, &val); | |
937 | if (ret) | |
938 | return ret; | |
939 | *outp = val; | |
940 | ||
941 | return 0; | |
942 | } | |
943 | ||
88b3a37e | 944 | static inline int dev_read_u64(const struct udevice *dev, |
3f3d7715 KR |
945 | const char *propname, u64 *outp) |
946 | { | |
947 | return ofnode_read_u64(dev_ofnode(dev), propname, outp); | |
948 | } | |
949 | ||
88b3a37e | 950 | static inline u64 dev_read_u64_default(const struct udevice *dev, |
3f3d7715 KR |
951 | const char *propname, u64 def) |
952 | { | |
953 | return ofnode_read_u64_default(dev_ofnode(dev), propname, def); | |
954 | } | |
955 | ||
88b3a37e | 956 | static inline const char *dev_read_string(const struct udevice *dev, |
47a0fd3b SG |
957 | const char *propname) |
958 | { | |
959 | return ofnode_read_string(dev_ofnode(dev), propname); | |
960 | } | |
961 | ||
88b3a37e SG |
962 | static inline bool dev_read_bool(const struct udevice *dev, |
963 | const char *propname) | |
47a0fd3b SG |
964 | { |
965 | return ofnode_read_bool(dev_ofnode(dev), propname); | |
966 | } | |
967 | ||
88b3a37e | 968 | static inline ofnode dev_read_subnode(const struct udevice *dev, |
47a0fd3b SG |
969 | const char *subbnode_name) |
970 | { | |
971 | return ofnode_find_subnode(dev_ofnode(dev), subbnode_name); | |
972 | } | |
973 | ||
88b3a37e | 974 | static inline int dev_read_size(const struct udevice *dev, const char *propname) |
47a0fd3b SG |
975 | { |
976 | return ofnode_read_size(dev_ofnode(dev), propname); | |
977 | } | |
978 | ||
88b3a37e SG |
979 | static inline fdt_addr_t dev_read_addr_index(const struct udevice *dev, |
980 | int index) | |
47a0fd3b SG |
981 | { |
982 | return devfdt_get_addr_index(dev, index); | |
983 | } | |
984 | ||
bdce9031 BM |
985 | static inline void *dev_read_addr_index_ptr(const struct udevice *dev, |
986 | int index) | |
987 | { | |
988 | return devfdt_get_addr_index_ptr(dev, index); | |
989 | } | |
990 | ||
88b3a37e | 991 | static inline fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, |
f5b90479 SN |
992 | int index, |
993 | fdt_size_t *size) | |
994 | { | |
995 | return devfdt_get_addr_size_index(dev, index, size); | |
996 | } | |
997 | ||
5e030632 JK |
998 | static inline void *dev_read_addr_size_index_ptr(const struct udevice *dev, |
999 | int index, | |
1000 | fdt_size_t *size) | |
1001 | { | |
1002 | return devfdt_get_addr_size_index_ptr(dev, index, size); | |
1003 | } | |
1004 | ||
88b3a37e | 1005 | static inline fdt_addr_t dev_read_addr_name(const struct udevice *dev, |
79598820 ĂFR |
1006 | const char *name) |
1007 | { | |
1008 | return devfdt_get_addr_name(dev, name); | |
1009 | } | |
1010 | ||
bc8fa1cb MS |
1011 | static inline void *dev_read_addr_name_ptr(const struct udevice *dev, |
1012 | const char *name) | |
1013 | { | |
1014 | return devfdt_get_addr_name_ptr(dev, name); | |
1015 | } | |
1016 | ||
88b3a37e | 1017 | static inline fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, |
f5b90479 SN |
1018 | const char *name, |
1019 | fdt_size_t *size) | |
1020 | { | |
1021 | return devfdt_get_addr_size_name(dev, name, size); | |
1022 | } | |
1023 | ||
bc8fa1cb MS |
1024 | static inline void *dev_read_addr_size_name_ptr(const struct udevice *dev, |
1025 | const char *name, | |
1026 | fdt_size_t *size) | |
1027 | { | |
1028 | return devfdt_get_addr_size_name_ptr(dev, name, size); | |
1029 | } | |
1030 | ||
88b3a37e | 1031 | static inline fdt_addr_t dev_read_addr(const struct udevice *dev) |
47a0fd3b SG |
1032 | { |
1033 | return devfdt_get_addr(dev); | |
1034 | } | |
1035 | ||
88b3a37e | 1036 | static inline void *dev_read_addr_ptr(const struct udevice *dev) |
c131c8bc | 1037 | { |
3fe69d37 | 1038 | return devfdt_get_addr_ptr(dev); |
c131c8bc PT |
1039 | } |
1040 | ||
f69d3d6d SG |
1041 | static inline fdt_addr_t dev_read_addr_pci(const struct udevice *dev, |
1042 | fdt_size_t *sizep) | |
33c215af | 1043 | { |
f69d3d6d | 1044 | return devfdt_get_addr_pci(dev, sizep); |
33c215af SG |
1045 | } |
1046 | ||
88b3a37e | 1047 | static inline void *dev_remap_addr(const struct udevice *dev) |
30a90f56 ĂFR |
1048 | { |
1049 | return devfdt_remap_addr(dev); | |
1050 | } | |
1051 | ||
88b3a37e | 1052 | static inline void *dev_remap_addr_index(const struct udevice *dev, int index) |
30a90f56 ĂFR |
1053 | { |
1054 | return devfdt_remap_addr_index(dev, index); | |
1055 | } | |
1056 | ||
88b3a37e SG |
1057 | static inline void *dev_remap_addr_name(const struct udevice *dev, |
1058 | const char *name) | |
79598820 ĂFR |
1059 | { |
1060 | return devfdt_remap_addr_name(dev, name); | |
1061 | } | |
1062 | ||
88b3a37e | 1063 | static inline fdt_addr_t dev_read_addr_size(const struct udevice *dev, |
47a0fd3b SG |
1064 | fdt_size_t *sizep) |
1065 | { | |
77224320 | 1066 | return dev_read_addr_size_index(dev, 0, sizep); |
47a0fd3b SG |
1067 | } |
1068 | ||
88b3a37e | 1069 | static inline const char *dev_read_name(const struct udevice *dev) |
47a0fd3b SG |
1070 | { |
1071 | return ofnode_get_name(dev_ofnode(dev)); | |
1072 | } | |
1073 | ||
88b3a37e | 1074 | static inline int dev_read_stringlist_search(const struct udevice *dev, |
47a0fd3b SG |
1075 | const char *propname, |
1076 | const char *string) | |
1077 | { | |
1078 | return ofnode_stringlist_search(dev_ofnode(dev), propname, string); | |
1079 | } | |
1080 | ||
88b3a37e | 1081 | static inline int dev_read_string_index(const struct udevice *dev, |
b5a144a5 JJH |
1082 | const char *propname, int index, |
1083 | const char **outp) | |
1084 | { | |
1085 | return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp); | |
1086 | } | |
1087 | ||
88b3a37e | 1088 | static inline int dev_read_string_count(const struct udevice *dev, |
b5a144a5 JJH |
1089 | const char *propname) |
1090 | { | |
1091 | return ofnode_read_string_count(dev_ofnode(dev), propname); | |
1092 | } | |
1093 | ||
075bfc95 SG |
1094 | static inline int dev_read_string_list(const struct udevice *dev, |
1095 | const char *propname, | |
1096 | const char ***listp) | |
1097 | { | |
1098 | return ofnode_read_string_list(dev_ofnode(dev), propname, listp); | |
1099 | } | |
1100 | ||
88b3a37e | 1101 | static inline int dev_read_phandle_with_args(const struct udevice *dev, |
47a0fd3b SG |
1102 | const char *list_name, const char *cells_name, int cell_count, |
1103 | int index, struct ofnode_phandle_args *out_args) | |
1104 | { | |
1105 | return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name, | |
1106 | cells_name, cell_count, index, | |
1107 | out_args); | |
1108 | } | |
1109 | ||
88b3a37e | 1110 | static inline int dev_count_phandle_with_args(const struct udevice *dev, |
89f68302 | 1111 | const char *list_name, const char *cells_name, int cell_count) |
642346ae PC |
1112 | { |
1113 | return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name, | |
89f68302 | 1114 | cells_name, cell_count); |
642346ae PC |
1115 | } |
1116 | ||
88b3a37e | 1117 | static inline int dev_read_addr_cells(const struct udevice *dev) |
47a0fd3b | 1118 | { |
ae6b33dc HS |
1119 | int parent = fdt_parent_offset(gd->fdt_blob, dev_of_offset(dev)); |
1120 | ||
1121 | return fdt_address_cells(gd->fdt_blob, parent); | |
47a0fd3b SG |
1122 | } |
1123 | ||
88b3a37e | 1124 | static inline int dev_read_size_cells(const struct udevice *dev) |
878d68c0 | 1125 | { |
ae6b33dc HS |
1126 | int parent = fdt_parent_offset(gd->fdt_blob, dev_of_offset(dev)); |
1127 | ||
1128 | return fdt_size_cells(gd->fdt_blob, parent); | |
878d68c0 SG |
1129 | } |
1130 | ||
88b3a37e | 1131 | static inline int dev_read_simple_addr_cells(const struct udevice *dev) |
878d68c0 SG |
1132 | { |
1133 | return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev)); | |
1134 | } | |
1135 | ||
88b3a37e | 1136 | static inline int dev_read_simple_size_cells(const struct udevice *dev) |
47a0fd3b SG |
1137 | { |
1138 | return fdt_size_cells(gd->fdt_blob, dev_of_offset(dev)); | |
1139 | } | |
1140 | ||
88b3a37e | 1141 | static inline int dev_read_phandle(const struct udevice *dev) |
47a0fd3b SG |
1142 | { |
1143 | return fdt_get_phandle(gd->fdt_blob, dev_of_offset(dev)); | |
1144 | } | |
1145 | ||
88b3a37e | 1146 | static inline const void *dev_read_prop(const struct udevice *dev, |
fd73621c | 1147 | const char *propname, int *lenp) |
47a0fd3b | 1148 | { |
61e51bab | 1149 | return ofnode_get_property(dev_ofnode(dev), propname, lenp); |
47a0fd3b SG |
1150 | } |
1151 | ||
ce891fca PD |
1152 | static inline int dev_read_first_prop(const struct udevice *dev, struct ofprop *prop) |
1153 | { | |
4b1f5714 | 1154 | return ofnode_first_property(dev_ofnode(dev), prop); |
ce891fca PD |
1155 | } |
1156 | ||
1157 | static inline int dev_read_next_prop(struct ofprop *prop) | |
1158 | { | |
4b1f5714 | 1159 | return ofnode_next_property(prop); |
ce891fca PD |
1160 | } |
1161 | ||
1162 | static inline const void *dev_read_prop_by_prop(struct ofprop *prop, | |
1163 | const char **propname, | |
1164 | int *lenp) | |
1165 | { | |
92432246 | 1166 | return ofprop_get_property(prop, propname, lenp); |
ce891fca PD |
1167 | } |
1168 | ||
88b3a37e | 1169 | static inline int dev_read_alias_seq(const struct udevice *dev, int *devnump) |
47a0fd3b | 1170 | { |
45224e8f | 1171 | #if CONFIG_IS_ENABLED(OF_CONTROL) |
47a0fd3b SG |
1172 | return fdtdec_get_alias_seq(gd->fdt_blob, dev->uclass->uc_drv->name, |
1173 | dev_of_offset(dev), devnump); | |
45224e8f MZ |
1174 | #else |
1175 | return -ENOTSUPP; | |
1176 | #endif | |
47a0fd3b SG |
1177 | } |
1178 | ||
88b3a37e SG |
1179 | static inline int dev_read_u32_array(const struct udevice *dev, |
1180 | const char *propname, u32 *out_values, | |
1181 | size_t sz) | |
47a0fd3b SG |
1182 | { |
1183 | return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz); | |
1184 | } | |
1185 | ||
88b3a37e | 1186 | static inline ofnode dev_read_first_subnode(const struct udevice *dev) |
47a0fd3b SG |
1187 | { |
1188 | return ofnode_first_subnode(dev_ofnode(dev)); | |
1189 | } | |
1190 | ||
1191 | static inline ofnode dev_read_next_subnode(ofnode node) | |
1192 | { | |
1193 | return ofnode_next_subnode(node); | |
1194 | } | |
1195 | ||
88b3a37e | 1196 | static inline const uint8_t *dev_read_u8_array_ptr(const struct udevice *dev, |
f262d4ca SG |
1197 | const char *propname, |
1198 | size_t sz) | |
f11c7ab9 SG |
1199 | { |
1200 | return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz); | |
1201 | } | |
1202 | ||
88b3a37e | 1203 | static inline int dev_read_enabled(const struct udevice *dev) |
f7d6fcf7 SG |
1204 | { |
1205 | return fdtdec_get_is_enabled(gd->fdt_blob, dev_of_offset(dev)); | |
1206 | } | |
1207 | ||
88b3a37e | 1208 | static inline int dev_read_resource(const struct udevice *dev, uint index, |
dcf98852 SG |
1209 | struct resource *res) |
1210 | { | |
1211 | return ofnode_read_resource(dev_ofnode(dev), index, res); | |
1212 | } | |
1213 | ||
88b3a37e | 1214 | static inline int dev_read_resource_byname(const struct udevice *dev, |
7b8b47bd MY |
1215 | const char *name, |
1216 | struct resource *res) | |
1217 | { | |
1218 | return ofnode_read_resource_byname(dev_ofnode(dev), name, res); | |
1219 | } | |
1220 | ||
88b3a37e SG |
1221 | static inline u64 dev_translate_address(const struct udevice *dev, |
1222 | const fdt32_t *in_addr) | |
147c6074 MS |
1223 | { |
1224 | return ofnode_translate_address(dev_ofnode(dev), in_addr); | |
1225 | } | |
1226 | ||
88b3a37e SG |
1227 | static inline u64 dev_translate_dma_address(const struct udevice *dev, |
1228 | const fdt32_t *in_addr) | |
641067fb FD |
1229 | { |
1230 | return ofnode_translate_dma_address(dev_ofnode(dev), in_addr); | |
1231 | } | |
1232 | ||
51bdb509 NSJ |
1233 | static inline int dev_get_dma_range(const struct udevice *dev, phys_addr_t *cpu, |
1234 | dma_addr_t *bus, u64 *size) | |
1235 | { | |
1236 | return ofnode_get_dma_range(dev_ofnode(dev), cpu, bus, size); | |
1237 | } | |
1238 | ||
83e4c7e9 MS |
1239 | static inline int dev_read_alias_highest_id(const char *stem) |
1240 | { | |
a00e0f7a | 1241 | if (!CONFIG_IS_ENABLED(OF_LIBFDT) || !gd->fdt_blob) |
0a6b75f7 | 1242 | return -1; |
83e4c7e9 MS |
1243 | return fdtdec_get_alias_highest_id(gd->fdt_blob, stem); |
1244 | } | |
1245 | ||
89b84b85 CY |
1246 | static inline int dev_get_child_count(const struct udevice *dev) |
1247 | { | |
1248 | return ofnode_get_child_count(dev_ofnode(dev)); | |
1249 | } | |
1250 | ||
15daa486 DB |
1251 | static inline int dev_decode_display_timing(const struct udevice *dev, |
1252 | int index, | |
1253 | struct display_timing *config) | |
1254 | { | |
1255 | return ofnode_decode_display_timing(dev_ofnode(dev), index, config); | |
1256 | } | |
1257 | ||
0347cc77 NJ |
1258 | static inline int dev_decode_panel_timing(const struct udevice *dev, |
1259 | struct display_timing *config) | |
1260 | { | |
1261 | return ofnode_decode_panel_timing(dev_ofnode(dev), config); | |
1262 | } | |
1263 | ||
f3dd213e MB |
1264 | static inline ofnode dev_get_phy_node(const struct udevice *dev) |
1265 | { | |
1266 | return ofnode_get_phy_node(dev_ofnode(dev)); | |
1267 | } | |
1268 | ||
123ca114 MB |
1269 | static inline phy_interface_t dev_read_phy_mode(const struct udevice *dev) |
1270 | { | |
1271 | return ofnode_read_phy_mode(dev_ofnode(dev)); | |
1272 | } | |
1273 | ||
f11c7ab9 SG |
1274 | #endif /* CONFIG_DM_DEV_READ_INLINE */ |
1275 | ||
1276 | /** | |
1277 | * dev_for_each_subnode() - Helper function to iterate through subnodes | |
1278 | * | |
1279 | * This creates a for() loop which works through the subnodes in a device's | |
1280 | * device-tree node. | |
1281 | * | |
1282 | * @subnode: ofnode holding the current subnode | |
6de6a615 | 1283 | * @dev: device to use for interation (`struct udevice *`) |
f11c7ab9 SG |
1284 | */ |
1285 | #define dev_for_each_subnode(subnode, dev) \ | |
1286 | for (subnode = dev_read_first_subnode(dev); \ | |
1287 | ofnode_valid(subnode); \ | |
1288 | subnode = ofnode_next_subnode(subnode)) | |
1289 | ||
ce891fca PD |
1290 | /** |
1291 | * dev_for_each_property() - Helper function to iterate through property | |
1292 | * | |
1293 | * This creates a for() loop which works through the property in a device's | |
1294 | * device-tree node. | |
1295 | * | |
1296 | * @prop: struct ofprop holding the current property | |
6de6a615 | 1297 | * @dev: device to use for interation (`struct udevice *`) |
ce891fca PD |
1298 | */ |
1299 | #define dev_for_each_property(prop, dev) \ | |
1300 | for (int ret_prop = dev_read_first_prop(dev, &prop); \ | |
1301 | !ret_prop; \ | |
1302 | ret_prop = dev_read_next_prop(&prop)) | |
1303 | ||
f11c7ab9 | 1304 | #endif |