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