Commit 035fd948 authored by Stephen Warren's avatar Stephen Warren Committed by Grant Likely

of: introduce of_parse_phandle_with_fixed_args

This is identical to of_parse_phandle_with_args(), except that the
number of argument cells is fixed, rather than being parsed out of the
node referenced by each phandle.
Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarGrant Likely <grant.likely@linaro.org>
parent 5fba49e3
...@@ -1082,7 +1082,8 @@ EXPORT_SYMBOL_GPL(of_property_count_strings); ...@@ -1082,7 +1082,8 @@ EXPORT_SYMBOL_GPL(of_property_count_strings);
static int __of_parse_phandle_with_args(const struct device_node *np, static int __of_parse_phandle_with_args(const struct device_node *np,
const char *list_name, const char *list_name,
const char *cells_name, int index, const char *cells_name,
int cell_count, int index,
struct of_phandle_args *out_args) struct of_phandle_args *out_args)
{ {
const __be32 *list, *list_end; const __be32 *list, *list_end;
...@@ -1118,12 +1119,18 @@ static int __of_parse_phandle_with_args(const struct device_node *np, ...@@ -1118,12 +1119,18 @@ static int __of_parse_phandle_with_args(const struct device_node *np,
np->full_name); np->full_name);
goto err; goto err;
} }
if (of_property_read_u32(node, cells_name, &count)) {
if (cells_name) {
if (of_property_read_u32(node, cells_name,
&count)) {
pr_err("%s: could not get %s for %s\n", pr_err("%s: could not get %s for %s\n",
np->full_name, cells_name, np->full_name, cells_name,
node->full_name); node->full_name);
goto err; goto err;
} }
} else {
count = cell_count;
}
/* /*
* Make sure that the arguments actually fit in the * Make sure that the arguments actually fit in the
...@@ -1244,10 +1251,52 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na ...@@ -1244,10 +1251,52 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
{ {
if (index < 0) if (index < 0)
return -EINVAL; return -EINVAL;
return __of_parse_phandle_with_args(np, list_name, cells_name, index, out_args); return __of_parse_phandle_with_args(np, list_name, cells_name, 0,
index, out_args);
} }
EXPORT_SYMBOL(of_parse_phandle_with_args); EXPORT_SYMBOL(of_parse_phandle_with_args);
/**
* of_parse_phandle_with_fixed_args() - Find a node pointed by phandle in a list
* @np: pointer to a device tree node containing a list
* @list_name: property name that contains a list
* @cell_count: number of argument cells following the phandle
* @index: index of a phandle to parse out
* @out_args: optional pointer to output arguments structure (will be filled)
*
* This function is useful to parse lists of phandles and their arguments.
* Returns 0 on success and fills out_args, on error returns appropriate
* errno value.
*
* Caller is responsible to call of_node_put() on the returned out_args->node
* pointer.
*
* Example:
*
* phandle1: node1 {
* }
*
* phandle2: node2 {
* }
*
* node3 {
* list = <&phandle1 0 2 &phandle2 2 3>;
* }
*
* To get a device_node of the `node2' node you may call this:
* of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args);
*/
int of_parse_phandle_with_fixed_args(const struct device_node *np,
const char *list_name, int cell_count,
int index, struct of_phandle_args *out_args)
{
if (index < 0)
return -EINVAL;
return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
index, out_args);
}
EXPORT_SYMBOL(of_parse_phandle_with_fixed_args);
/** /**
* of_count_phandle_with_args() - Find the number of phandles references in a property * of_count_phandle_with_args() - Find the number of phandles references in a property
* @np: pointer to a device tree node containing a list * @np: pointer to a device tree node containing a list
...@@ -1266,7 +1315,8 @@ EXPORT_SYMBOL(of_parse_phandle_with_args); ...@@ -1266,7 +1315,8 @@ EXPORT_SYMBOL(of_parse_phandle_with_args);
int of_count_phandle_with_args(const struct device_node *np, const char *list_name, int of_count_phandle_with_args(const struct device_node *np, const char *list_name,
const char *cells_name) const char *cells_name)
{ {
return __of_parse_phandle_with_args(np, list_name, cells_name, -1, NULL); return __of_parse_phandle_with_args(np, list_name, cells_name, 0, -1,
NULL);
} }
EXPORT_SYMBOL(of_count_phandle_with_args); EXPORT_SYMBOL(of_count_phandle_with_args);
......
...@@ -280,6 +280,9 @@ extern struct device_node *of_parse_phandle(const struct device_node *np, ...@@ -280,6 +280,9 @@ extern struct device_node *of_parse_phandle(const struct device_node *np,
extern int of_parse_phandle_with_args(const struct device_node *np, extern int of_parse_phandle_with_args(const struct device_node *np,
const char *list_name, const char *cells_name, int index, const char *list_name, const char *cells_name, int index,
struct of_phandle_args *out_args); struct of_phandle_args *out_args);
extern int of_parse_phandle_with_fixed_args(const struct device_node *np,
const char *list_name, int cells_count, int index,
struct of_phandle_args *out_args);
extern int of_count_phandle_with_args(const struct device_node *np, extern int of_count_phandle_with_args(const struct device_node *np,
const char *list_name, const char *cells_name); const char *list_name, const char *cells_name);
...@@ -477,6 +480,13 @@ static inline int of_parse_phandle_with_args(struct device_node *np, ...@@ -477,6 +480,13 @@ static inline int of_parse_phandle_with_args(struct device_node *np,
return -ENOSYS; return -ENOSYS;
} }
static inline int of_parse_phandle_with_fixed_args(const struct device_node *np,
const char *list_name, int cells_count, int index,
struct of_phandle_args *out_args)
{
return -ENOSYS;
}
static inline int of_count_phandle_with_args(struct device_node *np, static inline int of_count_phandle_with_args(struct device_node *np,
const char *list_name, const char *list_name,
const char *cells_name) const char *cells_name)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment