1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * property.c - Unified device property interface. |
4 | * |
5 | * Copyright (C) 2014, Intel Corporation |
6 | * Authors: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
7 | * Mika Westerberg <mika.westerberg@linux.intel.com> |
8 | */ |
9 | |
10 | #include <linux/acpi.h> |
11 | #include <linux/export.h> |
12 | #include <linux/kernel.h> |
13 | #include <linux/of.h> |
14 | #include <linux/of_address.h> |
15 | #include <linux/of_graph.h> |
16 | #include <linux/of_irq.h> |
17 | #include <linux/property.h> |
18 | #include <linux/etherdevice.h> |
19 | #include <linux/phy.h> |
20 | |
21 | struct fwnode_handle *dev_fwnode(struct device *dev) |
22 | { |
23 | return IS_ENABLED(CONFIG_OF) && dev->of_node ? |
24 | &dev->of_node->fwnode : dev->fwnode; |
25 | } |
26 | EXPORT_SYMBOL_GPL(dev_fwnode); |
27 | |
28 | /** |
29 | * device_property_present - check if a property of a device is present |
30 | * @dev: Device whose property is being checked |
31 | * @propname: Name of the property |
32 | * |
33 | * Check if property @propname is present in the device firmware description. |
34 | */ |
35 | bool device_property_present(struct device *dev, const char *propname) |
36 | { |
37 | return fwnode_property_present(dev_fwnode(dev), propname); |
38 | } |
39 | EXPORT_SYMBOL_GPL(device_property_present); |
40 | |
41 | /** |
42 | * fwnode_property_present - check if a property of a firmware node is present |
43 | * @fwnode: Firmware node whose property to check |
44 | * @propname: Name of the property |
45 | */ |
46 | bool fwnode_property_present(const struct fwnode_handle *fwnode, |
47 | const char *propname) |
48 | { |
49 | bool ret; |
50 | |
51 | ret = fwnode_call_bool_op(fwnode, property_present, propname); |
52 | if (ret == false && !IS_ERR_OR_NULL(fwnode) && |
53 | !IS_ERR_OR_NULL(fwnode->secondary)) |
54 | ret = fwnode_call_bool_op(fwnode->secondary, property_present, |
55 | propname); |
56 | return ret; |
57 | } |
58 | EXPORT_SYMBOL_GPL(fwnode_property_present); |
59 | |
60 | /** |
61 | * device_property_read_u8_array - return a u8 array property of a device |
62 | * @dev: Device to get the property of |
63 | * @propname: Name of the property |
64 | * @val: The values are stored here or %NULL to return the number of values |
65 | * @nval: Size of the @val array |
66 | * |
67 | * Function reads an array of u8 properties with @propname from the device |
68 | * firmware description and stores them to @val if found. |
69 | * |
70 | * Return: number of values if @val was %NULL, |
71 | * %0 if the property was found (success), |
72 | * %-EINVAL if given arguments are not valid, |
73 | * %-ENODATA if the property does not have a value, |
74 | * %-EPROTO if the property is not an array of numbers, |
75 | * %-EOVERFLOW if the size of the property is not as expected. |
76 | * %-ENXIO if no suitable firmware interface is present. |
77 | */ |
78 | int device_property_read_u8_array(struct device *dev, const char *propname, |
79 | u8 *val, size_t nval) |
80 | { |
81 | return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval); |
82 | } |
83 | EXPORT_SYMBOL_GPL(device_property_read_u8_array); |
84 | |
85 | /** |
86 | * device_property_read_u16_array - return a u16 array property of a device |
87 | * @dev: Device to get the property of |
88 | * @propname: Name of the property |
89 | * @val: The values are stored here or %NULL to return the number of values |
90 | * @nval: Size of the @val array |
91 | * |
92 | * Function reads an array of u16 properties with @propname from the device |
93 | * firmware description and stores them to @val if found. |
94 | * |
95 | * Return: number of values if @val was %NULL, |
96 | * %0 if the property was found (success), |
97 | * %-EINVAL if given arguments are not valid, |
98 | * %-ENODATA if the property does not have a value, |
99 | * %-EPROTO if the property is not an array of numbers, |
100 | * %-EOVERFLOW if the size of the property is not as expected. |
101 | * %-ENXIO if no suitable firmware interface is present. |
102 | */ |
103 | int device_property_read_u16_array(struct device *dev, const char *propname, |
104 | u16 *val, size_t nval) |
105 | { |
106 | return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval); |
107 | } |
108 | EXPORT_SYMBOL_GPL(device_property_read_u16_array); |
109 | |
110 | /** |
111 | * device_property_read_u32_array - return a u32 array property of a device |
112 | * @dev: Device to get the property of |
113 | * @propname: Name of the property |
114 | * @val: The values are stored here or %NULL to return the number of values |
115 | * @nval: Size of the @val array |
116 | * |
117 | * Function reads an array of u32 properties with @propname from the device |
118 | * firmware description and stores them to @val if found. |
119 | * |
120 | * Return: number of values if @val was %NULL, |
121 | * %0 if the property was found (success), |
122 | * %-EINVAL if given arguments are not valid, |
123 | * %-ENODATA if the property does not have a value, |
124 | * %-EPROTO if the property is not an array of numbers, |
125 | * %-EOVERFLOW if the size of the property is not as expected. |
126 | * %-ENXIO if no suitable firmware interface is present. |
127 | */ |
128 | int device_property_read_u32_array(struct device *dev, const char *propname, |
129 | u32 *val, size_t nval) |
130 | { |
131 | return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval); |
132 | } |
133 | EXPORT_SYMBOL_GPL(device_property_read_u32_array); |
134 | |
135 | /** |
136 | * device_property_read_u64_array - return a u64 array property of a device |
137 | * @dev: Device to get the property of |
138 | * @propname: Name of the property |
139 | * @val: The values are stored here or %NULL to return the number of values |
140 | * @nval: Size of the @val array |
141 | * |
142 | * Function reads an array of u64 properties with @propname from the device |
143 | * firmware description and stores them to @val if found. |
144 | * |
145 | * Return: number of values if @val was %NULL, |
146 | * %0 if the property was found (success), |
147 | * %-EINVAL if given arguments are not valid, |
148 | * %-ENODATA if the property does not have a value, |
149 | * %-EPROTO if the property is not an array of numbers, |
150 | * %-EOVERFLOW if the size of the property is not as expected. |
151 | * %-ENXIO if no suitable firmware interface is present. |
152 | */ |
153 | int device_property_read_u64_array(struct device *dev, const char *propname, |
154 | u64 *val, size_t nval) |
155 | { |
156 | return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval); |
157 | } |
158 | EXPORT_SYMBOL_GPL(device_property_read_u64_array); |
159 | |
160 | /** |
161 | * device_property_read_string_array - return a string array property of device |
162 | * @dev: Device to get the property of |
163 | * @propname: Name of the property |
164 | * @val: The values are stored here or %NULL to return the number of values |
165 | * @nval: Size of the @val array |
166 | * |
167 | * Function reads an array of string properties with @propname from the device |
168 | * firmware description and stores them to @val if found. |
169 | * |
170 | * Return: number of values read on success if @val is non-NULL, |
171 | * number of values available on success if @val is NULL, |
172 | * %-EINVAL if given arguments are not valid, |
173 | * %-ENODATA if the property does not have a value, |
174 | * %-EPROTO or %-EILSEQ if the property is not an array of strings, |
175 | * %-EOVERFLOW if the size of the property is not as expected. |
176 | * %-ENXIO if no suitable firmware interface is present. |
177 | */ |
178 | int device_property_read_string_array(struct device *dev, const char *propname, |
179 | const char **val, size_t nval) |
180 | { |
181 | return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval); |
182 | } |
183 | EXPORT_SYMBOL_GPL(device_property_read_string_array); |
184 | |
185 | /** |
186 | * device_property_read_string - return a string property of a device |
187 | * @dev: Device to get the property of |
188 | * @propname: Name of the property |
189 | * @val: The value is stored here |
190 | * |
191 | * Function reads property @propname from the device firmware description and |
192 | * stores the value into @val if found. The value is checked to be a string. |
193 | * |
194 | * Return: %0 if the property was found (success), |
195 | * %-EINVAL if given arguments are not valid, |
196 | * %-ENODATA if the property does not have a value, |
197 | * %-EPROTO or %-EILSEQ if the property type is not a string. |
198 | * %-ENXIO if no suitable firmware interface is present. |
199 | */ |
200 | int device_property_read_string(struct device *dev, const char *propname, |
201 | const char **val) |
202 | { |
203 | return fwnode_property_read_string(dev_fwnode(dev), propname, val); |
204 | } |
205 | EXPORT_SYMBOL_GPL(device_property_read_string); |
206 | |
207 | /** |
208 | * device_property_match_string - find a string in an array and return index |
209 | * @dev: Device to get the property of |
210 | * @propname: Name of the property holding the array |
211 | * @string: String to look for |
212 | * |
213 | * Find a given string in a string array and if it is found return the |
214 | * index back. |
215 | * |
216 | * Return: %0 if the property was found (success), |
217 | * %-EINVAL if given arguments are not valid, |
218 | * %-ENODATA if the property does not have a value, |
219 | * %-EPROTO if the property is not an array of strings, |
220 | * %-ENXIO if no suitable firmware interface is present. |
221 | */ |
222 | int device_property_match_string(struct device *dev, const char *propname, |
223 | const char *string) |
224 | { |
225 | return fwnode_property_match_string(dev_fwnode(dev), propname, string); |
226 | } |
227 | EXPORT_SYMBOL_GPL(device_property_match_string); |
228 | |
229 | static int fwnode_property_read_int_array(const struct fwnode_handle *fwnode, |
230 | const char *propname, |
231 | unsigned int elem_size, void *val, |
232 | size_t nval) |
233 | { |
234 | int ret; |
235 | |
236 | ret = fwnode_call_int_op(fwnode, property_read_int_array, propname, |
237 | elem_size, val, nval); |
238 | if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) && |
239 | !IS_ERR_OR_NULL(fwnode->secondary)) |
240 | ret = fwnode_call_int_op( |
241 | fwnode->secondary, property_read_int_array, propname, |
242 | elem_size, val, nval); |
243 | |
244 | return ret; |
245 | } |
246 | |
247 | /** |
248 | * fwnode_property_read_u8_array - return a u8 array property of firmware node |
249 | * @fwnode: Firmware node to get the property of |
250 | * @propname: Name of the property |
251 | * @val: The values are stored here or %NULL to return the number of values |
252 | * @nval: Size of the @val array |
253 | * |
254 | * Read an array of u8 properties with @propname from @fwnode and stores them to |
255 | * @val if found. |
256 | * |
257 | * Return: number of values if @val was %NULL, |
258 | * %0 if the property was found (success), |
259 | * %-EINVAL if given arguments are not valid, |
260 | * %-ENODATA if the property does not have a value, |
261 | * %-EPROTO if the property is not an array of numbers, |
262 | * %-EOVERFLOW if the size of the property is not as expected, |
263 | * %-ENXIO if no suitable firmware interface is present. |
264 | */ |
265 | int fwnode_property_read_u8_array(const struct fwnode_handle *fwnode, |
266 | const char *propname, u8 *val, size_t nval) |
267 | { |
268 | return fwnode_property_read_int_array(fwnode, propname, sizeof(u8), |
269 | val, nval); |
270 | } |
271 | EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array); |
272 | |
273 | /** |
274 | * fwnode_property_read_u16_array - return a u16 array property of firmware node |
275 | * @fwnode: Firmware node to get the property of |
276 | * @propname: Name of the property |
277 | * @val: The values are stored here or %NULL to return the number of values |
278 | * @nval: Size of the @val array |
279 | * |
280 | * Read an array of u16 properties with @propname from @fwnode and store them to |
281 | * @val if found. |
282 | * |
283 | * Return: number of values if @val was %NULL, |
284 | * %0 if the property was found (success), |
285 | * %-EINVAL if given arguments are not valid, |
286 | * %-ENODATA if the property does not have a value, |
287 | * %-EPROTO if the property is not an array of numbers, |
288 | * %-EOVERFLOW if the size of the property is not as expected, |
289 | * %-ENXIO if no suitable firmware interface is present. |
290 | */ |
291 | int fwnode_property_read_u16_array(const struct fwnode_handle *fwnode, |
292 | const char *propname, u16 *val, size_t nval) |
293 | { |
294 | return fwnode_property_read_int_array(fwnode, propname, sizeof(u16), |
295 | val, nval); |
296 | } |
297 | EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array); |
298 | |
299 | /** |
300 | * fwnode_property_read_u32_array - return a u32 array property of firmware node |
301 | * @fwnode: Firmware node to get the property of |
302 | * @propname: Name of the property |
303 | * @val: The values are stored here or %NULL to return the number of values |
304 | * @nval: Size of the @val array |
305 | * |
306 | * Read an array of u32 properties with @propname from @fwnode store them to |
307 | * @val if found. |
308 | * |
309 | * Return: number of values if @val was %NULL, |
310 | * %0 if the property was found (success), |
311 | * %-EINVAL if given arguments are not valid, |
312 | * %-ENODATA if the property does not have a value, |
313 | * %-EPROTO if the property is not an array of numbers, |
314 | * %-EOVERFLOW if the size of the property is not as expected, |
315 | * %-ENXIO if no suitable firmware interface is present. |
316 | */ |
317 | int fwnode_property_read_u32_array(const struct fwnode_handle *fwnode, |
318 | const char *propname, u32 *val, size_t nval) |
319 | { |
320 | return fwnode_property_read_int_array(fwnode, propname, sizeof(u32), |
321 | val, nval); |
322 | } |
323 | EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array); |
324 | |
325 | /** |
326 | * fwnode_property_read_u64_array - return a u64 array property firmware node |
327 | * @fwnode: Firmware node to get the property of |
328 | * @propname: Name of the property |
329 | * @val: The values are stored here or %NULL to return the number of values |
330 | * @nval: Size of the @val array |
331 | * |
332 | * Read an array of u64 properties with @propname from @fwnode and store them to |
333 | * @val if found. |
334 | * |
335 | * Return: number of values if @val was %NULL, |
336 | * %0 if the property was found (success), |
337 | * %-EINVAL if given arguments are not valid, |
338 | * %-ENODATA if the property does not have a value, |
339 | * %-EPROTO if the property is not an array of numbers, |
340 | * %-EOVERFLOW if the size of the property is not as expected, |
341 | * %-ENXIO if no suitable firmware interface is present. |
342 | */ |
343 | int fwnode_property_read_u64_array(const struct fwnode_handle *fwnode, |
344 | const char *propname, u64 *val, size_t nval) |
345 | { |
346 | return fwnode_property_read_int_array(fwnode, propname, sizeof(u64), |
347 | val, nval); |
348 | } |
349 | EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array); |
350 | |
351 | /** |
352 | * fwnode_property_read_string_array - return string array property of a node |
353 | * @fwnode: Firmware node to get the property of |
354 | * @propname: Name of the property |
355 | * @val: The values are stored here or %NULL to return the number of values |
356 | * @nval: Size of the @val array |
357 | * |
358 | * Read an string list property @propname from the given firmware node and store |
359 | * them to @val if found. |
360 | * |
361 | * Return: number of values read on success if @val is non-NULL, |
362 | * number of values available on success if @val is NULL, |
363 | * %-EINVAL if given arguments are not valid, |
364 | * %-ENODATA if the property does not have a value, |
365 | * %-EPROTO or %-EILSEQ if the property is not an array of strings, |
366 | * %-EOVERFLOW if the size of the property is not as expected, |
367 | * %-ENXIO if no suitable firmware interface is present. |
368 | */ |
369 | int fwnode_property_read_string_array(const struct fwnode_handle *fwnode, |
370 | const char *propname, const char **val, |
371 | size_t nval) |
372 | { |
373 | int ret; |
374 | |
375 | ret = fwnode_call_int_op(fwnode, property_read_string_array, propname, |
376 | val, nval); |
377 | if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) && |
378 | !IS_ERR_OR_NULL(fwnode->secondary)) |
379 | ret = fwnode_call_int_op(fwnode->secondary, |
380 | property_read_string_array, propname, |
381 | val, nval); |
382 | return ret; |
383 | } |
384 | EXPORT_SYMBOL_GPL(fwnode_property_read_string_array); |
385 | |
386 | /** |
387 | * fwnode_property_read_string - return a string property of a firmware node |
388 | * @fwnode: Firmware node to get the property of |
389 | * @propname: Name of the property |
390 | * @val: The value is stored here |
391 | * |
392 | * Read property @propname from the given firmware node and store the value into |
393 | * @val if found. The value is checked to be a string. |
394 | * |
395 | * Return: %0 if the property was found (success), |
396 | * %-EINVAL if given arguments are not valid, |
397 | * %-ENODATA if the property does not have a value, |
398 | * %-EPROTO or %-EILSEQ if the property is not a string, |
399 | * %-ENXIO if no suitable firmware interface is present. |
400 | */ |
401 | int fwnode_property_read_string(const struct fwnode_handle *fwnode, |
402 | const char *propname, const char **val) |
403 | { |
404 | int ret = fwnode_property_read_string_array(fwnode, propname, val, 1); |
405 | |
406 | return ret < 0 ? ret : 0; |
407 | } |
408 | EXPORT_SYMBOL_GPL(fwnode_property_read_string); |
409 | |
410 | /** |
411 | * fwnode_property_match_string - find a string in an array and return index |
412 | * @fwnode: Firmware node to get the property of |
413 | * @propname: Name of the property holding the array |
414 | * @string: String to look for |
415 | * |
416 | * Find a given string in a string array and if it is found return the |
417 | * index back. |
418 | * |
419 | * Return: %0 if the property was found (success), |
420 | * %-EINVAL if given arguments are not valid, |
421 | * %-ENODATA if the property does not have a value, |
422 | * %-EPROTO if the property is not an array of strings, |
423 | * %-ENXIO if no suitable firmware interface is present. |
424 | */ |
425 | int fwnode_property_match_string(const struct fwnode_handle *fwnode, |
426 | const char *propname, const char *string) |
427 | { |
428 | const char **values; |
429 | int nval, ret; |
430 | |
431 | nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0); |
432 | if (nval < 0) |
433 | return nval; |
434 | |
435 | if (nval == 0) |
436 | return -ENODATA; |
437 | |
438 | values = kcalloc(nval, sizeof(*values), GFP_KERNEL); |
439 | if (!values) |
440 | return -ENOMEM; |
441 | |
442 | ret = fwnode_property_read_string_array(fwnode, propname, values, nval); |
443 | if (ret < 0) |
444 | goto out; |
445 | |
446 | ret = match_string(values, nval, string); |
447 | if (ret < 0) |
448 | ret = -ENODATA; |
449 | out: |
450 | kfree(values); |
451 | return ret; |
452 | } |
453 | EXPORT_SYMBOL_GPL(fwnode_property_match_string); |
454 | |
455 | /** |
456 | * fwnode_property_get_reference_args() - Find a reference with arguments |
457 | * @fwnode: Firmware node where to look for the reference |
458 | * @prop: The name of the property |
459 | * @nargs_prop: The name of the property telling the number of |
460 | * arguments in the referred node. NULL if @nargs is known, |
461 | * otherwise @nargs is ignored. Only relevant on OF. |
462 | * @nargs: Number of arguments. Ignored if @nargs_prop is non-NULL. |
463 | * @index: Index of the reference, from zero onwards. |
464 | * @args: Result structure with reference and integer arguments. |
465 | * |
466 | * Obtain a reference based on a named property in an fwnode, with |
467 | * integer arguments. |
468 | * |
469 | * Caller is responsible to call fwnode_handle_put() on the returned |
470 | * args->fwnode pointer. |
471 | * |
472 | * Returns: %0 on success |
473 | * %-ENOENT when the index is out of bounds, the index has an empty |
474 | * reference or the property was not found |
475 | * %-EINVAL on parse error |
476 | */ |
477 | int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, |
478 | const char *prop, const char *nargs_prop, |
479 | unsigned int nargs, unsigned int index, |
480 | struct fwnode_reference_args *args) |
481 | { |
482 | return fwnode_call_int_op(fwnode, get_reference_args, prop, nargs_prop, |
483 | nargs, index, args); |
484 | } |
485 | EXPORT_SYMBOL_GPL(fwnode_property_get_reference_args); |
486 | |
487 | /** |
488 | * device_remove_properties - Remove properties from a device object. |
489 | * @dev: Device whose properties to remove. |
490 | * |
491 | * The function removes properties previously associated to the device |
492 | * firmware node with device_add_properties(). Memory allocated to the |
493 | * properties will also be released. |
494 | */ |
495 | void device_remove_properties(struct device *dev) |
496 | { |
497 | struct fwnode_handle *fwnode = dev_fwnode(dev); |
498 | |
499 | if (!fwnode) |
500 | return; |
501 | |
502 | if (is_software_node(fwnode->secondary)) { |
503 | fwnode_remove_software_node(fwnode->secondary); |
504 | set_secondary_fwnode(dev, NULL); |
505 | } |
506 | } |
507 | EXPORT_SYMBOL_GPL(device_remove_properties); |
508 | |
509 | /** |
510 | * device_add_properties - Add a collection of properties to a device object. |
511 | * @dev: Device to add properties to. |
512 | * @properties: Collection of properties to add. |
513 | * |
514 | * Associate a collection of device properties represented by @properties with |
515 | * @dev. The function takes a copy of @properties. |
516 | * |
517 | * WARNING: The callers should not use this function if it is known that there |
518 | * is no real firmware node associated with @dev! In that case the callers |
519 | * should create a software node and assign it to @dev directly. |
520 | */ |
521 | int device_add_properties(struct device *dev, |
522 | const struct property_entry *properties) |
523 | { |
524 | struct fwnode_handle *fwnode; |
525 | |
526 | fwnode = fwnode_create_software_node(properties, NULL); |
527 | if (IS_ERR(fwnode)) |
528 | return PTR_ERR(fwnode); |
529 | |
530 | set_secondary_fwnode(dev, fwnode); |
531 | return 0; |
532 | } |
533 | EXPORT_SYMBOL_GPL(device_add_properties); |
534 | |
535 | /** |
536 | * fwnode_get_next_parent - Iterate to the node's parent |
537 | * @fwnode: Firmware whose parent is retrieved |
538 | * |
539 | * This is like fwnode_get_parent() except that it drops the refcount |
540 | * on the passed node, making it suitable for iterating through a |
541 | * node's parents. |
542 | * |
543 | * Returns a node pointer with refcount incremented, use |
544 | * fwnode_handle_node() on it when done. |
545 | */ |
546 | struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode) |
547 | { |
548 | struct fwnode_handle *parent = fwnode_get_parent(fwnode); |
549 | |
550 | fwnode_handle_put(fwnode); |
551 | |
552 | return parent; |
553 | } |
554 | EXPORT_SYMBOL_GPL(fwnode_get_next_parent); |
555 | |
556 | /** |
557 | * fwnode_get_parent - Return parent firwmare node |
558 | * @fwnode: Firmware whose parent is retrieved |
559 | * |
560 | * Return parent firmware node of the given node if possible or %NULL if no |
561 | * parent was available. |
562 | */ |
563 | struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode) |
564 | { |
565 | return fwnode_call_ptr_op(fwnode, get_parent); |
566 | } |
567 | EXPORT_SYMBOL_GPL(fwnode_get_parent); |
568 | |
569 | /** |
570 | * fwnode_get_next_child_node - Return the next child node handle for a node |
571 | * @fwnode: Firmware node to find the next child node for. |
572 | * @child: Handle to one of the node's child nodes or a %NULL handle. |
573 | */ |
574 | struct fwnode_handle * |
575 | fwnode_get_next_child_node(const struct fwnode_handle *fwnode, |
576 | struct fwnode_handle *child) |
577 | { |
578 | return fwnode_call_ptr_op(fwnode, get_next_child_node, child); |
579 | } |
580 | EXPORT_SYMBOL_GPL(fwnode_get_next_child_node); |
581 | |
582 | /** |
583 | * fwnode_get_next_available_child_node - Return the next |
584 | * available child node handle for a node |
585 | * @fwnode: Firmware node to find the next child node for. |
586 | * @child: Handle to one of the node's child nodes or a %NULL handle. |
587 | */ |
588 | struct fwnode_handle * |
589 | fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode, |
590 | struct fwnode_handle *child) |
591 | { |
592 | struct fwnode_handle *next_child = child; |
593 | |
594 | if (!fwnode) |
595 | return NULL; |
596 | |
597 | do { |
598 | next_child = fwnode_get_next_child_node(fwnode, next_child); |
599 | |
600 | if (!next_child || fwnode_device_is_available(next_child)) |
601 | break; |
602 | } while (next_child); |
603 | |
604 | return next_child; |
605 | } |
606 | EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node); |
607 | |
608 | /** |
609 | * device_get_next_child_node - Return the next child node handle for a device |
610 | * @dev: Device to find the next child node for. |
611 | * @child: Handle to one of the device's child nodes or a null handle. |
612 | */ |
613 | struct fwnode_handle *device_get_next_child_node(struct device *dev, |
614 | struct fwnode_handle *child) |
615 | { |
616 | struct acpi_device *adev = ACPI_COMPANION(dev); |
617 | struct fwnode_handle *fwnode = NULL; |
618 | |
619 | if (dev->of_node) |
620 | fwnode = &dev->of_node->fwnode; |
621 | else if (adev) |
622 | fwnode = acpi_fwnode_handle(adev); |
623 | |
624 | return fwnode_get_next_child_node(fwnode, child); |
625 | } |
626 | EXPORT_SYMBOL_GPL(device_get_next_child_node); |
627 | |
628 | /** |
629 | * fwnode_get_named_child_node - Return first matching named child node handle |
630 | * @fwnode: Firmware node to find the named child node for. |
631 | * @childname: String to match child node name against. |
632 | */ |
633 | struct fwnode_handle * |
634 | fwnode_get_named_child_node(const struct fwnode_handle *fwnode, |
635 | const char *childname) |
636 | { |
637 | return fwnode_call_ptr_op(fwnode, get_named_child_node, childname); |
638 | } |
639 | EXPORT_SYMBOL_GPL(fwnode_get_named_child_node); |
640 | |
641 | /** |
642 | * device_get_named_child_node - Return first matching named child node handle |
643 | * @dev: Device to find the named child node for. |
644 | * @childname: String to match child node name against. |
645 | */ |
646 | struct fwnode_handle *device_get_named_child_node(struct device *dev, |
647 | const char *childname) |
648 | { |
649 | return fwnode_get_named_child_node(dev_fwnode(dev), childname); |
650 | } |
651 | EXPORT_SYMBOL_GPL(device_get_named_child_node); |
652 | |
653 | /** |
654 | * fwnode_handle_get - Obtain a reference to a device node |
655 | * @fwnode: Pointer to the device node to obtain the reference to. |
656 | * |
657 | * Returns the fwnode handle. |
658 | */ |
659 | struct fwnode_handle *fwnode_handle_get(struct fwnode_handle *fwnode) |
660 | { |
661 | if (!fwnode_has_op(fwnode, get)) |
662 | return fwnode; |
663 | |
664 | return fwnode_call_ptr_op(fwnode, get); |
665 | } |
666 | EXPORT_SYMBOL_GPL(fwnode_handle_get); |
667 | |
668 | /** |
669 | * fwnode_handle_put - Drop reference to a device node |
670 | * @fwnode: Pointer to the device node to drop the reference to. |
671 | * |
672 | * This has to be used when terminating device_for_each_child_node() iteration |
673 | * with break or return to prevent stale device node references from being left |
674 | * behind. |
675 | */ |
676 | void fwnode_handle_put(struct fwnode_handle *fwnode) |
677 | { |
678 | fwnode_call_void_op(fwnode, put); |
679 | } |
680 | EXPORT_SYMBOL_GPL(fwnode_handle_put); |
681 | |
682 | /** |
683 | * fwnode_device_is_available - check if a device is available for use |
684 | * @fwnode: Pointer to the fwnode of the device. |
685 | */ |
686 | bool fwnode_device_is_available(const struct fwnode_handle *fwnode) |
687 | { |
688 | return fwnode_call_bool_op(fwnode, device_is_available); |
689 | } |
690 | EXPORT_SYMBOL_GPL(fwnode_device_is_available); |
691 | |
692 | /** |
693 | * device_get_child_node_count - return the number of child nodes for device |
694 | * @dev: Device to cound the child nodes for |
695 | */ |
696 | unsigned int device_get_child_node_count(struct device *dev) |
697 | { |
698 | struct fwnode_handle *child; |
699 | unsigned int count = 0; |
700 | |
701 | device_for_each_child_node(dev, child) |
702 | count++; |
703 | |
704 | return count; |
705 | } |
706 | EXPORT_SYMBOL_GPL(device_get_child_node_count); |
707 | |
708 | bool device_dma_supported(struct device *dev) |
709 | { |
710 | /* For DT, this is always supported. |
711 | * For ACPI, this depends on CCA, which |
712 | * is determined by the acpi_dma_supported(). |
713 | */ |
714 | if (IS_ENABLED(CONFIG_OF) && dev->of_node) |
715 | return true; |
716 | |
717 | return acpi_dma_supported(ACPI_COMPANION(dev)); |
718 | } |
719 | EXPORT_SYMBOL_GPL(device_dma_supported); |
720 | |
721 | enum dev_dma_attr device_get_dma_attr(struct device *dev) |
722 | { |
723 | enum dev_dma_attr attr = DEV_DMA_NOT_SUPPORTED; |
724 | |
725 | if (IS_ENABLED(CONFIG_OF) && dev->of_node) { |
726 | if (of_dma_is_coherent(dev->of_node)) |
727 | attr = DEV_DMA_COHERENT; |
728 | else |
729 | attr = DEV_DMA_NON_COHERENT; |
730 | } else |
731 | attr = acpi_get_dma_attr(ACPI_COMPANION(dev)); |
732 | |
733 | return attr; |
734 | } |
735 | EXPORT_SYMBOL_GPL(device_get_dma_attr); |
736 | |
737 | /** |
738 | * fwnode_get_phy_mode - Get phy mode for given firmware node |
739 | * @fwnode: Pointer to the given node |
740 | * |
741 | * The function gets phy interface string from property 'phy-mode' or |
742 | * 'phy-connection-type', and return its index in phy_modes table, or errno in |
743 | * error case. |
744 | */ |
745 | int fwnode_get_phy_mode(struct fwnode_handle *fwnode) |
746 | { |
747 | const char *pm; |
748 | int err, i; |
749 | |
750 | err = fwnode_property_read_string(fwnode, "phy-mode" , &pm); |
751 | if (err < 0) |
752 | err = fwnode_property_read_string(fwnode, |
753 | "phy-connection-type" , &pm); |
754 | if (err < 0) |
755 | return err; |
756 | |
757 | for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++) |
758 | if (!strcasecmp(pm, phy_modes(i))) |
759 | return i; |
760 | |
761 | return -ENODEV; |
762 | } |
763 | EXPORT_SYMBOL_GPL(fwnode_get_phy_mode); |
764 | |
765 | /** |
766 | * device_get_phy_mode - Get phy mode for given device |
767 | * @dev: Pointer to the given device |
768 | * |
769 | * The function gets phy interface string from property 'phy-mode' or |
770 | * 'phy-connection-type', and return its index in phy_modes table, or errno in |
771 | * error case. |
772 | */ |
773 | int device_get_phy_mode(struct device *dev) |
774 | { |
775 | return fwnode_get_phy_mode(dev_fwnode(dev)); |
776 | } |
777 | EXPORT_SYMBOL_GPL(device_get_phy_mode); |
778 | |
779 | static void *fwnode_get_mac_addr(struct fwnode_handle *fwnode, |
780 | const char *name, char *addr, |
781 | int alen) |
782 | { |
783 | int ret = fwnode_property_read_u8_array(fwnode, name, addr, alen); |
784 | |
785 | if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr)) |
786 | return addr; |
787 | return NULL; |
788 | } |
789 | |
790 | /** |
791 | * fwnode_get_mac_address - Get the MAC from the firmware node |
792 | * @fwnode: Pointer to the firmware node |
793 | * @addr: Address of buffer to store the MAC in |
794 | * @alen: Length of the buffer pointed to by addr, should be ETH_ALEN |
795 | * |
796 | * Search the firmware node for the best MAC address to use. 'mac-address' is |
797 | * checked first, because that is supposed to contain to "most recent" MAC |
798 | * address. If that isn't set, then 'local-mac-address' is checked next, |
799 | * because that is the default address. If that isn't set, then the obsolete |
800 | * 'address' is checked, just in case we're using an old device tree. |
801 | * |
802 | * Note that the 'address' property is supposed to contain a virtual address of |
803 | * the register set, but some DTS files have redefined that property to be the |
804 | * MAC address. |
805 | * |
806 | * All-zero MAC addresses are rejected, because those could be properties that |
807 | * exist in the firmware tables, but were not updated by the firmware. For |
808 | * example, the DTS could define 'mac-address' and 'local-mac-address', with |
809 | * zero MAC addresses. Some older U-Boots only initialized 'local-mac-address'. |
810 | * In this case, the real MAC is in 'local-mac-address', and 'mac-address' |
811 | * exists but is all zeros. |
812 | */ |
813 | void *fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr, int alen) |
814 | { |
815 | char *res; |
816 | |
817 | res = fwnode_get_mac_addr(fwnode, "mac-address" , addr, alen); |
818 | if (res) |
819 | return res; |
820 | |
821 | res = fwnode_get_mac_addr(fwnode, "local-mac-address" , addr, alen); |
822 | if (res) |
823 | return res; |
824 | |
825 | return fwnode_get_mac_addr(fwnode, "address" , addr, alen); |
826 | } |
827 | EXPORT_SYMBOL(fwnode_get_mac_address); |
828 | |
829 | /** |
830 | * device_get_mac_address - Get the MAC for a given device |
831 | * @dev: Pointer to the device |
832 | * @addr: Address of buffer to store the MAC in |
833 | * @alen: Length of the buffer pointed to by addr, should be ETH_ALEN |
834 | */ |
835 | void *device_get_mac_address(struct device *dev, char *addr, int alen) |
836 | { |
837 | return fwnode_get_mac_address(dev_fwnode(dev), addr, alen); |
838 | } |
839 | EXPORT_SYMBOL(device_get_mac_address); |
840 | |
841 | /** |
842 | * fwnode_irq_get - Get IRQ directly from a fwnode |
843 | * @fwnode: Pointer to the firmware node |
844 | * @index: Zero-based index of the IRQ |
845 | * |
846 | * Returns Linux IRQ number on success. Other values are determined |
847 | * accordingly to acpi_/of_ irq_get() operation. |
848 | */ |
849 | int fwnode_irq_get(struct fwnode_handle *fwnode, unsigned int index) |
850 | { |
851 | struct device_node *of_node = to_of_node(fwnode); |
852 | struct resource res; |
853 | int ret; |
854 | |
855 | if (IS_ENABLED(CONFIG_OF) && of_node) |
856 | return of_irq_get(of_node, index); |
857 | |
858 | ret = acpi_irq_get(ACPI_HANDLE_FWNODE(fwnode), index, &res); |
859 | if (ret) |
860 | return ret; |
861 | |
862 | return res.start; |
863 | } |
864 | EXPORT_SYMBOL(fwnode_irq_get); |
865 | |
866 | /** |
867 | * fwnode_graph_get_next_endpoint - Get next endpoint firmware node |
868 | * @fwnode: Pointer to the parent firmware node |
869 | * @prev: Previous endpoint node or %NULL to get the first |
870 | * |
871 | * Returns an endpoint firmware node pointer or %NULL if no more endpoints |
872 | * are available. |
873 | */ |
874 | struct fwnode_handle * |
875 | fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode, |
876 | struct fwnode_handle *prev) |
877 | { |
878 | return fwnode_call_ptr_op(fwnode, graph_get_next_endpoint, prev); |
879 | } |
880 | EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint); |
881 | |
882 | /** |
883 | * fwnode_graph_get_port_parent - Return the device fwnode of a port endpoint |
884 | * @endpoint: Endpoint firmware node of the port |
885 | * |
886 | * Return: the firmware node of the device the @endpoint belongs to. |
887 | */ |
888 | struct fwnode_handle * |
889 | fwnode_graph_get_port_parent(const struct fwnode_handle *endpoint) |
890 | { |
891 | struct fwnode_handle *port, *parent; |
892 | |
893 | port = fwnode_get_parent(endpoint); |
894 | parent = fwnode_call_ptr_op(port, graph_get_port_parent); |
895 | |
896 | fwnode_handle_put(port); |
897 | |
898 | return parent; |
899 | } |
900 | EXPORT_SYMBOL_GPL(fwnode_graph_get_port_parent); |
901 | |
902 | /** |
903 | * fwnode_graph_get_remote_port_parent - Return fwnode of a remote device |
904 | * @fwnode: Endpoint firmware node pointing to the remote endpoint |
905 | * |
906 | * Extracts firmware node of a remote device the @fwnode points to. |
907 | */ |
908 | struct fwnode_handle * |
909 | fwnode_graph_get_remote_port_parent(const struct fwnode_handle *fwnode) |
910 | { |
911 | struct fwnode_handle *endpoint, *parent; |
912 | |
913 | endpoint = fwnode_graph_get_remote_endpoint(fwnode); |
914 | parent = fwnode_graph_get_port_parent(endpoint); |
915 | |
916 | fwnode_handle_put(endpoint); |
917 | |
918 | return parent; |
919 | } |
920 | EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent); |
921 | |
922 | /** |
923 | * fwnode_graph_get_remote_port - Return fwnode of a remote port |
924 | * @fwnode: Endpoint firmware node pointing to the remote endpoint |
925 | * |
926 | * Extracts firmware node of a remote port the @fwnode points to. |
927 | */ |
928 | struct fwnode_handle * |
929 | fwnode_graph_get_remote_port(const struct fwnode_handle *fwnode) |
930 | { |
931 | return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode)); |
932 | } |
933 | EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port); |
934 | |
935 | /** |
936 | * fwnode_graph_get_remote_endpoint - Return fwnode of a remote endpoint |
937 | * @fwnode: Endpoint firmware node pointing to the remote endpoint |
938 | * |
939 | * Extracts firmware node of a remote endpoint the @fwnode points to. |
940 | */ |
941 | struct fwnode_handle * |
942 | fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode) |
943 | { |
944 | return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint); |
945 | } |
946 | EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint); |
947 | |
948 | /** |
949 | * fwnode_graph_get_remote_node - get remote parent node for given port/endpoint |
950 | * @fwnode: pointer to parent fwnode_handle containing graph port/endpoint |
951 | * @port_id: identifier of the parent port node |
952 | * @endpoint_id: identifier of the endpoint node |
953 | * |
954 | * Return: Remote fwnode handle associated with remote endpoint node linked |
955 | * to @node. Use fwnode_node_put() on it when done. |
956 | */ |
957 | struct fwnode_handle * |
958 | fwnode_graph_get_remote_node(const struct fwnode_handle *fwnode, u32 port_id, |
959 | u32 endpoint_id) |
960 | { |
961 | struct fwnode_handle *endpoint = NULL; |
962 | |
963 | while ((endpoint = fwnode_graph_get_next_endpoint(fwnode, endpoint))) { |
964 | struct fwnode_endpoint fwnode_ep; |
965 | struct fwnode_handle *remote; |
966 | int ret; |
967 | |
968 | ret = fwnode_graph_parse_endpoint(endpoint, &fwnode_ep); |
969 | if (ret < 0) |
970 | continue; |
971 | |
972 | if (fwnode_ep.port != port_id || fwnode_ep.id != endpoint_id) |
973 | continue; |
974 | |
975 | remote = fwnode_graph_get_remote_port_parent(endpoint); |
976 | if (!remote) |
977 | return NULL; |
978 | |
979 | return fwnode_device_is_available(remote) ? remote : NULL; |
980 | } |
981 | |
982 | return NULL; |
983 | } |
984 | EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_node); |
985 | |
986 | /** |
987 | * fwnode_graph_parse_endpoint - parse common endpoint node properties |
988 | * @fwnode: pointer to endpoint fwnode_handle |
989 | * @endpoint: pointer to the fwnode endpoint data structure |
990 | * |
991 | * Parse @fwnode representing a graph endpoint node and store the |
992 | * information in @endpoint. The caller must hold a reference to |
993 | * @fwnode. |
994 | */ |
995 | int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, |
996 | struct fwnode_endpoint *endpoint) |
997 | { |
998 | memset(endpoint, 0, sizeof(*endpoint)); |
999 | |
1000 | return fwnode_call_int_op(fwnode, graph_parse_endpoint, endpoint); |
1001 | } |
1002 | EXPORT_SYMBOL(fwnode_graph_parse_endpoint); |
1003 | |
1004 | const void *device_get_match_data(struct device *dev) |
1005 | { |
1006 | return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev); |
1007 | } |
1008 | EXPORT_SYMBOL_GPL(device_get_match_data); |
1009 | |