root/drivers/base/property.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dev_fwnode
  2. device_property_present
  3. fwnode_property_present
  4. device_property_read_u8_array
  5. device_property_read_u16_array
  6. device_property_read_u32_array
  7. device_property_read_u64_array
  8. device_property_read_string_array
  9. device_property_read_string
  10. device_property_match_string
  11. fwnode_property_read_int_array
  12. fwnode_property_read_u8_array
  13. fwnode_property_read_u16_array
  14. fwnode_property_read_u32_array
  15. fwnode_property_read_u64_array
  16. fwnode_property_read_string_array
  17. fwnode_property_read_string
  18. fwnode_property_match_string
  19. fwnode_property_get_reference_args
  20. fwnode_find_reference
  21. device_remove_properties
  22. device_add_properties
  23. fwnode_get_next_parent
  24. fwnode_get_parent
  25. fwnode_get_next_child_node
  26. fwnode_get_next_available_child_node
  27. device_get_next_child_node
  28. fwnode_get_named_child_node
  29. device_get_named_child_node
  30. fwnode_handle_get
  31. fwnode_handle_put
  32. fwnode_device_is_available
  33. device_get_child_node_count
  34. device_dma_supported
  35. device_get_dma_attr
  36. fwnode_get_phy_mode
  37. device_get_phy_mode
  38. fwnode_get_mac_addr
  39. fwnode_get_mac_address
  40. device_get_mac_address
  41. fwnode_irq_get
  42. fwnode_graph_get_next_endpoint
  43. fwnode_graph_get_port_parent
  44. fwnode_graph_get_remote_port_parent
  45. fwnode_graph_get_remote_port
  46. fwnode_graph_get_remote_endpoint
  47. fwnode_graph_get_remote_node
  48. fwnode_graph_get_endpoint_by_id
  49. fwnode_graph_parse_endpoint
  50. device_get_match_data

   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 fwnode_handle *dev_fwnode(struct device *dev)
  22 {
  23         return IS_ENABLED(CONFIG_OF) && dev->of_node ?
  24                 &dev->of_node->fwnode : dev->fwnode;
  25 }
  26 EXPORT_SYMBOL_GPL(dev_fwnode);
  27 
  28 /**
  29  * device_property_present - check if a property of a device is present
  30  * @dev: Device whose property is being checked
  31  * @propname: Name of the property
  32  *
  33  * Check if property @propname is present in the device firmware description.
  34  */
  35 bool device_property_present(struct device *dev, const char *propname)
  36 {
  37         return fwnode_property_present(dev_fwnode(dev), propname);
  38 }
  39 EXPORT_SYMBOL_GPL(device_property_present);
  40 
  41 /**
  42  * fwnode_property_present - check if a property of a firmware node is present
  43  * @fwnode: Firmware node whose property to check
  44  * @propname: Name of the property
  45  */
  46 bool fwnode_property_present(const struct fwnode_handle *fwnode,
  47                              const char *propname)
  48 {
  49         bool ret;
  50 
  51         ret = fwnode_call_bool_op(fwnode, property_present, propname);
  52         if (ret == false && !IS_ERR_OR_NULL(fwnode) &&
  53             !IS_ERR_OR_NULL(fwnode->secondary))
  54                 ret = fwnode_call_bool_op(fwnode->secondary, property_present,
  55                                          propname);
  56         return ret;
  57 }
  58 EXPORT_SYMBOL_GPL(fwnode_property_present);
  59 
  60 /**
  61  * device_property_read_u8_array - return a u8 array property of a device
  62  * @dev: Device to get the property of
  63  * @propname: Name of the property
  64  * @val: The values are stored here or %NULL to return the number of values
  65  * @nval: Size of the @val array
  66  *
  67  * Function reads an array of u8 properties with @propname from the device
  68  * firmware description and stores them to @val if found.
  69  *
  70  * Return: number of values if @val was %NULL,
  71  *         %0 if the property was found (success),
  72  *         %-EINVAL if given arguments are not valid,
  73  *         %-ENODATA if the property does not have a value,
  74  *         %-EPROTO if the property is not an array of numbers,
  75  *         %-EOVERFLOW if the size of the property is not as expected.
  76  *         %-ENXIO if no suitable firmware interface is present.
  77  */
  78 int device_property_read_u8_array(struct device *dev, const char *propname,
  79                                   u8 *val, size_t nval)
  80 {
  81         return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval);
  82 }
  83 EXPORT_SYMBOL_GPL(device_property_read_u8_array);
  84 
  85 /**
  86  * device_property_read_u16_array - return a u16 array property of a device
  87  * @dev: Device to get the property of
  88  * @propname: Name of the property
  89  * @val: The values are stored here or %NULL to return the number of values
  90  * @nval: Size of the @val array
  91  *
  92  * Function reads an array of u16 properties with @propname from the device
  93  * firmware description and stores them to @val if found.
  94  *
  95  * Return: number of values if @val was %NULL,
  96  *         %0 if the property was found (success),
  97  *         %-EINVAL if given arguments are not valid,
  98  *         %-ENODATA if the property does not have a value,
  99  *         %-EPROTO if the property is not an array of numbers,
 100  *         %-EOVERFLOW if the size of the property is not as expected.
 101  *         %-ENXIO if no suitable firmware interface is present.
 102  */
 103 int device_property_read_u16_array(struct device *dev, const char *propname,
 104                                    u16 *val, size_t nval)
 105 {
 106         return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval);
 107 }
 108 EXPORT_SYMBOL_GPL(device_property_read_u16_array);
 109 
 110 /**
 111  * device_property_read_u32_array - return a u32 array property of a device
 112  * @dev: Device to get the property of
 113  * @propname: Name of the property
 114  * @val: The values are stored here or %NULL to return the number of values
 115  * @nval: Size of the @val array
 116  *
 117  * Function reads an array of u32 properties with @propname from the device
 118  * firmware description and stores them to @val if found.
 119  *
 120  * Return: number of values if @val was %NULL,
 121  *         %0 if the property was found (success),
 122  *         %-EINVAL if given arguments are not valid,
 123  *         %-ENODATA if the property does not have a value,
 124  *         %-EPROTO if the property is not an array of numbers,
 125  *         %-EOVERFLOW if the size of the property is not as expected.
 126  *         %-ENXIO if no suitable firmware interface is present.
 127  */
 128 int device_property_read_u32_array(struct device *dev, const char *propname,
 129                                    u32 *val, size_t nval)
 130 {
 131         return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval);
 132 }
 133 EXPORT_SYMBOL_GPL(device_property_read_u32_array);
 134 
 135 /**
 136  * device_property_read_u64_array - return a u64 array property of a device
 137  * @dev: Device to get the property of
 138  * @propname: Name of the property
 139  * @val: The values are stored here or %NULL to return the number of values
 140  * @nval: Size of the @val array
 141  *
 142  * Function reads an array of u64 properties with @propname from the device
 143  * firmware description and stores them to @val if found.
 144  *
 145  * Return: number of values if @val was %NULL,
 146  *         %0 if the property was found (success),
 147  *         %-EINVAL if given arguments are not valid,
 148  *         %-ENODATA if the property does not have a value,
 149  *         %-EPROTO if the property is not an array of numbers,
 150  *         %-EOVERFLOW if the size of the property is not as expected.
 151  *         %-ENXIO if no suitable firmware interface is present.
 152  */
 153 int device_property_read_u64_array(struct device *dev, const char *propname,
 154                                    u64 *val, size_t nval)
 155 {
 156         return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval);
 157 }
 158 EXPORT_SYMBOL_GPL(device_property_read_u64_array);
 159 
 160 /**
 161  * device_property_read_string_array - return a string array property of device
 162  * @dev: Device to get the property of
 163  * @propname: Name of the property
 164  * @val: The values are stored here or %NULL to return the number of values
 165  * @nval: Size of the @val array
 166  *
 167  * Function reads an array of string properties with @propname from the device
 168  * firmware description and stores them to @val if found.
 169  *
 170  * Return: number of values read on success if @val is non-NULL,
 171  *         number of values available on success if @val is NULL,
 172  *         %-EINVAL if given arguments are not valid,
 173  *         %-ENODATA if the property does not have a value,
 174  *         %-EPROTO or %-EILSEQ if the property is not an array of strings,
 175  *         %-EOVERFLOW if the size of the property is not as expected.
 176  *         %-ENXIO if no suitable firmware interface is present.
 177  */
 178 int device_property_read_string_array(struct device *dev, const char *propname,
 179                                       const char **val, size_t nval)
 180 {
 181         return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval);
 182 }
 183 EXPORT_SYMBOL_GPL(device_property_read_string_array);
 184 
 185 /**
 186  * device_property_read_string - return a string property of a device
 187  * @dev: Device to get the property of
 188  * @propname: Name of the property
 189  * @val: The value is stored here
 190  *
 191  * Function reads property @propname from the device firmware description and
 192  * stores the value into @val if found. The value is checked to be a string.
 193  *
 194  * Return: %0 if the property was found (success),
 195  *         %-EINVAL if given arguments are not valid,
 196  *         %-ENODATA if the property does not have a value,
 197  *         %-EPROTO or %-EILSEQ if the property type is not a string.
 198  *         %-ENXIO if no suitable firmware interface is present.
 199  */
 200 int device_property_read_string(struct device *dev, const char *propname,
 201                                 const char **val)
 202 {
 203         return fwnode_property_read_string(dev_fwnode(dev), propname, val);
 204 }
 205 EXPORT_SYMBOL_GPL(device_property_read_string);
 206 
 207 /**
 208  * device_property_match_string - find a string in an array and return index
 209  * @dev: Device to get the property of
 210  * @propname: Name of the property holding the array
 211  * @string: String to look for
 212  *
 213  * Find a given string in a string array and if it is found return the
 214  * index back.
 215  *
 216  * Return: %0 if the property was found (success),
 217  *         %-EINVAL if given arguments are not valid,
 218  *         %-ENODATA if the property does not have a value,
 219  *         %-EPROTO if the property is not an array of strings,
 220  *         %-ENXIO if no suitable firmware interface is present.
 221  */
 222 int device_property_match_string(struct device *dev, const char *propname,
 223                                  const char *string)
 224 {
 225         return fwnode_property_match_string(dev_fwnode(dev), propname, string);
 226 }
 227 EXPORT_SYMBOL_GPL(device_property_match_string);
 228 
 229 static int fwnode_property_read_int_array(const struct fwnode_handle *fwnode,
 230                                           const char *propname,
 231                                           unsigned int elem_size, void *val,
 232                                           size_t nval)
 233 {
 234         int ret;
 235 
 236         ret = fwnode_call_int_op(fwnode, property_read_int_array, propname,
 237                                  elem_size, val, nval);
 238         if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) &&
 239             !IS_ERR_OR_NULL(fwnode->secondary))
 240                 ret = fwnode_call_int_op(
 241                         fwnode->secondary, property_read_int_array, propname,
 242                         elem_size, val, nval);
 243 
 244         return ret;
 245 }
 246 
 247 /**
 248  * fwnode_property_read_u8_array - return a u8 array property of firmware node
 249  * @fwnode: Firmware node to get the property of
 250  * @propname: Name of the property
 251  * @val: The values are stored here or %NULL to return the number of values
 252  * @nval: Size of the @val array
 253  *
 254  * Read an array of u8 properties with @propname from @fwnode and stores them to
 255  * @val if found.
 256  *
 257  * Return: number of values if @val was %NULL,
 258  *         %0 if the property was found (success),
 259  *         %-EINVAL if given arguments are not valid,
 260  *         %-ENODATA if the property does not have a value,
 261  *         %-EPROTO if the property is not an array of numbers,
 262  *         %-EOVERFLOW if the size of the property is not as expected,
 263  *         %-ENXIO if no suitable firmware interface is present.
 264  */
 265 int fwnode_property_read_u8_array(const struct fwnode_handle *fwnode,
 266                                   const char *propname, u8 *val, size_t nval)
 267 {
 268         return fwnode_property_read_int_array(fwnode, propname, sizeof(u8),
 269                                               val, nval);
 270 }
 271 EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array);
 272 
 273 /**
 274  * fwnode_property_read_u16_array - return a u16 array property of firmware node
 275  * @fwnode: Firmware node to get the property of
 276  * @propname: Name of the property
 277  * @val: The values are stored here or %NULL to return the number of values
 278  * @nval: Size of the @val array
 279  *
 280  * Read an array of u16 properties with @propname from @fwnode and store them to
 281  * @val if found.
 282  *
 283  * Return: number of values if @val was %NULL,
 284  *         %0 if the property was found (success),
 285  *         %-EINVAL if given arguments are not valid,
 286  *         %-ENODATA if the property does not have a value,
 287  *         %-EPROTO if the property is not an array of numbers,
 288  *         %-EOVERFLOW if the size of the property is not as expected,
 289  *         %-ENXIO if no suitable firmware interface is present.
 290  */
 291 int fwnode_property_read_u16_array(const struct fwnode_handle *fwnode,
 292                                    const char *propname, u16 *val, size_t nval)
 293 {
 294         return fwnode_property_read_int_array(fwnode, propname, sizeof(u16),
 295                                               val, nval);
 296 }
 297 EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array);
 298 
 299 /**
 300  * fwnode_property_read_u32_array - return a u32 array property of firmware node
 301  * @fwnode: Firmware node to get the property of
 302  * @propname: Name of the property
 303  * @val: The values are stored here or %NULL to return the number of values
 304  * @nval: Size of the @val array
 305  *
 306  * Read an array of u32 properties with @propname from @fwnode store them to
 307  * @val if found.
 308  *
 309  * Return: number of values if @val was %NULL,
 310  *         %0 if the property was found (success),
 311  *         %-EINVAL if given arguments are not valid,
 312  *         %-ENODATA if the property does not have a value,
 313  *         %-EPROTO if the property is not an array of numbers,
 314  *         %-EOVERFLOW if the size of the property is not as expected,
 315  *         %-ENXIO if no suitable firmware interface is present.
 316  */
 317 int fwnode_property_read_u32_array(const struct fwnode_handle *fwnode,
 318                                    const char *propname, u32 *val, size_t nval)
 319 {
 320         return fwnode_property_read_int_array(fwnode, propname, sizeof(u32),
 321                                               val, nval);
 322 }
 323 EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array);
 324 
 325 /**
 326  * fwnode_property_read_u64_array - return a u64 array property firmware node
 327  * @fwnode: Firmware node to get the property of
 328  * @propname: Name of the property
 329  * @val: The values are stored here or %NULL to return the number of values
 330  * @nval: Size of the @val array
 331  *
 332  * Read an array of u64 properties with @propname from @fwnode and store them to
 333  * @val if found.
 334  *
 335  * Return: number of values if @val was %NULL,
 336  *         %0 if the property was found (success),
 337  *         %-EINVAL if given arguments are not valid,
 338  *         %-ENODATA if the property does not have a value,
 339  *         %-EPROTO if the property is not an array of numbers,
 340  *         %-EOVERFLOW if the size of the property is not as expected,
 341  *         %-ENXIO if no suitable firmware interface is present.
 342  */
 343 int fwnode_property_read_u64_array(const struct fwnode_handle *fwnode,
 344                                    const char *propname, u64 *val, size_t nval)
 345 {
 346         return fwnode_property_read_int_array(fwnode, propname, sizeof(u64),
 347                                               val, nval);
 348 }
 349 EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array);
 350 
 351 /**
 352  * fwnode_property_read_string_array - return string array property of a node
 353  * @fwnode: Firmware node to get the property of
 354  * @propname: Name of the property
 355  * @val: The values are stored here or %NULL to return the number of values
 356  * @nval: Size of the @val array
 357  *
 358  * Read an string list property @propname from the given firmware node and store
 359  * them to @val if found.
 360  *
 361  * Return: number of values read on success if @val is non-NULL,
 362  *         number of values available on success if @val is NULL,
 363  *         %-EINVAL if given arguments are not valid,
 364  *         %-ENODATA if the property does not have a value,
 365  *         %-EPROTO or %-EILSEQ if the property is not an array of strings,
 366  *         %-EOVERFLOW if the size of the property is not as expected,
 367  *         %-ENXIO if no suitable firmware interface is present.
 368  */
 369 int fwnode_property_read_string_array(const struct fwnode_handle *fwnode,
 370                                       const char *propname, const char **val,
 371                                       size_t nval)
 372 {
 373         int ret;
 374 
 375         ret = fwnode_call_int_op(fwnode, property_read_string_array, propname,
 376                                  val, nval);
 377         if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) &&
 378             !IS_ERR_OR_NULL(fwnode->secondary))
 379                 ret = fwnode_call_int_op(fwnode->secondary,
 380                                          property_read_string_array, propname,
 381                                          val, nval);
 382         return ret;
 383 }
 384 EXPORT_SYMBOL_GPL(fwnode_property_read_string_array);
 385 
 386 /**
 387  * fwnode_property_read_string - return a string property of a firmware node
 388  * @fwnode: Firmware node to get the property of
 389  * @propname: Name of the property
 390  * @val: The value is stored here
 391  *
 392  * Read property @propname from the given firmware node and store the value into
 393  * @val if found.  The value is checked to be a string.
 394  *
 395  * Return: %0 if the property was found (success),
 396  *         %-EINVAL if given arguments are not valid,
 397  *         %-ENODATA if the property does not have a value,
 398  *         %-EPROTO or %-EILSEQ if the property is not a string,
 399  *         %-ENXIO if no suitable firmware interface is present.
 400  */
 401 int fwnode_property_read_string(const struct fwnode_handle *fwnode,
 402                                 const char *propname, const char **val)
 403 {
 404         int ret = fwnode_property_read_string_array(fwnode, propname, val, 1);
 405 
 406         return ret < 0 ? ret : 0;
 407 }
 408 EXPORT_SYMBOL_GPL(fwnode_property_read_string);
 409 
 410 /**
 411  * fwnode_property_match_string - find a string in an array and return index
 412  * @fwnode: Firmware node to get the property of
 413  * @propname: Name of the property holding the array
 414  * @string: String to look for
 415  *
 416  * Find a given string in a string array and if it is found return the
 417  * index back.
 418  *
 419  * Return: %0 if the property was found (success),
 420  *         %-EINVAL if given arguments are not valid,
 421  *         %-ENODATA if the property does not have a value,
 422  *         %-EPROTO if the property is not an array of strings,
 423  *         %-ENXIO if no suitable firmware interface is present.
 424  */
 425 int fwnode_property_match_string(const struct fwnode_handle *fwnode,
 426         const char *propname, const char *string)
 427 {
 428         const char **values;
 429         int nval, ret;
 430 
 431         nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0);
 432         if (nval < 0)
 433                 return nval;
 434 
 435         if (nval == 0)
 436                 return -ENODATA;
 437 
 438         values = kcalloc(nval, sizeof(*values), GFP_KERNEL);
 439         if (!values)
 440                 return -ENOMEM;
 441 
 442         ret = fwnode_property_read_string_array(fwnode, propname, values, nval);
 443         if (ret < 0)
 444                 goto out;
 445 
 446         ret = match_string(values, nval, string);
 447         if (ret < 0)
 448                 ret = -ENODATA;
 449 out:
 450         kfree(values);
 451         return ret;
 452 }
 453 EXPORT_SYMBOL_GPL(fwnode_property_match_string);
 454 
 455 /**
 456  * fwnode_property_get_reference_args() - Find a reference with arguments
 457  * @fwnode:     Firmware node where to look for the reference
 458  * @prop:       The name of the property
 459  * @nargs_prop: The name of the property telling the number of
 460  *              arguments in the referred node. NULL if @nargs is known,
 461  *              otherwise @nargs is ignored. Only relevant on OF.
 462  * @nargs:      Number of arguments. Ignored if @nargs_prop is non-NULL.
 463  * @index:      Index of the reference, from zero onwards.
 464  * @args:       Result structure with reference and integer arguments.
 465  *
 466  * Obtain a reference based on a named property in an fwnode, with
 467  * integer arguments.
 468  *
 469  * Caller is responsible to call fwnode_handle_put() on the returned
 470  * args->fwnode pointer.
 471  *
 472  * Returns: %0 on success
 473  *          %-ENOENT when the index is out of bounds, the index has an empty
 474  *                   reference or the property was not found
 475  *          %-EINVAL on parse error
 476  */
 477 int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,
 478                                        const char *prop, const char *nargs_prop,
 479                                        unsigned int nargs, unsigned int index,
 480                                        struct fwnode_reference_args *args)
 481 {
 482         return fwnode_call_int_op(fwnode, get_reference_args, prop, nargs_prop,
 483                                   nargs, index, args);
 484 }
 485 EXPORT_SYMBOL_GPL(fwnode_property_get_reference_args);
 486 
 487 /**
 488  * fwnode_find_reference - Find named reference to a fwnode_handle
 489  * @fwnode: Firmware node where to look for the reference
 490  * @name: The name of the reference
 491  * @index: Index of the reference
 492  *
 493  * @index can be used when the named reference holds a table of references.
 494  *
 495  * Returns pointer to the reference fwnode, or ERR_PTR. Caller is responsible to
 496  * call fwnode_handle_put() on the returned fwnode pointer.
 497  */
 498 struct fwnode_handle *fwnode_find_reference(const struct fwnode_handle *fwnode,
 499                                             const char *name,
 500                                             unsigned int index)
 501 {
 502         struct fwnode_reference_args args;
 503         int ret;
 504 
 505         ret = fwnode_property_get_reference_args(fwnode, name, NULL, 0, index,
 506                                                  &args);
 507         return ret ? ERR_PTR(ret) : args.fwnode;
 508 }
 509 EXPORT_SYMBOL_GPL(fwnode_find_reference);
 510 
 511 /**
 512  * device_remove_properties - Remove properties from a device object.
 513  * @dev: Device whose properties to remove.
 514  *
 515  * The function removes properties previously associated to the device
 516  * firmware node with device_add_properties(). Memory allocated to the
 517  * properties will also be released.
 518  */
 519 void device_remove_properties(struct device *dev)
 520 {
 521         struct fwnode_handle *fwnode = dev_fwnode(dev);
 522 
 523         if (!fwnode)
 524                 return;
 525 
 526         if (is_software_node(fwnode->secondary)) {
 527                 fwnode_remove_software_node(fwnode->secondary);
 528                 set_secondary_fwnode(dev, NULL);
 529         }
 530 }
 531 EXPORT_SYMBOL_GPL(device_remove_properties);
 532 
 533 /**
 534  * device_add_properties - Add a collection of properties to a device object.
 535  * @dev: Device to add properties to.
 536  * @properties: Collection of properties to add.
 537  *
 538  * Associate a collection of device properties represented by @properties with
 539  * @dev. The function takes a copy of @properties.
 540  *
 541  * WARNING: The callers should not use this function if it is known that there
 542  * is no real firmware node associated with @dev! In that case the callers
 543  * should create a software node and assign it to @dev directly.
 544  */
 545 int device_add_properties(struct device *dev,
 546                           const struct property_entry *properties)
 547 {
 548         struct fwnode_handle *fwnode;
 549 
 550         fwnode = fwnode_create_software_node(properties, NULL);
 551         if (IS_ERR(fwnode))
 552                 return PTR_ERR(fwnode);
 553 
 554         set_secondary_fwnode(dev, fwnode);
 555         return 0;
 556 }
 557 EXPORT_SYMBOL_GPL(device_add_properties);
 558 
 559 /**
 560  * fwnode_get_next_parent - Iterate to the node's parent
 561  * @fwnode: Firmware whose parent is retrieved
 562  *
 563  * This is like fwnode_get_parent() except that it drops the refcount
 564  * on the passed node, making it suitable for iterating through a
 565  * node's parents.
 566  *
 567  * Returns a node pointer with refcount incremented, use
 568  * fwnode_handle_node() on it when done.
 569  */
 570 struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode)
 571 {
 572         struct fwnode_handle *parent = fwnode_get_parent(fwnode);
 573 
 574         fwnode_handle_put(fwnode);
 575 
 576         return parent;
 577 }
 578 EXPORT_SYMBOL_GPL(fwnode_get_next_parent);
 579 
 580 /**
 581  * fwnode_get_parent - Return parent firwmare node
 582  * @fwnode: Firmware whose parent is retrieved
 583  *
 584  * Return parent firmware node of the given node if possible or %NULL if no
 585  * parent was available.
 586  */
 587 struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode)
 588 {
 589         return fwnode_call_ptr_op(fwnode, get_parent);
 590 }
 591 EXPORT_SYMBOL_GPL(fwnode_get_parent);
 592 
 593 /**
 594  * fwnode_get_next_child_node - Return the next child node handle for a node
 595  * @fwnode: Firmware node to find the next child node for.
 596  * @child: Handle to one of the node's child nodes or a %NULL handle.
 597  */
 598 struct fwnode_handle *
 599 fwnode_get_next_child_node(const struct fwnode_handle *fwnode,
 600                            struct fwnode_handle *child)
 601 {
 602         return fwnode_call_ptr_op(fwnode, get_next_child_node, child);
 603 }
 604 EXPORT_SYMBOL_GPL(fwnode_get_next_child_node);
 605 
 606 /**
 607  * fwnode_get_next_available_child_node - Return the next
 608  * available child node handle for a node
 609  * @fwnode: Firmware node to find the next child node for.
 610  * @child: Handle to one of the node's child nodes or a %NULL handle.
 611  */
 612 struct fwnode_handle *
 613 fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode,
 614                                      struct fwnode_handle *child)
 615 {
 616         struct fwnode_handle *next_child = child;
 617 
 618         if (!fwnode)
 619                 return NULL;
 620 
 621         do {
 622                 next_child = fwnode_get_next_child_node(fwnode, next_child);
 623 
 624                 if (!next_child || fwnode_device_is_available(next_child))
 625                         break;
 626         } while (next_child);
 627 
 628         return next_child;
 629 }
 630 EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node);
 631 
 632 /**
 633  * device_get_next_child_node - Return the next child node handle for a device
 634  * @dev: Device to find the next child node for.
 635  * @child: Handle to one of the device's child nodes or a null handle.
 636  */
 637 struct fwnode_handle *device_get_next_child_node(struct device *dev,
 638                                                  struct fwnode_handle *child)
 639 {
 640         struct acpi_device *adev = ACPI_COMPANION(dev);
 641         struct fwnode_handle *fwnode = NULL;
 642 
 643         if (dev->of_node)
 644                 fwnode = &dev->of_node->fwnode;
 645         else if (adev)
 646                 fwnode = acpi_fwnode_handle(adev);
 647 
 648         return fwnode_get_next_child_node(fwnode, child);
 649 }
 650 EXPORT_SYMBOL_GPL(device_get_next_child_node);
 651 
 652 /**
 653  * fwnode_get_named_child_node - Return first matching named child node handle
 654  * @fwnode: Firmware node to find the named child node for.
 655  * @childname: String to match child node name against.
 656  */
 657 struct fwnode_handle *
 658 fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
 659                             const char *childname)
 660 {
 661         return fwnode_call_ptr_op(fwnode, get_named_child_node, childname);
 662 }
 663 EXPORT_SYMBOL_GPL(fwnode_get_named_child_node);
 664 
 665 /**
 666  * device_get_named_child_node - Return first matching named child node handle
 667  * @dev: Device to find the named child node for.
 668  * @childname: String to match child node name against.
 669  */
 670 struct fwnode_handle *device_get_named_child_node(struct device *dev,
 671                                                   const char *childname)
 672 {
 673         return fwnode_get_named_child_node(dev_fwnode(dev), childname);
 674 }
 675 EXPORT_SYMBOL_GPL(device_get_named_child_node);
 676 
 677 /**
 678  * fwnode_handle_get - Obtain a reference to a device node
 679  * @fwnode: Pointer to the device node to obtain the reference to.
 680  *
 681  * Returns the fwnode handle.
 682  */
 683 struct fwnode_handle *fwnode_handle_get(struct fwnode_handle *fwnode)
 684 {
 685         if (!fwnode_has_op(fwnode, get))
 686                 return fwnode;
 687 
 688         return fwnode_call_ptr_op(fwnode, get);
 689 }
 690 EXPORT_SYMBOL_GPL(fwnode_handle_get);
 691 
 692 /**
 693  * fwnode_handle_put - Drop reference to a device node
 694  * @fwnode: Pointer to the device node to drop the reference to.
 695  *
 696  * This has to be used when terminating device_for_each_child_node() iteration
 697  * with break or return to prevent stale device node references from being left
 698  * behind.
 699  */
 700 void fwnode_handle_put(struct fwnode_handle *fwnode)
 701 {
 702         fwnode_call_void_op(fwnode, put);
 703 }
 704 EXPORT_SYMBOL_GPL(fwnode_handle_put);
 705 
 706 /**
 707  * fwnode_device_is_available - check if a device is available for use
 708  * @fwnode: Pointer to the fwnode of the device.
 709  */
 710 bool fwnode_device_is_available(const struct fwnode_handle *fwnode)
 711 {
 712         return fwnode_call_bool_op(fwnode, device_is_available);
 713 }
 714 EXPORT_SYMBOL_GPL(fwnode_device_is_available);
 715 
 716 /**
 717  * device_get_child_node_count - return the number of child nodes for device
 718  * @dev: Device to cound the child nodes for
 719  */
 720 unsigned int device_get_child_node_count(struct device *dev)
 721 {
 722         struct fwnode_handle *child;
 723         unsigned int count = 0;
 724 
 725         device_for_each_child_node(dev, child)
 726                 count++;
 727 
 728         return count;
 729 }
 730 EXPORT_SYMBOL_GPL(device_get_child_node_count);
 731 
 732 bool device_dma_supported(struct device *dev)
 733 {
 734         /* For DT, this is always supported.
 735          * For ACPI, this depends on CCA, which
 736          * is determined by the acpi_dma_supported().
 737          */
 738         if (IS_ENABLED(CONFIG_OF) && dev->of_node)
 739                 return true;
 740 
 741         return acpi_dma_supported(ACPI_COMPANION(dev));
 742 }
 743 EXPORT_SYMBOL_GPL(device_dma_supported);
 744 
 745 enum dev_dma_attr device_get_dma_attr(struct device *dev)
 746 {
 747         enum dev_dma_attr attr = DEV_DMA_NOT_SUPPORTED;
 748 
 749         if (IS_ENABLED(CONFIG_OF) && dev->of_node) {
 750                 if (of_dma_is_coherent(dev->of_node))
 751                         attr = DEV_DMA_COHERENT;
 752                 else
 753                         attr = DEV_DMA_NON_COHERENT;
 754         } else
 755                 attr = acpi_get_dma_attr(ACPI_COMPANION(dev));
 756 
 757         return attr;
 758 }
 759 EXPORT_SYMBOL_GPL(device_get_dma_attr);
 760 
 761 /**
 762  * fwnode_get_phy_mode - Get phy mode for given firmware node
 763  * @fwnode:     Pointer to the given node
 764  *
 765  * The function gets phy interface string from property 'phy-mode' or
 766  * 'phy-connection-type', and return its index in phy_modes table, or errno in
 767  * error case.
 768  */
 769 int fwnode_get_phy_mode(struct fwnode_handle *fwnode)
 770 {
 771         const char *pm;
 772         int err, i;
 773 
 774         err = fwnode_property_read_string(fwnode, "phy-mode", &pm);
 775         if (err < 0)
 776                 err = fwnode_property_read_string(fwnode,
 777                                                   "phy-connection-type", &pm);
 778         if (err < 0)
 779                 return err;
 780 
 781         for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++)
 782                 if (!strcasecmp(pm, phy_modes(i)))
 783                         return i;
 784 
 785         return -ENODEV;
 786 }
 787 EXPORT_SYMBOL_GPL(fwnode_get_phy_mode);
 788 
 789 /**
 790  * device_get_phy_mode - Get phy mode for given device
 791  * @dev:        Pointer to the given device
 792  *
 793  * The function gets phy interface string from property 'phy-mode' or
 794  * 'phy-connection-type', and return its index in phy_modes table, or errno in
 795  * error case.
 796  */
 797 int device_get_phy_mode(struct device *dev)
 798 {
 799         return fwnode_get_phy_mode(dev_fwnode(dev));
 800 }
 801 EXPORT_SYMBOL_GPL(device_get_phy_mode);
 802 
 803 static void *fwnode_get_mac_addr(struct fwnode_handle *fwnode,
 804                                  const char *name, char *addr,
 805                                  int alen)
 806 {
 807         int ret = fwnode_property_read_u8_array(fwnode, name, addr, alen);
 808 
 809         if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr))
 810                 return addr;
 811         return NULL;
 812 }
 813 
 814 /**
 815  * fwnode_get_mac_address - Get the MAC from the firmware node
 816  * @fwnode:     Pointer to the firmware node
 817  * @addr:       Address of buffer to store the MAC in
 818  * @alen:       Length of the buffer pointed to by addr, should be ETH_ALEN
 819  *
 820  * Search the firmware node for the best MAC address to use.  'mac-address' is
 821  * checked first, because that is supposed to contain to "most recent" MAC
 822  * address. If that isn't set, then 'local-mac-address' is checked next,
 823  * because that is the default address.  If that isn't set, then the obsolete
 824  * 'address' is checked, just in case we're using an old device tree.
 825  *
 826  * Note that the 'address' property is supposed to contain a virtual address of
 827  * the register set, but some DTS files have redefined that property to be the
 828  * MAC address.
 829  *
 830  * All-zero MAC addresses are rejected, because those could be properties that
 831  * exist in the firmware tables, but were not updated by the firmware.  For
 832  * example, the DTS could define 'mac-address' and 'local-mac-address', with
 833  * zero MAC addresses.  Some older U-Boots only initialized 'local-mac-address'.
 834  * In this case, the real MAC is in 'local-mac-address', and 'mac-address'
 835  * exists but is all zeros.
 836 */
 837 void *fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr, int alen)
 838 {
 839         char *res;
 840 
 841         res = fwnode_get_mac_addr(fwnode, "mac-address", addr, alen);
 842         if (res)
 843                 return res;
 844 
 845         res = fwnode_get_mac_addr(fwnode, "local-mac-address", addr, alen);
 846         if (res)
 847                 return res;
 848 
 849         return fwnode_get_mac_addr(fwnode, "address", addr, alen);
 850 }
 851 EXPORT_SYMBOL(fwnode_get_mac_address);
 852 
 853 /**
 854  * device_get_mac_address - Get the MAC for a given device
 855  * @dev:        Pointer to the device
 856  * @addr:       Address of buffer to store the MAC in
 857  * @alen:       Length of the buffer pointed to by addr, should be ETH_ALEN
 858  */
 859 void *device_get_mac_address(struct device *dev, char *addr, int alen)
 860 {
 861         return fwnode_get_mac_address(dev_fwnode(dev), addr, alen);
 862 }
 863 EXPORT_SYMBOL(device_get_mac_address);
 864 
 865 /**
 866  * fwnode_irq_get - Get IRQ directly from a fwnode
 867  * @fwnode:     Pointer to the firmware node
 868  * @index:      Zero-based index of the IRQ
 869  *
 870  * Returns Linux IRQ number on success. Other values are determined
 871  * accordingly to acpi_/of_ irq_get() operation.
 872  */
 873 int fwnode_irq_get(struct fwnode_handle *fwnode, unsigned int index)
 874 {
 875         struct device_node *of_node = to_of_node(fwnode);
 876         struct resource res;
 877         int ret;
 878 
 879         if (IS_ENABLED(CONFIG_OF) && of_node)
 880                 return of_irq_get(of_node, index);
 881 
 882         ret = acpi_irq_get(ACPI_HANDLE_FWNODE(fwnode), index, &res);
 883         if (ret)
 884                 return ret;
 885 
 886         return res.start;
 887 }
 888 EXPORT_SYMBOL(fwnode_irq_get);
 889 
 890 /**
 891  * fwnode_graph_get_next_endpoint - Get next endpoint firmware node
 892  * @fwnode: Pointer to the parent firmware node
 893  * @prev: Previous endpoint node or %NULL to get the first
 894  *
 895  * Returns an endpoint firmware node pointer or %NULL if no more endpoints
 896  * are available.
 897  */
 898 struct fwnode_handle *
 899 fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
 900                                struct fwnode_handle *prev)
 901 {
 902         return fwnode_call_ptr_op(fwnode, graph_get_next_endpoint, prev);
 903 }
 904 EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
 905 
 906 /**
 907  * fwnode_graph_get_port_parent - Return the device fwnode of a port endpoint
 908  * @endpoint: Endpoint firmware node of the port
 909  *
 910  * Return: the firmware node of the device the @endpoint belongs to.
 911  */
 912 struct fwnode_handle *
 913 fwnode_graph_get_port_parent(const struct fwnode_handle *endpoint)
 914 {
 915         struct fwnode_handle *port, *parent;
 916 
 917         port = fwnode_get_parent(endpoint);
 918         parent = fwnode_call_ptr_op(port, graph_get_port_parent);
 919 
 920         fwnode_handle_put(port);
 921 
 922         return parent;
 923 }
 924 EXPORT_SYMBOL_GPL(fwnode_graph_get_port_parent);
 925 
 926 /**
 927  * fwnode_graph_get_remote_port_parent - Return fwnode of a remote device
 928  * @fwnode: Endpoint firmware node pointing to the remote endpoint
 929  *
 930  * Extracts firmware node of a remote device the @fwnode points to.
 931  */
 932 struct fwnode_handle *
 933 fwnode_graph_get_remote_port_parent(const struct fwnode_handle *fwnode)
 934 {
 935         struct fwnode_handle *endpoint, *parent;
 936 
 937         endpoint = fwnode_graph_get_remote_endpoint(fwnode);
 938         parent = fwnode_graph_get_port_parent(endpoint);
 939 
 940         fwnode_handle_put(endpoint);
 941 
 942         return parent;
 943 }
 944 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent);
 945 
 946 /**
 947  * fwnode_graph_get_remote_port - Return fwnode of a remote port
 948  * @fwnode: Endpoint firmware node pointing to the remote endpoint
 949  *
 950  * Extracts firmware node of a remote port the @fwnode points to.
 951  */
 952 struct fwnode_handle *
 953 fwnode_graph_get_remote_port(const struct fwnode_handle *fwnode)
 954 {
 955         return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode));
 956 }
 957 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port);
 958 
 959 /**
 960  * fwnode_graph_get_remote_endpoint - Return fwnode of a remote endpoint
 961  * @fwnode: Endpoint firmware node pointing to the remote endpoint
 962  *
 963  * Extracts firmware node of a remote endpoint the @fwnode points to.
 964  */
 965 struct fwnode_handle *
 966 fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
 967 {
 968         return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint);
 969 }
 970 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint);
 971 
 972 /**
 973  * fwnode_graph_get_remote_node - get remote parent node for given port/endpoint
 974  * @fwnode: pointer to parent fwnode_handle containing graph port/endpoint
 975  * @port_id: identifier of the parent port node
 976  * @endpoint_id: identifier of the endpoint node
 977  *
 978  * Return: Remote fwnode handle associated with remote endpoint node linked
 979  *         to @node. Use fwnode_node_put() on it when done.
 980  */
 981 struct fwnode_handle *
 982 fwnode_graph_get_remote_node(const struct fwnode_handle *fwnode, u32 port_id,
 983                              u32 endpoint_id)
 984 {
 985         struct fwnode_handle *endpoint = NULL;
 986 
 987         while ((endpoint = fwnode_graph_get_next_endpoint(fwnode, endpoint))) {
 988                 struct fwnode_endpoint fwnode_ep;
 989                 struct fwnode_handle *remote;
 990                 int ret;
 991 
 992                 ret = fwnode_graph_parse_endpoint(endpoint, &fwnode_ep);
 993                 if (ret < 0)
 994                         continue;
 995 
 996                 if (fwnode_ep.port != port_id || fwnode_ep.id != endpoint_id)
 997                         continue;
 998 
 999                 remote = fwnode_graph_get_remote_port_parent(endpoint);
1000                 if (!remote)
1001                         return NULL;
1002 
1003                 return fwnode_device_is_available(remote) ? remote : NULL;
1004         }
1005 
1006         return NULL;
1007 }
1008 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_node);
1009 
1010 /**
1011  * fwnode_graph_get_endpoint_by_id - get endpoint by port and endpoint numbers
1012  * @fwnode: parent fwnode_handle containing the graph
1013  * @port: identifier of the port node
1014  * @endpoint: identifier of the endpoint node under the port node
1015  * @flags: fwnode lookup flags
1016  *
1017  * Return the fwnode handle of the local endpoint corresponding the port and
1018  * endpoint IDs or NULL if not found.
1019  *
1020  * If FWNODE_GRAPH_ENDPOINT_NEXT is passed in @flags and the specified endpoint
1021  * has not been found, look for the closest endpoint ID greater than the
1022  * specified one and return the endpoint that corresponds to it, if present.
1023  *
1024  * Do not return endpoints that belong to disabled devices, unless
1025  * FWNODE_GRAPH_DEVICE_DISABLED is passed in @flags.
1026  *
1027  * The returned endpoint needs to be released by calling fwnode_handle_put() on
1028  * it when it is not needed any more.
1029  */
1030 struct fwnode_handle *
1031 fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode,
1032                                 u32 port, u32 endpoint, unsigned long flags)
1033 {
1034         struct fwnode_handle *ep = NULL, *best_ep = NULL;
1035         unsigned int best_ep_id = 0;
1036         bool endpoint_next = flags & FWNODE_GRAPH_ENDPOINT_NEXT;
1037         bool enabled_only = !(flags & FWNODE_GRAPH_DEVICE_DISABLED);
1038 
1039         while ((ep = fwnode_graph_get_next_endpoint(fwnode, ep))) {
1040                 struct fwnode_endpoint fwnode_ep = { 0 };
1041                 int ret;
1042 
1043                 if (enabled_only) {
1044                         struct fwnode_handle *dev_node;
1045                         bool available;
1046 
1047                         dev_node = fwnode_graph_get_remote_port_parent(ep);
1048                         available = fwnode_device_is_available(dev_node);
1049                         fwnode_handle_put(dev_node);
1050                         if (!available)
1051                                 continue;
1052                 }
1053 
1054                 ret = fwnode_graph_parse_endpoint(ep, &fwnode_ep);
1055                 if (ret < 0)
1056                         continue;
1057 
1058                 if (fwnode_ep.port != port)
1059                         continue;
1060 
1061                 if (fwnode_ep.id == endpoint)
1062                         return ep;
1063 
1064                 if (!endpoint_next)
1065                         continue;
1066 
1067                 /*
1068                  * If the endpoint that has just been found is not the first
1069                  * matching one and the ID of the one found previously is closer
1070                  * to the requested endpoint ID, skip it.
1071                  */
1072                 if (fwnode_ep.id < endpoint ||
1073                     (best_ep && best_ep_id < fwnode_ep.id))
1074                         continue;
1075 
1076                 fwnode_handle_put(best_ep);
1077                 best_ep = fwnode_handle_get(ep);
1078                 best_ep_id = fwnode_ep.id;
1079         }
1080 
1081         return best_ep;
1082 }
1083 EXPORT_SYMBOL_GPL(fwnode_graph_get_endpoint_by_id);
1084 
1085 /**
1086  * fwnode_graph_parse_endpoint - parse common endpoint node properties
1087  * @fwnode: pointer to endpoint fwnode_handle
1088  * @endpoint: pointer to the fwnode endpoint data structure
1089  *
1090  * Parse @fwnode representing a graph endpoint node and store the
1091  * information in @endpoint. The caller must hold a reference to
1092  * @fwnode.
1093  */
1094 int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
1095                                 struct fwnode_endpoint *endpoint)
1096 {
1097         memset(endpoint, 0, sizeof(*endpoint));
1098 
1099         return fwnode_call_int_op(fwnode, graph_parse_endpoint, endpoint);
1100 }
1101 EXPORT_SYMBOL(fwnode_graph_parse_endpoint);
1102 
1103 const void *device_get_match_data(struct device *dev)
1104 {
1105         return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev);
1106 }
1107 EXPORT_SYMBOL_GPL(device_get_match_data);

/* [<][>][^][v][top][bottom][index][help] */