Skip to content

Commit

Permalink
of: Let of_for_each_phandle fallback to non-negative cell_count
Browse files Browse the repository at this point in the history
Referencing device tree nodes from a property allows to pass arguments.
This is for example used for referencing gpios. This looks as follows:

	gpio_ctrl: gpio-controller {
		#gpio-cells = <2>
		...
	}

	someothernode {
		gpios = <&gpio_ctrl 5 0 &gpio_ctrl 3 0>;
		...
	}

To know the number of arguments this must be either fixed, or the
referenced node is checked for a $cells_name (here: "#gpio-cells")
property and with this information the start of the second reference can
be determined.

Currently regulators are referenced with no additional arguments. To
allow some optional arguments without having to change all referenced
nodes this change introduces a way to specify a default cell_count. So
when a phandle is parsed we check for the $cells_name property and use
it as before if present. If it is not present we fall back to
cells_count if non-negative and only fail if cells_count is smaller than
zero.

Change-Id: Ic7a6a5e667d46847becb2a9593a00ba6db49fc98
Signed-off-by: Uwe Kleine-König <[email protected]>
Signed-off-by: Rob Herring <[email protected]>
  • Loading branch information
Uwe Kleine-König authored and luk1337 committed Dec 19, 2024
1 parent 4ea8fcc commit 0c77b8d
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1290,11 +1290,20 @@ int of_phandle_iterator_next(struct of_phandle_iterator *it)

if (of_property_read_u32(it->node, it->cells_name,
&count)) {
pr_err("%pOF: could not get %s for %pOF\n",
it->parent,
it->cells_name,
it->node);
goto err;
/*
* If both cell_count and cells_name is given,
* fall back to cell_count in absence
* of the cells_name property
*/
if (it->cell_count >= 0) {
count = it->cell_count;
} else {
pr_err("%pOF: could not get %s for %pOF\n",
it->parent,
it->cells_name,
it->node);
goto err;
}
}
} else {
count = it->cell_count;
Expand Down Expand Up @@ -1460,7 +1469,7 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
{
if (index < 0)
return -EINVAL;
return __of_parse_phandle_with_args(np, list_name, cells_name, 0,
return __of_parse_phandle_with_args(np, list_name, cells_name, -1,
index, out_args);
}
EXPORT_SYMBOL(of_parse_phandle_with_args);
Expand Down Expand Up @@ -1543,7 +1552,7 @@ int of_parse_phandle_with_args_map(const struct device_node *np,
if (!pass_name)
goto free;

ret = __of_parse_phandle_with_args(np, list_name, cells_name, 0, index,
ret = __of_parse_phandle_with_args(np, list_name, cells_name, -1, index,
out_args);
if (ret)
goto free;
Expand Down Expand Up @@ -1712,7 +1721,7 @@ int of_count_phandle_with_args(const struct device_node *np, const char *list_na
struct of_phandle_iterator it;
int rc, cur_index = 0;

rc = of_phandle_iterator_init(&it, np, list_name, cells_name, 0);
rc = of_phandle_iterator_init(&it, np, list_name, cells_name, -1);
if (rc)
return rc;

Expand Down

0 comments on commit 0c77b8d

Please sign in to comment.