[openwrt/openwrt] kernel: backport of changes & helpers

LEDE Commits lede-commits at lists.infradead.org
Sat Jan 7 08:45:43 PST 2023


rmilecki pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/11759a5bf3c62846ded3d8946322802d41ac8984

commit 11759a5bf3c62846ded3d8946322802d41ac8984
Author: Rafał Miłecki <rafal at milecki.pl>
AuthorDate: Sat Jan 7 16:59:14 2023 +0100

    kernel: backport of changes & helpers
    
    This code is required for upcoming NVMEM changes.
    
    Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 ...-some-formatting-issues-and-provide-missi.patch |  95 +++
 ...3-0005-of-Fix-kerneldoc-output-formatting.patch | 489 +++++++++++++
 ...sing-Return-section-in-kerneldoc-comments.patch | 787 +++++++++++++++++++++
 ...x-spelling-issue-with-function-param-prop.patch |  54 ++
 ...ass-the-dst-buffer-to-of_get_mac_address.patch} |   2 +-
 ...f_get_mac_addr_nvmem-for-non-platform-de.patch} |   2 +-
 ..._count_phandle_with_args-arguments-with-C.patch |  27 +
 ...e-small-of_parse_phandle-variants-static-.patch | 359 ++++++++++
 ...e-add-of_parse_phandle_with_optional_args.patch |  56 ++
 ...ty-make-.-cells-optional-for-simple-props.patch |  32 +
 ...of-property-add-nvmem-cell-cells-property.patch |  28 +
 ...e-small-of_parse_phandle-variants-static-.patch | 359 ++++++++++
 ...e-add-of_parse_phandle_with_optional_args.patch |  56 ++
 ...ty-make-.-cells-optional-for-simple-props.patch |  32 +
 ...of-property-add-nvmem-cell-cells-property.patch |  28 +
 .../hack-5.10/920-device_tree_cmdline.patch        |   2 +-
 .../900-arm-add-cmdline-override.patch             |   2 +-
 .../102-powerpc-add-cmdline-override.patch         |   2 +-
 18 files changed, 2407 insertions(+), 5 deletions(-)

