1 /* SPDX-License-Identifier: GPL-2.0+ */ 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 <sjg@chromium.org> 7 */ 8 9 #ifndef _DM_READ_H 10 #define _DM_READ_H 11 12 #include <dm/fdtaddr.h> 13 #include <dm/ofnode.h> 14 #include <dm/uclass.h> 15 16 struct resource; 17 18 #if CONFIG_IS_ENABLED(OF_LIVE) 19 static inline const struct device_node *dev_np(struct udevice *dev) 20 { 21 return ofnode_to_np(dev->node); 22 } 23 #else 24 static inline const struct device_node *dev_np(struct udevice *dev) 25 { 26 return NULL; 27 } 28 #endif 29 30 /** 31 * dev_ofnode() - get the DT node reference associated with a udevice 32 * 33 * @dev: device to check 34 * @return reference of the the device's DT node 35 */ 36 static inline ofnode dev_ofnode(struct udevice *dev) 37 { 38 return dev->node; 39 } 40 41 static inline bool dev_of_valid(struct udevice *dev) 42 { 43 return ofnode_valid(dev_ofnode(dev)); 44 } 45 46 #ifndef CONFIG_DM_DEV_READ_INLINE 47 /** 48 * dev_read_u32() - read a 32-bit integer from a device's DT property 49 * 50 * @dev: device to read DT property from 51 * @propname: name of the property to read from 52 * @outp: place to put value (if found) 53 * @return 0 if OK, -ve on error 54 */ 55 int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp); 56 57 /** 58 * dev_read_u32_default() - read a 32-bit integer from a device's DT property 59 * 60 * @dev: device to read DT property from 61 * @propname: name of the property to read from 62 * @def: default value to return if the property has no value 63 * @return property value, or @def if not found 64 */ 65 int dev_read_u32_default(struct udevice *dev, const char *propname, int def); 66 67 /** 68 * dev_read_string() - Read a string from a device's DT property 69 * 70 * @dev: device to read DT property from 71 * @propname: name of the property to read 72 * @return string from property value, or NULL if there is no such property 73 */ 74 const char *dev_read_string(struct udevice *dev, const char *propname); 75 76 /** 77 * dev_read_bool() - read a boolean value from a device's DT property 78 * 79 * @dev: device to read DT property from 80 * @propname: name of property to read 81 * @return true if property is present (meaning true), false if not present 82 */ 83 bool dev_read_bool(struct udevice *dev, const char *propname); 84 85 /** 86 * dev_read_subnode() - find a named subnode of a device 87 * 88 * @dev: device whose DT node contains the subnode 89 * @subnode_name: name of subnode to find 90 * @return reference to subnode (which can be invalid if there is no such 91 * subnode) 92 */ 93 ofnode dev_read_subnode(struct udevice *dev, const char *subbnode_name); 94 95 /** 96 * dev_read_size() - read the size of a property 97 * 98 * @dev: device to check 99 * @propname: property to check 100 * @return size of property if present, or -EINVAL if not 101 */ 102 int dev_read_size(struct udevice *dev, const char *propname); 103 104 /** 105 * dev_read_addr_index() - Get the indexed reg property of a device 106 * 107 * @dev: Device to read from 108 * @index: the 'reg' property can hold a list of <addr, size> pairs 109 * and @index is used to select which one is required 110 * 111 * @return address or FDT_ADDR_T_NONE if not found 112 */ 113 fdt_addr_t dev_read_addr_index(struct udevice *dev, int index); 114 115 /** 116 * dev_remap_addr_index() - Get the indexed reg property of a device 117 * as a memory-mapped I/O pointer 118 * 119 * @dev: Device to read from 120 * @index: the 'reg' property can hold a list of <addr, size> pairs 121 * and @index is used to select which one is required 122 * 123 * @return pointer or NULL if not found 124 */ 125 void *dev_remap_addr_index(struct udevice *dev, int index); 126 127 /** 128 * dev_read_addr() - Get the reg property of a device 129 * 130 * @dev: Device to read from 131 * 132 * @return address or FDT_ADDR_T_NONE if not found 133 */ 134 fdt_addr_t dev_read_addr(struct udevice *dev); 135 136 /** 137 * dev_read_addr_ptr() - Get the reg property of a device 138 * as a pointer 139 * 140 * @dev: Device to read from 141 * 142 * @return pointer or NULL if not found 143 */ 144 void *dev_read_addr_ptr(struct udevice *dev); 145 146 /** 147 * dev_remap_addr() - Get the reg property of a device as a 148 * memory-mapped I/O pointer 149 * 150 * @dev: Device to read from 151 * 152 * @return pointer or NULL if not found 153 */ 154 void *dev_remap_addr(struct udevice *dev); 155 156 /** 157 * dev_read_addr_size() - get address and size from a device property 158 * 159 * This does no address translation. It simply reads an property that contains 160 * an address and a size value, one after the other. 161 * 162 * @dev: Device to read from 163 * @propname: property to read 164 * @sizep: place to put size value (on success) 165 * @return address value, or FDT_ADDR_T_NONE on error 166 */ 167 fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *propname, 168 fdt_size_t *sizep); 169 170 /** 171 * dev_read_name() - get the name of a device's node 172 * 173 * @node: valid node to look up 174 * @return name of node 175 */ 176 const char *dev_read_name(struct udevice *dev); 177 178 /** 179 * dev_read_stringlist_search() - find string in a string list and return index 180 * 181 * Note that it is possible for this function to succeed on property values 182 * that are not NUL-terminated. That's because the function will stop after 183 * finding the first occurrence of @string. This can for example happen with 184 * small-valued cell properties, such as #address-cells, when searching for 185 * the empty string. 186 * 187 * @dev: device to check 188 * @propname: name of the property containing the string list 189 * @string: string to look up in the string list 190 * 191 * @return: 192 * the index of the string in the list of strings 193 * -ENODATA if the property is not found 194 * -EINVAL on some other error 195 */ 196 int dev_read_stringlist_search(struct udevice *dev, const char *property, 197 const char *string); 198 199 /** 200 * dev_read_string_index() - obtain an indexed string from a string list 201 * 202 * @dev: device to examine 203 * @propname: name of the property containing the string list 204 * @index: index of the string to return 205 * @out: return location for the string 206 * 207 * @return: 208 * length of string, if found or -ve error value if not found 209 */ 210 int dev_read_string_index(struct udevice *dev, const char *propname, int index, 211 const char **outp); 212 213 /** 214 * dev_read_string_count() - find the number of strings in a string list 215 * 216 * @dev: device to examine 217 * @propname: name of the property containing the string list 218 * @return: 219 * number of strings in the list, or -ve error value if not found 220 */ 221 int dev_read_string_count(struct udevice *dev, const char *propname); 222 /** 223 * dev_read_phandle_with_args() - Find a node pointed by phandle in a list 224 * 225 * This function is useful to parse lists of phandles and their arguments. 226 * Returns 0 on success and fills out_args, on error returns appropriate 227 * errno value. 228 * 229 * Caller is responsible to call of_node_put() on the returned out_args->np 230 * pointer. 231 * 232 * Example: 233 * 234 * phandle1: node1 { 235 * #list-cells = <2>; 236 * } 237 * 238 * phandle2: node2 { 239 * #list-cells = <1>; 240 * } 241 * 242 * node3 { 243 * list = <&phandle1 1 2 &phandle2 3>; 244 * } 245 * 246 * To get a device_node of the `node2' node you may call this: 247 * dev_read_phandle_with_args(dev, "list", "#list-cells", 0, 1, &args); 248 * 249 * @dev: device whose node containing a list 250 * @list_name: property name that contains a list 251 * @cells_name: property name that specifies phandles' arguments count 252 * @cells_count: Cell count to use if @cells_name is NULL 253 * @index: index of a phandle to parse out 254 * @out_args: optional pointer to output arguments structure (will be filled) 255 * @return 0 on success (with @out_args filled out if not NULL), -ENOENT if 256 * @list_name does not exist, -EINVAL if a phandle was not found, 257 * @cells_name could not be found, the arguments were truncated or there 258 * were too many arguments. 259 */ 260 int dev_read_phandle_with_args(struct udevice *dev, const char *list_name, 261 const char *cells_name, int cell_count, 262 int index, 263 struct ofnode_phandle_args *out_args); 264 265 /** 266 * dev_count_phandle_with_args() - Return phandle number in a list 267 * 268 * This function is usefull to get phandle number contained in a property list. 269 * For example, this allows to allocate the right amount of memory to keep 270 * clock's reference contained into the "clocks" property. 271 * 272 * 273 * @dev: device whose node containing a list 274 * @list_name: property name that contains a list 275 * @cells_name: property name that specifies phandles' arguments count 276 * @Returns number of phandle found on success, on error returns appropriate 277 * errno value. 278 */ 279 280 int dev_count_phandle_with_args(struct udevice *dev, const char *list_name, 281 const char *cells_name); 282 283 /** 284 * dev_read_addr_cells() - Get the number of address cells for a device's node 285 * 286 * This walks back up the tree to find the closest #address-cells property 287 * which controls the given node. 288 * 289 * @dev: device to check 290 * @return number of address cells this node uses 291 */ 292 int dev_read_addr_cells(struct udevice *dev); 293 294 /** 295 * dev_read_size_cells() - Get the number of size cells for a device's node 296 * 297 * This walks back up the tree to find the closest #size-cells property 298 * which controls the given node. 299 * 300 * @dev: device to check 301 * @return number of size cells this node uses 302 */ 303 int dev_read_size_cells(struct udevice *dev); 304 305 /** 306 * dev_read_addr_cells() - Get the address cells property in a node 307 * 308 * This function matches fdt_address_cells(). 309 * 310 * @dev: device to check 311 * @return number of address cells this node uses 312 */ 313 int dev_read_simple_addr_cells(struct udevice *dev); 314 315 /** 316 * dev_read_size_cells() - Get the size cells property in a node 317 * 318 * This function matches fdt_size_cells(). 319 * 320 * @dev: device to check 321 * @return number of size cells this node uses 322 */ 323 int dev_read_simple_size_cells(struct udevice *dev); 324 325 /** 326 * dev_read_phandle() - Get the phandle from a device 327 * 328 * @dev: device to check 329 * @return phandle (1 or greater), or 0 if no phandle or other error 330 */ 331 int dev_read_phandle(struct udevice *dev); 332 333 /** 334 * dev_read_prop()- - read a property from a device's node 335 * 336 * @dev: device to check 337 * @propname: property to read 338 * @lenp: place to put length on success 339 * @return pointer to property, or NULL if not found 340 */ 341 const void *dev_read_prop(struct udevice *dev, const char *propname, int *lenp); 342 343 /** 344 * dev_read_alias_seq() - Get the alias sequence number of a node 345 * 346 * This works out whether a node is pointed to by an alias, and if so, the 347 * sequence number of that alias. Aliases are of the form <base><num> where 348 * <num> is the sequence number. For example spi2 would be sequence number 2. 349 * 350 * @dev: device to look up 351 * @devnump: set to the sequence number if one is found 352 * @return 0 if a sequence was found, -ve if not 353 */ 354 int dev_read_alias_seq(struct udevice *dev, int *devnump); 355 356 /** 357 * dev_read_u32_array() - Find and read an array of 32 bit integers 358 * 359 * Search for a property in a device node and read 32-bit value(s) from 360 * it. 361 * 362 * The out_values is modified only if a valid u32 value can be decoded. 363 * 364 * @dev: device to look up 365 * @propname: name of the property to read 366 * @out_values: pointer to return value, modified only if return value is 0 367 * @sz: number of array elements to read 368 * @return 0 on success, -EINVAL if the property does not exist, -ENODATA if 369 * property does not have a value, and -EOVERFLOW if the property data isn't 370 * large enough. 371 */ 372 int dev_read_u32_array(struct udevice *dev, const char *propname, 373 u32 *out_values, size_t sz); 374 375 /** 376 * dev_read_first_subnode() - find the first subnode of a device's node 377 * 378 * @dev: device to look up 379 * @return reference to the first subnode (which can be invalid if the device's 380 * node has no subnodes) 381 */ 382 ofnode dev_read_first_subnode(struct udevice *dev); 383 384 /** 385 * ofnode_next_subnode() - find the next sibling of a subnode 386 * 387 * @node: valid reference to previous node (sibling) 388 * @return reference to the next subnode (which can be invalid if the node 389 * has no more siblings) 390 */ 391 ofnode dev_read_next_subnode(ofnode node); 392 393 /** 394 * dev_read_u8_array_ptr() - find an 8-bit array 395 * 396 * Look up a device's node property and return a pointer to its contents as a 397 * byte array of given length. The property must have at least enough data 398 * for the array (count bytes). It may have more, but this will be ignored. 399 * The data is not copied. 400 * 401 * @dev: device to look up 402 * @propname: name of property to find 403 * @sz: number of array elements 404 * @return pointer to byte array if found, or NULL if the property is not 405 * found or there is not enough data 406 */ 407 const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, const char *propname, 408 size_t sz); 409 410 /** 411 * dev_read_enabled() - check whether a node is enabled 412 * 413 * This looks for a 'status' property. If this exists, then returns 1 if 414 * the status is 'ok' and 0 otherwise. If there is no status property, 415 * it returns 1 on the assumption that anything mentioned should be enabled 416 * by default. 417 * 418 * @dev: device to examine 419 * @return integer value 0 (not enabled) or 1 (enabled) 420 */ 421 int dev_read_enabled(struct udevice *dev); 422 423 /** 424 * dev_read_resource() - obtain an indexed resource from a device. 425 * 426 * @dev: device to examine 427 * @index index of the resource to retrieve (0 = first) 428 * @res returns the resource 429 * @return 0 if ok, negative on error 430 */ 431 int dev_read_resource(struct udevice *dev, uint index, struct resource *res); 432 433 /** 434 * dev_read_resource_byname() - obtain a named resource from a device. 435 * 436 * @dev: device to examine 437 * @name: name of the resource to retrieve 438 * @res: returns the resource 439 * @return 0 if ok, negative on error 440 */ 441 int dev_read_resource_byname(struct udevice *dev, const char *name, 442 struct resource *res); 443 444 /** 445 * dev_translate_address() - Tranlate a device-tree address 446 * 447 * Translate an address from the device-tree into a CPU physical address. This 448 * function walks up the tree and applies the various bus mappings along the 449 * way. 450 * 451 * @dev: device giving the context in which to translate the address 452 * @in_addr: pointer to the address to translate 453 * @return the translated address; OF_BAD_ADDR on error 454 */ 455 u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr); 456 #else /* CONFIG_DM_DEV_READ_INLINE is enabled */ 457 458 static inline int dev_read_u32(struct udevice *dev, 459 const char *propname, u32 *outp) 460 { 461 return ofnode_read_u32(dev_ofnode(dev), propname, outp); 462 } 463 464 static inline int dev_read_u32_default(struct udevice *dev, 465 const char *propname, int def) 466 { 467 return ofnode_read_u32_default(dev_ofnode(dev), propname, def); 468 } 469 470 static inline const char *dev_read_string(struct udevice *dev, 471 const char *propname) 472 { 473 return ofnode_read_string(dev_ofnode(dev), propname); 474 } 475 476 static inline bool dev_read_bool(struct udevice *dev, const char *propname) 477 { 478 return ofnode_read_bool(dev_ofnode(dev), propname); 479 } 480 481 static inline ofnode dev_read_subnode(struct udevice *dev, 482 const char *subbnode_name) 483 { 484 return ofnode_find_subnode(dev_ofnode(dev), subbnode_name); 485 } 486 487 static inline int dev_read_size(struct udevice *dev, const char *propname) 488 { 489 return ofnode_read_size(dev_ofnode(dev), propname); 490 } 491 492 static inline fdt_addr_t dev_read_addr_index(struct udevice *dev, int index) 493 { 494 return devfdt_get_addr_index(dev, index); 495 } 496 497 static inline fdt_addr_t dev_read_addr(struct udevice *dev) 498 { 499 return devfdt_get_addr(dev); 500 } 501 502 static inline void *dev_read_addr_ptr(struct udevice *dev) 503 { 504 return devfdt_get_addr_ptr(dev); 505 } 506 507 static inline void *dev_remap_addr(struct udevice *dev) 508 { 509 return devfdt_remap_addr(dev); 510 } 511 512 static inline void *dev_remap_addr_index(struct udevice *dev, int index) 513 { 514 return devfdt_remap_addr_index(dev, index); 515 } 516 517 static inline fdt_addr_t dev_read_addr_size(struct udevice *dev, 518 const char *propname, 519 fdt_size_t *sizep) 520 { 521 return ofnode_get_addr_size(dev_ofnode(dev), propname, sizep); 522 } 523 524 static inline const char *dev_read_name(struct udevice *dev) 525 { 526 return ofnode_get_name(dev_ofnode(dev)); 527 } 528 529 static inline int dev_read_stringlist_search(struct udevice *dev, 530 const char *propname, 531 const char *string) 532 { 533 return ofnode_stringlist_search(dev_ofnode(dev), propname, string); 534 } 535 536 static inline int dev_read_string_index(struct udevice *dev, 537 const char *propname, int index, 538 const char **outp) 539 { 540 return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp); 541 } 542 543 static inline int dev_read_string_count(struct udevice *dev, 544 const char *propname) 545 { 546 return ofnode_read_string_count(dev_ofnode(dev), propname); 547 } 548 549 static inline int dev_read_phandle_with_args(struct udevice *dev, 550 const char *list_name, const char *cells_name, int cell_count, 551 int index, struct ofnode_phandle_args *out_args) 552 { 553 return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name, 554 cells_name, cell_count, index, 555 out_args); 556 } 557 558 static inline int dev_count_phandle_with_args(struct udevice *dev, 559 const char *list_name, const char *cells_name) 560 { 561 return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name, 562 cells_name); 563 } 564 565 static inline int dev_read_addr_cells(struct udevice *dev) 566 { 567 /* NOTE: this call should walk up the parent stack */ 568 return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev)); 569 } 570 571 static inline int dev_read_size_cells(struct udevice *dev) 572 { 573 /* NOTE: this call should walk up the parent stack */ 574 return fdt_size_cells(gd->fdt_blob, dev_of_offset(dev)); 575 } 576 577 static inline int dev_read_simple_addr_cells(struct udevice *dev) 578 { 579 return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev)); 580 } 581 582 static inline int dev_read_simple_size_cells(struct udevice *dev) 583 { 584 return fdt_size_cells(gd->fdt_blob, dev_of_offset(dev)); 585 } 586 587 static inline int dev_read_phandle(struct udevice *dev) 588 { 589 return fdt_get_phandle(gd->fdt_blob, dev_of_offset(dev)); 590 } 591 592 static inline const void *dev_read_prop(struct udevice *dev, 593 const char *propname, int *lenp) 594 { 595 return ofnode_get_property(dev_ofnode(dev), propname, lenp); 596 } 597 598 static inline int dev_read_alias_seq(struct udevice *dev, int *devnump) 599 { 600 return fdtdec_get_alias_seq(gd->fdt_blob, dev->uclass->uc_drv->name, 601 dev_of_offset(dev), devnump); 602 } 603 604 static inline int dev_read_u32_array(struct udevice *dev, const char *propname, 605 u32 *out_values, size_t sz) 606 { 607 return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz); 608 } 609 610 static inline ofnode dev_read_first_subnode(struct udevice *dev) 611 { 612 return ofnode_first_subnode(dev_ofnode(dev)); 613 } 614 615 static inline ofnode dev_read_next_subnode(ofnode node) 616 { 617 return ofnode_next_subnode(node); 618 } 619 620 static inline const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, 621 const char *propname, size_t sz) 622 { 623 return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz); 624 } 625 626 static inline int dev_read_enabled(struct udevice *dev) 627 { 628 return fdtdec_get_is_enabled(gd->fdt_blob, dev_of_offset(dev)); 629 } 630 631 static inline int dev_read_resource(struct udevice *dev, uint index, 632 struct resource *res) 633 { 634 return ofnode_read_resource(dev_ofnode(dev), index, res); 635 } 636 637 static inline int dev_read_resource_byname(struct udevice *dev, 638 const char *name, 639 struct resource *res) 640 { 641 return ofnode_read_resource_byname(dev_ofnode(dev), name, res); 642 } 643 644 static inline u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr) 645 { 646 return ofnode_translate_address(dev_ofnode(dev), in_addr); 647 } 648 649 #endif /* CONFIG_DM_DEV_READ_INLINE */ 650 651 /** 652 * dev_for_each_subnode() - Helper function to iterate through subnodes 653 * 654 * This creates a for() loop which works through the subnodes in a device's 655 * device-tree node. 656 * 657 * @subnode: ofnode holding the current subnode 658 * @dev: device to use for interation (struct udevice *) 659 */ 660 #define dev_for_each_subnode(subnode, dev) \ 661 for (subnode = dev_read_first_subnode(dev); \ 662 ofnode_valid(subnode); \ 663 subnode = ofnode_next_subnode(subnode)) 664 665 #endif 666