property.c (42577B)
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/phy.h> 19 20struct fwnode_handle *dev_fwnode(struct device *dev) 21{ 22 return IS_ENABLED(CONFIG_OF) && dev->of_node ? 23 of_fwnode_handle(dev->of_node) : dev->fwnode; 24} 25EXPORT_SYMBOL_GPL(dev_fwnode); 26 27/** 28 * device_property_present - check if a property of a device is present 29 * @dev: Device whose property is being checked 30 * @propname: Name of the property 31 * 32 * Check if property @propname is present in the device firmware description. 33 */ 34bool device_property_present(struct device *dev, const char *propname) 35{ 36 return fwnode_property_present(dev_fwnode(dev), propname); 37} 38EXPORT_SYMBOL_GPL(device_property_present); 39 40/** 41 * fwnode_property_present - check if a property of a firmware node is present 42 * @fwnode: Firmware node whose property to check 43 * @propname: Name of the property 44 */ 45bool fwnode_property_present(const struct fwnode_handle *fwnode, 46 const char *propname) 47{ 48 bool ret; 49 50 if (IS_ERR_OR_NULL(fwnode)) 51 return false; 52 53 ret = fwnode_call_bool_op(fwnode, property_present, propname); 54 if (ret) 55 return ret; 56 57 return fwnode_call_bool_op(fwnode->secondary, property_present, propname); 58} 59EXPORT_SYMBOL_GPL(fwnode_property_present); 60 61/** 62 * device_property_read_u8_array - return a u8 array property of a device 63 * @dev: Device to get the property of 64 * @propname: Name of the property 65 * @val: The values are stored here or %NULL to return the number of values 66 * @nval: Size of the @val array 67 * 68 * Function reads an array of u8 properties with @propname from the device 69 * firmware description and stores them to @val if found. 70 * 71 * It's recommended to call device_property_count_u8() instead of calling 72 * this function with @val equals %NULL and @nval equals 0. 73 * 74 * Return: number of values if @val was %NULL, 75 * %0 if the property was found (success), 76 * %-EINVAL if given arguments are not valid, 77 * %-ENODATA if the property does not have a value, 78 * %-EPROTO if the property is not an array of numbers, 79 * %-EOVERFLOW if the size of the property is not as expected. 80 * %-ENXIO if no suitable firmware interface is present. 81 */ 82int device_property_read_u8_array(struct device *dev, const char *propname, 83 u8 *val, size_t nval) 84{ 85 return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval); 86} 87EXPORT_SYMBOL_GPL(device_property_read_u8_array); 88 89/** 90 * device_property_read_u16_array - return a u16 array property of a device 91 * @dev: Device to get the property of 92 * @propname: Name of the property 93 * @val: The values are stored here or %NULL to return the number of values 94 * @nval: Size of the @val array 95 * 96 * Function reads an array of u16 properties with @propname from the device 97 * firmware description and stores them to @val if found. 98 * 99 * It's recommended to call device_property_count_u16() instead of calling 100 * this function with @val equals %NULL and @nval equals 0. 101 * 102 * Return: number of values if @val was %NULL, 103 * %0 if the property was found (success), 104 * %-EINVAL if given arguments are not valid, 105 * %-ENODATA if the property does not have a value, 106 * %-EPROTO if the property is not an array of numbers, 107 * %-EOVERFLOW if the size of the property is not as expected. 108 * %-ENXIO if no suitable firmware interface is present. 109 */ 110int device_property_read_u16_array(struct device *dev, const char *propname, 111 u16 *val, size_t nval) 112{ 113 return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval); 114} 115EXPORT_SYMBOL_GPL(device_property_read_u16_array); 116 117/** 118 * device_property_read_u32_array - return a u32 array property of a device 119 * @dev: Device to get the property of 120 * @propname: Name of the property 121 * @val: The values are stored here or %NULL to return the number of values 122 * @nval: Size of the @val array 123 * 124 * Function reads an array of u32 properties with @propname from the device 125 * firmware description and stores them to @val if found. 126 * 127 * It's recommended to call device_property_count_u32() instead of calling 128 * this function with @val equals %NULL and @nval equals 0. 129 * 130 * Return: number of values if @val was %NULL, 131 * %0 if the property was found (success), 132 * %-EINVAL if given arguments are not valid, 133 * %-ENODATA if the property does not have a value, 134 * %-EPROTO if the property is not an array of numbers, 135 * %-EOVERFLOW if the size of the property is not as expected. 136 * %-ENXIO if no suitable firmware interface is present. 137 */ 138int device_property_read_u32_array(struct device *dev, const char *propname, 139 u32 *val, size_t nval) 140{ 141 return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval); 142} 143EXPORT_SYMBOL_GPL(device_property_read_u32_array); 144 145/** 146 * device_property_read_u64_array - return a u64 array property of a device 147 * @dev: Device to get the property of 148 * @propname: Name of the property 149 * @val: The values are stored here or %NULL to return the number of values 150 * @nval: Size of the @val array 151 * 152 * Function reads an array of u64 properties with @propname from the device 153 * firmware description and stores them to @val if found. 154 * 155 * It's recommended to call device_property_count_u64() instead of calling 156 * this function with @val equals %NULL and @nval equals 0. 157 * 158 * Return: number of values if @val was %NULL, 159 * %0 if the property was found (success), 160 * %-EINVAL if given arguments are not valid, 161 * %-ENODATA if the property does not have a value, 162 * %-EPROTO if the property is not an array of numbers, 163 * %-EOVERFLOW if the size of the property is not as expected. 164 * %-ENXIO if no suitable firmware interface is present. 165 */ 166int device_property_read_u64_array(struct device *dev, const char *propname, 167 u64 *val, size_t nval) 168{ 169 return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval); 170} 171EXPORT_SYMBOL_GPL(device_property_read_u64_array); 172 173/** 174 * device_property_read_string_array - return a string array property of device 175 * @dev: Device to get the property of 176 * @propname: Name of the property 177 * @val: The values are stored here or %NULL to return the number of values 178 * @nval: Size of the @val array 179 * 180 * Function reads an array of string properties with @propname from the device 181 * firmware description and stores them to @val if found. 182 * 183 * It's recommended to call device_property_string_array_count() instead of calling 184 * this function with @val equals %NULL and @nval equals 0. 185 * 186 * Return: number of values read on success if @val is non-NULL, 187 * number of values available on success if @val is NULL, 188 * %-EINVAL if given arguments are not valid, 189 * %-ENODATA if the property does not have a value, 190 * %-EPROTO or %-EILSEQ if the property is not an array of strings, 191 * %-EOVERFLOW if the size of the property is not as expected. 192 * %-ENXIO if no suitable firmware interface is present. 193 */ 194int device_property_read_string_array(struct device *dev, const char *propname, 195 const char **val, size_t nval) 196{ 197 return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval); 198} 199EXPORT_SYMBOL_GPL(device_property_read_string_array); 200 201/** 202 * device_property_read_string - return a string property of a device 203 * @dev: Device to get the property of 204 * @propname: Name of the property 205 * @val: The value is stored here 206 * 207 * Function reads property @propname from the device firmware description and 208 * stores the value into @val if found. The value is checked to be a string. 209 * 210 * Return: %0 if the property was found (success), 211 * %-EINVAL if given arguments are not valid, 212 * %-ENODATA if the property does not have a value, 213 * %-EPROTO or %-EILSEQ if the property type is not a string. 214 * %-ENXIO if no suitable firmware interface is present. 215 */ 216int device_property_read_string(struct device *dev, const char *propname, 217 const char **val) 218{ 219 return fwnode_property_read_string(dev_fwnode(dev), propname, val); 220} 221EXPORT_SYMBOL_GPL(device_property_read_string); 222 223/** 224 * device_property_match_string - find a string in an array and return index 225 * @dev: Device to get the property of 226 * @propname: Name of the property holding the array 227 * @string: String to look for 228 * 229 * Find a given string in a string array and if it is found return the 230 * index back. 231 * 232 * Return: %0 if the property was found (success), 233 * %-EINVAL if given arguments are not valid, 234 * %-ENODATA if the property does not have a value, 235 * %-EPROTO if the property is not an array of strings, 236 * %-ENXIO if no suitable firmware interface is present. 237 */ 238int device_property_match_string(struct device *dev, const char *propname, 239 const char *string) 240{ 241 return fwnode_property_match_string(dev_fwnode(dev), propname, string); 242} 243EXPORT_SYMBOL_GPL(device_property_match_string); 244 245static int fwnode_property_read_int_array(const struct fwnode_handle *fwnode, 246 const char *propname, 247 unsigned int elem_size, void *val, 248 size_t nval) 249{ 250 int ret; 251 252 if (IS_ERR_OR_NULL(fwnode)) 253 return -EINVAL; 254 255 ret = fwnode_call_int_op(fwnode, property_read_int_array, propname, 256 elem_size, val, nval); 257 if (ret != -EINVAL) 258 return ret; 259 260 return fwnode_call_int_op(fwnode->secondary, property_read_int_array, propname, 261 elem_size, val, nval); 262} 263 264/** 265 * fwnode_property_read_u8_array - return a u8 array property of firmware node 266 * @fwnode: Firmware node to get the property of 267 * @propname: Name of the property 268 * @val: The values are stored here or %NULL to return the number of values 269 * @nval: Size of the @val array 270 * 271 * Read an array of u8 properties with @propname from @fwnode and stores them to 272 * @val if found. 273 * 274 * It's recommended to call fwnode_property_count_u8() instead of calling 275 * this function with @val equals %NULL and @nval equals 0. 276 * 277 * Return: number of values if @val was %NULL, 278 * %0 if the property was found (success), 279 * %-EINVAL if given arguments are not valid, 280 * %-ENODATA if the property does not have a value, 281 * %-EPROTO if the property is not an array of numbers, 282 * %-EOVERFLOW if the size of the property is not as expected, 283 * %-ENXIO if no suitable firmware interface is present. 284 */ 285int fwnode_property_read_u8_array(const struct fwnode_handle *fwnode, 286 const char *propname, u8 *val, size_t nval) 287{ 288 return fwnode_property_read_int_array(fwnode, propname, sizeof(u8), 289 val, nval); 290} 291EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array); 292 293/** 294 * fwnode_property_read_u16_array - return a u16 array property of firmware node 295 * @fwnode: Firmware node to get the property of 296 * @propname: Name of the property 297 * @val: The values are stored here or %NULL to return the number of values 298 * @nval: Size of the @val array 299 * 300 * Read an array of u16 properties with @propname from @fwnode and store them to 301 * @val if found. 302 * 303 * It's recommended to call fwnode_property_count_u16() instead of calling 304 * this function with @val equals %NULL and @nval equals 0. 305 * 306 * Return: number of values if @val was %NULL, 307 * %0 if the property was found (success), 308 * %-EINVAL if given arguments are not valid, 309 * %-ENODATA if the property does not have a value, 310 * %-EPROTO if the property is not an array of numbers, 311 * %-EOVERFLOW if the size of the property is not as expected, 312 * %-ENXIO if no suitable firmware interface is present. 313 */ 314int fwnode_property_read_u16_array(const struct fwnode_handle *fwnode, 315 const char *propname, u16 *val, size_t nval) 316{ 317 return fwnode_property_read_int_array(fwnode, propname, sizeof(u16), 318 val, nval); 319} 320EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array); 321 322/** 323 * fwnode_property_read_u32_array - return a u32 array property of firmware node 324 * @fwnode: Firmware node to get the property of 325 * @propname: Name of the property 326 * @val: The values are stored here or %NULL to return the number of values 327 * @nval: Size of the @val array 328 * 329 * Read an array of u32 properties with @propname from @fwnode store them to 330 * @val if found. 331 * 332 * It's recommended to call fwnode_property_count_u32() instead of calling 333 * this function with @val equals %NULL and @nval equals 0. 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_u32_array(const struct fwnode_handle *fwnode, 344 const char *propname, u32 *val, size_t nval) 345{ 346 return fwnode_property_read_int_array(fwnode, propname, sizeof(u32), 347 val, nval); 348} 349EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array); 350 351/** 352 * fwnode_property_read_u64_array - return a u64 array property firmware 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 array of u64 properties with @propname from @fwnode and store them to 359 * @val if found. 360 * 361 * It's recommended to call fwnode_property_count_u64() instead of calling 362 * this function with @val equals %NULL and @nval equals 0. 363 * 364 * Return: number of values if @val was %NULL, 365 * %0 if the property was found (success), 366 * %-EINVAL if given arguments are not valid, 367 * %-ENODATA if the property does not have a value, 368 * %-EPROTO if the property is not an array of numbers, 369 * %-EOVERFLOW if the size of the property is not as expected, 370 * %-ENXIO if no suitable firmware interface is present. 371 */ 372int fwnode_property_read_u64_array(const struct fwnode_handle *fwnode, 373 const char *propname, u64 *val, size_t nval) 374{ 375 return fwnode_property_read_int_array(fwnode, propname, sizeof(u64), 376 val, nval); 377} 378EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array); 379 380/** 381 * fwnode_property_read_string_array - return string array property of a node 382 * @fwnode: Firmware node to get the property of 383 * @propname: Name of the property 384 * @val: The values are stored here or %NULL to return the number of values 385 * @nval: Size of the @val array 386 * 387 * Read an string list property @propname from the given firmware node and store 388 * them to @val if found. 389 * 390 * It's recommended to call fwnode_property_string_array_count() instead of calling 391 * this function with @val equals %NULL and @nval equals 0. 392 * 393 * Return: number of values read on success if @val is non-NULL, 394 * number of values available on success if @val is NULL, 395 * %-EINVAL if given arguments are not valid, 396 * %-ENODATA if the property does not have a value, 397 * %-EPROTO or %-EILSEQ if the property is not an array of strings, 398 * %-EOVERFLOW if the size of the property is not as expected, 399 * %-ENXIO if no suitable firmware interface is present. 400 */ 401int fwnode_property_read_string_array(const struct fwnode_handle *fwnode, 402 const char *propname, const char **val, 403 size_t nval) 404{ 405 int ret; 406 407 if (IS_ERR_OR_NULL(fwnode)) 408 return -EINVAL; 409 410 ret = fwnode_call_int_op(fwnode, property_read_string_array, propname, 411 val, nval); 412 if (ret != -EINVAL) 413 return ret; 414 415 return fwnode_call_int_op(fwnode->secondary, property_read_string_array, propname, 416 val, nval); 417} 418EXPORT_SYMBOL_GPL(fwnode_property_read_string_array); 419 420/** 421 * fwnode_property_read_string - return a string property of a firmware node 422 * @fwnode: Firmware node to get the property of 423 * @propname: Name of the property 424 * @val: The value is stored here 425 * 426 * Read property @propname from the given firmware node and store the value into 427 * @val if found. The value is checked to be a string. 428 * 429 * Return: %0 if the property was found (success), 430 * %-EINVAL if given arguments are not valid, 431 * %-ENODATA if the property does not have a value, 432 * %-EPROTO or %-EILSEQ if the property is not a string, 433 * %-ENXIO if no suitable firmware interface is present. 434 */ 435int fwnode_property_read_string(const struct fwnode_handle *fwnode, 436 const char *propname, const char **val) 437{ 438 int ret = fwnode_property_read_string_array(fwnode, propname, val, 1); 439 440 return ret < 0 ? ret : 0; 441} 442EXPORT_SYMBOL_GPL(fwnode_property_read_string); 443 444/** 445 * fwnode_property_match_string - find a string in an array and return index 446 * @fwnode: Firmware node to get the property of 447 * @propname: Name of the property holding the array 448 * @string: String to look for 449 * 450 * Find a given string in a string array and if it is found return the 451 * index back. 452 * 453 * Return: %0 if the property was found (success), 454 * %-EINVAL if given arguments are not valid, 455 * %-ENODATA if the property does not have a value, 456 * %-EPROTO if the property is not an array of strings, 457 * %-ENXIO if no suitable firmware interface is present. 458 */ 459int fwnode_property_match_string(const struct fwnode_handle *fwnode, 460 const char *propname, const char *string) 461{ 462 const char **values; 463 int nval, ret; 464 465 nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0); 466 if (nval < 0) 467 return nval; 468 469 if (nval == 0) 470 return -ENODATA; 471 472 values = kcalloc(nval, sizeof(*values), GFP_KERNEL); 473 if (!values) 474 return -ENOMEM; 475 476 ret = fwnode_property_read_string_array(fwnode, propname, values, nval); 477 if (ret < 0) 478 goto out; 479 480 ret = match_string(values, nval, string); 481 if (ret < 0) 482 ret = -ENODATA; 483out: 484 kfree(values); 485 return ret; 486} 487EXPORT_SYMBOL_GPL(fwnode_property_match_string); 488 489/** 490 * fwnode_property_get_reference_args() - Find a reference with arguments 491 * @fwnode: Firmware node where to look for the reference 492 * @prop: The name of the property 493 * @nargs_prop: The name of the property telling the number of 494 * arguments in the referred node. NULL if @nargs is known, 495 * otherwise @nargs is ignored. Only relevant on OF. 496 * @nargs: Number of arguments. Ignored if @nargs_prop is non-NULL. 497 * @index: Index of the reference, from zero onwards. 498 * @args: Result structure with reference and integer arguments. 499 * 500 * Obtain a reference based on a named property in an fwnode, with 501 * integer arguments. 502 * 503 * Caller is responsible to call fwnode_handle_put() on the returned 504 * args->fwnode pointer. 505 * 506 * Returns: %0 on success 507 * %-ENOENT when the index is out of bounds, the index has an empty 508 * reference or the property was not found 509 * %-EINVAL on parse error 510 */ 511int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, 512 const char *prop, const char *nargs_prop, 513 unsigned int nargs, unsigned int index, 514 struct fwnode_reference_args *args) 515{ 516 int ret; 517 518 if (IS_ERR_OR_NULL(fwnode)) 519 return -ENOENT; 520 521 ret = fwnode_call_int_op(fwnode, get_reference_args, prop, nargs_prop, 522 nargs, index, args); 523 if (ret == 0) 524 return ret; 525 526 if (IS_ERR_OR_NULL(fwnode->secondary)) 527 return ret; 528 529 return fwnode_call_int_op(fwnode->secondary, get_reference_args, prop, nargs_prop, 530 nargs, index, args); 531} 532EXPORT_SYMBOL_GPL(fwnode_property_get_reference_args); 533 534/** 535 * fwnode_find_reference - Find named reference to a fwnode_handle 536 * @fwnode: Firmware node where to look for the reference 537 * @name: The name of the reference 538 * @index: Index of the reference 539 * 540 * @index can be used when the named reference holds a table of references. 541 * 542 * Returns pointer to the reference fwnode, or ERR_PTR. Caller is responsible to 543 * call fwnode_handle_put() on the returned fwnode pointer. 544 */ 545struct fwnode_handle *fwnode_find_reference(const struct fwnode_handle *fwnode, 546 const char *name, 547 unsigned int index) 548{ 549 struct fwnode_reference_args args; 550 int ret; 551 552 ret = fwnode_property_get_reference_args(fwnode, name, NULL, 0, index, 553 &args); 554 return ret ? ERR_PTR(ret) : args.fwnode; 555} 556EXPORT_SYMBOL_GPL(fwnode_find_reference); 557 558/** 559 * fwnode_get_name - Return the name of a node 560 * @fwnode: The firmware node 561 * 562 * Returns a pointer to the node name. 563 */ 564const char *fwnode_get_name(const struct fwnode_handle *fwnode) 565{ 566 return fwnode_call_ptr_op(fwnode, get_name); 567} 568EXPORT_SYMBOL_GPL(fwnode_get_name); 569 570/** 571 * fwnode_get_name_prefix - Return the prefix of node for printing purposes 572 * @fwnode: The firmware node 573 * 574 * Returns the prefix of a node, intended to be printed right before the node. 575 * The prefix works also as a separator between the nodes. 576 */ 577const char *fwnode_get_name_prefix(const struct fwnode_handle *fwnode) 578{ 579 return fwnode_call_ptr_op(fwnode, get_name_prefix); 580} 581 582/** 583 * fwnode_get_parent - Return parent firwmare node 584 * @fwnode: Firmware whose parent is retrieved 585 * 586 * Return parent firmware node of the given node if possible or %NULL if no 587 * parent was available. 588 */ 589struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode) 590{ 591 return fwnode_call_ptr_op(fwnode, get_parent); 592} 593EXPORT_SYMBOL_GPL(fwnode_get_parent); 594 595/** 596 * fwnode_get_next_parent - Iterate to the node's parent 597 * @fwnode: Firmware whose parent is retrieved 598 * 599 * This is like fwnode_get_parent() except that it drops the refcount 600 * on the passed node, making it suitable for iterating through a 601 * node's parents. 602 * 603 * Returns a node pointer with refcount incremented, use 604 * fwnode_handle_node() on it when done. 605 */ 606struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode) 607{ 608 struct fwnode_handle *parent = fwnode_get_parent(fwnode); 609 610 fwnode_handle_put(fwnode); 611 612 return parent; 613} 614EXPORT_SYMBOL_GPL(fwnode_get_next_parent); 615 616/** 617 * fwnode_get_next_parent_dev - Find device of closest ancestor fwnode 618 * @fwnode: firmware node 619 * 620 * Given a firmware node (@fwnode), this function finds its closest ancestor 621 * firmware node that has a corresponding struct device and returns that struct 622 * device. 623 * 624 * The caller of this function is expected to call put_device() on the returned 625 * device when they are done. 626 */ 627struct device *fwnode_get_next_parent_dev(struct fwnode_handle *fwnode) 628{ 629 struct fwnode_handle *parent; 630 struct device *dev; 631 632 fwnode_for_each_parent_node(fwnode, parent) { 633 dev = get_dev_from_fwnode(parent); 634 if (dev) { 635 fwnode_handle_put(parent); 636 return dev; 637 } 638 } 639 return NULL; 640} 641 642/** 643 * fwnode_count_parents - Return the number of parents a node has 644 * @fwnode: The node the parents of which are to be counted 645 * 646 * Returns the number of parents a node has. 647 */ 648unsigned int fwnode_count_parents(const struct fwnode_handle *fwnode) 649{ 650 struct fwnode_handle *parent; 651 unsigned int count = 0; 652 653 fwnode_for_each_parent_node(fwnode, parent) 654 count++; 655 656 return count; 657} 658EXPORT_SYMBOL_GPL(fwnode_count_parents); 659 660/** 661 * fwnode_get_nth_parent - Return an nth parent of a node 662 * @fwnode: The node the parent of which is requested 663 * @depth: Distance of the parent from the node 664 * 665 * Returns the nth parent of a node. If there is no parent at the requested 666 * @depth, %NULL is returned. If @depth is 0, the functionality is equivalent to 667 * fwnode_handle_get(). For @depth == 1, it is fwnode_get_parent() and so on. 668 * 669 * The caller is responsible for calling fwnode_handle_put() for the returned 670 * node. 671 */ 672struct fwnode_handle *fwnode_get_nth_parent(struct fwnode_handle *fwnode, 673 unsigned int depth) 674{ 675 struct fwnode_handle *parent; 676 677 if (depth == 0) 678 return fwnode_handle_get(fwnode); 679 680 fwnode_for_each_parent_node(fwnode, parent) { 681 if (--depth == 0) 682 return parent; 683 } 684 return NULL; 685} 686EXPORT_SYMBOL_GPL(fwnode_get_nth_parent); 687 688/** 689 * fwnode_is_ancestor_of - Test if @ancestor is ancestor of @child 690 * @ancestor: Firmware which is tested for being an ancestor 691 * @child: Firmware which is tested for being the child 692 * 693 * A node is considered an ancestor of itself too. 694 * 695 * Returns true if @ancestor is an ancestor of @child. Otherwise, returns false. 696 */ 697bool fwnode_is_ancestor_of(struct fwnode_handle *ancestor, struct fwnode_handle *child) 698{ 699 struct fwnode_handle *parent; 700 701 if (IS_ERR_OR_NULL(ancestor)) 702 return false; 703 704 if (child == ancestor) 705 return true; 706 707 fwnode_for_each_parent_node(child, parent) { 708 if (parent == ancestor) { 709 fwnode_handle_put(parent); 710 return true; 711 } 712 } 713 return false; 714} 715 716/** 717 * fwnode_get_next_child_node - Return the next child node handle for a node 718 * @fwnode: Firmware node to find the next child node for. 719 * @child: Handle to one of the node's child nodes or a %NULL handle. 720 */ 721struct fwnode_handle * 722fwnode_get_next_child_node(const struct fwnode_handle *fwnode, 723 struct fwnode_handle *child) 724{ 725 return fwnode_call_ptr_op(fwnode, get_next_child_node, child); 726} 727EXPORT_SYMBOL_GPL(fwnode_get_next_child_node); 728 729/** 730 * fwnode_get_next_available_child_node - Return the next 731 * available child node handle for a node 732 * @fwnode: Firmware node to find the next child node for. 733 * @child: Handle to one of the node's child nodes or a %NULL handle. 734 */ 735struct fwnode_handle * 736fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode, 737 struct fwnode_handle *child) 738{ 739 struct fwnode_handle *next_child = child; 740 741 if (IS_ERR_OR_NULL(fwnode)) 742 return NULL; 743 744 do { 745 next_child = fwnode_get_next_child_node(fwnode, next_child); 746 if (!next_child) 747 return NULL; 748 } while (!fwnode_device_is_available(next_child)); 749 750 return next_child; 751} 752EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node); 753 754/** 755 * device_get_next_child_node - Return the next child node handle for a device 756 * @dev: Device to find the next child node for. 757 * @child: Handle to one of the device's child nodes or a null handle. 758 */ 759struct fwnode_handle *device_get_next_child_node(struct device *dev, 760 struct fwnode_handle *child) 761{ 762 const struct fwnode_handle *fwnode = dev_fwnode(dev); 763 struct fwnode_handle *next; 764 765 if (IS_ERR_OR_NULL(fwnode)) 766 return NULL; 767 768 /* Try to find a child in primary fwnode */ 769 next = fwnode_get_next_child_node(fwnode, child); 770 if (next) 771 return next; 772 773 /* When no more children in primary, continue with secondary */ 774 return fwnode_get_next_child_node(fwnode->secondary, child); 775} 776EXPORT_SYMBOL_GPL(device_get_next_child_node); 777 778/** 779 * fwnode_get_named_child_node - Return first matching named child node handle 780 * @fwnode: Firmware node to find the named child node for. 781 * @childname: String to match child node name against. 782 */ 783struct fwnode_handle * 784fwnode_get_named_child_node(const struct fwnode_handle *fwnode, 785 const char *childname) 786{ 787 return fwnode_call_ptr_op(fwnode, get_named_child_node, childname); 788} 789EXPORT_SYMBOL_GPL(fwnode_get_named_child_node); 790 791/** 792 * device_get_named_child_node - Return first matching named child node handle 793 * @dev: Device to find the named child node for. 794 * @childname: String to match child node name against. 795 */ 796struct fwnode_handle *device_get_named_child_node(struct device *dev, 797 const char *childname) 798{ 799 return fwnode_get_named_child_node(dev_fwnode(dev), childname); 800} 801EXPORT_SYMBOL_GPL(device_get_named_child_node); 802 803/** 804 * fwnode_handle_get - Obtain a reference to a device node 805 * @fwnode: Pointer to the device node to obtain the reference to. 806 * 807 * Returns the fwnode handle. 808 */ 809struct fwnode_handle *fwnode_handle_get(struct fwnode_handle *fwnode) 810{ 811 if (!fwnode_has_op(fwnode, get)) 812 return fwnode; 813 814 return fwnode_call_ptr_op(fwnode, get); 815} 816EXPORT_SYMBOL_GPL(fwnode_handle_get); 817 818/** 819 * fwnode_handle_put - Drop reference to a device node 820 * @fwnode: Pointer to the device node to drop the reference to. 821 * 822 * This has to be used when terminating device_for_each_child_node() iteration 823 * with break or return to prevent stale device node references from being left 824 * behind. 825 */ 826void fwnode_handle_put(struct fwnode_handle *fwnode) 827{ 828 fwnode_call_void_op(fwnode, put); 829} 830EXPORT_SYMBOL_GPL(fwnode_handle_put); 831 832/** 833 * fwnode_device_is_available - check if a device is available for use 834 * @fwnode: Pointer to the fwnode of the device. 835 * 836 * For fwnode node types that don't implement the .device_is_available() 837 * operation, this function returns true. 838 */ 839bool fwnode_device_is_available(const struct fwnode_handle *fwnode) 840{ 841 if (IS_ERR_OR_NULL(fwnode)) 842 return false; 843 844 if (!fwnode_has_op(fwnode, device_is_available)) 845 return true; 846 847 return fwnode_call_bool_op(fwnode, device_is_available); 848} 849EXPORT_SYMBOL_GPL(fwnode_device_is_available); 850 851/** 852 * device_get_child_node_count - return the number of child nodes for device 853 * @dev: Device to cound the child nodes for 854 */ 855unsigned int device_get_child_node_count(struct device *dev) 856{ 857 struct fwnode_handle *child; 858 unsigned int count = 0; 859 860 device_for_each_child_node(dev, child) 861 count++; 862 863 return count; 864} 865EXPORT_SYMBOL_GPL(device_get_child_node_count); 866 867bool device_dma_supported(struct device *dev) 868{ 869 return fwnode_call_bool_op(dev_fwnode(dev), device_dma_supported); 870} 871EXPORT_SYMBOL_GPL(device_dma_supported); 872 873enum dev_dma_attr device_get_dma_attr(struct device *dev) 874{ 875 if (!fwnode_has_op(dev_fwnode(dev), device_get_dma_attr)) 876 return DEV_DMA_NOT_SUPPORTED; 877 878 return fwnode_call_int_op(dev_fwnode(dev), device_get_dma_attr); 879} 880EXPORT_SYMBOL_GPL(device_get_dma_attr); 881 882/** 883 * fwnode_get_phy_mode - Get phy mode for given firmware node 884 * @fwnode: Pointer to the given node 885 * 886 * The function gets phy interface string from property 'phy-mode' or 887 * 'phy-connection-type', and return its index in phy_modes table, or errno in 888 * error case. 889 */ 890int fwnode_get_phy_mode(struct fwnode_handle *fwnode) 891{ 892 const char *pm; 893 int err, i; 894 895 err = fwnode_property_read_string(fwnode, "phy-mode", &pm); 896 if (err < 0) 897 err = fwnode_property_read_string(fwnode, 898 "phy-connection-type", &pm); 899 if (err < 0) 900 return err; 901 902 for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++) 903 if (!strcasecmp(pm, phy_modes(i))) 904 return i; 905 906 return -ENODEV; 907} 908EXPORT_SYMBOL_GPL(fwnode_get_phy_mode); 909 910/** 911 * device_get_phy_mode - Get phy mode for given device 912 * @dev: Pointer to the given device 913 * 914 * The function gets phy interface string from property 'phy-mode' or 915 * 'phy-connection-type', and return its index in phy_modes table, or errno in 916 * error case. 917 */ 918int device_get_phy_mode(struct device *dev) 919{ 920 return fwnode_get_phy_mode(dev_fwnode(dev)); 921} 922EXPORT_SYMBOL_GPL(device_get_phy_mode); 923 924/** 925 * fwnode_iomap - Maps the memory mapped IO for a given fwnode 926 * @fwnode: Pointer to the firmware node 927 * @index: Index of the IO range 928 * 929 * Returns a pointer to the mapped memory. 930 */ 931void __iomem *fwnode_iomap(struct fwnode_handle *fwnode, int index) 932{ 933 return fwnode_call_ptr_op(fwnode, iomap, index); 934} 935EXPORT_SYMBOL(fwnode_iomap); 936 937/** 938 * fwnode_irq_get - Get IRQ directly from a fwnode 939 * @fwnode: Pointer to the firmware node 940 * @index: Zero-based index of the IRQ 941 * 942 * Returns Linux IRQ number on success. Other values are determined 943 * accordingly to acpi_/of_ irq_get() operation. 944 */ 945int fwnode_irq_get(const struct fwnode_handle *fwnode, unsigned int index) 946{ 947 return fwnode_call_int_op(fwnode, irq_get, index); 948} 949EXPORT_SYMBOL(fwnode_irq_get); 950 951/** 952 * fwnode_irq_get_byname - Get IRQ from a fwnode using its name 953 * @fwnode: Pointer to the firmware node 954 * @name: IRQ name 955 * 956 * Description: 957 * Find a match to the string @name in the 'interrupt-names' string array 958 * in _DSD for ACPI, or of_node for Device Tree. Then get the Linux IRQ 959 * number of the IRQ resource corresponding to the index of the matched 960 * string. 961 * 962 * Return: 963 * Linux IRQ number on success, or negative errno otherwise. 964 */ 965int fwnode_irq_get_byname(const struct fwnode_handle *fwnode, const char *name) 966{ 967 int index; 968 969 if (!name) 970 return -EINVAL; 971 972 index = fwnode_property_match_string(fwnode, "interrupt-names", name); 973 if (index < 0) 974 return index; 975 976 return fwnode_irq_get(fwnode, index); 977} 978EXPORT_SYMBOL(fwnode_irq_get_byname); 979 980/** 981 * fwnode_graph_get_next_endpoint - Get next endpoint firmware node 982 * @fwnode: Pointer to the parent firmware node 983 * @prev: Previous endpoint node or %NULL to get the first 984 * 985 * Returns an endpoint firmware node pointer or %NULL if no more endpoints 986 * are available. 987 */ 988struct fwnode_handle * 989fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode, 990 struct fwnode_handle *prev) 991{ 992 const struct fwnode_handle *parent; 993 struct fwnode_handle *ep; 994 995 /* 996 * If this function is in a loop and the previous iteration returned 997 * an endpoint from fwnode->secondary, then we need to use the secondary 998 * as parent rather than @fwnode. 999 */ 1000 if (prev) 1001 parent = fwnode_graph_get_port_parent(prev); 1002 else 1003 parent = fwnode; 1004 if (IS_ERR_OR_NULL(parent)) 1005 return NULL; 1006 1007 ep = fwnode_call_ptr_op(parent, graph_get_next_endpoint, prev); 1008 if (ep) 1009 return ep; 1010 1011 return fwnode_graph_get_next_endpoint(parent->secondary, NULL); 1012} 1013EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint); 1014 1015/** 1016 * fwnode_graph_get_port_parent - Return the device fwnode of a port endpoint 1017 * @endpoint: Endpoint firmware node of the port 1018 * 1019 * Return: the firmware node of the device the @endpoint belongs to. 1020 */ 1021struct fwnode_handle * 1022fwnode_graph_get_port_parent(const struct fwnode_handle *endpoint) 1023{ 1024 struct fwnode_handle *port, *parent; 1025 1026 port = fwnode_get_parent(endpoint); 1027 parent = fwnode_call_ptr_op(port, graph_get_port_parent); 1028 1029 fwnode_handle_put(port); 1030 1031 return parent; 1032} 1033EXPORT_SYMBOL_GPL(fwnode_graph_get_port_parent); 1034 1035/** 1036 * fwnode_graph_get_remote_port_parent - Return fwnode of a remote device 1037 * @fwnode: Endpoint firmware node pointing to the remote endpoint 1038 * 1039 * Extracts firmware node of a remote device the @fwnode points to. 1040 */ 1041struct fwnode_handle * 1042fwnode_graph_get_remote_port_parent(const struct fwnode_handle *fwnode) 1043{ 1044 struct fwnode_handle *endpoint, *parent; 1045 1046 endpoint = fwnode_graph_get_remote_endpoint(fwnode); 1047 parent = fwnode_graph_get_port_parent(endpoint); 1048 1049 fwnode_handle_put(endpoint); 1050 1051 return parent; 1052} 1053EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent); 1054 1055/** 1056 * fwnode_graph_get_remote_port - Return fwnode of a remote port 1057 * @fwnode: Endpoint firmware node pointing to the remote endpoint 1058 * 1059 * Extracts firmware node of a remote port the @fwnode points to. 1060 */ 1061struct fwnode_handle * 1062fwnode_graph_get_remote_port(const struct fwnode_handle *fwnode) 1063{ 1064 return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode)); 1065} 1066EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port); 1067 1068/** 1069 * fwnode_graph_get_remote_endpoint - Return fwnode of a remote endpoint 1070 * @fwnode: Endpoint firmware node pointing to the remote endpoint 1071 * 1072 * Extracts firmware node of a remote endpoint the @fwnode points to. 1073 */ 1074struct fwnode_handle * 1075fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode) 1076{ 1077 return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint); 1078} 1079EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint); 1080 1081static bool fwnode_graph_remote_available(struct fwnode_handle *ep) 1082{ 1083 struct fwnode_handle *dev_node; 1084 bool available; 1085 1086 dev_node = fwnode_graph_get_remote_port_parent(ep); 1087 available = fwnode_device_is_available(dev_node); 1088 fwnode_handle_put(dev_node); 1089 1090 return available; 1091} 1092 1093/** 1094 * fwnode_graph_get_endpoint_by_id - get endpoint by port and endpoint numbers 1095 * @fwnode: parent fwnode_handle containing the graph 1096 * @port: identifier of the port node 1097 * @endpoint: identifier of the endpoint node under the port node 1098 * @flags: fwnode lookup flags 1099 * 1100 * Return the fwnode handle of the local endpoint corresponding the port and 1101 * endpoint IDs or NULL if not found. 1102 * 1103 * If FWNODE_GRAPH_ENDPOINT_NEXT is passed in @flags and the specified endpoint 1104 * has not been found, look for the closest endpoint ID greater than the 1105 * specified one and return the endpoint that corresponds to it, if present. 1106 * 1107 * Does not return endpoints that belong to disabled devices or endpoints that 1108 * are unconnected, unless FWNODE_GRAPH_DEVICE_DISABLED is passed in @flags. 1109 * 1110 * The returned endpoint needs to be released by calling fwnode_handle_put() on 1111 * it when it is not needed any more. 1112 */ 1113struct fwnode_handle * 1114fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode, 1115 u32 port, u32 endpoint, unsigned long flags) 1116{ 1117 struct fwnode_handle *ep, *best_ep = NULL; 1118 unsigned int best_ep_id = 0; 1119 bool endpoint_next = flags & FWNODE_GRAPH_ENDPOINT_NEXT; 1120 bool enabled_only = !(flags & FWNODE_GRAPH_DEVICE_DISABLED); 1121 1122 fwnode_graph_for_each_endpoint(fwnode, ep) { 1123 struct fwnode_endpoint fwnode_ep = { 0 }; 1124 int ret; 1125 1126 if (enabled_only && !fwnode_graph_remote_available(ep)) 1127 continue; 1128 1129 ret = fwnode_graph_parse_endpoint(ep, &fwnode_ep); 1130 if (ret < 0) 1131 continue; 1132 1133 if (fwnode_ep.port != port) 1134 continue; 1135 1136 if (fwnode_ep.id == endpoint) 1137 return ep; 1138 1139 if (!endpoint_next) 1140 continue; 1141 1142 /* 1143 * If the endpoint that has just been found is not the first 1144 * matching one and the ID of the one found previously is closer 1145 * to the requested endpoint ID, skip it. 1146 */ 1147 if (fwnode_ep.id < endpoint || 1148 (best_ep && best_ep_id < fwnode_ep.id)) 1149 continue; 1150 1151 fwnode_handle_put(best_ep); 1152 best_ep = fwnode_handle_get(ep); 1153 best_ep_id = fwnode_ep.id; 1154 } 1155 1156 return best_ep; 1157} 1158EXPORT_SYMBOL_GPL(fwnode_graph_get_endpoint_by_id); 1159 1160/** 1161 * fwnode_graph_get_endpoint_count - Count endpoints on a device node 1162 * @fwnode: The node related to a device 1163 * @flags: fwnode lookup flags 1164 * Count endpoints in a device node. 1165 * 1166 * If FWNODE_GRAPH_DEVICE_DISABLED flag is specified, also unconnected endpoints 1167 * and endpoints connected to disabled devices are counted. 1168 */ 1169unsigned int fwnode_graph_get_endpoint_count(struct fwnode_handle *fwnode, 1170 unsigned long flags) 1171{ 1172 struct fwnode_handle *ep; 1173 unsigned int count = 0; 1174 1175 fwnode_graph_for_each_endpoint(fwnode, ep) { 1176 if (flags & FWNODE_GRAPH_DEVICE_DISABLED || 1177 fwnode_graph_remote_available(ep)) 1178 count++; 1179 } 1180 1181 return count; 1182} 1183EXPORT_SYMBOL_GPL(fwnode_graph_get_endpoint_count); 1184 1185/** 1186 * fwnode_graph_parse_endpoint - parse common endpoint node properties 1187 * @fwnode: pointer to endpoint fwnode_handle 1188 * @endpoint: pointer to the fwnode endpoint data structure 1189 * 1190 * Parse @fwnode representing a graph endpoint node and store the 1191 * information in @endpoint. The caller must hold a reference to 1192 * @fwnode. 1193 */ 1194int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, 1195 struct fwnode_endpoint *endpoint) 1196{ 1197 memset(endpoint, 0, sizeof(*endpoint)); 1198 1199 return fwnode_call_int_op(fwnode, graph_parse_endpoint, endpoint); 1200} 1201EXPORT_SYMBOL(fwnode_graph_parse_endpoint); 1202 1203const void *device_get_match_data(struct device *dev) 1204{ 1205 return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev); 1206} 1207EXPORT_SYMBOL_GPL(device_get_match_data); 1208 1209static unsigned int fwnode_graph_devcon_matches(struct fwnode_handle *fwnode, 1210 const char *con_id, void *data, 1211 devcon_match_fn_t match, 1212 void **matches, 1213 unsigned int matches_len) 1214{ 1215 struct fwnode_handle *node; 1216 struct fwnode_handle *ep; 1217 unsigned int count = 0; 1218 void *ret; 1219 1220 fwnode_graph_for_each_endpoint(fwnode, ep) { 1221 if (matches && count >= matches_len) { 1222 fwnode_handle_put(ep); 1223 break; 1224 } 1225 1226 node = fwnode_graph_get_remote_port_parent(ep); 1227 if (!fwnode_device_is_available(node)) { 1228 fwnode_handle_put(node); 1229 continue; 1230 } 1231 1232 ret = match(node, con_id, data); 1233 fwnode_handle_put(node); 1234 if (ret) { 1235 if (matches) 1236 matches[count] = ret; 1237 count++; 1238 } 1239 } 1240 return count; 1241} 1242 1243static unsigned int fwnode_devcon_matches(struct fwnode_handle *fwnode, 1244 const char *con_id, void *data, 1245 devcon_match_fn_t match, 1246 void **matches, 1247 unsigned int matches_len) 1248{ 1249 struct fwnode_handle *node; 1250 unsigned int count = 0; 1251 unsigned int i; 1252 void *ret; 1253 1254 for (i = 0; ; i++) { 1255 if (matches && count >= matches_len) 1256 break; 1257 1258 node = fwnode_find_reference(fwnode, con_id, i); 1259 if (IS_ERR(node)) 1260 break; 1261 1262 ret = match(node, NULL, data); 1263 fwnode_handle_put(node); 1264 if (ret) { 1265 if (matches) 1266 matches[count] = ret; 1267 count++; 1268 } 1269 } 1270 1271 return count; 1272} 1273 1274/** 1275 * fwnode_connection_find_match - Find connection from a device node 1276 * @fwnode: Device node with the connection 1277 * @con_id: Identifier for the connection 1278 * @data: Data for the match function 1279 * @match: Function to check and convert the connection description 1280 * 1281 * Find a connection with unique identifier @con_id between @fwnode and another 1282 * device node. @match will be used to convert the connection description to 1283 * data the caller is expecting to be returned. 1284 */ 1285void *fwnode_connection_find_match(struct fwnode_handle *fwnode, 1286 const char *con_id, void *data, 1287 devcon_match_fn_t match) 1288{ 1289 unsigned int count; 1290 void *ret; 1291 1292 if (!fwnode || !match) 1293 return NULL; 1294 1295 count = fwnode_graph_devcon_matches(fwnode, con_id, data, match, &ret, 1); 1296 if (count) 1297 return ret; 1298 1299 count = fwnode_devcon_matches(fwnode, con_id, data, match, &ret, 1); 1300 return count ? ret : NULL; 1301} 1302EXPORT_SYMBOL_GPL(fwnode_connection_find_match); 1303 1304/** 1305 * fwnode_connection_find_matches - Find connections from a device node 1306 * @fwnode: Device node with the connection 1307 * @con_id: Identifier for the connection 1308 * @data: Data for the match function 1309 * @match: Function to check and convert the connection description 1310 * @matches: (Optional) array of pointers to fill with matches 1311 * @matches_len: Length of @matches 1312 * 1313 * Find up to @matches_len connections with unique identifier @con_id between 1314 * @fwnode and other device nodes. @match will be used to convert the 1315 * connection description to data the caller is expecting to be returned 1316 * through the @matches array. 1317 * If @matches is NULL @matches_len is ignored and the total number of resolved 1318 * matches is returned. 1319 * 1320 * Return: Number of matches resolved, or negative errno. 1321 */ 1322int fwnode_connection_find_matches(struct fwnode_handle *fwnode, 1323 const char *con_id, void *data, 1324 devcon_match_fn_t match, 1325 void **matches, unsigned int matches_len) 1326{ 1327 unsigned int count_graph; 1328 unsigned int count_ref; 1329 1330 if (!fwnode || !match) 1331 return -EINVAL; 1332 1333 count_graph = fwnode_graph_devcon_matches(fwnode, con_id, data, match, 1334 matches, matches_len); 1335 1336 if (matches) { 1337 matches += count_graph; 1338 matches_len -= count_graph; 1339 } 1340 1341 count_ref = fwnode_devcon_matches(fwnode, con_id, data, match, 1342 matches, matches_len); 1343 1344 return count_graph + count_ref; 1345} 1346EXPORT_SYMBOL_GPL(fwnode_connection_find_matches);