diff --git a/target/linux/generic/backport-5.10/732-v5.13-0003-of-base-Fix-some-formatting-issues-and-provide-missi.patch b/target/linux/generic/backport-5.10/732-v5.13-0003-of-base-Fix-some-formatting-issues-and-provide-missi.patch
new file mode 100644
index 0000000000..33808f88a3
--- /dev/null
+++ b/target/linux/generic/backport-5.10/732-v5.13-0003-of-base-Fix-some-formatting-issues-and-provide-missi.patch
@@ -0,0 +1,95 @@
+From 3637d49e11219512920aca8b8ccd0994be33fa8b Mon Sep 17 00:00:00 2001
+From: Lee Jones <lee.jones at linaro.org>
+Date: Thu, 18 Mar 2021 10:40:30 +0000
+Subject: [PATCH] of: base: Fix some formatting issues and provide missing
+ descriptions
+
+Fixes the following W=1 kernel build warning(s):
+
+ drivers/of/base.c:315: warning: Function parameter or member 'cpun' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: Function parameter or member 'prop_name' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: Function parameter or member 'cpu' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: Function parameter or member 'thread' not described in '__of_find_n_match_cpu_property'
+ drivers/of/base.c:315: warning: expecting prototype for property holds the physical id of the(). Prototype was for __of_find_n_match_cpu_property() instead
+ drivers/of/base.c:1139: warning: Function parameter or member 'match' not described in 'of_find_matching_node_and_match'
+ drivers/of/base.c:1779: warning: Function parameter or member 'np' not described in '__of_add_property'
+ drivers/of/base.c:1779: warning: Function parameter or member 'prop' not described in '__of_add_property'
+ drivers/of/base.c:1800: warning: Function parameter or member 'np' not described in 'of_add_property'
+ drivers/of/base.c:1800: warning: Function parameter or member 'prop' not described in 'of_add_property'
+ drivers/of/base.c:1849: warning: Function parameter or member 'np' not described in 'of_remove_property'
+ drivers/of/base.c:1849: warning: Function parameter or member 'prop' not described in 'of_remove_property'
+ drivers/of/base.c:2137: warning: Function parameter or member 'dn' not described in 'of_console_check'
+ drivers/of/base.c:2137: warning: Function parameter or member 'name' not described in 'of_console_check'
+ drivers/of/base.c:2137: warning: Function parameter or member 'index' not described in 'of_console_check'
+
+Cc: Rob Herring <robh+dt at kernel.org>
+Cc: Frank Rowand <frowand.list at gmail.com>
+Cc: "David S. Miller" <davem at davemloft.net>
+Cc: devicetree at vger.kernel.org
+Signed-off-by: Lee Jones <lee.jones at linaro.org>
+Signed-off-by: Rob Herring <robh at kernel.org>
+Link: https://lore.kernel.org/r/20210318104036.3175910-5-lee.jones@linaro.org
+---
+ drivers/of/base.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -305,7 +305,7 @@ bool __weak arch_match_cpu_phys_id(int c
+ 	return (u32)phys_id == cpu;
+ }
+ 
+-/**
++/*
+  * Checks if the given "prop_name" property holds the physical id of the
+  * core/thread corresponding to the logical cpu 'cpu'. If 'thread' is not
+  * NULL, local thread number within the core is returned in it.
+@@ -1128,7 +1128,7 @@ EXPORT_SYMBOL(of_match_node);
+  *			will; typically, you pass what the previous call
+  *			returned. of_node_put() will be called on it
+  *	@matches:	array of of device match structures to search in
+- *	@match		Updated to point at the matches entry which matched
++ *	@match:		Updated to point at the matches entry which matched
+  *
+  *	Returns a node pointer with refcount incremented, use
+  *	of_node_put() on it when done.
+@@ -1779,6 +1779,8 @@ EXPORT_SYMBOL(of_count_phandle_with_args
+ 
+ /**
+  * __of_add_property - Add a property to a node without lock operations
++ * @np:		Caller's Device Node
++ * @prob:	Property to add
+  */
+ int __of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1800,6 +1802,8 @@ int __of_add_property(struct device_node
+ 
+ /**
+  * of_add_property - Add a property to a node
++ * @np:		Caller's Device Node
++ * @prob:	Property to add
+  */
+ int of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1844,6 +1848,8 @@ int __of_remove_property(struct device_n
+ 
+ /**
+  * of_remove_property - Remove a property from a node.
++ * @np:		Caller's Device Node
++ * @prob:	Property to remove
+  *
+  * Note that we don't actually remove it, since we have given out
+  * who-knows-how-many pointers to the data using get-property.
+@@ -2130,9 +2136,9 @@ EXPORT_SYMBOL_GPL(of_alias_get_highest_i
+ 
+ /**
+  * of_console_check() - Test and setup console for DT setup
+- * @dn - Pointer to device node
+- * @name - Name to use for preferred console without index. ex. "ttyS"
+- * @index - Index to use for preferred console.
++ * @dn: Pointer to device node
++ * @name: Name to use for preferred console without index. ex. "ttyS"
++ * @index: Index to use for preferred console.
+  *
+  * Check if the given device node matches the stdout-path property in the
+  * /chosen node. If it does then register it as the preferred console and return
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0005-of-Fix-kerneldoc-output-formatting.patch b/target/linux/generic/backport-5.10/732-v5.13-0005-of-Fix-kerneldoc-output-formatting.patch
new file mode 100644
index 0000000000..bda03b9c4c
--- /dev/null
+++ b/target/linux/generic/backport-5.10/732-v5.13-0005-of-Fix-kerneldoc-output-formatting.patch
@@ -0,0 +1,489 @@
+From 62f026f082e4d762a47b43ea693b38f025122332 Mon Sep 17 00:00:00 2001
+From: Rob Herring <robh at kernel.org>
+Date: Fri, 26 Mar 2021 13:26:06 -0600
+Subject: [PATCH] of: Fix kerneldoc output formatting
+
+The indentation of the kerneldoc comments affects the output formatting.
+Leading tabs in particular don't work, sections need to be indented
+under the section header, and several code blocks are reformatted.
+
+Cc: Frank Rowand <frowand.list at gmail.com>
+Cc: Mauro Carvalho Chehab <mchehab at kernel.org>
+Signed-off-by: Rob Herring <robh at kernel.org>
+Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
+Link: https://lore.kernel.org/r/20210326192606.3702739-1-robh@kernel.org
+---
+ drivers/of/base.c | 275 +++++++++++++++++++++++-----------------------
+ drivers/of/fdt.c  |   9 +-
+ 2 files changed, 141 insertions(+), 143 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -651,11 +651,11 @@ bool of_device_is_big_endian(const struc
+ EXPORT_SYMBOL(of_device_is_big_endian);
+ 
+ /**
+- *	of_get_parent - Get a node's parent if any
+- *	@node:	Node to get parent
++ * of_get_parent - Get a node's parent if any
++ * @node:	Node to get parent
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_get_parent(const struct device_node *node)
+ {
+@@ -673,15 +673,15 @@ struct device_node *of_get_parent(const
+ EXPORT_SYMBOL(of_get_parent);
+ 
+ /**
+- *	of_get_next_parent - Iterate to a node's parent
+- *	@node:	Node to get parent of
++ * of_get_next_parent - Iterate to a node's parent
++ * @node:	Node to get parent of
+  *
+- *	This is like of_get_parent() except that it drops the
+- *	refcount on the passed node, making it suitable for iterating
+- *	through a node's parents.
++ * This is like of_get_parent() except that it drops the
++ * refcount on the passed node, making it suitable for iterating
++ * through a node's parents.
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_get_next_parent(struct device_node *node)
+ {
+@@ -719,13 +719,13 @@ static struct device_node *__of_get_next
+ 	     child = __of_get_next_child(parent, child))
+ 
+ /**
+- *	of_get_next_child - Iterate a node childs
+- *	@node:	parent node
+- *	@prev:	previous child of the parent node, or NULL to get first
+- *
+- *	Returns a node pointer with refcount incremented, use of_node_put() on
+- *	it when done. Returns NULL when prev is the last child. Decrements the
+- *	refcount of prev.
++ * of_get_next_child - Iterate a node childs
++ * @node:	parent node
++ * @prev:	previous child of the parent node, or NULL to get first
++ *
++ * Return: A node pointer with refcount incremented, use of_node_put() on
++ * it when done. Returns NULL when prev is the last child. Decrements the
++ * refcount of prev.
+  */
+ struct device_node *of_get_next_child(const struct device_node *node,
+ 	struct device_node *prev)
+@@ -741,12 +741,12 @@ struct device_node *of_get_next_child(co
+ EXPORT_SYMBOL(of_get_next_child);
+ 
+ /**
+- *	of_get_next_available_child - Find the next available child node
+- *	@node:	parent node
+- *	@prev:	previous child of the parent node, or NULL to get first
++ * of_get_next_available_child - Find the next available child node
++ * @node:	parent node
++ * @prev:	previous child of the parent node, or NULL to get first
+  *
+- *      This function is like of_get_next_child(), except that it
+- *      automatically skips any disabled nodes (i.e. status = "disabled").
++ * This function is like of_get_next_child(), except that it
++ * automatically skips any disabled nodes (i.e. status = "disabled").
+  */
+ struct device_node *of_get_next_available_child(const struct device_node *node,
+ 	struct device_node *prev)
+@@ -772,12 +772,12 @@ struct device_node *of_get_next_availabl
+ EXPORT_SYMBOL(of_get_next_available_child);
+ 
+ /**
+- *	of_get_next_cpu_node - Iterate on cpu nodes
+- *	@prev:	previous child of the /cpus node, or NULL to get first
++ * of_get_next_cpu_node - Iterate on cpu nodes
++ * @prev:	previous child of the /cpus node, or NULL to get first
+  *
+- *	Returns a cpu node pointer with refcount incremented, use of_node_put()
+- *	on it when done. Returns NULL when prev is the last child. Decrements
+- *	the refcount of prev.
++ * Return: A cpu node pointer with refcount incremented, use of_node_put()
++ * on it when done. Returns NULL when prev is the last child. Decrements
++ * the refcount of prev.
+  */
+ struct device_node *of_get_next_cpu_node(struct device_node *prev)
+ {
+@@ -834,15 +834,15 @@ struct device_node *of_get_compatible_ch
+ EXPORT_SYMBOL(of_get_compatible_child);
+ 
+ /**
+- *	of_get_child_by_name - Find the child node by name for a given parent
+- *	@node:	parent node
+- *	@name:	child name to look for.
+- *
+- *      This function looks for child node for given matching name
+- *
+- *	Returns a node pointer if found, with refcount incremented, use
+- *	of_node_put() on it when done.
+- *	Returns NULL if node is not found.
++ * of_get_child_by_name - Find the child node by name for a given parent
++ * @node:	parent node
++ * @name:	child name to look for.
++ *
++ * This function looks for child node for given matching name
++ *
++ * Return: A node pointer if found, with refcount incremented, use
++ * of_node_put() on it when done.
++ * Returns NULL if node is not found.
+  */
+ struct device_node *of_get_child_by_name(const struct device_node *node,
+ 				const char *name)
+@@ -893,22 +893,22 @@ struct device_node *__of_find_node_by_fu
+ }
+ 
+ /**
+- *	of_find_node_opts_by_path - Find a node matching a full OF path
+- *	@path: Either the full path to match, or if the path does not
+- *	       start with '/', the name of a property of the /aliases
+- *	       node (an alias).  In the case of an alias, the node
+- *	       matching the alias' value will be returned.
+- *	@opts: Address of a pointer into which to store the start of
+- *	       an options string appended to the end of the path with
+- *	       a ':' separator.
+- *
+- *	Valid paths:
+- *		/foo/bar	Full path
+- *		foo		Valid alias
+- *		foo/bar		Valid alias + relative path
++ * of_find_node_opts_by_path - Find a node matching a full OF path
++ * @path: Either the full path to match, or if the path does not
++ *       start with '/', the name of a property of the /aliases
++ *       node (an alias).  In the case of an alias, the node
++ *       matching the alias' value will be returned.
++ * @opts: Address of a pointer into which to store the start of
++ *       an options string appended to the end of the path with
++ *       a ':' separator.
++ *
++ * Valid paths:
++ *  * /foo/bar	Full path
++ *  * foo	Valid alias
++ *  * foo/bar	Valid alias + relative path
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_opts_by_path(const char *path, const char **opts)
+ {
+@@ -958,15 +958,15 @@ struct device_node *of_find_node_opts_by
+ EXPORT_SYMBOL(of_find_node_opts_by_path);
+ 
+ /**
+- *	of_find_node_by_name - Find a node by its "name" property
+- *	@from:	The node to start searching from or NULL; the node
++ * of_find_node_by_name - Find a node by its "name" property
++ * @from:	The node to start searching from or NULL; the node
+  *		you pass will not be searched, only the next one
+  *		will. Typically, you pass what the previous call
+  *		returned. of_node_put() will be called on @from.
+- *	@name:	The name string to match against
++ * @name:	The name string to match against
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_by_name(struct device_node *from,
+ 	const char *name)
+@@ -985,16 +985,16 @@ struct device_node *of_find_node_by_name
+ EXPORT_SYMBOL(of_find_node_by_name);
+ 
+ /**
+- *	of_find_node_by_type - Find a node by its "device_type" property
+- *	@from:	The node to start searching from, or NULL to start searching
++ * of_find_node_by_type - Find a node by its "device_type" property
++ * @from:	The node to start searching from, or NULL to start searching
+  *		the entire device tree. The node you pass will not be
+  *		searched, only the next one will; typically, you pass
+  *		what the previous call returned. of_node_put() will be
+  *		called on from for you.
+- *	@type:	The type string to match against
++ * @type:	The type string to match against
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_by_type(struct device_node *from,
+ 	const char *type)
+@@ -1013,18 +1013,18 @@ struct device_node *of_find_node_by_type
+ EXPORT_SYMBOL(of_find_node_by_type);
+ 
+ /**
+- *	of_find_compatible_node - Find a node based on type and one of the
++ * of_find_compatible_node - Find a node based on type and one of the
+  *                                tokens in its "compatible" property
+- *	@from:		The node to start searching from or NULL, the node
+- *			you pass will not be searched, only the next one
+- *			will; typically, you pass what the previous call
+- *			returned. of_node_put() will be called on it
+- *	@type:		The type string to match "device_type" or NULL to ignore
+- *	@compatible:	The string to match to one of the tokens in the device
+- *			"compatible" list.
++ * @from:	The node to start searching from or NULL, the node
++ *		you pass will not be searched, only the next one
++ *		will; typically, you pass what the previous call
++ *		returned. of_node_put() will be called on it
++ * @type:	The type string to match "device_type" or NULL to ignore
++ * @compatible:	The string to match to one of the tokens in the device
++ *		"compatible" list.
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_compatible_node(struct device_node *from,
+ 	const char *type, const char *compatible)
+@@ -1044,16 +1044,16 @@ struct device_node *of_find_compatible_n
+ EXPORT_SYMBOL(of_find_compatible_node);
+ 
+ /**
+- *	of_find_node_with_property - Find a node which has a property with
+- *                                   the given name.
+- *	@from:		The node to start searching from or NULL, the node
+- *			you pass will not be searched, only the next one
+- *			will; typically, you pass what the previous call
+- *			returned. of_node_put() will be called on it
+- *	@prop_name:	The name of the property to look for.
++ * of_find_node_with_property - Find a node which has a property with
++ *                              the given name.
++ * @from:	The node to start searching from or NULL, the node
++ *		you pass will not be searched, only the next one
++ *		will; typically, you pass what the previous call
++ *		returned. of_node_put() will be called on it
++ * @prop_name:	The name of the property to look for.
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_with_property(struct device_node *from,
+ 	const char *prop_name)
+@@ -1102,10 +1102,10 @@ const struct of_device_id *__of_match_no
+ 
+ /**
+  * of_match_node - Tell if a device_node has a matching of_match structure
+- *	@matches:	array of of device match structures to search in
+- *	@node:		the of device structure to match against
++ * @matches:	array of of device match structures to search in
++ * @node:	the of device structure to match against
+  *
+- *	Low level utility function used by device matching.
++ * Low level utility function used by device matching.
+  */
+ const struct of_device_id *of_match_node(const struct of_device_id *matches,
+ 					 const struct device_node *node)
+@@ -1121,17 +1121,17 @@ const struct of_device_id *of_match_node
+ EXPORT_SYMBOL(of_match_node);
+ 
+ /**
+- *	of_find_matching_node_and_match - Find a node based on an of_device_id
+- *					  match table.
+- *	@from:		The node to start searching from or NULL, the node
+- *			you pass will not be searched, only the next one
+- *			will; typically, you pass what the previous call
+- *			returned. of_node_put() will be called on it
+- *	@matches:	array of of device match structures to search in
+- *	@match:		Updated to point at the matches entry which matched
++ * of_find_matching_node_and_match - Find a node based on an of_device_id
++ *				     match table.
++ * @from:	The node to start searching from or NULL, the node
++ *		you pass will not be searched, only the next one
++ *		will; typically, you pass what the previous call
++ *		returned. of_node_put() will be called on it
++ * @matches:	array of of device match structures to search in
++ * @match:	Updated to point at the matches entry which matched
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.
+  */
+ struct device_node *of_find_matching_node_and_match(struct device_node *from,
+ 					const struct of_device_id *matches,
+@@ -1465,21 +1465,21 @@ EXPORT_SYMBOL(of_parse_phandle);
+  * Caller is responsible to call of_node_put() on the returned out_args->np
+  * pointer.
+  *
+- * Example:
++ * Example::
+  *
+- * phandle1: node1 {
++ *  phandle1: node1 {
+  *	#list-cells = <2>;
+- * }
++ *  };
+  *
+- * phandle2: node2 {
++ *  phandle2: node2 {
+  *	#list-cells = <1>;
+- * }
++ *  };
+  *
+- * node3 {
++ *  node3 {
+  *	list = <&phandle1 1 2 &phandle2 3>;
+- * }
++ *  };
+  *
+- * To get a device_node of the `node2' node you may call this:
++ * 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,
+@@ -1517,29 +1517,29 @@ EXPORT_SYMBOL(of_parse_phandle_with_args
+  * 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>;
+- * }
++ * Example::
+  *
+- * phandle3: node3 {
+- * 	#list-cells = <1>;
+- * 	list-map = <0 &phandle2 3>,
+- * 		   <1 &phandle2 2>,
+- * 		   <2 &phandle1 5 1>;
+- *	list-map-mask = <0x3>;
+- * };
+- *
+- * node4 {
+- *	list = <&phandle1 1 2 &phandle3 0>;
+- * }
++ *  phandle1: node1 {
++ *  	#list-cells = <2>;
++ *  };
++ *
++ *  phandle2: node2 {
++ *  	#list-cells = <1>;
++ *  };
++ *
++ *  phandle3: node3 {
++ *  	#list-cells = <1>;
++ *  	list-map = <0 &phandle2 3>,
++ *  		   <1 &phandle2 2>,
++ *  		   <2 &phandle1 5 1>;
++ *  	list-map-mask = <0x3>;
++ *  };
++ *
++ *  node4 {
++ *  	list = <&phandle1 1 2 &phandle3 0>;
++ *  };
+  *
+- * To get a device_node of the `node2' node you may call this:
++ * To get a device_node of the ``node2`` node you may call this:
+  * of_parse_phandle_with_args(node4, "list", "list", 1, &args);
+  */
+ int of_parse_phandle_with_args_map(const struct device_node *np,
+@@ -1699,19 +1699,19 @@ EXPORT_SYMBOL(of_parse_phandle_with_args
+  * Caller is responsible to call of_node_put() on the returned out_args->np
+  * pointer.
+  *
+- * Example:
++ * Example::
+  *
+- * phandle1: node1 {
+- * }
++ *  phandle1: node1 {
++ *  };
+  *
+- * phandle2: node2 {
+- * }
++ *  phandle2: node2 {
++ *  };
+  *
+- * node3 {
+- *	list = <&phandle1 0 2 &phandle2 2 3>;
+- * }
++ *  node3 {
++ *  	list = <&phandle1 0 2 &phandle2 2 3>;
++ *  };
+  *
+- * To get a device_node of the `node2' node you may call this:
++ * 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,
+@@ -1957,13 +1957,12 @@ static void of_alias_add(struct alias_pr
+ 
+ /**
+  * of_alias_scan - Scan all properties of the 'aliases' node
++ * @dt_alloc:	An allocator that provides a virtual address to memory
++ *		for storing the resulting tree
+  *
+  * The function scans all the properties of the 'aliases' node and populates
+  * the global lookup table with the properties.  It returns the
+  * number of alias properties found, or an error code in case of failure.
+- *
+- * @dt_alloc:	An allocator that provides a virtual address to memory
+- *		for storing the resulting tree
+  */
+ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
+ {
+@@ -2158,12 +2157,12 @@ bool of_console_check(struct device_node
+ EXPORT_SYMBOL_GPL(of_console_check);
+ 
+ /**
+- *	of_find_next_cache_node - Find a node's subsidiary cache
+- *	@np:	node of type "cpu" or "cache"
++ * of_find_next_cache_node - Find a node's subsidiary cache
++ * @np:	node of type "cpu" or "cache"
+  *
+- *	Returns a node pointer with refcount incremented, use
+- *	of_node_put() on it when done.  Caller should hold a reference
+- *	to np.
++ * Return: A node pointer with refcount incremented, use
++ * of_node_put() on it when done.  Caller should hold a reference
++ * to np.
+  */
+ struct device_node *of_find_next_cache_node(const struct device_node *np)
+ {
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -349,11 +349,6 @@ static int unflatten_dt_nodes(const void
+ 
+ /**
+  * __unflatten_device_tree - create tree of device_nodes from flat blob
+- *
+- * unflattens a device-tree, creating the
+- * tree of struct device_node. It also fills the "name" and "type"
+- * pointers of the nodes so the normal device-tree walking functions
+- * can be used.
+  * @blob: The blob to expand
+  * @dad: Parent device node
+  * @mynodes: The device_node tree created by the call
+@@ -361,6 +356,10 @@ static int unflatten_dt_nodes(const void
+  * for the resulting tree
+  * @detached: if true set OF_DETACHED on @mynodes
+  *
++ * unflattens a device-tree, creating the tree of struct device_node. It also
++ * fills the "name" and "type" pointers of the nodes so the normal device-tree
++ * walking functions can be used.
++ *
+  * Returns NULL on failure or the memory chunk containing the unflattened
+  * device tree on success.
+  */
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0006-of-Add-missing-Return-section-in-kerneldoc-comments.patch b/target/linux/generic/backport-5.10/732-v5.13-0006-of-Add-missing-Return-section-in-kerneldoc-comments.patch
new file mode 100644
index 0000000000..9c99ccb1db
--- /dev/null
+++ b/target/linux/generic/backport-5.10/732-v5.13-0006-of-Add-missing-Return-section-in-kerneldoc-comments.patch
@@ -0,0 +1,787 @@
+From 8c8239c2c1fb82f171cb22a707f3bb88a2f22109 Mon Sep 17 00:00:00 2001
+From: Rob Herring <robh at kernel.org>
+Date: Thu, 25 Mar 2021 10:47:12 -0600
+Subject: [PATCH] of: Add missing 'Return' section in kerneldoc comments
+
+Many of the DT kerneldoc comments are lacking a 'Return' section. Let's
+add the section in cases we have a description of return values. There's
+still some cases where the return values are not documented.
+
+Cc: Frank Rowand <frowand.list at gmail.com>
+Cc: Mauro Carvalho Chehab <mchehab at kernel.org>
+Signed-off-by: Rob Herring <robh at kernel.org>
+Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
+Link: https://lore.kernel.org/r/20210325164713.1296407-8-robh@kernel.org
+---
+ drivers/of/base.c     | 39 +++++++++++++------------
+ drivers/of/dynamic.c  | 19 ++++++++-----
+ drivers/of/fdt.c      |  8 +++---
+ drivers/of/irq.c      | 14 ++++-----
+ drivers/of/overlay.c  | 16 +++++------
+ drivers/of/platform.c | 10 +++----
+ drivers/of/property.c | 66 +++++++++++++++++++++++++++----------------
+ include/linux/of.h    | 63 ++++++++++++++++++++++++++---------------
+ 8 files changed, 140 insertions(+), 95 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -244,7 +244,7 @@ struct device_node *__of_find_all_nodes(
+  * @prev:	Previous node or NULL to start iteration
+  *		of_node_put() will be called on it
+  *
+- * Returns a node pointer with refcount incremented, use
++ * Return: A node pointer with refcount incremented, use
+  * of_node_put() on it when done.
+  */
+ struct device_node *of_find_all_nodes(struct device_node *prev)
+@@ -374,7 +374,7 @@ bool __weak arch_find_n_match_cpu_physic
+  * before booting secondary cores. This function uses arch_match_cpu_phys_id
+  * which can be overridden by architecture specific implementation.
+  *
+- * Returns a node pointer for the logical cpu with refcount incremented, use
++ * Return: A node pointer for the logical cpu with refcount incremented, use
+  * of_node_put() on it when done. Returns NULL if not found.
+  */
+ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
+@@ -394,8 +394,8 @@ EXPORT_SYMBOL(of_get_cpu_node);
+  *
+  * @cpu_node: Pointer to the device_node for CPU.
+  *
+- * Returns the logical CPU number of the given CPU device_node.
+- * Returns -ENODEV if the CPU is not found.
++ * Return: The logical CPU number of the given CPU device_node or -ENODEV if the
++ * CPU is not found.
+  */
+ int of_cpu_node_to_id(struct device_node *cpu_node)
+ {
+@@ -427,7 +427,7 @@ EXPORT_SYMBOL(of_cpu_node_to_id);
+  * bindings. This function check for both and returns the idle state node for
+  * the requested index.
+  *
+- * In case an idle state node is found at @index, the refcount is incremented
++ * Return: An idle state node if found at @index. The refcount is incremented
+  * for it, so call of_node_put() on it when done. Returns NULL if not found.
+  */
+ struct device_node *of_get_cpu_state_node(struct device_node *cpu_node,
+@@ -561,7 +561,7 @@ int of_device_compatible_match(struct de
+  * of_machine_is_compatible - Test root of device tree for a given compatible value
+  * @compat: compatible string to look for in root node's compatible property.
+  *
+- * Returns a positive integer if the root node has the given value in its
++ * Return: A positive integer if the root node has the given value in its
+  * compatible property.
+  */
+ int of_machine_is_compatible(const char *compat)
+@@ -583,7 +583,7 @@ EXPORT_SYMBOL(of_machine_is_compatible);
+  *
+  *  @device: Node to check for availability, with locks already held
+  *
+- *  Returns true if the status property is absent or set to "okay" or "ok",
++ *  Return: True if the status property is absent or set to "okay" or "ok",
+  *  false otherwise
+  */
+ static bool __of_device_is_available(const struct device_node *device)
+@@ -611,7 +611,7 @@ static bool __of_device_is_available(con
+  *
+  *  @device: Node to check for availability
+  *
+- *  Returns true if the status property is absent or set to "okay" or "ok",
++ *  Return: True if the status property is absent or set to "okay" or "ok",
+  *  false otherwise
+  */
+ bool of_device_is_available(const struct device_node *device)
+@@ -632,7 +632,7 @@ EXPORT_SYMBOL(of_device_is_available);
+  *
+  *  @device: Node to check for endianness
+  *
+- *  Returns true if the device has a "big-endian" property, or if the kernel
++ *  Return: True if the device has a "big-endian" property, or if the kernel
+  *  was compiled for BE *and* the device has a "native-endian" property.
+  *  Returns false otherwise.
+  *
+@@ -816,7 +816,7 @@ EXPORT_SYMBOL(of_get_next_cpu_node);
+  * Lookup child node whose compatible property contains the given compatible
+  * string.
+  *
+- * Returns a node pointer with refcount incremented, use of_node_put() on it
++ * Return: a node pointer with refcount incremented, use of_node_put() on it
+  * when done; or NULL if not found.
+  */
+ struct device_node *of_get_compatible_child(const struct device_node *parent,
+@@ -1170,7 +1170,7 @@ EXPORT_SYMBOL(of_find_matching_node_and_
+  * It does this by stripping the manufacturer prefix (as delimited by a ',')
+  * from the first entry in the compatible list property.
+  *
+- * This routine returns 0 on success, <0 on failure.
++ * Return: This routine returns 0 on success, <0 on failure.
+  */
+ int of_modalias_node(struct device_node *node, char *modalias, int len)
+ {
+@@ -1190,7 +1190,7 @@ EXPORT_SYMBOL_GPL(of_modalias_node);
+  * of_find_node_by_phandle - Find a node given a phandle
+  * @handle:	phandle of the node to find
+  *
+- * Returns a node pointer with refcount incremented, use
++ * Return: A node pointer with refcount incremented, use
+  * of_node_put() on it when done.
+  */
+ struct device_node *of_find_node_by_phandle(phandle handle)
+@@ -1431,7 +1431,7 @@ static int __of_parse_phandle_with_args(
+  * @index: For properties holding a table of phandles, this is the index into
+  *         the table
+  *
+- * Returns the device_node pointer with refcount incremented.  Use
++ * 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,
+@@ -1731,7 +1731,7 @@ EXPORT_SYMBOL(of_parse_phandle_with_fixe
+  * @list_name:	property name that contains a list
+  * @cells_name:	property name that specifies phandles' arguments count
+  *
+- * Returns the number of phandle + argument tuples within a property. It
++ * Return: The number of phandle + argument tuples within a property. It
+  * is a typical pattern to encode a list of phandle and variable
+  * arguments into a single property. The number of arguments is encoded
+  * by a property in the phandle-target node. For example, a gpios
+@@ -2031,7 +2031,9 @@ void of_alias_scan(void * (*dt_alloc)(u6
+  * @stem:	Alias stem of the given device_node
+  *
+  * The function travels the lookup table to get the alias id for the given
+- * device_node and alias stem.  It returns the alias id if found.
++ * device_node and alias stem.
++ *
++ * Return: The alias id if found.
+  */
+ int of_alias_get_id(struct device_node *np, const char *stem)
+ {
+@@ -2140,8 +2142,9 @@ EXPORT_SYMBOL_GPL(of_alias_get_highest_i
+  * @index: Index to use for preferred console.
+  *
+  * Check if the given device node matches the stdout-path property in the
+- * /chosen node. If it does then register it as the preferred console and return
+- * TRUE. Otherwise return FALSE.
++ * /chosen node. If it does then register it as the preferred console.
++ *
++ * Return: TRUE if console successfully setup. Otherwise return FALSE.
+  */
+ bool of_console_check(struct device_node *dn, char *name, int index)
+ {
+@@ -2192,7 +2195,7 @@ struct device_node *of_find_next_cache_n
+  *
+  * @cpu: cpu number(logical index) for which the last cache level is needed
+  *
+- * Returns the the level at which the last cache is present. It is exactly
++ * Return: The the level at which the last cache is present. It is exactly
+  * same as  the total number of cache levels for the given logical cpu.
+  */
+ int of_find_last_cache_level(unsigned int cpu)
+--- a/drivers/of/dynamic.c
++++ b/drivers/of/dynamic.c
+@@ -27,7 +27,7 @@ static struct device_node *kobj_to_devic
+  * @node:	Node to inc refcount, NULL is supported to simplify writing of
+  *		callers
+  *
+- * Returns node.
++ * Return: The node with refcount incremented.
+  */
+ struct device_node *of_node_get(struct device_node *node)
+ {
+@@ -104,7 +104,8 @@ int of_reconfig_notify(unsigned long act
+  * @arg		- argument of the of notifier
+  *
+  * Returns the new state of a device based on the notifier used.
+- * Returns 0 on device going from enabled to disabled, 1 on device
++ *
++ * Return: 0 on device going from enabled to disabled, 1 on device
+  * going from disabled to enabled and -1 on no change.
+  */
+ int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr)
+@@ -371,7 +372,8 @@ void of_node_release(struct kobject *kob
+  * property structure and the property name & contents. The property's
+  * flags have the OF_DYNAMIC bit set so that we can differentiate between
+  * dynamically allocated properties and not.
+- * Returns the newly allocated property or NULL on out of memory error.
++ *
++ * Return: The newly allocated property or NULL on out of memory error.
+  */
+ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
+ {
+@@ -414,7 +416,7 @@ struct property *__of_prop_dup(const str
+  * another node.  The node data are dynamically allocated and all the node
+  * flags have the OF_DYNAMIC & OF_DETACHED bits set.
+  *
+- * Returns the newly allocated node or NULL on out of memory error.
++ * Return: The newly allocated node or NULL on out of memory error.
+  */
+ struct device_node *__of_node_dup(const struct device_node *np,
+ 				  const char *full_name)
+@@ -780,7 +782,8 @@ static int __of_changeset_apply(struct o
+  * Any side-effects of live tree state changes are applied here on
+  * success, like creation/destruction of devices and side-effects
+  * like creation of sysfs properties and directories.
+- * Returns 0 on success, a negative error value in case of an error.
++ *
++ * Return: 0 on success, a negative error value in case of an error.
+  * On error the partially applied effects are reverted.
+  */
+ int of_changeset_apply(struct of_changeset *ocs)
+@@ -874,7 +877,8 @@ static int __of_changeset_revert(struct
+  * was before the application.
+  * Any side-effects like creation/destruction of devices and
+  * removal of sysfs properties and directories are applied.
+- * Returns 0 on success, a negative error value in case of an error.
++ *
++ * Return: 0 on success, a negative error value in case of an error.
+  */
+ int of_changeset_revert(struct of_changeset *ocs)
+ {
+@@ -902,7 +906,8 @@ EXPORT_SYMBOL_GPL(of_changeset_revert);
+  * + OF_RECONFIG_ADD_PROPERTY
+  * + OF_RECONFIG_REMOVE_PROPERTY,
+  * + OF_RECONFIG_UPDATE_PROPERTY
+- * Returns 0 on success, a negative error value in case of an error.
++ *
++ * Return: 0 on success, a negative error value in case of an error.
+  */
+ int of_changeset_action(struct of_changeset *ocs, unsigned long action,
+ 		struct device_node *np, struct property *prop)
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -282,7 +282,7 @@ static void reverse_nodes(struct device_
+  * @dad: Parent struct device_node
+  * @nodepp: The device_node tree created by the call
+  *
+- * It returns the size of unflattened device tree or error code
++ * Return: The size of unflattened device tree or error code
+  */
+ static int unflatten_dt_nodes(const void *blob,
+ 			      void *mem,
+@@ -360,7 +360,7 @@ static int unflatten_dt_nodes(const void
+  * fills the "name" and "type" pointers of the nodes so the normal device-tree
+  * walking functions can be used.
+  *
+- * Returns NULL on failure or the memory chunk containing the unflattened
++ * Return: NULL on failure or the memory chunk containing the unflattened
+  * device tree on success.
+  */
+ void *__unflatten_device_tree(const void *blob,
+@@ -441,7 +441,7 @@ static DEFINE_MUTEX(of_fdt_unflatten_mut
+  * pointers of the nodes so the normal device-tree walking functions
+  * can be used.
+  *
+- * Returns NULL on failure or the memory chunk containing the unflattened
++ * Return: NULL on failure or the memory chunk containing the unflattened
+  * device tree on success.
+  */
+ void *of_fdt_unflatten_tree(const unsigned long *blob,
+@@ -715,7 +715,7 @@ const void *__init of_get_flat_dt_prop(u
+  * @node: node to test
+  * @compat: compatible string to compare with compatible list.
+  *
+- * On match, returns a non-zero value with smaller values returned for more
++ * Return: a non-zero value on match with smaller values returned for more
+  * specific compatible values.
+  */
+ static int of_fdt_is_compatible(const void *blob,
+--- a/drivers/of/irq.c
++++ b/drivers/of/irq.c
+@@ -48,7 +48,7 @@ EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
+  * of_irq_find_parent - Given a device node, find its interrupt parent node
+  * @child: pointer to device node
+  *
+- * Returns a pointer to the interrupt parent node, or NULL if the interrupt
++ * Return: A pointer to the interrupt parent node, or NULL if the interrupt
+  * parent could not be determined.
+  */
+ struct device_node *of_irq_find_parent(struct device_node *child)
+@@ -81,14 +81,14 @@ EXPORT_SYMBOL_GPL(of_irq_find_parent);
+  * @addr:	address specifier (start of "reg" property of the device) in be32 format
+  * @out_irq:	structure of_phandle_args updated by this function
+  *
+- * Returns 0 on success and a negative number on error
+- *
+  * This function is a low-level interrupt tree walking function. It
+  * can be used to do a partial walk with synthetized reg and interrupts
+  * properties, for example when resolving PCI interrupts when no device
+  * node exist for the parent. It takes an interrupt specifier structure as
+  * input, walks the tree looking for any interrupt-map properties, translates
+  * the specifier for each map, and then returns the translated map.
++ *
++ * Return: 0 on success and a negative number on error
+  */
+ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
+ {
+@@ -380,7 +380,7 @@ EXPORT_SYMBOL_GPL(of_irq_to_resource);
+  * @dev: pointer to device tree node
+  * @index: zero-based index of the IRQ
+  *
+- * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
++ * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
+  * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
+  * of any other failure.
+  */
+@@ -407,7 +407,7 @@ EXPORT_SYMBOL_GPL(of_irq_get);
+  * @dev: pointer to device tree node
+  * @name: IRQ name
+  *
+- * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
++ * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
+  * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
+  * of any other failure.
+  */
+@@ -447,7 +447,7 @@ int of_irq_count(struct device_node *dev
+  * @res: array of resources to fill in
+  * @nr_irqs: the number of IRQs (and upper bound for num of @res elements)
+  *
+- * Returns the size of the filled in table (up to @nr_irqs).
++ * Return: The size of the filled in table (up to @nr_irqs).
+  */
+ int of_irq_to_resource_table(struct device_node *dev, struct resource *res,
+ 		int nr_irqs)
+@@ -602,7 +602,7 @@ static u32 __of_msi_map_id(struct device
+  * Walk up the device hierarchy looking for devices with a "msi-map"
+  * property.  If found, apply the mapping to @id_in.
+  *
+- * Returns the mapped MSI ID.
++ * Return: The mapped MSI ID.
+  */
+ u32 of_msi_map_id(struct device *dev, struct device_node *msi_np, u32 id_in)
+ {
+--- a/drivers/of/overlay.c
++++ b/drivers/of/overlay.c
+@@ -296,7 +296,7 @@ err_free_target_path:
+  *
+  * Update of property in symbols node is not allowed.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid @overlay.
+  */
+ static int add_changeset_property(struct overlay_changeset *ovcs,
+@@ -401,7 +401,7 @@ static int add_changeset_property(struct
+  *
+  * NOTE_2: Multiple mods of created nodes not supported.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid @overlay.
+  */
+ static int add_changeset_node(struct overlay_changeset *ovcs,
+@@ -473,7 +473,7 @@ static int add_changeset_node(struct ove
+  *
+  * Do not allow symbols node to have any children.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid @overlay_node.
+  */
+ static int build_changeset_next_level(struct overlay_changeset *ovcs,
+@@ -604,7 +604,7 @@ static int find_dup_cset_prop(struct ove
+  * the same node or duplicate {add, delete, or update} properties entries
+  * for the same property.
+  *
+- * Returns 0 on success, or -EINVAL if duplicate changeset entry found.
++ * Return: 0 on success, or -EINVAL if duplicate changeset entry found.
+  */
+ static int changeset_dup_entry_check(struct overlay_changeset *ovcs)
+ {
+@@ -628,7 +628,7 @@ static int changeset_dup_entry_check(str
+  * any portions of the changeset that were successfully created will remain
+  * in @ovcs->cset.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
++ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
+  * invalid overlay in @ovcs->fragments[].
+  */
+ static int build_changeset(struct overlay_changeset *ovcs)
+@@ -724,7 +724,7 @@ static struct device_node *find_target(s
+  * the top level of @tree.  The relevant top level nodes are the fragment
+  * nodes and the __symbols__ node.  Any other top level node will be ignored.
+  *
+- * Returns 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error
++ * Return: 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error
+  * detected in @tree, or -ENOSPC if idr_alloc() error.
+  */
+ static int init_overlay_changeset(struct overlay_changeset *ovcs,
+@@ -1179,7 +1179,7 @@ static int overlay_removal_is_ok(struct
+  * If an error is returned by an overlay changeset post-remove notifier
+  * then no further overlay changeset post-remove notifier will be called.
+  *
+- * Returns 0 on success, or a negative error number.  *ovcs_id is set to
++ * Return: 0 on success, or a negative error number.  *ovcs_id is set to
+  * zero after reverting the changeset, even if a subsequent error occurs.
+  */
+ int of_overlay_remove(int *ovcs_id)
+@@ -1257,7 +1257,7 @@ EXPORT_SYMBOL_GPL(of_overlay_remove);
+  *
+  * Removes all overlays from the system in the correct order.
+  *
+- * Returns 0 on success, or a negative error number
++ * Return: 0 on success, or a negative error number
+  */
+ int of_overlay_remove_all(void)
+ {
+--- a/drivers/of/platform.c
++++ b/drivers/of/platform.c
+@@ -44,7 +44,7 @@ static const struct of_device_id of_skip
+  * Takes a reference to the embedded struct device which needs to be dropped
+  * after use.
+  *
+- * Returns platform_device pointer, or NULL if not found
++ * Return: platform_device pointer, or NULL if not found
+  */
+ struct platform_device *of_find_device_by_node(struct device_node *np)
+ {
+@@ -160,7 +160,7 @@ EXPORT_SYMBOL(of_device_alloc);
+  * @platform_data: pointer to populate platform_data pointer with
+  * @parent: Linux device model parent device.
+  *
+- * Returns pointer to created platform device, or NULL if a device was not
++ * Return: Pointer to created platform device, or NULL if a device was not
+  * registered.  Unavailable devices will not get registered.
+  */
+ static struct platform_device *of_platform_device_create_pdata(
+@@ -204,7 +204,7 @@ err_clear_flag:
+  * @bus_id: name to assign device
+  * @parent: Linux device model parent device.
+  *
+- * Returns pointer to created platform device, or NULL if a device was not
++ * Return: Pointer to created platform device, or NULL if a device was not
+  * registered.  Unavailable devices will not get registered.
+  */
+ struct platform_device *of_platform_device_create(struct device_node *np,
+@@ -463,7 +463,7 @@ EXPORT_SYMBOL(of_platform_bus_probe);
+  * New board support should be using this function instead of
+  * of_platform_bus_probe().
+  *
+- * Returns 0 on success, < 0 on failure.
++ * Return: 0 on success, < 0 on failure.
+  */
+ int of_platform_populate(struct device_node *root,
+ 			const struct of_device_id *matches,
+@@ -608,7 +608,7 @@ static void devm_of_platform_populate_re
+  * Similar to of_platform_populate(), but will automatically call
+  * of_platform_depopulate() when the device is unbound from the bus.
+  *
+- * Returns 0 on success, < 0 on failure.
++ * Return: 0 on success, < 0 on failure.
+  */
+ int devm_of_platform_populate(struct device *dev)
+ {
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -60,9 +60,11 @@ EXPORT_SYMBOL(of_graph_is_present);
+  * @elem_size:	size of the individual element
+  *
+  * Search for a property in a device node and count the number of elements of
+- * size elem_size in it. Returns number of elements on sucess, -EINVAL if the
+- * property does not exist or its length does not match a multiple of elem_size
+- * and -ENODATA if the property does not have a value.
++ * size elem_size in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does not
++ * exist or its length does not match a multiple of elem_size and -ENODATA if
++ * the property does not have a value.
+  */
+ int of_property_count_elems_of_size(const struct device_node *np,
+ 				const char *propname, int elem_size)
+@@ -94,8 +96,9 @@ EXPORT_SYMBOL_GPL(of_property_count_elem
+  * @len:	if !=NULL, actual length is written to here
+  *
+  * Search for a property in a device node and valid the requested size.
+- * Returns the property value on success, -EINVAL if the property does not
+- *  exist, -ENODATA if property does not have a value, and -EOVERFLOW if the
++ *
++ * Return: The property value on success, -EINVAL if the property does not
++ * exist, -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data is too small or too large.
+  *
+  */
+@@ -128,7 +131,9 @@ static void *of_find_property_value_of_s
+  * @out_value:	pointer to return value, modified only if no error.
+  *
+  * Search for a property in a device node and read nth 32-bit value from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -160,7 +165,9 @@ EXPORT_SYMBOL_GPL(of_property_read_u32_i
+  * @out_value:	pointer to return value, modified only if no error.
+  *
+  * Search for a property in a device node and read nth 64-bit value from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -195,12 +202,14 @@ EXPORT_SYMBOL_GPL(of_property_read_u64_i
+  *		sz_min will be read.
+  *
+  * Search for a property in a device node and read 8-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
+- * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+- * if the property data is smaller than sz_min or longer than sz_max.
++ * it.
+  *
+  * dts entry of array should be like:
+- *	property = /bits/ 8 <0x50 0x60 0x70>;
++ *  ``property = /bits/ 8 <0x50 0x60 0x70>;``
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
++ * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
++ * if the property data is smaller than sz_min or longer than sz_max.
+  *
+  * The out_values is modified only if a valid u8 value can be decoded.
+  */
+@@ -243,12 +252,14 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  *		sz_min will be read.
+  *
+  * Search for a property in a device node and read 16-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
+- * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+- * if the property data is smaller than sz_min or longer than sz_max.
++ * it.
+  *
+  * dts entry of array should be like:
+- *	property = /bits/ 16 <0x5000 0x6000 0x7000>;
++ *  ``property = /bits/ 16 <0x5000 0x6000 0x7000>;``
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
++ * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
++ * if the property data is smaller than sz_min or longer than sz_max.
+  *
+  * The out_values is modified only if a valid u16 value can be decoded.
+  */
+@@ -291,7 +302,9 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  *		sz_min will be read.
+  *
+  * Search for a property in a device node and read 32-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
++ * it.
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
+  * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+  * if the property data is smaller than sz_min or longer than sz_max.
+  *
+@@ -330,7 +343,9 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  * @out_value:	pointer to return value, modified only if return value is 0.
+  *
+  * Search for a property in a device node and read a 64-bit value from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -365,7 +380,9 @@ EXPORT_SYMBOL_GPL(of_property_read_u64);
+  *		sz_min will be read.
+  *
+  * Search for a property in a device node and read 64-bit value(s) from
+- * it. Returns number of elements read on success, -EINVAL if the property
++ * it.
++ *
++ * Return: The number of elements read on success, -EINVAL if the property
+  * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
+  * if the property data is smaller than sz_min or longer than sz_max.
+  *
+@@ -407,10 +424,11 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
+  *		return value is 0.
+  *
+  * Search for a property in a device tree node and retrieve a null
+- * terminated string value (pointer to data, not a copy). Returns 0 on
+- * success, -EINVAL if the property does not exist, -ENODATA if property
+- * does not have a value, and -EILSEQ if the string is not null-terminated
+- * within the length of the property data.
++ * terminated string value (pointer to data, not a copy).
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist, -ENODATA if
++ * property does not have a value, and -EILSEQ if the string is not
++ * null-terminated within the length of the property data.
+  *
+  * The out_string pointer is modified only if a valid string can be decoded.
+  */
+@@ -774,7 +792,7 @@ EXPORT_SYMBOL(of_graph_get_remote_port_p
+  * @node: pointer to a local endpoint device_node
+  *
+  * Return: Remote port node associated with remote endpoint node linked
+- *	   to @node. Use of_node_put() on it when done.
++ * to @node. Use of_node_put() on it when done.
+  */
+ struct device_node *of_graph_get_remote_port(const struct device_node *node)
+ {
+@@ -807,7 +825,7 @@ EXPORT_SYMBOL(of_graph_get_endpoint_coun
+  * @endpoint: identifier (value of reg property) of the endpoint node
+  *
+  * Return: Remote device node associated with remote endpoint node linked
+- *	   to @node. Use of_node_put() on it when done.
++ * to @node. Use of_node_put() on it when done.
+  */
+ struct device_node *of_graph_get_remote_node(const struct device_node *node,
+ 					     u32 port, u32 endpoint)
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -424,12 +424,14 @@ extern int of_detach_node(struct device_
+  * @sz:		number of array elements to read
+  *
+  * Search for a property in a device node and read 8-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
+- * -ENODATA if property does not have a value, and -EOVERFLOW if the
+- * property data isn't large enough.
++ * it.
+  *
+  * dts entry of array should be like:
+- *	property = /bits/ 8 <0x50 0x60 0x70>;
++ *  ``property = /bits/ 8 <0x50 0x60 0x70>;``
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
++ * -ENODATA if property does not have a value, and -EOVERFLOW if the
++ * property data isn't large enough.
+  *
+  * The out_values is modified only if a valid u8 value can be decoded.
+  */
+@@ -454,12 +456,14 @@ static inline int of_property_read_u8_ar
+  * @sz:		number of array elements to read
+  *
+  * Search for a property in a device node and read 16-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
+- * -ENODATA if property does not have a value, and -EOVERFLOW if the
+- * property data isn't large enough.
++ * it.
+  *
+  * dts entry of array should be like:
+- *	property = /bits/ 16 <0x5000 0x6000 0x7000>;
++ *  ``property = /bits/ 16 <0x5000 0x6000 0x7000>;``
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
++ * -ENODATA if property does not have a value, and -EOVERFLOW if the
++ * property data isn't large enough.
+  *
+  * The out_values is modified only if a valid u16 value can be decoded.
+  */
+@@ -485,7 +489,9 @@ static inline int of_property_read_u16_a
+  * @sz:		number of array elements to read
+  *
+  * Search for a property in a device node and read 32-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -513,7 +519,9 @@ static inline int of_property_read_u32_a
+  * @sz:		number of array elements to read
+  *
+  * Search for a property in a device node and read 64-bit value(s) from
+- * it. Returns 0 on success, -EINVAL if the property does not exist,
++ * it.
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist,
+  * -ENODATA if property does not have a value, and -EOVERFLOW if the
+  * property data isn't large enough.
+  *
+@@ -1063,7 +1071,9 @@ static inline bool of_node_is_type(const
+  * @propname:	name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u8 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u8 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1080,7 +1090,9 @@ static inline int of_property_count_u8_e
+  * @propname:	name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u16 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u16 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1097,7 +1109,9 @@ static inline int of_property_count_u16_
+  * @propname:	name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u32 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u32 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1114,7 +1128,9 @@ static inline int of_property_count_u32_
+  * @propname:	name of the property to be searched.
+  *
+  * Search for a property in a device node and count the number of u64 elements
+- * in it. Returns number of elements on sucess, -EINVAL if the property does
++ * in it.
++ *
++ * Return: The number of elements on sucess, -EINVAL if the property does
+  * not exist or its length does not match a multiple of u64 and -ENODATA if the
+  * property does not have a value.
+  */
+@@ -1135,7 +1151,7 @@ static inline int of_property_count_u64_
+  * Search for a property in a device tree node and retrieve a list of
+  * terminated string values (pointer to data, not a copy) in that property.
+  *
+- * If @out_strs is NULL, the number of strings in the property is returned.
++ * Return: If @out_strs is NULL, the number of strings in the property is returned.
+  */
+ static inline int of_property_read_string_array(const struct device_node *np,
+ 						const char *propname, const char **out_strs,
+@@ -1151,10 +1167,11 @@ static inline int of_property_read_strin
+  * @propname:	name of the property to be searched.
+  *
+  * Search for a property in a device tree node and retrieve the number of null
+- * terminated string contain in it. Returns the number of strings on
+- * success, -EINVAL if the property does not exist, -ENODATA if property
+- * does not have a value, and -EILSEQ if the string is not null-terminated
+- * within the length of the property data.
++ * terminated string contain in it.
++ *
++ * Return: The number of strings on success, -EINVAL if the property does not
++ * exist, -ENODATA if property does not have a value, and -EILSEQ if the string
++ * is not null-terminated within the length of the property data.
+  */
+ static inline int of_property_count_strings(const struct device_node *np,
+ 					    const char *propname)
+@@ -1174,7 +1191,8 @@ static inline int of_property_count_stri
+  * Search for a property in a device tree node and retrieve a null
+  * terminated string value (pointer to data, not a copy) in the list of strings
+  * contained in that property.
+- * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if
++ *
++ * Return: 0 on success, -EINVAL if the property does not exist, -ENODATA if
+  * property does not have a value, and -EILSEQ if the string is not
+  * null-terminated within the length of the property data.
+  *
+@@ -1194,7 +1212,8 @@ static inline int of_property_read_strin
+  * @propname:	name of the property to be searched.
+  *
+  * Search for a property in a device node.
+- * Returns true if the property exists false otherwise.
++ *
++ * Return: true if the property exists false otherwise.
+  */
+ static inline bool of_property_read_bool(const struct device_node *np,
+ 					 const char *propname)
+@@ -1440,7 +1459,7 @@ static inline int of_reconfig_get_state_
+  * of_device_is_system_power_controller - Tells if system-power-controller is found for device_node
+  * @np: Pointer to the given device_node
+  *
+- * return true if present false otherwise
++ * Return: true if present false otherwise
+  */
+ static inline bool of_device_is_system_power_controller(const struct device_node *np)
+ {
diff --git a/target/linux/generic/backport-5.10/732-v5.13-0007-of-base-Fix-spelling-issue-with-function-param-prop.patch b/target/linux/generic/backport-5.10/732-v5.13-0007-of-base-Fix-spelling-issue-with-function-param-prop.patch
new file mode 100644
index 0000000000..64197d7482
--- /dev/null
+++ b/target/linux/generic/backport-5.10/732-v5.13-0007-of-base-Fix-spelling-issue-with-function-param-prop.patch
@@ -0,0 +1,54 @@
+From 31e46db02ac1351c84e56a18606d17fc1b8390dd Mon Sep 17 00:00:00 2001
+From: Lee Jones <lee.jones at linaro.org>
+Date: Mon, 29 Mar 2021 16:24:35 +0100
+Subject: [PATCH] of: base: Fix spelling issue with function param 'prop'
+
+Fixes the following W=1 kernel build warning(s):
+
+ drivers/of/base.c:1781: warning: Function parameter or member 'prop' not described in '__of_add_property'
+ drivers/of/base.c:1781: warning: Excess function parameter 'prob' description in '__of_add_property'
+ drivers/of/base.c:1804: warning: Function parameter or member 'prop' not described in 'of_add_property'
+ drivers/of/base.c:1804: warning: Excess function parameter 'prob' description in 'of_add_property'
+ drivers/of/base.c:1855: warning: Function parameter or member 'prop' not described in 'of_remove_property'
+ drivers/of/base.c:1855: warning: Excess function parameter 'prob' description in 'of_remove_property'
+
+Cc: Rob Herring <robh+dt at kernel.org>
+Cc: Frank Rowand <frowand.list at gmail.com>
+Cc: "David S. Miller" <davem at davemloft.net>
+Cc: devicetree at vger.kernel.org
+Signed-off-by: Lee Jones <lee.jones at linaro.org>
+Link: https://lore.kernel.org/r/20210329152435.900225-1-lee.jones@linaro.org
+Signed-off-by: Rob Herring <robh at kernel.org>
+---
+ drivers/of/base.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -1780,7 +1780,7 @@ EXPORT_SYMBOL(of_count_phandle_with_args
+ /**
+  * __of_add_property - Add a property to a node without lock operations
+  * @np:		Caller's Device Node
+- * @prob:	Property to add
++ * @prop:	Property to add
+  */
+ int __of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1803,7 +1803,7 @@ int __of_add_property(struct device_node
+ /**
+  * of_add_property - Add a property to a node
+  * @np:		Caller's Device Node
+- * @prob:	Property to add
++ * @prop:	Property to add
+  */
+ int of_add_property(struct device_node *np, struct property *prop)
+ {
+@@ -1849,7 +1849,7 @@ int __of_remove_property(struct device_n
+ /**
+  * of_remove_property - Remove a property from a node.
+  * @np:		Caller's Device Node
+- * @prob:	Property to remove
++ * @prop:	Property to remove
+  *
+  * Note that we don't actually remove it, since we have given out
+  * who-knows-how-many pointers to the data using get-property.
diff --git a/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.10/732-v5.13-0008-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
similarity index 99%
rename from target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
rename to target/linux/generic/backport-5.10/732-v5.13-0008-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
index 928e1ca0dc..ae46508aeb 100644
--- a/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
+++ b/target/linux/generic/backport-5.10/732-v5.13-0008-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
@@ -1,7 +1,7 @@
 From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001
 From: Michael Walle <michael at walle.cc>
 Date: Mon, 12 Apr 2021 19:47:17 +0200
-Subject: of: net: pass the dst buffer to of_get_mac_address()
+Subject: [PATCH] of: net: pass the dst buffer to of_get_mac_address()
 
 of_get_mac_address() returns a "const void*" pointer to a MAC address.
 Lately, support to fetch the MAC address by an NVMEM provider was added.
diff --git a/target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch b/target/linux/generic/backport-5.10/732-v5.13-0009-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-de.patch
similarity index 96%
rename from target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch
rename to target/linux/generic/backport-5.10/732-v5.13-0009-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-de.patch
index 245c5f3bd6..260a3258bb 100644
--- a/target/linux/generic/backport-5.10/732-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch
+++ b/target/linux/generic/backport-5.10/732-v5.13-0009-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-de.patch
@@ -1,7 +1,7 @@
 From f10843e04a075202dbb39dfcee047e3a2fdf5a8d Mon Sep 17 00:00:00 2001
 From: Michael Walle <michael at walle.cc>
 Date: Mon, 12 Apr 2021 19:47:18 +0200
-Subject: of: net: fix of_get_mac_addr_nvmem() for non-platform devices
+Subject: [PATCH] of: net: fix of_get_mac_addr_nvmem() for non-platform devices
 
 of_get_mac_address() already supports fetching the MAC address by an
 nvmem provider. But until now, it was just working for platform devices.
diff --git a/target/linux/generic/backport-5.10/825-v5.15-of-unify-of_count_phandle_with_args-arguments-with-C.patch b/target/linux/generic/backport-5.10/825-v5.15-of-unify-of_count_phandle_with_args-arguments-with-C.patch
new file mode 100644
index 0000000000..ee5b7a0f7e
--- /dev/null
+++ b/target/linux/generic/backport-5.10/825-v5.15-of-unify-of_count_phandle_with_args-arguments-with-C.patch
@@ -0,0 +1,27 @@
+From a065d5615fc83908ef21ed8159ffb63d816ff5de Mon Sep 17 00:00:00 2001
+From: Krzysztof Kozlowski <krzysztof.kozlowski at canonical.com>
+Date: Wed, 28 Jul 2021 16:42:27 +0200
+Subject: [PATCH] of: unify of_count_phandle_with_args() arguments with
+ !CONFIG_OF
+
+Unify the declaration of of_count_phandle_with_args() between enabled
+and disabled OF by making constifying pointed device_node.
+
+Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at canonical.com>
+Reviewed-by: Rob Herring <robh at kernel.org>
+Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
+---
+ include/linux/of.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -889,7 +889,7 @@ static inline int of_parse_phandle_with_
+ 	return -ENOSYS;
+ }
+ 
+-static inline int of_count_phandle_with_args(struct device_node *np,
++static inline int of_count_phandle_with_args(const struct device_node *np,
+ 					     const char *list_name,
+ 					     const char *cells_name)
+ {
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
index 0000000000..b6ef67dfa7
--- /dev/null
+++ b/target/linux/generic/backport-5.10/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch
@@ -0,0 +1,359 @@
+From 66a8f7f04979f4ad739085f01d99c8caf620b4f5 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at 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 at kernel.org>
+Signed-off-by: Michael Walle <michael at walle.cc>
+[robh: move index < 0 check into __of_parse_phandle_with_args]
+Signed-off-by: Rob Herring <robh at 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.
diff --git a/target/linux/generic/backport-5.10/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch b/target/linux/generic/backport-5.10/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch
new file mode 100644
index 0000000000..a3df3ce75c
--- /dev/null
+++ b/target/linux/generic/backport-5.10/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch
@@ -0,0 +1,56 @@
+From 8eddceb280f5deb8046fcb660de9f9f683b408b9 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at walle.cc>
+Date: Tue, 6 Dec 2022 21:07:21 +0100
+Subject: [PATCH] of: base: add of_parse_phandle_with_optional_args()
+
+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 at walle.cc>
+Reviewed-by: Rob Herring <robh at kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
+---
+ include/linux/of.h | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -1157,6 +1157,31 @@ static inline int of_parse_phandle_with_
+ }
+ 
+ /**
++ * of_parse_phandle_with_optional_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)
++ *
++ * Same as of_parse_phandle_with_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.
++ */
++static inline 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)
++{
++	return __of_parse_phandle_with_args(np, list_name, cells_name,
++					    0, 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.
diff --git a/target/linux/generic/backport-5.10/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch b/target/linux/generic/backport-5.10/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch
new file mode 100644
index 0000000000..95b0e60d56
--- /dev/null
+++ b/target/linux/generic/backport-5.10/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch
@@ -0,0 +1,32 @@
+From 4f4145c9fee8c7a445dbbbadceccce5391e6b287 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at walle.cc>
+Date: Tue, 6 Dec 2022 21:07:22 +0100
+Subject: [PATCH] of: property: make #.*-cells optional for simple props
+
+Sometimes, future bindings for phandles will get additional arguments.
+Thus the target node of the phandle will need a new #.*-cells property.
+To be backwards compatible, this needs to be optional.
+
+Prepare the DEFINE_SIMPLE_PROPS() to handle the cells name as optional.
+
+Signed-off-by: Michael Walle <michael at walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal at bootlin.com>
+Reviewed-by: Rob Herring <robh at kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
+---
+ drivers/of/property.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1267,8 +1267,8 @@ static struct device_node *parse_suffix_
+ 	if (strcmp_suffix(prop_name, suffix))
+ 		return NULL;
+ 
+-	if (of_parse_phandle_with_args(np, prop_name, cells_name, index,
+-				       &sup_args))
++	if (__of_parse_phandle_with_args(np, prop_name, cells_name, 0, index,
++					 &sup_args))
+ 		return NULL;
+ 
+ 	return sup_args.np;
diff --git a/target/linux/generic/backport-5.10/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch b/target/linux/generic/backport-5.10/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch
new file mode 100644
index 0000000000..5d1df95ff1
--- /dev/null
+++ b/target/linux/generic/backport-5.10/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch
@@ -0,0 +1,28 @@
+From 9cf9486a6a7e8a3d76154d0c506051ba3740e8b6 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at walle.cc>
+Date: Tue, 6 Dec 2022 21:07:23 +0100
+Subject: [PATCH] of: property: add #nvmem-cell-cells property
+
+Bindings describe the new '#nvmem-cell-cells' property. Now that the
+arguments count property is optional, we just add this property to the
+nvmem-cells.
+
+Signed-off-by: Michael Walle <michael at walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal at bootlin.com>
+Reviewed-by: Rob Herring <robh at kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
+---
+ drivers/of/property.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1314,7 +1314,7 @@ DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "
+ DEFINE_SIMPLE_PROP(extcon, "extcon", NULL)
+ DEFINE_SIMPLE_PROP(interrupts_extended, "interrupts-extended",
+ 					"#interrupt-cells")
+-DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", NULL)
++DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", "#nvmem-cell-cells")
+ DEFINE_SIMPLE_PROP(phys, "phys", "#phy-cells")
+ DEFINE_SIMPLE_PROP(wakeup_parent, "wakeup-parent", NULL)
+ DEFINE_SIMPLE_PROP(pinctrl0, "pinctrl-0", NULL)
diff --git a/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch b/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch
new file mode 100644
index 0000000000..b00cf57419
--- /dev/null
+++ b/target/linux/generic/backport-5.15/826-v5.17-of-base-make-small-of_parse_phandle-variants-static-.patch
@@ -0,0 +1,359 @@
+From 66a8f7f04979f4ad739085f01d99c8caf620b4f5 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at 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 at kernel.org>
+Signed-off-by: Michael Walle <michael at walle.cc>
+[robh: move index < 0 check into __of_parse_phandle_with_args]
+Signed-off-by: Rob Herring <robh at 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
+@@ -1371,15 +1371,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) {
+ 		/*
+@@ -1422,82 +1425,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
+@@ -1684,47 +1612,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);
+ 
+@@ -864,18 +858,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;
+ }
+@@ -889,13 +877,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)
+@@ -1077,6 +1058,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.
diff --git a/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch b/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch
new file mode 100644
index 0000000000..b829f21cfa
--- /dev/null
+++ b/target/linux/generic/backport-5.15/827-v6.3-0001-of-base-add-of_parse_phandle_with_optional_args.patch
@@ -0,0 +1,56 @@
+From 8eddceb280f5deb8046fcb660de9f9f683b408b9 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at walle.cc>
+Date: Tue, 6 Dec 2022 21:07:21 +0100
+Subject: [PATCH] of: base: add of_parse_phandle_with_optional_args()
+
+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 at walle.cc>
+Reviewed-by: Rob Herring <robh at kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
+---
+ include/linux/of.h | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -1169,6 +1169,31 @@ static inline int of_parse_phandle_with_
+ }
+ 
+ /**
++ * of_parse_phandle_with_optional_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)
++ *
++ * Same as of_parse_phandle_with_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.
++ */
++static inline 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)
++{
++	return __of_parse_phandle_with_args(np, list_name, cells_name,
++					    0, 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.
diff --git a/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch b/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch
new file mode 100644
index 0000000000..4cf11ca34b
--- /dev/null
+++ b/target/linux/generic/backport-5.15/827-v6.3-0002-of-property-make-.-cells-optional-for-simple-props.patch
@@ -0,0 +1,32 @@
+From 4f4145c9fee8c7a445dbbbadceccce5391e6b287 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at walle.cc>
+Date: Tue, 6 Dec 2022 21:07:22 +0100
+Subject: [PATCH] of: property: make #.*-cells optional for simple props
+
+Sometimes, future bindings for phandles will get additional arguments.
+Thus the target node of the phandle will need a new #.*-cells property.
+To be backwards compatible, this needs to be optional.
+
+Prepare the DEFINE_SIMPLE_PROPS() to handle the cells name as optional.
+
+Signed-off-by: Michael Walle <michael at walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal at bootlin.com>
+Reviewed-by: Rob Herring <robh at kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
+---
+ drivers/of/property.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1227,8 +1227,8 @@ static struct device_node *parse_suffix_
+ 	if (strcmp_suffix(prop_name, suffix))
+ 		return NULL;
+ 
+-	if (of_parse_phandle_with_args(np, prop_name, cells_name, index,
+-				       &sup_args))
++	if (__of_parse_phandle_with_args(np, prop_name, cells_name, 0, index,
++					 &sup_args))
+ 		return NULL;
+ 
+ 	return sup_args.np;
diff --git a/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch b/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch
new file mode 100644
index 0000000000..8c047e685d
--- /dev/null
+++ b/target/linux/generic/backport-5.15/827-v6.3-0003-of-property-add-nvmem-cell-cells-property.patch
@@ -0,0 +1,28 @@
+From 9cf9486a6a7e8a3d76154d0c506051ba3740e8b6 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael at walle.cc>
+Date: Tue, 6 Dec 2022 21:07:23 +0100
+Subject: [PATCH] of: property: add #nvmem-cell-cells property
+
+Bindings describe the new '#nvmem-cell-cells' property. Now that the
+arguments count property is optional, we just add this property to the
+nvmem-cells.
+
+Signed-off-by: Michael Walle <michael at walle.cc>
+Tested-by: Miquel Raynal <miquel.raynal at bootlin.com>
+Reviewed-by: Rob Herring <robh at kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
+---
+ drivers/of/property.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/of/property.c
++++ b/drivers/of/property.c
+@@ -1276,7 +1276,7 @@ DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-c
+ DEFINE_SIMPLE_PROP(power_domains, "power-domains", "#power-domain-cells")
+ DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "#hwlock-cells")
+ DEFINE_SIMPLE_PROP(extcon, "extcon", NULL)
+-DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", NULL)
++DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", "#nvmem-cell-cells")
+ DEFINE_SIMPLE_PROP(phys, "phys", "#phy-cells")
+ DEFINE_SIMPLE_PROP(wakeup_parent, "wakeup-parent", NULL)
+ DEFINE_SIMPLE_PROP(pinctrl0, "pinctrl-0", NULL)
diff --git a/target/linux/generic/hack-5.10/920-device_tree_cmdline.patch b/target/linux/generic/hack-5.10/920-device_tree_cmdline.patch
index 17d3f2ffd5..dbba45b41c 100644
--- a/target/linux/generic/hack-5.10/920-device_tree_cmdline.patch
+++ b/target/linux/generic/hack-5.10/920-device_tree_cmdline.patch
@@ -16,7 +16,7 @@ SVN-Revision: 36780
 
 --- a/drivers/of/fdt.c
 +++ b/drivers/of/fdt.c
-@@ -1055,6 +1055,9 @@ int __init early_init_dt_scan_chosen(uns
+@@ -1054,6 +1054,9 @@ int __init early_init_dt_scan_chosen(uns
  	p = of_get_flat_dt_prop(node, "bootargs", &l);
  	if (p != NULL && l > 0)
  		strlcpy(data, p, min(l, COMMAND_LINE_SIZE));
diff --git a/target/linux/ipq806x/patches-5.10/900-arm-add-cmdline-override.patch b/target/linux/ipq806x/patches-5.10/900-arm-add-cmdline-override.patch
index ddc3b7cb52..3f43328961 100644
--- a/target/linux/ipq806x/patches-5.10/900-arm-add-cmdline-override.patch
+++ b/target/linux/ipq806x/patches-5.10/900-arm-add-cmdline-override.patch
@@ -17,7 +17,7 @@
  	default ""
 --- a/drivers/of/fdt.c
 +++ b/drivers/of/fdt.c
-@@ -1059,6 +1059,17 @@ int __init early_init_dt_scan_chosen(uns
+@@ -1058,6 +1058,17 @@ int __init early_init_dt_scan_chosen(uns
  	if (p != NULL && l > 0)
  		strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE));
  
diff --git a/target/linux/mpc85xx/patches-5.10/102-powerpc-add-cmdline-override.patch b/target/linux/mpc85xx/patches-5.10/102-powerpc-add-cmdline-override.patch
index 9242fce4e2..95ce5f2bb9 100644
--- a/target/linux/mpc85xx/patches-5.10/102-powerpc-add-cmdline-override.patch
+++ b/target/linux/mpc85xx/patches-5.10/102-powerpc-add-cmdline-override.patch
@@ -17,7 +17,7 @@
  	help
 --- a/drivers/of/fdt.c
 +++ b/drivers/of/fdt.c
-@@ -1059,6 +1059,17 @@ int __init early_init_dt_scan_chosen(uns
+@@ -1058,6 +1058,17 @@ int __init early_init_dt_scan_chosen(uns
  	if (p != NULL && l > 0)
  		strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE));
  




More information about the lede-commits mailing list