kernel: backport of changes & helpers
[openwrt/openwrt.git] / target / linux / generic / backport-5.10 / 826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch
diff --git a/target/linux/generic/backport-5.10/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch b/target/linux/generic/backport-5.10/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch
new file mode 100644 (file)
index 0000000..b6ef67d
--- /dev/null
@@ -0,0 +1,359 @@
+From 66a8f7f04979f4ad739085f01d99c8caf620b4f5 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 18 Jan 2022 18:35:02 +0100
+Subject: [PATCH] of: base: make small of_parse_phandle() variants static
+ inline
+
+Make all the smaller variants of the of_parse_phandle() static inline.
+This also let us remove the empty function stubs if CONFIG_OF is not
+defined.
+
+Suggested-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Michael Walle <michael@walle.cc>
+[robh: move index < 0 check into __of_parse_phandle_with_args]
+Signed-off-by: Rob Herring <robh@kernel.org>
+Link: https://lore.kernel.org/r/20220118173504.2867523-2-michael@walle.cc
+---
+ drivers/of/base.c  | 131 +++------------------------------------
+ include/linux/of.h | 148 ++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 129 insertions(+), 150 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -1372,15 +1372,18 @@ int of_phandle_iterator_args(struct of_p
+       return count;
+ }
+-static int __of_parse_phandle_with_args(const struct device_node *np,
+-                                      const char *list_name,
+-                                      const char *cells_name,
+-                                      int cell_count, int index,
+-                                      struct of_phandle_args *out_args)
++int __of_parse_phandle_with_args(const struct device_node *np,
++                               const char *list_name,
++                               const char *cells_name,
++                               int cell_count, int index,
++                               struct of_phandle_args *out_args)
+ {
+       struct of_phandle_iterator it;
+       int rc, cur_index = 0;
++      if (index < 0)
++              return -EINVAL;
++
+       /* Loop over the phandles until all the requested entry is found */
+       of_for_each_phandle(&it, rc, np, list_name, cells_name, cell_count) {
+               /*
+@@ -1423,82 +1426,7 @@ static int __of_parse_phandle_with_args(
+       of_node_put(it.node);
+       return rc;
+ }
+-
+-/**
+- * of_parse_phandle - Resolve a phandle property to a device_node pointer
+- * @np: Pointer to device node holding phandle property
+- * @phandle_name: Name of property holding a phandle value
+- * @index: For properties holding a table of phandles, this is the index into
+- *         the table
+- *
+- * Return: The device_node pointer with refcount incremented.  Use
+- * of_node_put() on it when done.
+- */
+-struct device_node *of_parse_phandle(const struct device_node *np,
+-                                   const char *phandle_name, int index)
+-{
+-      struct of_phandle_args args;
+-
+-      if (index < 0)
+-              return NULL;
+-
+-      if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
+-                                       index, &args))
+-              return NULL;
+-
+-      return args.np;
+-}
+-EXPORT_SYMBOL(of_parse_phandle);
+-
+-/**
+- * of_parse_phandle_with_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
+- * @cells_name:       property name that specifies phandles' arguments count
+- * @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->np
+- * pointer.
+- *
+- * Example::
+- *
+- *  phandle1: node1 {
+- *    #list-cells = <2>;
+- *  };
+- *
+- *  phandle2: node2 {
+- *    #list-cells = <1>;
+- *  };
+- *
+- *  node3 {
+- *    list = <&phandle1 1 2 &phandle2 3>;
+- *  };
+- *
+- * To get a device_node of the ``node2`` node you may call this:
+- * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
+- */
+-int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
+-                              const char *cells_name, int index,
+-                              struct of_phandle_args *out_args)
+-{
+-      int cell_count = -1;
+-
+-      if (index < 0)
+-              return -EINVAL;
+-
+-      /* If cells_name is NULL we assume a cell count of 0 */
+-      if (!cells_name)
+-              cell_count = 0;
+-
+-      return __of_parse_phandle_with_args(np, list_name, cells_name,
+-                                          cell_count, index, out_args);
+-}
+-EXPORT_SYMBOL(of_parse_phandle_with_args);
++EXPORT_SYMBOL(__of_parse_phandle_with_args);
+ /**
+  * of_parse_phandle_with_args_map() - Find a node pointed by phandle in a list and remap it
+@@ -1685,47 +1613,6 @@ free:
+ EXPORT_SYMBOL(of_parse_phandle_with_args_map);
+ /**
+- * 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->np
+- * 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
+  * @np:               pointer to a device tree node containing a list
+  * @list_name:        property name that contains a list
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -363,18 +363,12 @@ extern const struct of_device_id *of_mat
+       const struct of_device_id *matches, const struct device_node *node);
+ extern int of_modalias_node(struct device_node *node, char *modalias, int len);
+ extern void of_print_phandle_args(const char *msg, const struct of_phandle_args *args);
+-extern struct device_node *of_parse_phandle(const struct device_node *np,
+-                                          const char *phandle_name,
+-                                          int index);
+-extern int of_parse_phandle_with_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_parse_phandle_with_args(const struct device_node *np,
++      const char *list_name, const char *cells_name, int cell_count,
++      int index, struct of_phandle_args *out_args);
+ extern int of_parse_phandle_with_args_map(const struct device_node *np,
+       const char *list_name, const char *stem_name, int index,
+       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,
+       const char *list_name, const char *cells_name);
+@@ -857,18 +851,12 @@ static inline int of_property_read_strin
+       return -ENOSYS;
+ }
+-static inline struct device_node *of_parse_phandle(const struct device_node *np,
+-                                                 const char *phandle_name,
+-                                                 int index)
+-{
+-      return NULL;
+-}
+-
+-static inline int of_parse_phandle_with_args(const struct device_node *np,
+-                                           const char *list_name,
+-                                           const char *cells_name,
+-                                           int index,
+-                                           struct of_phandle_args *out_args)
++static inline int __of_parse_phandle_with_args(const struct device_node *np,
++                                             const char *list_name,
++                                             const char *cells_name,
++                                             int cell_count,
++                                             int index,
++                                             struct of_phandle_args *out_args)
+ {
+       return -ENOSYS;
+ }
+@@ -882,13 +870,6 @@ static inline int of_parse_phandle_with_
+       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(const struct device_node *np,
+                                            const char *list_name,
+                                            const char *cells_name)
+@@ -1065,6 +1046,117 @@ static inline bool of_node_is_type(const
+ }
+ /**
++ * of_parse_phandle - Resolve a phandle property to a device_node pointer
++ * @np: Pointer to device node holding phandle property
++ * @phandle_name: Name of property holding a phandle value
++ * @index: For properties holding a table of phandles, this is the index into
++ *         the table
++ *
++ * Return: The device_node pointer with refcount incremented.  Use
++ * of_node_put() on it when done.
++ */
++static inline struct device_node *of_parse_phandle(const struct device_node *np,
++                                                 const char *phandle_name,
++                                                 int index)
++{
++      struct of_phandle_args args;
++
++      if (__of_parse_phandle_with_args(np, phandle_name, NULL, 0,
++                                       index, &args))
++              return NULL;
++
++      return args.np;
++}
++
++/**
++ * of_parse_phandle_with_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
++ * @cells_name:       property name that specifies phandles' arguments count
++ * @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->np
++ * pointer.
++ *
++ * Example::
++ *
++ *  phandle1: node1 {
++ *    #list-cells = <2>;
++ *  };
++ *
++ *  phandle2: node2 {
++ *    #list-cells = <1>;
++ *  };
++ *
++ *  node3 {
++ *    list = <&phandle1 1 2 &phandle2 3>;
++ *  };
++ *
++ * To get a device_node of the ``node2`` node you may call this:
++ * of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
++ */
++static inline int of_parse_phandle_with_args(const struct device_node *np,
++                                           const char *list_name,
++                                           const char *cells_name,
++                                           int index,
++                                           struct of_phandle_args *out_args)
++{
++      int cell_count = -1;
++
++      /* If cells_name is NULL we assume a cell count of 0 */
++      if (!cells_name)
++              cell_count = 0;
++
++      return __of_parse_phandle_with_args(np, list_name, cells_name,
++                                          cell_count, index, out_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->np
++ * 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);
++ */
++static inline 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)
++{
++      return __of_parse_phandle_with_args(np, list_name, NULL, cell_count,
++                                          index, out_args);
++}
++
++/**
+  * of_property_count_u8_elems - Count the number of u8 elements in a property
+  *
+  * @np:               device node from which the property value is to be read.