Skip to content

Commit

Permalink
software node: remove separate handling of references
Browse files Browse the repository at this point in the history
Now that all users of references have moved to reference properties,
we can remove separate handling of references.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Dmitry Torokhov authored and Rafael J. Wysocki committed Dec 3, 2019
1 parent 53c24c2 commit e933bed
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 44 deletions.
48 changes: 18 additions & 30 deletions drivers/base/swnode.c
Original file line number Diff line number Diff line change
Expand Up @@ -479,9 +479,8 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
struct fwnode_reference_args *args)
{
struct swnode *swnode = to_swnode(fwnode);
const struct software_node_reference *ref;
const struct software_node_ref_args *ref_array;
const struct software_node_ref_args *ref_args;
const struct software_node_ref_args *ref;
const struct property_entry *prop;
struct fwnode_handle *refnode;
u32 nargs_prop_val;
Expand All @@ -492,37 +491,26 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
return -ENOENT;

prop = property_entry_get(swnode->node->properties, propname);
if (prop) {
if (prop->type != DEV_PROP_REF)
return -EINVAL;

/*
* We expect that references are never stored inline, even
* single ones, as they are too big.
*/
if (prop->is_inline)
return -EINVAL;

if (index * sizeof(*ref_args) >= prop->length)
return -ENOENT;

ref_array = prop->pointer;
ref_args = &ref_array[index];
} else {
if (!swnode->node->references)
return -ENOENT;
if (!prop)
return -ENOENT;

if (prop->type != DEV_PROP_REF)
return -EINVAL;

for (ref = swnode->node->references; ref->name; ref++)
if (!strcmp(ref->name, propname))
break;
/*
* We expect that references are never stored inline, even
* single ones, as they are too big.
*/
if (prop->is_inline)
return -EINVAL;

if (!ref->name || index > (ref->nrefs - 1))
return -ENOENT;
if (index * sizeof(*ref) >= prop->length)
return -ENOENT;

ref_args = &ref->refs[index];
}
ref_array = prop->pointer;
ref = &ref_array[index];

refnode = software_node_fwnode(ref_args->node);
refnode = software_node_fwnode(ref->node);
if (!refnode)
return -ENOENT;

Expand All @@ -543,7 +531,7 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
args->nargs = nargs;

for (i = 0; i < nargs; i++)
args->args[i] = ref_args->args[i];
args->args[i] = ref->args[i];

return 0;
}
Expand Down
14 changes: 0 additions & 14 deletions include/linux/property.h
Original file line number Diff line number Diff line change
Expand Up @@ -416,30 +416,16 @@ int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
/* -------------------------------------------------------------------------- */
/* Software fwnode support - when HW description is incomplete or missing */

/**
* struct software_node_reference - Named software node reference property
* @name: Name of the property
* @nrefs: Number of elements in @refs array
* @refs: Array of references with optional arguments
*/
struct software_node_reference {
const char *name;
unsigned int nrefs;
const struct software_node_ref_args *refs;
};

/**
* struct software_node - Software node description
* @name: Name of the software node
* @parent: Parent of the software node
* @properties: Array of device properties
* @references: Array of software node reference properties
*/
struct software_node {
const char *name;
const struct software_node *parent;
const struct property_entry *properties;
const struct software_node_reference *references;
};

bool is_software_node(const struct fwnode_handle *fwnode);
Expand Down

0 comments on commit e933bed

Please sign in to comment.