aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Thomson <Adam.Thomson.Opensource@diasemi.com>2016-06-21 13:50:20 -0400
committerMark Brown <broonie@kernel.org>2016-06-26 07:39:03 -0400
commit613e97218ccbd7f33895cad4525d861810a9d5d5 (patch)
tree2e13158ccc751520e2f69f030c3c98814e318768
parent1a695a905c18548062509178b98bc91e67510864 (diff)
device property: Add function to search for named child of device
For device nodes in both DT and ACPI, it possible to have named child nodes which contain properties (an existing example being gpio-leds). This adds a function to find a named child node for a device which can be used by drivers for property retrieval. For DT data node name matching, of_node_cmp() and similar functions are made available outside of CONFIG_OF block so the new function can reference these for DT and non-DT builds. For ACPI data node name matching, a helper function is also added which returns false if CONFIG_ACPI is not set, otherwise it performs a string comparison on the data node name. This avoids using the acpi_data_node struct for non CONFIG_ACPI builds, which would otherwise cause a build failure. Signed-off-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com> Acked-by: Sathyanarayana Nujella <sathyanarayana.nujella@intel.com> Acked-by: Rob Herring <robh@kernel.org> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/base/property.c28
-rw-r--r--include/acpi/acpi_bus.h7
-rw-r--r--include/linux/acpi.h6
-rw-r--r--include/linux/of.h14
-rw-r--r--include/linux/property.h3
5 files changed, 51 insertions, 7 deletions
diff --git a/drivers/base/property.c b/drivers/base/property.c
index f38c21de29b7..43a36d68c3fd 100644
--- a/drivers/base/property.c
+++ b/drivers/base/property.c
@@ -888,6 +888,34 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev,
888EXPORT_SYMBOL_GPL(device_get_next_child_node); 888EXPORT_SYMBOL_GPL(device_get_next_child_node);
889 889
890/** 890/**
891 * device_get_named_child_node - Return first matching named child node handle
892 * @dev: Device to find the named child node for.
893 * @childname: String to match child node name against.
894 */
895struct fwnode_handle *device_get_named_child_node(struct device *dev,
896 const char *childname)
897{
898 struct fwnode_handle *child;
899
900 /*
901 * Find first matching named child node of this device.
902 * For ACPI this will be a data only sub-node.
903 */
904 device_for_each_child_node(dev, child) {
905 if (is_of_node(child)) {
906 if (!of_node_cmp(to_of_node(child)->name, childname))
907 return child;
908 } else if (is_acpi_data_node(child)) {
909 if (acpi_data_node_match(child, childname))
910 return child;
911 }
912 }
913
914 return NULL;
915}
916EXPORT_SYMBOL_GPL(device_get_named_child_node);
917
918/**
891 * fwnode_handle_put - Drop reference to a device node 919 * fwnode_handle_put - Drop reference to a device node
892 * @fwnode: Pointer to the device node to drop the reference to. 920 * @fwnode: Pointer to the device node to drop the reference to.
893 * 921 *
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 788c6c35291a..c1a524de67c5 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -420,6 +420,13 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn
420 container_of(fwnode, struct acpi_data_node, fwnode) : NULL; 420 container_of(fwnode, struct acpi_data_node, fwnode) : NULL;
421} 421}
422 422
423static inline bool acpi_data_node_match(struct fwnode_handle *fwnode,
424 const char *name)
425{
426 return is_acpi_data_node(fwnode) ?
427 (!strcmp(to_acpi_data_node(fwnode)->name, name)) : false;
428}
429
423static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev) 430static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
424{ 431{
425 return &adev->fwnode; 432 return &adev->fwnode;
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 288fac5294f5..03039c472e95 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -568,6 +568,12 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn
568 return NULL; 568 return NULL;
569} 569}
570 570
571static inline bool acpi_data_node_match(struct fwnode_handle *fwnode,
572 const char *name)
573{
574 return false;
575}
576
571static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev) 577static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
572{ 578{
573 return NULL; 579 return NULL;
diff --git a/include/linux/of.h b/include/linux/of.h
index c7292e8ea080..8455741e313e 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -238,13 +238,6 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size)
238#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1 238#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
239#endif 239#endif
240 240
241/* Default string compare functions, Allow arch asm/prom.h to override */
242#if !defined(of_compat_cmp)
243#define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2))
244#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
245#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
246#endif
247
248#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags) 241#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
249#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags) 242#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
250 243
@@ -726,6 +719,13 @@ static inline void of_property_clear_flag(struct property *p, unsigned long flag
726#define of_match_node(_matches, _node) NULL 719#define of_match_node(_matches, _node) NULL
727#endif /* CONFIG_OF */ 720#endif /* CONFIG_OF */
728 721
722/* Default string compare functions, Allow arch asm/prom.h to override */
723#if !defined(of_compat_cmp)
724#define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2))
725#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
726#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
727#endif
728
729#if defined(CONFIG_OF) && defined(CONFIG_NUMA) 729#if defined(CONFIG_OF) && defined(CONFIG_NUMA)
730extern int of_node_to_nid(struct device_node *np); 730extern int of_node_to_nid(struct device_node *np);
731#else 731#else
diff --git a/include/linux/property.h b/include/linux/property.h
index ecab11e40794..3a2f9ae25c86 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -77,6 +77,9 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev,
77 for (child = device_get_next_child_node(dev, NULL); child; \ 77 for (child = device_get_next_child_node(dev, NULL); child; \
78 child = device_get_next_child_node(dev, child)) 78 child = device_get_next_child_node(dev, child))
79 79
80struct fwnode_handle *device_get_named_child_node(struct device *dev,
81 const char *childname);
82
80void fwnode_handle_put(struct fwnode_handle *fwnode); 83void fwnode_handle_put(struct fwnode_handle *fwnode);
81 84
82unsigned int device_get_child_node_count(struct device *dev); 85unsigned int device_get_child_node_count(struct device *dev);