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 21struct 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} 26EXPORT_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 */ 35bool device_property_present(struct device *dev, const char *propname) 36{ 37 return fwnode_property_present(dev_fwnode(dev), propname); 38} 39EXPORT_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 */ 46bool 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} 58EXPORT_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 */ 78int 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} 83EXPORT_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 */ 103int 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} 108EXPORT_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 */ 128int 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} 133EXPORT_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 */ 153int 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} 158EXPORT_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 */ 178int 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} 183EXPORT_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 */ 200int 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} 205EXPORT_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 */ 222int 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} 227EXPORT_SYMBOL_GPL(device_property_match_string); 228 229static 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 */ 265int 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} 271EXPORT_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 */ 291int 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} 297EXPORT_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 */ 317int 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} 323EXPORT_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 */ 343int 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} 349EXPORT_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 */ 369int 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} 384EXPORT_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 */ 401int 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} 408EXPORT_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 */ 425int 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; 449out: 450 kfree(values); 451 return ret; 452} 453EXPORT_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 */ 477int 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} 485EXPORT_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 */ 495void 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} 507EXPORT_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 */ 521int 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} 533EXPORT_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 */ 546struct 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} 554EXPORT_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 */ 563struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode) 564{ 565 return fwnode_call_ptr_op(fwnode, get_parent); 566} 567EXPORT_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 */ 574struct fwnode_handle * 575fwnode_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} 580EXPORT_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 */ 588struct fwnode_handle * 589fwnode_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} 606EXPORT_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 */ 613struct 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} 626EXPORT_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 */ 633struct fwnode_handle * 634fwnode_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} 639EXPORT_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 */ 646struct 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} 651EXPORT_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 */ 659struct 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} 666EXPORT_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 */ 676void fwnode_handle_put(struct fwnode_handle *fwnode) 677{ 678 fwnode_call_void_op(fwnode, put); 679} 680EXPORT_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 */ 686bool fwnode_device_is_available(const struct fwnode_handle *fwnode) 687{ 688 return fwnode_call_bool_op(fwnode, device_is_available); 689} 690EXPORT_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 */ 696unsigned 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} 706EXPORT_SYMBOL_GPL(device_get_child_node_count); 707 708bool 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} 719EXPORT_SYMBOL_GPL(device_dma_supported); 720 721enum 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} 735EXPORT_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 */ 745int 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} 763EXPORT_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 */ 773int device_get_phy_mode(struct device *dev) 774{ 775 return fwnode_get_phy_mode(dev_fwnode(dev)); 776} 777EXPORT_SYMBOL_GPL(device_get_phy_mode); 778 779static 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*/ 813void *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} 827EXPORT_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 */ 835void *device_get_mac_address(struct device *dev, char *addr, int alen) 836{ 837 return fwnode_get_mac_address(dev_fwnode(dev), addr, alen); 838} 839EXPORT_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 */ 849int 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} 864EXPORT_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 */ 874struct fwnode_handle * 875fwnode_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} 880EXPORT_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 */ 888struct fwnode_handle * 889fwnode_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} 900EXPORT_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 */ 908struct fwnode_handle * 909fwnode_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} 920EXPORT_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 */ 928struct fwnode_handle * 929fwnode_graph_get_remote_port(const struct fwnode_handle *fwnode) 930{ 931 return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode)); 932} 933EXPORT_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 */ 941struct fwnode_handle * 942fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode) 943{ 944 return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint); 945} 946EXPORT_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 */ 957struct fwnode_handle * 958fwnode_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} 984EXPORT_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 */ 995int 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} 1002EXPORT_SYMBOL(fwnode_graph_parse_endpoint); 1003 1004const void *device_get_match_data(struct device *dev) 1005{ 1006 return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev); 1007} 1008EXPORT_SYMBOL_GPL(device_get_match_data); 1009