Message ID | 20211228142549.1275412-2-michael@walle.cc |
---|---|
State | New |
Headers | show |
Series | [1/8] of: base: add of_parse_phandle_with_optional_args() | expand |
On Tue, Dec 28, 2021 at 03:25:42PM +0100, Michael Walle wrote: > Add a new variant of the of_parse_phandle_with_args() which treats the > cells name as optional. If it's missing, it is assumed that the phandle > has no arguments. > > Up until now, a nvmem node didn't have any arguments, so all the device > trees haven't any '#*-cells' property. But there is a need for an > additional argument for the phandle, for which we need a '#*-cells' > property. Therefore, we need to support nvmem nodes with and without > this property. > > Signed-off-by: Michael Walle <michael@walle.cc> > --- > drivers/of/base.c | 23 +++++++++++++++++++++++ > include/linux/of.h | 12 ++++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/drivers/of/base.c b/drivers/of/base.c > index 5b907600f5b0..fb28bb26276e 100644 > --- a/drivers/of/base.c > +++ b/drivers/of/base.c > @@ -1543,6 +1543,29 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na > } > EXPORT_SYMBOL(of_parse_phandle_with_args); > > +/** > + * of_parse_phandle_with_optional_args() - Find a node pointed by phandle in a list > + * > + * Same as of_parse_phandle_args() except that if the cells_name property is > + * not found, cell_count of 0 is assumed. > + * > + * This is used to useful, if you have a phandle which didn't have arguments > + * before and thus doesn't have a '#*-cells' property but is now migrated to > + * having arguments while retaining backwards compatibility. > + */ > +int of_parse_phandle_with_optional_args(const struct device_node *np, > + const char *list_name, > + const char *cells_name, int index, > + struct of_phandle_args *out_args) > +{ > + if (index < 0) > + return -EINVAL; I'm not sure why we didn't do this from the start, but just make index unsigned and then this check is not needed. > + > + return __of_parse_phandle_with_args(np, list_name, cells_name, > + 0, index, out_args); > +} > +EXPORT_SYMBOL(of_parse_phandle_with_optional_args); With the above, just make this static inline. Bonus points if you want to do the same changes on the other variants. Rob
diff --git a/drivers/of/base.c b/drivers/of/base.c index 5b907600f5b0..fb28bb26276e 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1543,6 +1543,29 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na } EXPORT_SYMBOL(of_parse_phandle_with_args); +/** + * of_parse_phandle_with_optional_args() - Find a node pointed by phandle in a list + * + * Same as of_parse_phandle_args() except that if the cells_name property is + * not found, cell_count of 0 is assumed. + * + * This is used to useful, if you have a phandle which didn't have arguments + * before and thus doesn't have a '#*-cells' property but is now migrated to + * having arguments while retaining backwards compatibility. + */ +int of_parse_phandle_with_optional_args(const struct device_node *np, + const char *list_name, + const char *cells_name, int index, + struct of_phandle_args *out_args) +{ + if (index < 0) + return -EINVAL; + + return __of_parse_phandle_with_args(np, list_name, cells_name, + 0, index, out_args); +} +EXPORT_SYMBOL(of_parse_phandle_with_optional_args); + /** * of_parse_phandle_with_args_map() - Find a node pointed by phandle in a list and remap it * @np: pointer to a device tree node containing a list diff --git a/include/linux/of.h b/include/linux/of.h index ff143a027abc..ccace453d25f 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -376,6 +376,9 @@ extern int of_parse_phandle_with_args_map(const struct device_node *np, 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_parse_phandle_with_optional_args(const struct device_node *np, + const char *list_name, const char *cells_name, int index, + struct of_phandle_args *out_args); extern int of_count_phandle_with_args(const struct device_node *np, const char *list_name, const char *cells_name); @@ -897,6 +900,15 @@ static inline int of_parse_phandle_with_fixed_args(const struct device_node *np, return -ENOSYS; } +static inline int of_parse_phandle_with_optional_args(const struct device_node *np, + char *list_name, + int cells_count, + int index, + struct of_phandle_args *out_args) +{ + return -ENOSYS; +} + static inline int of_count_phandle_with_args(const struct device_node *np, const char *list_name, const char *cells_name)
Add a new variant of the of_parse_phandle_with_args() which treats the cells name as optional. If it's missing, it is assumed that the phandle has no arguments. Up until now, a nvmem node didn't have any arguments, so all the device trees haven't any '#*-cells' property. But there is a need for an additional argument for the phandle, for which we need a '#*-cells' property. Therefore, we need to support nvmem nodes with and without this property. Signed-off-by: Michael Walle <michael@walle.cc> --- drivers/of/base.c | 23 +++++++++++++++++++++++ include/linux/of.h | 12 ++++++++++++ 2 files changed, 35 insertions(+)