History

software node: Add software_node_get_reference_args()

This makes it possible to support drivers that use fwnode_property_get_reference_args() function.

Heikki Krogerus committed 7 years ago

Commit b06184a1 parent c959d0c2 files · +75 −0Browse files

Unified · Split

2 files
  1. drivers/base/swnode.c +47 −0
  2. include/linux/property.h +28 −0
drivers/base/swnode.c+47−0
@@ -560,6 +560,52 @@ software_node_get_named_child_node(const struct fwnode_handle *fwnode, · 559 unmodified lines
560560 return NULL;
561561 }
562562
563+static int
564+software_node_get_reference_args(const struct fwnode_handle *fwnode,
565+ const char *propname, const char *nargs_prop,
566+ unsigned int nargs, unsigned int index,
567+ struct fwnode_reference_args *args)
568+{
569+ struct swnode *swnode = to_swnode(fwnode);
570+ const struct software_node_reference *ref;
571+ const struct property_entry *prop;
572+ struct fwnode_handle *refnode;
573+ int i;
574+
575+ if (!swnode || !swnode->node->references)
576+ return -ENOENT;
577+
578+ for (ref = swnode->node->references; ref->name; ref++)
579+ if (!strcmp(ref->name, propname))
580+ break;
581+
582+ if (!ref->name || index > (ref->nrefs - 1))
583+ return -ENOENT;
584+
585+ refnode = software_node_fwnode(ref->refs[index].node);
586+ if (!refnode)
587+ return -ENOENT;
588+
589+ if (nargs_prop) {
590+ prop = property_entry_get(swnode->node->properties, nargs_prop);
591+ if (!prop)
592+ return -EINVAL;
593+
594+ nargs = prop->value.u32_data;
595+ }
596+
597+ if (nargs > NR_FWNODE_REFERENCE_ARGS)
598+ return -EINVAL;
599+
600+ args->fwnode = software_node_get(refnode);
601+ args->nargs = nargs;
602+
603+ for (i = 0; i < nargs; i++)
604+ args->args[i] = ref->refs[index].args[i];
605+
606+ return 0;
607+}
608+
563609 static const struct fwnode_operations software_node_ops = {
564610 .get = software_node_get,
565611 .put = software_node_put,
@@ -569,6 +615,7 @@ static const struct fwnode_operations software_node_ops = { · 3 unmodified lines
569615 .get_parent = software_node_get_parent,
570616 .get_next_child_node = software_node_get_next_child,
571617 .get_named_child_node = software_node_get_named_child_node,
618+ .get_reference_args = software_node_get_reference_args
572619 };
573620
574621 /* -------------------------------------------------------------------------- */
include/linux/property.h+28−0
@@ -332,16 +332,44 @@ int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, · 331 unmodified lines
332332 /* -------------------------------------------------------------------------- */
333333 /* Software fwnode support - when HW description is incomplete or missing */
334334
335+struct software_node;
336+
337+/**
338+ * struct software_node_ref_args - Reference with additional arguments
339+ * @node: Reference to a software node
340+ * @nargs: Number of elements in @args array
341+ * @args: Integer arguments
342+ */
343+struct software_node_ref_args {
344+ const struct software_node *node;
345+ unsigned int nargs;
346+ u64 args[NR_FWNODE_REFERENCE_ARGS];
347+};
348+
349+/**
350+ * struct software_node_reference - Named software node reference property
351+ * @name: Name of the property
352+ * @nrefs: Number of elements in @refs array
353+ * @refs: Array of references with optional arguments
354+ */
355+struct software_node_reference {
356+ const char *name;
357+ unsigned int nrefs;
358+ const struct software_node_ref_args *refs;
359+};
360+
335361 /**
336362 * struct software_node - Software node description
337363 * @name: Name of the software node
338364 * @parent: Parent of the software node
339365 * @properties: Array of device properties
366+ * @references: Array of software node reference properties
340367 */
341368 struct software_node {
342369 const char *name;
343370 const struct software_node *parent;
344371 const struct property_entry *properties;
372+ const struct software_node_reference *references;
345373 };
346374
347375 bool is_software_node(const struct fwnode_handle *fwnode);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t