summaryrefslogtreecommitdiffstats
path: root/drivers/base/swnode.c
diff options
context:
space:
mode:
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>2019-02-13 06:55:49 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2019-02-14 05:33:15 -0500
commit344798206f171c5abea7ab1f9762fa526d7f539d (patch)
tree10d0ddeba86fc04b36ea8ba97886d14954661b8f /drivers/base/swnode.c
parent2b6e492467c78183bb629bb0a100ea3509b615a5 (diff)
software node: Implement get_named_child_node fwnode callback
This makes it possible to support drivers that use fwnode_get_named_child_node() and device_get_named_child_node() functions. The node name is for now taken from a device property named "name". That mimics the old style of naming of the nodes in devicetree (though with modern flattened DT, the name is matched against the actual node-name, it used to be done with a property "name"). In Open Firmware DT the "name" property is also still being used. Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base/swnode.c')
-rw-r--r--drivers/base/swnode.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 89ad8dee6ad5..1fad9291f6aa 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -499,6 +499,28 @@ software_node_get_next_child(const struct fwnode_handle *fwnode,
499 return &c->fwnode; 499 return &c->fwnode;
500} 500}
501 501
502static struct fwnode_handle *
503software_node_get_named_child_node(const struct fwnode_handle *fwnode,
504 const char *childname)
505{
506 struct software_node *swnode = to_software_node(fwnode);
507 const struct property_entry *prop;
508 struct software_node *child;
509
510 if (!swnode || list_empty(&swnode->children))
511 return NULL;
512
513 list_for_each_entry(child, &swnode->children, entry) {
514 prop = property_entry_get(child->properties, "name");
515 if (!prop)
516 continue;
517 if (!strcmp(childname, prop->value.str)) {
518 kobject_get(&child->kobj);
519 return &child->fwnode;
520 }
521 }
522 return NULL;
523}
502 524
503static const struct fwnode_operations software_node_ops = { 525static const struct fwnode_operations software_node_ops = {
504 .get = software_node_get, 526 .get = software_node_get,
@@ -508,6 +530,7 @@ static const struct fwnode_operations software_node_ops = {
508 .property_read_string_array = software_node_read_string_array, 530 .property_read_string_array = software_node_read_string_array,
509 .get_parent = software_node_get_parent, 531 .get_parent = software_node_get_parent,
510 .get_next_child_node = software_node_get_next_child, 532 .get_next_child_node = software_node_get_next_child,
533 .get_named_child_node = software_node_get_named_child_node,
511}; 534};
512 535
513/* -------------------------------------------------------------------------- */ 536/* -------------------------------------------------------------------------- */