1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * property.c - Unified device property interface. 4 * 5 * Copyright (C) 2014, Intel Corporation 6 * Authors: Rafael J. Wysocki <rafael.j.wysocki@intel.com> 7 * Mika Westerberg <mika.westerberg@linux.intel.com> 8 */ 9 10 #include <linux/acpi.h> 11 #include <linux/export.h> 12 #include <linux/kernel.h> 13 #include <linux/of.h> 14 #include <linux/of_address.h> 15 #include <linux/of_graph.h> 16 #include <linux/of_irq.h> 17 #include <linux/property.h> 18 #include <linux/etherdevice.h> 19 #include <linux/phy.h> 20 21 struct property_set { 22 struct device *dev; 23 struct fwnode_handle fwnode; 24 const struct property_entry *properties; 25 }; 26 27 static const struct fwnode_operations pset_fwnode_ops; 28 29 static inline bool is_pset_node(const struct fwnode_handle *fwnode) 30 { 31 return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &pset_fwnode_ops; 32 } 33 34 #define to_pset_node(__fwnode) \ 35 ({ \ 36 typeof(__fwnode) __to_pset_node_fwnode = __fwnode; \ 37 \ 38 is_pset_node(__to_pset_node_fwnode) ? \ 39 container_of(__to_pset_node_fwnode, \ 40 struct property_set, fwnode) : \ 41 NULL; \ 42 }) 43 44 static const struct property_entry * 45 pset_prop_get(const struct property_set *pset, const char *name) 46 { 47 const struct property_entry *prop; 48 49 if (!pset || !pset->properties) 50 return NULL; 51 52 for (prop = pset->properties; prop->name; prop++) 53 if (!strcmp(name, prop->name)) 54 return prop; 55 56 return NULL; 57 } 58 59 static const void *property_get_pointer(const struct property_entry *prop) 60 { 61 switch (prop->type) { 62 case DEV_PROP_U8: 63 if (prop->is_array) 64 return prop->pointer.u8_data; 65 return &prop->value.u8_data; 66 case DEV_PROP_U16: 67 if (prop->is_array) 68 return prop->pointer.u16_data; 69 return &prop->value.u16_data; 70 case DEV_PROP_U32: 71 if (prop->is_array) 72 return prop->pointer.u32_data; 73 return &prop->value.u32_data; 74 case DEV_PROP_U64: 75 if (prop->is_array) 76 return prop->pointer.u64_data; 77 return &prop->value.u64_data; 78 case DEV_PROP_STRING: 79 if (prop->is_array) 80 return prop->pointer.str; 81 return &prop->value.str; 82 default: 83 return NULL; 84 } 85 } 86 87 static void property_set_pointer(struct property_entry *prop, const void *pointer) 88 { 89 switch (prop->type) { 90 case DEV_PROP_U8: 91 if (prop->is_array) 92 prop->pointer.u8_data = pointer; 93 else 94 prop->value.u8_data = *((u8 *)pointer); 95 break; 96 case DEV_PROP_U16: 97 if (prop->is_array) 98 prop->pointer.u16_data = pointer; 99 else 100 prop->value.u16_data = *((u16 *)pointer); 101 break; 102 case DEV_PROP_U32: 103 if (prop->is_array) 104 prop->pointer.u32_data = pointer; 105 else 106 prop->value.u32_data = *((u32 *)pointer); 107 break; 108 case DEV_PROP_U64: 109 if (prop->is_array) 110 prop->pointer.u64_data = pointer; 111 else 112 prop->value.u64_data = *((u64 *)pointer); 113 break; 114 case DEV_PROP_STRING: 115 if (prop->is_array) 116 prop->pointer.str = pointer; 117 else 118 prop->value.str = pointer; 119 break; 120 default: 121 break; 122 } 123 } 124 125 static const void *pset_prop_find(const struct property_set *pset, 126 const char *propname, size_t length) 127 { 128 const struct property_entry *prop; 129 const void *pointer; 130 131 prop = pset_prop_get(pset, propname); 132 if (!prop) 133 return ERR_PTR(-EINVAL); 134 pointer = property_get_pointer(prop); 135 if (!pointer) 136 return ERR_PTR(-ENODATA); 137 if (length > prop->length) 138 return ERR_PTR(-EOVERFLOW); 139 return pointer; 140 } 141 142 static int pset_prop_read_u8_array(const struct property_set *pset, 143 const char *propname, 144 u8 *values, size_t nval) 145 { 146 const void *pointer; 147 size_t length = nval * sizeof(*values); 148 149 pointer = pset_prop_find(pset, propname, length); 150 if (IS_ERR(pointer)) 151 return PTR_ERR(pointer); 152 153 memcpy(values, pointer, length); 154 return 0; 155 } 156 157 static int pset_prop_read_u16_array(const struct property_set *pset, 158 const char *propname, 159 u16 *values, size_t nval) 160 { 161 const void *pointer; 162 size_t length = nval * sizeof(*values); 163 164 pointer = pset_prop_find(pset, propname, length); 165 if (IS_ERR(pointer)) 166 return PTR_ERR(pointer); 167 168 memcpy(values, pointer, length); 169 return 0; 170 } 171 172 static int pset_prop_read_u32_array(const struct property_set *pset, 173 const char *propname, 174 u32 *values, size_t nval) 175 { 176 const void *pointer; 177 size_t length = nval * sizeof(*values); 178 179 pointer = pset_prop_find(pset, propname, length); 180 if (IS_ERR(pointer)) 181 return PTR_ERR(pointer); 182 183 memcpy(values, pointer, length); 184 return 0; 185 } 186 187 static int pset_prop_read_u64_array(const struct property_set *pset, 188 const char *propname, 189 u64 *values, size_t nval) 190 { 191 const void *pointer; 192 size_t length = nval * sizeof(*values); 193 194 pointer = pset_prop_find(pset, propname, length); 195 if (IS_ERR(pointer)) 196 return PTR_ERR(pointer); 197 198 memcpy(values, pointer, length); 199 return 0; 200 } 201 202 static int pset_prop_count_elems_of_size(const struct property_set *pset, 203 const char *propname, size_t length) 204 { 205 const struct property_entry *prop; 206 207 prop = pset_prop_get(pset, propname); 208 if (!prop) 209 return -EINVAL; 210 211 return prop->length / length; 212 } 213 214 static int pset_prop_read_string_array(const struct property_set *pset, 215 const char *propname, 216 const char **strings, size_t nval) 217 { 218 const struct property_entry *prop; 219 const void *pointer; 220 size_t array_len, length; 221 222 /* Find out the array length. */ 223 prop = pset_prop_get(pset, propname); 224 if (!prop) 225 return -EINVAL; 226 227 if (!prop->is_array) 228 /* The array length for a non-array string property is 1. */ 229 array_len = 1; 230 else 231 /* Find the length of an array. */ 232 array_len = pset_prop_count_elems_of_size(pset, propname, 233 sizeof(const char *)); 234 235 /* Return how many there are if strings is NULL. */ 236 if (!strings) 237 return array_len; 238 239 array_len = min(nval, array_len); 240 length = array_len * sizeof(*strings); 241 242 pointer = pset_prop_find(pset, propname, length); 243 if (IS_ERR(pointer)) 244 return PTR_ERR(pointer); 245 246 memcpy(strings, pointer, length); 247 248 return array_len; 249 } 250 251 struct fwnode_handle *dev_fwnode(struct device *dev) 252 { 253 return IS_ENABLED(CONFIG_OF) && dev->of_node ? 254 &dev->of_node->fwnode : dev->fwnode; 255 } 256 EXPORT_SYMBOL_GPL(dev_fwnode); 257 258 static bool pset_fwnode_property_present(const struct fwnode_handle *fwnode, 259 const char *propname) 260 { 261 return !!pset_prop_get(to_pset_node(fwnode), propname); 262 } 263 264 static int pset_fwnode_read_int_array(const struct fwnode_handle *fwnode, 265 const char *propname, 266 unsigned int elem_size, void *val, 267 size_t nval) 268 { 269 const struct property_set *node = to_pset_node(fwnode); 270 271 if (!val) 272 return pset_prop_count_elems_of_size(node, propname, elem_size); 273 274 switch (elem_size) { 275 case sizeof(u8): 276 return pset_prop_read_u8_array(node, propname, val, nval); 277 case sizeof(u16): 278 return pset_prop_read_u16_array(node, propname, val, nval); 279 case sizeof(u32): 280 return pset_prop_read_u32_array(node, propname, val, nval); 281 case sizeof(u64): 282 return pset_prop_read_u64_array(node, propname, val, nval); 283 } 284 285 return -ENXIO; 286 } 287 288 static int 289 pset_fwnode_property_read_string_array(const struct fwnode_handle *fwnode, 290 const char *propname, 291 const char **val, size_t nval) 292 { 293 return pset_prop_read_string_array(to_pset_node(fwnode), propname, 294 val, nval); 295 } 296 297 static const struct fwnode_operations pset_fwnode_ops = { 298 .property_present = pset_fwnode_property_present, 299 .property_read_int_array = pset_fwnode_read_int_array, 300 .property_read_string_array = pset_fwnode_property_read_string_array, 301 }; 302 303 /** 304 * device_property_present - check if a property of a device is present 305 * @dev: Device whose property is being checked 306 * @propname: Name of the property 307 * 308 * Check if property @propname is present in the device firmware description. 309 */ 310 bool device_property_present(struct device *dev, const char *propname) 311 { 312 return fwnode_property_present(dev_fwnode(dev), propname); 313 } 314 EXPORT_SYMBOL_GPL(device_property_present); 315 316 /** 317 * fwnode_property_present - check if a property of a firmware node is present 318 * @fwnode: Firmware node whose property to check 319 * @propname: Name of the property 320 */ 321 bool fwnode_property_present(const struct fwnode_handle *fwnode, 322 const char *propname) 323 { 324 bool ret; 325 326 ret = fwnode_call_bool_op(fwnode, property_present, propname); 327 if (ret == false && !IS_ERR_OR_NULL(fwnode) && 328 !IS_ERR_OR_NULL(fwnode->secondary)) 329 ret = fwnode_call_bool_op(fwnode->secondary, property_present, 330 propname); 331 return ret; 332 } 333 EXPORT_SYMBOL_GPL(fwnode_property_present); 334 335 /** 336 * device_property_read_u8_array - return a u8 array property of a device 337 * @dev: Device to get the property of 338 * @propname: Name of the property 339 * @val: The values are stored here or %NULL to return the number of values 340 * @nval: Size of the @val array 341 * 342 * Function reads an array of u8 properties with @propname from the device 343 * firmware description and stores them to @val if found. 344 * 345 * Return: number of values if @val was %NULL, 346 * %0 if the property was found (success), 347 * %-EINVAL if given arguments are not valid, 348 * %-ENODATA if the property does not have a value, 349 * %-EPROTO if the property is not an array of numbers, 350 * %-EOVERFLOW if the size of the property is not as expected. 351 * %-ENXIO if no suitable firmware interface is present. 352 */ 353 int device_property_read_u8_array(struct device *dev, const char *propname, 354 u8 *val, size_t nval) 355 { 356 return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval); 357 } 358 EXPORT_SYMBOL_GPL(device_property_read_u8_array); 359 360 /** 361 * device_property_read_u16_array - return a u16 array property of a device 362 * @dev: Device to get the property of 363 * @propname: Name of the property 364 * @val: The values are stored here or %NULL to return the number of values 365 * @nval: Size of the @val array 366 * 367 * Function reads an array of u16 properties with @propname from the device 368 * firmware description and stores them to @val if found. 369 * 370 * Return: number of values if @val was %NULL, 371 * %0 if the property was found (success), 372 * %-EINVAL if given arguments are not valid, 373 * %-ENODATA if the property does not have a value, 374 * %-EPROTO if the property is not an array of numbers, 375 * %-EOVERFLOW if the size of the property is not as expected. 376 * %-ENXIO if no suitable firmware interface is present. 377 */ 378 int device_property_read_u16_array(struct device *dev, const char *propname, 379 u16 *val, size_t nval) 380 { 381 return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval); 382 } 383 EXPORT_SYMBOL_GPL(device_property_read_u16_array); 384 385 /** 386 * device_property_read_u32_array - return a u32 array property of a device 387 * @dev: Device to get the property of 388 * @propname: Name of the property 389 * @val: The values are stored here or %NULL to return the number of values 390 * @nval: Size of the @val array 391 * 392 * Function reads an array of u32 properties with @propname from the device 393 * firmware description and stores them to @val if found. 394 * 395 * Return: number of values if @val was %NULL, 396 * %0 if the property was found (success), 397 * %-EINVAL if given arguments are not valid, 398 * %-ENODATA if the property does not have a value, 399 * %-EPROTO if the property is not an array of numbers, 400 * %-EOVERFLOW if the size of the property is not as expected. 401 * %-ENXIO if no suitable firmware interface is present. 402 */ 403 int device_property_read_u32_array(struct device *dev, const char *propname, 404 u32 *val, size_t nval) 405 { 406 return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval); 407 } 408 EXPORT_SYMBOL_GPL(device_property_read_u32_array); 409 410 /** 411 * device_property_read_u64_array - return a u64 array property of a device 412 * @dev: Device to get the property of 413 * @propname: Name of the property 414 * @val: The values are stored here or %NULL to return the number of values 415 * @nval: Size of the @val array 416 * 417 * Function reads an array of u64 properties with @propname from the device 418 * firmware description and stores them to @val if found. 419 * 420 * Return: number of values if @val was %NULL, 421 * %0 if the property was found (success), 422 * %-EINVAL if given arguments are not valid, 423 * %-ENODATA if the property does not have a value, 424 * %-EPROTO if the property is not an array of numbers, 425 * %-EOVERFLOW if the size of the property is not as expected. 426 * %-ENXIO if no suitable firmware interface is present. 427 */ 428 int device_property_read_u64_array(struct device *dev, const char *propname, 429 u64 *val, size_t nval) 430 { 431 return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval); 432 } 433 EXPORT_SYMBOL_GPL(device_property_read_u64_array); 434 435 /** 436 * device_property_read_string_array - return a string array property of device 437 * @dev: Device to get the property of 438 * @propname: Name of the property 439 * @val: The values are stored here or %NULL to return the number of values 440 * @nval: Size of the @val array 441 * 442 * Function reads an array of string properties with @propname from the device 443 * firmware description and stores them to @val if found. 444 * 445 * Return: number of values read on success if @val is non-NULL, 446 * number of values available on success if @val is NULL, 447 * %-EINVAL if given arguments are not valid, 448 * %-ENODATA if the property does not have a value, 449 * %-EPROTO or %-EILSEQ if the property is not an array of strings, 450 * %-EOVERFLOW if the size of the property is not as expected. 451 * %-ENXIO if no suitable firmware interface is present. 452 */ 453 int device_property_read_string_array(struct device *dev, const char *propname, 454 const char **val, size_t nval) 455 { 456 return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval); 457 } 458 EXPORT_SYMBOL_GPL(device_property_read_string_array); 459 460 /** 461 * device_property_read_string - return a string property of a device 462 * @dev: Device to get the property of 463 * @propname: Name of the property 464 * @val: The value is stored here 465 * 466 * Function reads property @propname from the device firmware description and 467 * stores the value into @val if found. The value is checked to be a string. 468 * 469 * Return: %0 if the property was found (success), 470 * %-EINVAL if given arguments are not valid, 471 * %-ENODATA if the property does not have a value, 472 * %-EPROTO or %-EILSEQ if the property type is not a string. 473 * %-ENXIO if no suitable firmware interface is present. 474 */ 475 int device_property_read_string(struct device *dev, const char *propname, 476 const char **val) 477 { 478 return fwnode_property_read_string(dev_fwnode(dev), propname, val); 479 } 480 EXPORT_SYMBOL_GPL(device_property_read_string); 481 482 /** 483 * device_property_match_string - find a string in an array and return index 484 * @dev: Device to get the property of 485 * @propname: Name of the property holding the array 486 * @string: String to look for 487 * 488 * Find a given string in a string array and if it is found return the 489 * index back. 490 * 491 * Return: %0 if the property was found (success), 492 * %-EINVAL if given arguments are not valid, 493 * %-ENODATA if the property does not have a value, 494 * %-EPROTO if the property is not an array of strings, 495 * %-ENXIO if no suitable firmware interface is present. 496 */ 497 int device_property_match_string(struct device *dev, const char *propname, 498 const char *string) 499 { 500 return fwnode_property_match_string(dev_fwnode(dev), propname, string); 501 } 502 EXPORT_SYMBOL_GPL(device_property_match_string); 503 504 static int fwnode_property_read_int_array(const struct fwnode_handle *fwnode, 505 const char *propname, 506 unsigned int elem_size, void *val, 507 size_t nval) 508 { 509 int ret; 510 511 ret = fwnode_call_int_op(fwnode, property_read_int_array, propname, 512 elem_size, val, nval); 513 if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) && 514 !IS_ERR_OR_NULL(fwnode->secondary)) 515 ret = fwnode_call_int_op( 516 fwnode->secondary, property_read_int_array, propname, 517 elem_size, val, nval); 518 519 return ret; 520 } 521 522 /** 523 * fwnode_property_read_u8_array - return a u8 array property of firmware node 524 * @fwnode: Firmware node to get the property of 525 * @propname: Name of the property 526 * @val: The values are stored here or %NULL to return the number of values 527 * @nval: Size of the @val array 528 * 529 * Read an array of u8 properties with @propname from @fwnode and stores them to 530 * @val if found. 531 * 532 * Return: number of values if @val was %NULL, 533 * %0 if the property was found (success), 534 * %-EINVAL if given arguments are not valid, 535 * %-ENODATA if the property does not have a value, 536 * %-EPROTO if the property is not an array of numbers, 537 * %-EOVERFLOW if the size of the property is not as expected, 538 * %-ENXIO if no suitable firmware interface is present. 539 */ 540 int fwnode_property_read_u8_array(const struct fwnode_handle *fwnode, 541 const char *propname, u8 *val, size_t nval) 542 { 543 return fwnode_property_read_int_array(fwnode, propname, sizeof(u8), 544 val, nval); 545 } 546 EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array); 547 548 /** 549 * fwnode_property_read_u16_array - return a u16 array property of firmware node 550 * @fwnode: Firmware node to get the property of 551 * @propname: Name of the property 552 * @val: The values are stored here or %NULL to return the number of values 553 * @nval: Size of the @val array 554 * 555 * Read an array of u16 properties with @propname from @fwnode and store them to 556 * @val if found. 557 * 558 * Return: number of values if @val was %NULL, 559 * %0 if the property was found (success), 560 * %-EINVAL if given arguments are not valid, 561 * %-ENODATA if the property does not have a value, 562 * %-EPROTO if the property is not an array of numbers, 563 * %-EOVERFLOW if the size of the property is not as expected, 564 * %-ENXIO if no suitable firmware interface is present. 565 */ 566 int fwnode_property_read_u16_array(const struct fwnode_handle *fwnode, 567 const char *propname, u16 *val, size_t nval) 568 { 569 return fwnode_property_read_int_array(fwnode, propname, sizeof(u16), 570 val, nval); 571 } 572 EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array); 573 574 /** 575 * fwnode_property_read_u32_array - return a u32 array property of firmware node 576 * @fwnode: Firmware node to get the property of 577 * @propname: Name of the property 578 * @val: The values are stored here or %NULL to return the number of values 579 * @nval: Size of the @val array 580 * 581 * Read an array of u32 properties with @propname from @fwnode store them to 582 * @val if found. 583 * 584 * Return: number of values if @val was %NULL, 585 * %0 if the property was found (success), 586 * %-EINVAL if given arguments are not valid, 587 * %-ENODATA if the property does not have a value, 588 * %-EPROTO if the property is not an array of numbers, 589 * %-EOVERFLOW if the size of the property is not as expected, 590 * %-ENXIO if no suitable firmware interface is present. 591 */ 592 int fwnode_property_read_u32_array(const struct fwnode_handle *fwnode, 593 const char *propname, u32 *val, size_t nval) 594 { 595 return fwnode_property_read_int_array(fwnode, propname, sizeof(u32), 596 val, nval); 597 } 598 EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array); 599 600 /** 601 * fwnode_property_read_u64_array - return a u64 array property firmware node 602 * @fwnode: Firmware node to get the property of 603 * @propname: Name of the property 604 * @val: The values are stored here or %NULL to return the number of values 605 * @nval: Size of the @val array 606 * 607 * Read an array of u64 properties with @propname from @fwnode and store them to 608 * @val if found. 609 * 610 * Return: number of values if @val was %NULL, 611 * %0 if the property was found (success), 612 * %-EINVAL if given arguments are not valid, 613 * %-ENODATA if the property does not have a value, 614 * %-EPROTO if the property is not an array of numbers, 615 * %-EOVERFLOW if the size of the property is not as expected, 616 * %-ENXIO if no suitable firmware interface is present. 617 */ 618 int fwnode_property_read_u64_array(const struct fwnode_handle *fwnode, 619 const char *propname, u64 *val, size_t nval) 620 { 621 return fwnode_property_read_int_array(fwnode, propname, sizeof(u64), 622 val, nval); 623 } 624 EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array); 625 626 /** 627 * fwnode_property_read_string_array - return string array property of a node 628 * @fwnode: Firmware node to get the property of 629 * @propname: Name of the property 630 * @val: The values are stored here or %NULL to return the number of values 631 * @nval: Size of the @val array 632 * 633 * Read an string list property @propname from the given firmware node and store 634 * them to @val if found. 635 * 636 * Return: number of values read on success if @val is non-NULL, 637 * number of values available on success if @val is NULL, 638 * %-EINVAL if given arguments are not valid, 639 * %-ENODATA if the property does not have a value, 640 * %-EPROTO or %-EILSEQ if the property is not an array of strings, 641 * %-EOVERFLOW if the size of the property is not as expected, 642 * %-ENXIO if no suitable firmware interface is present. 643 */ 644 int fwnode_property_read_string_array(const struct fwnode_handle *fwnode, 645 const char *propname, const char **val, 646 size_t nval) 647 { 648 int ret; 649 650 ret = fwnode_call_int_op(fwnode, property_read_string_array, propname, 651 val, nval); 652 if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) && 653 !IS_ERR_OR_NULL(fwnode->secondary)) 654 ret = fwnode_call_int_op(fwnode->secondary, 655 property_read_string_array, propname, 656 val, nval); 657 return ret; 658 } 659 EXPORT_SYMBOL_GPL(fwnode_property_read_string_array); 660 661 /** 662 * fwnode_property_read_string - return a string property of a firmware node 663 * @fwnode: Firmware node to get the property of 664 * @propname: Name of the property 665 * @val: The value is stored here 666 * 667 * Read property @propname from the given firmware node and store the value into 668 * @val if found. The value is checked to be a string. 669 * 670 * Return: %0 if the property was found (success), 671 * %-EINVAL if given arguments are not valid, 672 * %-ENODATA if the property does not have a value, 673 * %-EPROTO or %-EILSEQ if the property is not a string, 674 * %-ENXIO if no suitable firmware interface is present. 675 */ 676 int fwnode_property_read_string(const struct fwnode_handle *fwnode, 677 const char *propname, const char **val) 678 { 679 int ret = fwnode_property_read_string_array(fwnode, propname, val, 1); 680 681 return ret < 0 ? ret : 0; 682 } 683 EXPORT_SYMBOL_GPL(fwnode_property_read_string); 684 685 /** 686 * fwnode_property_match_string - find a string in an array and return index 687 * @fwnode: Firmware node to get the property of 688 * @propname: Name of the property holding the array 689 * @string: String to look for 690 * 691 * Find a given string in a string array and if it is found return the 692 * index back. 693 * 694 * Return: %0 if the property was found (success), 695 * %-EINVAL if given arguments are not valid, 696 * %-ENODATA if the property does not have a value, 697 * %-EPROTO if the property is not an array of strings, 698 * %-ENXIO if no suitable firmware interface is present. 699 */ 700 int fwnode_property_match_string(const struct fwnode_handle *fwnode, 701 const char *propname, const char *string) 702 { 703 const char **values; 704 int nval, ret; 705 706 nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0); 707 if (nval < 0) 708 return nval; 709 710 if (nval == 0) 711 return -ENODATA; 712 713 values = kcalloc(nval, sizeof(*values), GFP_KERNEL); 714 if (!values) 715 return -ENOMEM; 716 717 ret = fwnode_property_read_string_array(fwnode, propname, values, nval); 718 if (ret < 0) 719 goto out; 720 721 ret = match_string(values, nval, string); 722 if (ret < 0) 723 ret = -ENODATA; 724 out: 725 kfree(values); 726 return ret; 727 } 728 EXPORT_SYMBOL_GPL(fwnode_property_match_string); 729 730 /** 731 * fwnode_property_get_reference_args() - Find a reference with arguments 732 * @fwnode: Firmware node where to look for the reference 733 * @prop: The name of the property 734 * @nargs_prop: The name of the property telling the number of 735 * arguments in the referred node. NULL if @nargs is known, 736 * otherwise @nargs is ignored. Only relevant on OF. 737 * @nargs: Number of arguments. Ignored if @nargs_prop is non-NULL. 738 * @index: Index of the reference, from zero onwards. 739 * @args: Result structure with reference and integer arguments. 740 * 741 * Obtain a reference based on a named property in an fwnode, with 742 * integer arguments. 743 * 744 * Caller is responsible to call fwnode_handle_put() on the returned 745 * args->fwnode pointer. 746 * 747 * Returns: %0 on success 748 * %-ENOENT when the index is out of bounds, the index has an empty 749 * reference or the property was not found 750 * %-EINVAL on parse error 751 */ 752 int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, 753 const char *prop, const char *nargs_prop, 754 unsigned int nargs, unsigned int index, 755 struct fwnode_reference_args *args) 756 { 757 return fwnode_call_int_op(fwnode, get_reference_args, prop, nargs_prop, 758 nargs, index, args); 759 } 760 EXPORT_SYMBOL_GPL(fwnode_property_get_reference_args); 761 762 static void property_entry_free_data(const struct property_entry *p) 763 { 764 const void *pointer = property_get_pointer(p); 765 size_t i, nval; 766 767 if (p->is_array) { 768 if (p->type == DEV_PROP_STRING && p->pointer.str) { 769 nval = p->length / sizeof(const char *); 770 for (i = 0; i < nval; i++) 771 kfree(p->pointer.str[i]); 772 } 773 kfree(pointer); 774 } else if (p->type == DEV_PROP_STRING) { 775 kfree(p->value.str); 776 } 777 kfree(p->name); 778 } 779 780 static int property_copy_string_array(struct property_entry *dst, 781 const struct property_entry *src) 782 { 783 const char **d; 784 size_t nval = src->length / sizeof(*d); 785 int i; 786 787 d = kcalloc(nval, sizeof(*d), GFP_KERNEL); 788 if (!d) 789 return -ENOMEM; 790 791 for (i = 0; i < nval; i++) { 792 d[i] = kstrdup(src->pointer.str[i], GFP_KERNEL); 793 if (!d[i] && src->pointer.str[i]) { 794 while (--i >= 0) 795 kfree(d[i]); 796 kfree(d); 797 return -ENOMEM; 798 } 799 } 800 801 dst->pointer.str = d; 802 return 0; 803 } 804 805 static int property_entry_copy_data(struct property_entry *dst, 806 const struct property_entry *src) 807 { 808 const void *pointer = property_get_pointer(src); 809 const void *new; 810 int error; 811 812 if (src->is_array) { 813 if (!src->length) 814 return -ENODATA; 815 816 if (src->type == DEV_PROP_STRING) { 817 error = property_copy_string_array(dst, src); 818 if (error) 819 return error; 820 new = dst->pointer.str; 821 } else { 822 new = kmemdup(pointer, src->length, GFP_KERNEL); 823 if (!new) 824 return -ENOMEM; 825 } 826 } else if (src->type == DEV_PROP_STRING) { 827 new = kstrdup(src->value.str, GFP_KERNEL); 828 if (!new && src->value.str) 829 return -ENOMEM; 830 } else { 831 new = pointer; 832 } 833 834 dst->length = src->length; 835 dst->is_array = src->is_array; 836 dst->type = src->type; 837 838 property_set_pointer(dst, new); 839 840 dst->name = kstrdup(src->name, GFP_KERNEL); 841 if (!dst->name) 842 goto out_free_data; 843 844 return 0; 845 846 out_free_data: 847 property_entry_free_data(dst); 848 return -ENOMEM; 849 } 850 851 /** 852 * property_entries_dup - duplicate array of properties 853 * @properties: array of properties to copy 854 * 855 * This function creates a deep copy of the given NULL-terminated array 856 * of property entries. 857 */ 858 struct property_entry * 859 property_entries_dup(const struct property_entry *properties) 860 { 861 struct property_entry *p; 862 int i, n = 0; 863 864 while (properties[n].name) 865 n++; 866 867 p = kcalloc(n + 1, sizeof(*p), GFP_KERNEL); 868 if (!p) 869 return ERR_PTR(-ENOMEM); 870 871 for (i = 0; i < n; i++) { 872 int ret = property_entry_copy_data(&p[i], &properties[i]); 873 if (ret) { 874 while (--i >= 0) 875 property_entry_free_data(&p[i]); 876 kfree(p); 877 return ERR_PTR(ret); 878 } 879 } 880 881 return p; 882 } 883 EXPORT_SYMBOL_GPL(property_entries_dup); 884 885 /** 886 * property_entries_free - free previously allocated array of properties 887 * @properties: array of properties to destroy 888 * 889 * This function frees given NULL-terminated array of property entries, 890 * along with their data. 891 */ 892 void property_entries_free(const struct property_entry *properties) 893 { 894 const struct property_entry *p; 895 896 for (p = properties; p->name; p++) 897 property_entry_free_data(p); 898 899 kfree(properties); 900 } 901 EXPORT_SYMBOL_GPL(property_entries_free); 902 903 /** 904 * pset_free_set - releases memory allocated for copied property set 905 * @pset: Property set to release 906 * 907 * Function takes previously copied property set and releases all the 908 * memory allocated to it. 909 */ 910 static void pset_free_set(struct property_set *pset) 911 { 912 if (!pset) 913 return; 914 915 property_entries_free(pset->properties); 916 kfree(pset); 917 } 918 919 /** 920 * pset_copy_set - copies property set 921 * @pset: Property set to copy 922 * 923 * This function takes a deep copy of the given property set and returns 924 * pointer to the copy. Call device_free_property_set() to free resources 925 * allocated in this function. 926 * 927 * Return: Pointer to the new property set or error pointer. 928 */ 929 static struct property_set *pset_copy_set(const struct property_set *pset) 930 { 931 struct property_entry *properties; 932 struct property_set *p; 933 934 p = kzalloc(sizeof(*p), GFP_KERNEL); 935 if (!p) 936 return ERR_PTR(-ENOMEM); 937 938 properties = property_entries_dup(pset->properties); 939 if (IS_ERR(properties)) { 940 kfree(p); 941 return ERR_CAST(properties); 942 } 943 944 p->properties = properties; 945 return p; 946 } 947 948 /** 949 * device_remove_properties - Remove properties from a device object. 950 * @dev: Device whose properties to remove. 951 * 952 * The function removes properties previously associated to the device 953 * secondary firmware node with device_add_properties(). Memory allocated 954 * to the properties will also be released. 955 */ 956 void device_remove_properties(struct device *dev) 957 { 958 struct fwnode_handle *fwnode; 959 struct property_set *pset; 960 961 fwnode = dev_fwnode(dev); 962 if (!fwnode) 963 return; 964 /* 965 * Pick either primary or secondary node depending which one holds 966 * the pset. If there is no real firmware node (ACPI/DT) primary 967 * will hold the pset. 968 */ 969 pset = to_pset_node(fwnode); 970 if (pset) { 971 set_primary_fwnode(dev, NULL); 972 } else { 973 pset = to_pset_node(fwnode->secondary); 974 if (pset && dev == pset->dev) 975 set_secondary_fwnode(dev, NULL); 976 } 977 if (pset && dev == pset->dev) 978 pset_free_set(pset); 979 } 980 EXPORT_SYMBOL_GPL(device_remove_properties); 981 982 /** 983 * device_add_properties - Add a collection of properties to a device object. 984 * @dev: Device to add properties to. 985 * @properties: Collection of properties to add. 986 * 987 * Associate a collection of device properties represented by @properties with 988 * @dev as its secondary firmware node. The function takes a copy of 989 * @properties. 990 */ 991 int device_add_properties(struct device *dev, 992 const struct property_entry *properties) 993 { 994 struct property_set *p, pset; 995 996 if (!properties) 997 return -EINVAL; 998 999 pset.properties = properties; 1000 1001 p = pset_copy_set(&pset); 1002 if (IS_ERR(p)) 1003 return PTR_ERR(p); 1004 1005 p->fwnode.ops = &pset_fwnode_ops; 1006 set_secondary_fwnode(dev, &p->fwnode); 1007 p->dev = dev; 1008 return 0; 1009 } 1010 EXPORT_SYMBOL_GPL(device_add_properties); 1011 1012 /** 1013 * fwnode_get_next_parent - Iterate to the node's parent 1014 * @fwnode: Firmware whose parent is retrieved 1015 * 1016 * This is like fwnode_get_parent() except that it drops the refcount 1017 * on the passed node, making it suitable for iterating through a 1018 * node's parents. 1019 * 1020 * Returns a node pointer with refcount incremented, use 1021 * fwnode_handle_node() on it when done. 1022 */ 1023 struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode) 1024 { 1025 struct fwnode_handle *parent = fwnode_get_parent(fwnode); 1026 1027 fwnode_handle_put(fwnode); 1028 1029 return parent; 1030 } 1031 EXPORT_SYMBOL_GPL(fwnode_get_next_parent); 1032 1033 /** 1034 * fwnode_get_parent - Return parent firwmare node 1035 * @fwnode: Firmware whose parent is retrieved 1036 * 1037 * Return parent firmware node of the given node if possible or %NULL if no 1038 * parent was available. 1039 */ 1040 struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode) 1041 { 1042 return fwnode_call_ptr_op(fwnode, get_parent); 1043 } 1044 EXPORT_SYMBOL_GPL(fwnode_get_parent); 1045 1046 /** 1047 * fwnode_get_next_child_node - Return the next child node handle for a node 1048 * @fwnode: Firmware node to find the next child node for. 1049 * @child: Handle to one of the node's child nodes or a %NULL handle. 1050 */ 1051 struct fwnode_handle * 1052 fwnode_get_next_child_node(const struct fwnode_handle *fwnode, 1053 struct fwnode_handle *child) 1054 { 1055 return fwnode_call_ptr_op(fwnode, get_next_child_node, child); 1056 } 1057 EXPORT_SYMBOL_GPL(fwnode_get_next_child_node); 1058 1059 /** 1060 * fwnode_get_next_available_child_node - Return the next 1061 * available child node handle for a node 1062 * @fwnode: Firmware node to find the next child node for. 1063 * @child: Handle to one of the node's child nodes or a %NULL handle. 1064 */ 1065 struct fwnode_handle * 1066 fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode, 1067 struct fwnode_handle *child) 1068 { 1069 struct fwnode_handle *next_child = child; 1070 1071 if (!fwnode) 1072 return NULL; 1073 1074 do { 1075 next_child = fwnode_get_next_child_node(fwnode, next_child); 1076 1077 if (!next_child || fwnode_device_is_available(next_child)) 1078 break; 1079 } while (next_child); 1080 1081 return next_child; 1082 } 1083 EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node); 1084 1085 /** 1086 * device_get_next_child_node - Return the next child node handle for a device 1087 * @dev: Device to find the next child node for. 1088 * @child: Handle to one of the device's child nodes or a null handle. 1089 */ 1090 struct fwnode_handle *device_get_next_child_node(struct device *dev, 1091 struct fwnode_handle *child) 1092 { 1093 struct acpi_device *adev = ACPI_COMPANION(dev); 1094 struct fwnode_handle *fwnode = NULL; 1095 1096 if (dev->of_node) 1097 fwnode = &dev->of_node->fwnode; 1098 else if (adev) 1099 fwnode = acpi_fwnode_handle(adev); 1100 1101 return fwnode_get_next_child_node(fwnode, child); 1102 } 1103 EXPORT_SYMBOL_GPL(device_get_next_child_node); 1104 1105 /** 1106 * fwnode_get_named_child_node - Return first matching named child node handle 1107 * @fwnode: Firmware node to find the named child node for. 1108 * @childname: String to match child node name against. 1109 */ 1110 struct fwnode_handle * 1111 fwnode_get_named_child_node(const struct fwnode_handle *fwnode, 1112 const char *childname) 1113 { 1114 return fwnode_call_ptr_op(fwnode, get_named_child_node, childname); 1115 } 1116 EXPORT_SYMBOL_GPL(fwnode_get_named_child_node); 1117 1118 /** 1119 * device_get_named_child_node - Return first matching named child node handle 1120 * @dev: Device to find the named child node for. 1121 * @childname: String to match child node name against. 1122 */ 1123 struct fwnode_handle *device_get_named_child_node(struct device *dev, 1124 const char *childname) 1125 { 1126 return fwnode_get_named_child_node(dev_fwnode(dev), childname); 1127 } 1128 EXPORT_SYMBOL_GPL(device_get_named_child_node); 1129 1130 /** 1131 * fwnode_handle_get - Obtain a reference to a device node 1132 * @fwnode: Pointer to the device node to obtain the reference to. 1133 * 1134 * Returns the fwnode handle. 1135 */ 1136 struct fwnode_handle *fwnode_handle_get(struct fwnode_handle *fwnode) 1137 { 1138 if (!fwnode_has_op(fwnode, get)) 1139 return fwnode; 1140 1141 return fwnode_call_ptr_op(fwnode, get); 1142 } 1143 EXPORT_SYMBOL_GPL(fwnode_handle_get); 1144 1145 /** 1146 * fwnode_handle_put - Drop reference to a device node 1147 * @fwnode: Pointer to the device node to drop the reference to. 1148 * 1149 * This has to be used when terminating device_for_each_child_node() iteration 1150 * with break or return to prevent stale device node references from being left 1151 * behind. 1152 */ 1153 void fwnode_handle_put(struct fwnode_handle *fwnode) 1154 { 1155 fwnode_call_void_op(fwnode, put); 1156 } 1157 EXPORT_SYMBOL_GPL(fwnode_handle_put); 1158 1159 /** 1160 * fwnode_device_is_available - check if a device is available for use 1161 * @fwnode: Pointer to the fwnode of the device. 1162 */ 1163 bool fwnode_device_is_available(const struct fwnode_handle *fwnode) 1164 { 1165 return fwnode_call_bool_op(fwnode, device_is_available); 1166 } 1167 EXPORT_SYMBOL_GPL(fwnode_device_is_available); 1168 1169 /** 1170 * device_get_child_node_count - return the number of child nodes for device 1171 * @dev: Device to cound the child nodes for 1172 */ 1173 unsigned int device_get_child_node_count(struct device *dev) 1174 { 1175 struct fwnode_handle *child; 1176 unsigned int count = 0; 1177 1178 device_for_each_child_node(dev, child) 1179 count++; 1180 1181 return count; 1182 } 1183 EXPORT_SYMBOL_GPL(device_get_child_node_count); 1184 1185 bool device_dma_supported(struct device *dev) 1186 { 1187 /* For DT, this is always supported. 1188 * For ACPI, this depends on CCA, which 1189 * is determined by the acpi_dma_supported(). 1190 */ 1191 if (IS_ENABLED(CONFIG_OF) && dev->of_node) 1192 return true; 1193 1194 return acpi_dma_supported(ACPI_COMPANION(dev)); 1195 } 1196 EXPORT_SYMBOL_GPL(device_dma_supported); 1197 1198 enum dev_dma_attr device_get_dma_attr(struct device *dev) 1199 { 1200 enum dev_dma_attr attr = DEV_DMA_NOT_SUPPORTED; 1201 1202 if (IS_ENABLED(CONFIG_OF) && dev->of_node) { 1203 if (of_dma_is_coherent(dev->of_node)) 1204 attr = DEV_DMA_COHERENT; 1205 else 1206 attr = DEV_DMA_NON_COHERENT; 1207 } else 1208 attr = acpi_get_dma_attr(ACPI_COMPANION(dev)); 1209 1210 return attr; 1211 } 1212 EXPORT_SYMBOL_GPL(device_get_dma_attr); 1213 1214 /** 1215 * fwnode_get_phy_mode - Get phy mode for given firmware node 1216 * @fwnode: Pointer to the given node 1217 * 1218 * The function gets phy interface string from property 'phy-mode' or 1219 * 'phy-connection-type', and return its index in phy_modes table, or errno in 1220 * error case. 1221 */ 1222 int fwnode_get_phy_mode(struct fwnode_handle *fwnode) 1223 { 1224 const char *pm; 1225 int err, i; 1226 1227 err = fwnode_property_read_string(fwnode, "phy-mode", &pm); 1228 if (err < 0) 1229 err = fwnode_property_read_string(fwnode, 1230 "phy-connection-type", &pm); 1231 if (err < 0) 1232 return err; 1233 1234 for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++) 1235 if (!strcasecmp(pm, phy_modes(i))) 1236 return i; 1237 1238 return -ENODEV; 1239 } 1240 EXPORT_SYMBOL_GPL(fwnode_get_phy_mode); 1241 1242 /** 1243 * device_get_phy_mode - Get phy mode for given device 1244 * @dev: Pointer to the given device 1245 * 1246 * The function gets phy interface string from property 'phy-mode' or 1247 * 'phy-connection-type', and return its index in phy_modes table, or errno in 1248 * error case. 1249 */ 1250 int device_get_phy_mode(struct device *dev) 1251 { 1252 return fwnode_get_phy_mode(dev_fwnode(dev)); 1253 } 1254 EXPORT_SYMBOL_GPL(device_get_phy_mode); 1255 1256 static void *fwnode_get_mac_addr(struct fwnode_handle *fwnode, 1257 const char *name, char *addr, 1258 int alen) 1259 { 1260 int ret = fwnode_property_read_u8_array(fwnode, name, addr, alen); 1261 1262 if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr)) 1263 return addr; 1264 return NULL; 1265 } 1266 1267 /** 1268 * fwnode_get_mac_address - Get the MAC from the firmware node 1269 * @fwnode: Pointer to the firmware node 1270 * @addr: Address of buffer to store the MAC in 1271 * @alen: Length of the buffer pointed to by addr, should be ETH_ALEN 1272 * 1273 * Search the firmware node for the best MAC address to use. 'mac-address' is 1274 * checked first, because that is supposed to contain to "most recent" MAC 1275 * address. If that isn't set, then 'local-mac-address' is checked next, 1276 * because that is the default address. If that isn't set, then the obsolete 1277 * 'address' is checked, just in case we're using an old device tree. 1278 * 1279 * Note that the 'address' property is supposed to contain a virtual address of 1280 * the register set, but some DTS files have redefined that property to be the 1281 * MAC address. 1282 * 1283 * All-zero MAC addresses are rejected, because those could be properties that 1284 * exist in the firmware tables, but were not updated by the firmware. For 1285 * example, the DTS could define 'mac-address' and 'local-mac-address', with 1286 * zero MAC addresses. Some older U-Boots only initialized 'local-mac-address'. 1287 * In this case, the real MAC is in 'local-mac-address', and 'mac-address' 1288 * exists but is all zeros. 1289 */ 1290 void *fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr, int alen) 1291 { 1292 char *res; 1293 1294 res = fwnode_get_mac_addr(fwnode, "mac-address", addr, alen); 1295 if (res) 1296 return res; 1297 1298 res = fwnode_get_mac_addr(fwnode, "local-mac-address", addr, alen); 1299 if (res) 1300 return res; 1301 1302 return fwnode_get_mac_addr(fwnode, "address", addr, alen); 1303 } 1304 EXPORT_SYMBOL(fwnode_get_mac_address); 1305 1306 /** 1307 * device_get_mac_address - Get the MAC for a given device 1308 * @dev: Pointer to the device 1309 * @addr: Address of buffer to store the MAC in 1310 * @alen: Length of the buffer pointed to by addr, should be ETH_ALEN 1311 */ 1312 void *device_get_mac_address(struct device *dev, char *addr, int alen) 1313 { 1314 return fwnode_get_mac_address(dev_fwnode(dev), addr, alen); 1315 } 1316 EXPORT_SYMBOL(device_get_mac_address); 1317 1318 /** 1319 * fwnode_irq_get - Get IRQ directly from a fwnode 1320 * @fwnode: Pointer to the firmware node 1321 * @index: Zero-based index of the IRQ 1322 * 1323 * Returns Linux IRQ number on success. Other values are determined 1324 * accordingly to acpi_/of_ irq_get() operation. 1325 */ 1326 int fwnode_irq_get(struct fwnode_handle *fwnode, unsigned int index) 1327 { 1328 struct device_node *of_node = to_of_node(fwnode); 1329 struct resource res; 1330 int ret; 1331 1332 if (IS_ENABLED(CONFIG_OF) && of_node) 1333 return of_irq_get(of_node, index); 1334 1335 ret = acpi_irq_get(ACPI_HANDLE_FWNODE(fwnode), index, &res); 1336 if (ret) 1337 return ret; 1338 1339 return res.start; 1340 } 1341 EXPORT_SYMBOL(fwnode_irq_get); 1342 1343 /** 1344 * device_graph_get_next_endpoint - Get next endpoint firmware node 1345 * @fwnode: Pointer to the parent firmware node 1346 * @prev: Previous endpoint node or %NULL to get the first 1347 * 1348 * Returns an endpoint firmware node pointer or %NULL if no more endpoints 1349 * are available. 1350 */ 1351 struct fwnode_handle * 1352 fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode, 1353 struct fwnode_handle *prev) 1354 { 1355 return fwnode_call_ptr_op(fwnode, graph_get_next_endpoint, prev); 1356 } 1357 EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint); 1358 1359 /** 1360 * fwnode_graph_get_port_parent - Return the device fwnode of a port endpoint 1361 * @endpoint: Endpoint firmware node of the port 1362 * 1363 * Return: the firmware node of the device the @endpoint belongs to. 1364 */ 1365 struct fwnode_handle * 1366 fwnode_graph_get_port_parent(const struct fwnode_handle *endpoint) 1367 { 1368 struct fwnode_handle *port, *parent; 1369 1370 port = fwnode_get_parent(endpoint); 1371 parent = fwnode_call_ptr_op(port, graph_get_port_parent); 1372 1373 fwnode_handle_put(port); 1374 1375 return parent; 1376 } 1377 EXPORT_SYMBOL_GPL(fwnode_graph_get_port_parent); 1378 1379 /** 1380 * fwnode_graph_get_remote_port_parent - Return fwnode of a remote device 1381 * @fwnode: Endpoint firmware node pointing to the remote endpoint 1382 * 1383 * Extracts firmware node of a remote device the @fwnode points to. 1384 */ 1385 struct fwnode_handle * 1386 fwnode_graph_get_remote_port_parent(const struct fwnode_handle *fwnode) 1387 { 1388 struct fwnode_handle *endpoint, *parent; 1389 1390 endpoint = fwnode_graph_get_remote_endpoint(fwnode); 1391 parent = fwnode_graph_get_port_parent(endpoint); 1392 1393 fwnode_handle_put(endpoint); 1394 1395 return parent; 1396 } 1397 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent); 1398 1399 /** 1400 * fwnode_graph_get_remote_port - Return fwnode of a remote port 1401 * @fwnode: Endpoint firmware node pointing to the remote endpoint 1402 * 1403 * Extracts firmware node of a remote port the @fwnode points to. 1404 */ 1405 struct fwnode_handle * 1406 fwnode_graph_get_remote_port(const struct fwnode_handle *fwnode) 1407 { 1408 return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode)); 1409 } 1410 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port); 1411 1412 /** 1413 * fwnode_graph_get_remote_endpoint - Return fwnode of a remote endpoint 1414 * @fwnode: Endpoint firmware node pointing to the remote endpoint 1415 * 1416 * Extracts firmware node of a remote endpoint the @fwnode points to. 1417 */ 1418 struct fwnode_handle * 1419 fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode) 1420 { 1421 return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint); 1422 } 1423 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint); 1424 1425 /** 1426 * fwnode_graph_get_remote_node - get remote parent node for given port/endpoint 1427 * @fwnode: pointer to parent fwnode_handle containing graph port/endpoint 1428 * @port_id: identifier of the parent port node 1429 * @endpoint_id: identifier of the endpoint node 1430 * 1431 * Return: Remote fwnode handle associated with remote endpoint node linked 1432 * to @node. Use fwnode_node_put() on it when done. 1433 */ 1434 struct fwnode_handle * 1435 fwnode_graph_get_remote_node(const struct fwnode_handle *fwnode, u32 port_id, 1436 u32 endpoint_id) 1437 { 1438 struct fwnode_handle *endpoint = NULL; 1439 1440 while ((endpoint = fwnode_graph_get_next_endpoint(fwnode, endpoint))) { 1441 struct fwnode_endpoint fwnode_ep; 1442 struct fwnode_handle *remote; 1443 int ret; 1444 1445 ret = fwnode_graph_parse_endpoint(endpoint, &fwnode_ep); 1446 if (ret < 0) 1447 continue; 1448 1449 if (fwnode_ep.port != port_id || fwnode_ep.id != endpoint_id) 1450 continue; 1451 1452 remote = fwnode_graph_get_remote_port_parent(endpoint); 1453 if (!remote) 1454 return NULL; 1455 1456 return fwnode_device_is_available(remote) ? remote : NULL; 1457 } 1458 1459 return NULL; 1460 } 1461 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_node); 1462 1463 /** 1464 * fwnode_graph_parse_endpoint - parse common endpoint node properties 1465 * @fwnode: pointer to endpoint fwnode_handle 1466 * @endpoint: pointer to the fwnode endpoint data structure 1467 * 1468 * Parse @fwnode representing a graph endpoint node and store the 1469 * information in @endpoint. The caller must hold a reference to 1470 * @fwnode. 1471 */ 1472 int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, 1473 struct fwnode_endpoint *endpoint) 1474 { 1475 memset(endpoint, 0, sizeof(*endpoint)); 1476 1477 return fwnode_call_int_op(fwnode, graph_parse_endpoint, endpoint); 1478 } 1479 EXPORT_SYMBOL(fwnode_graph_parse_endpoint); 1480 1481 const void *device_get_match_data(struct device *dev) 1482 { 1483 return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev); 1484 } 1485 EXPORT_SYMBOL_GPL(device_get_match_data); 1486