All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args
@ 2020-09-25  7:41 Patrick Delaunay
  2020-09-25  7:41 ` [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle Patrick Delaunay
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Patrick Delaunay @ 2020-09-25  7:41 UTC (permalink / raw)
  To: u-boot

The cell_count argument is required when cells_name is NULL.

This patch adds this parameter in live tree API
- of_count_phandle_with_args
- ofnode_count_phandle_with_args
- dev_count_phandle_with_args

This parameter solves issue when these API is used to count
the number of element of a cell without cell name. This parameter
allow to force the size cell.

For example:
  count = dev_count_phandle_with_args(dev, "array", NULL, 3);

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---
It is linked to previous serie [1] but it is not a blocking point today
as no user use this API with cells_name = NULL
+ dev_count_phandle_with_args
+ ofnode_count_phandle_with_args

[1/3] was Previously sent in RFC [2] + missing impacts in:
  drivers/net/designware.c
  drivers/power/domain/power-domain-uclass.c
  drivers/usb/host/ohci-da8xx.c
  drivers/usb/host/ohci-generic.c

I also add test in [3/3] for modified API.

But I think it is the good time to modify these functions as they are not
hugely used.

[1] http://patchwork.ozlabs.org/project/uboot/list/?series=200899
    "dm: add cells_count parameter in live DT APIs of_parse_phandle_with_args"
[2] http://patchwork.ozlabs.org/project/uboot/list/?series=200906&state=*


 board/st/stm32mp1/stm32mp1.c               | 2 +-
 drivers/clk/clk-uclass.c                   | 4 ++--
 drivers/core/of_access.c                   | 7 ++++---
 drivers/core/ofnode.c                      | 6 +++---
 drivers/core/read.c                        | 5 +++--
 drivers/net/designware.c                   | 3 ++-
 drivers/phy/phy-uclass.c                   | 2 +-
 drivers/power/domain/power-domain-uclass.c | 2 +-
 drivers/reset/reset-uclass.c               | 2 +-
 drivers/usb/host/ehci-generic.c            | 4 ++--
 drivers/usb/host/ohci-da8xx.c              | 3 ++-
 drivers/usb/host/ohci-generic.c            | 6 ++++--
 include/dm/of_access.h                     | 4 +++-
 include/dm/ofnode.h                        | 3 ++-
 include/dm/read.h                          | 8 +++++---
 15 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
index 3b677d339b..03a19af930 100644
--- a/board/st/stm32mp1/stm32mp1.c
+++ b/board/st/stm32mp1/stm32mp1.c
@@ -314,7 +314,7 @@ static int board_check_usb_power(void)
 	 * for each of them
 	 */
 	adc_count = ofnode_count_phandle_with_args(node, "st,adc_usb_pd",
-						   "#io-channel-cells");
+						   "#io-channel-cells", 0);
 	if (adc_count < 0) {
 		if (adc_count == -ENOENT)
 			return 0;
diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index 934cd5787a..b1d8f1adaf 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -160,7 +160,7 @@ int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk)
 	
 	bulk->count = 0;
 
-	count = dev_count_phandle_with_args(dev, "clocks", "#clock-cells");
+	count = dev_count_phandle_with_args(dev, "clocks", "#clock-cells", 0);
 	if (count < 1)
 		return count;
 
@@ -195,7 +195,7 @@ static int clk_set_default_parents(struct udevice *dev, int stage)
 	int ret;
 
 	num_parents = dev_count_phandle_with_args(dev, "assigned-clock-parents",
-						  "#clock-cells");
+						  "#clock-cells", 0);
 	if (num_parents < 0) {
 		debug("%s: could not read assigned-clock-parents for %p\n",
 		      __func__, dev);
diff --git a/drivers/core/of_access.c b/drivers/core/of_access.c
index bcf1644d05..0a12e9b26f 100644
--- a/drivers/core/of_access.c
+++ b/drivers/core/of_access.c
@@ -756,10 +756,11 @@ int of_parse_phandle_with_args(const struct device_node *np,
 }
 
 int of_count_phandle_with_args(const struct device_node *np,
-			       const char *list_name, const char *cells_name)
+			       const char *list_name, const char *cells_name,
+			       int cell_count)
 {
-	return __of_parse_phandle_with_args(np, list_name, cells_name, 0,
-					    -1, NULL);
+	return __of_parse_phandle_with_args(np, list_name, cells_name,
+					    cell_count, -1, NULL);
 }
 
 static void of_alias_add(struct alias_prop *ap, struct device_node *np,
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
index 79fcdf5ce2..7d1b89514c 100644
--- a/drivers/core/ofnode.c
+++ b/drivers/core/ofnode.c
@@ -432,15 +432,15 @@ int ofnode_parse_phandle_with_args(ofnode node, const char *list_name,
 }
 
 int ofnode_count_phandle_with_args(ofnode node, const char *list_name,
-				   const char *cells_name)
+				   const char *cells_name, int cell_count)
 {
 	if (ofnode_is_np(node))
 		return of_count_phandle_with_args(ofnode_to_np(node),
-				list_name, cells_name);
+				list_name, cells_name, cell_count);
 	else
 		return fdtdec_parse_phandle_with_args(gd->fdt_blob,
 				ofnode_to_offset(node), list_name, cells_name,
-				0, -1, NULL);
+				cell_count, -1, NULL);
 }
 
 ofnode ofnode_path(const char *path)
diff --git a/drivers/core/read.c b/drivers/core/read.c
index 86f3f88170..076125824c 100644
--- a/drivers/core/read.c
+++ b/drivers/core/read.c
@@ -214,10 +214,11 @@ int dev_read_phandle_with_args(const struct udevice *dev, const char *list_name,
 }
 
 int dev_count_phandle_with_args(const struct udevice *dev,
-				const char *list_name, const char *cells_name)
+				const char *list_name, const char *cells_name,
+				int cell_count)
 {
 	return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
-					      cells_name);
+					      cells_name, cell_count);
 }
 
 int dev_read_addr_cells(const struct udevice *dev)
diff --git a/drivers/net/designware.c b/drivers/net/designware.c
index 1c0e829407..4c19abbaf0 100644
--- a/drivers/net/designware.c
+++ b/drivers/net/designware.c
@@ -688,7 +688,8 @@ int designware_eth_probe(struct udevice *dev)
 	int i, clock_nb;
 
 	priv->clock_count = 0;
-	clock_nb = dev_count_phandle_with_args(dev, "clocks", "#clock-cells");
+	clock_nb = dev_count_phandle_with_args(dev, "clocks", "#clock-cells",
+					       0);
 	if (clock_nb > 0) {
 		priv->clocks = devm_kcalloc(dev, clock_nb, sizeof(struct clk),
 					    GFP_KERNEL);
diff --git a/drivers/phy/phy-uclass.c b/drivers/phy/phy-uclass.c
index db7f39cd0b..8713b8e7b7 100644
--- a/drivers/phy/phy-uclass.c
+++ b/drivers/phy/phy-uclass.c
@@ -179,7 +179,7 @@ int generic_phy_get_bulk(struct udevice *dev, struct phy_bulk *bulk)
 	if (!dev_read_prop(dev, "phys", NULL))
 		return 0;
 
-	count = dev_count_phandle_with_args(dev, "phys", "#phy-cells");
+	count = dev_count_phandle_with_args(dev, "phys", "#phy-cells", 0);
 	if (count < 1)
 		return count;
 
diff --git a/drivers/power/domain/power-domain-uclass.c b/drivers/power/domain/power-domain-uclass.c
index c2c7c3bd50..af829db9da 100644
--- a/drivers/power/domain/power-domain-uclass.c
+++ b/drivers/power/domain/power-domain-uclass.c
@@ -117,7 +117,7 @@ static int dev_power_domain_ctrl(struct udevice *dev, bool on)
 	int i, count, ret = 0;
 
 	count = dev_count_phandle_with_args(dev, "power-domains",
-					    "#power-domain-cells");
+					    "#power-domain-cells", 0);
 	for (i = 0; i < count; i++) {
 		ret = power_domain_get_by_index(dev, &pd, i);
 		if (ret)
diff --git a/drivers/reset/reset-uclass.c b/drivers/reset/reset-uclass.c
index 5e38ce5c06..411ad649ca 100644
--- a/drivers/reset/reset-uclass.c
+++ b/drivers/reset/reset-uclass.c
@@ -106,7 +106,7 @@ int reset_get_bulk(struct udevice *dev, struct reset_ctl_bulk *bulk)
 	
 	bulk->count = 0;
 
-	count = dev_count_phandle_with_args(dev, "resets", "#reset-cells");
+	count = dev_count_phandle_with_args(dev, "resets", "#reset-cells", 0);
 	if (count < 1)
 		return count;
 
diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c
index 304a3437d5..c93a7051a7 100644
--- a/drivers/usb/host/ehci-generic.c
+++ b/drivers/usb/host/ehci-generic.c
@@ -86,7 +86,7 @@ static int ehci_usb_probe(struct udevice *dev)
 	err = 0;
 	priv->clock_count = 0;
 	clock_nb = ofnode_count_phandle_with_args(dev_ofnode(dev), "clocks",
-						  "#clock-cells");
+						  "#clock-cells", 0);
 	if (clock_nb > 0) {
 		priv->clocks = devm_kcalloc(dev, clock_nb, sizeof(struct clk),
 					    GFP_KERNEL);
@@ -116,7 +116,7 @@ static int ehci_usb_probe(struct udevice *dev)
 
 	priv->reset_count = 0;
 	reset_nb = ofnode_count_phandle_with_args(dev_ofnode(dev), "resets",
-						  "#reset-cells");
+						  "#reset-cells", 0);
 	if (reset_nb > 0) {
 		priv->resets = devm_kcalloc(dev, reset_nb,
 					    sizeof(struct reset_ctl),
diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c
index 22e7b565b5..aa1eba262a 100644
--- a/drivers/usb/host/ohci-da8xx.c
+++ b/drivers/usb/host/ohci-da8xx.c
@@ -95,7 +95,8 @@ static int ohci_da8xx_probe(struct udevice *dev)
 
 	err = 0;
 	priv->clock_count = 0;
-	clock_nb = dev_count_phandle_with_args(dev, "clocks", "#clock-cells");
+	clock_nb = dev_count_phandle_with_args(dev, "clocks", "#clock-cells",
+					       0);
 
 	if (clock_nb < 0)
 		return clock_nb;
diff --git a/drivers/usb/host/ohci-generic.c b/drivers/usb/host/ohci-generic.c
index b84bf8ac0f..7a286435c6 100644
--- a/drivers/usb/host/ohci-generic.c
+++ b/drivers/usb/host/ohci-generic.c
@@ -85,7 +85,8 @@ static int ohci_usb_probe(struct udevice *dev)
 
 	err = 0;
 	priv->clock_count = 0;
-	clock_nb = dev_count_phandle_with_args(dev, "clocks", "#clock-cells");
+	clock_nb = dev_count_phandle_with_args(dev, "clocks", "#clock-cells",
+					       0);
 	if (clock_nb > 0) {
 		priv->clocks = devm_kcalloc(dev, clock_nb, sizeof(struct clk),
 					    GFP_KERNEL);
@@ -111,7 +112,8 @@ static int ohci_usb_probe(struct udevice *dev)
 	}
 
 	priv->reset_count = 0;
-	reset_nb = dev_count_phandle_with_args(dev, "resets", "#reset-cells");
+	reset_nb = dev_count_phandle_with_args(dev, "resets", "#reset-cells",
+					       0);
 	if (reset_nb > 0) {
 		priv->resets = devm_kcalloc(dev, reset_nb,
 					    sizeof(struct reset_ctl),
diff --git a/include/dm/of_access.h b/include/dm/of_access.h
index 2fa65c9332..cc382b1671 100644
--- a/include/dm/of_access.h
+++ b/include/dm/of_access.h
@@ -450,6 +450,7 @@ int of_parse_phandle_with_args(const struct device_node *np,
  * @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
+ * @cells_count: Cell count to use if @cells_name is NULL
  * @return number of phandle found, -ENOENT if
  *	@list_name does not exist, -EINVAL if a phandle was not found,
  *	@cells_name could not be found, the arguments were truncated or there
@@ -460,7 +461,8 @@ int of_parse_phandle_with_args(const struct device_node *np,
  *
  */
 int of_count_phandle_with_args(const struct device_node *np,
-			       const char *list_name, const char *cells_name);
+			       const char *list_name, const char *cells_name,
+			       int cells_count);
 
 /**
  * of_alias_scan() - Scan all properties of the 'aliases' node
diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h
index 8df2facf99..1726b6b2f9 100644
--- a/include/dm/ofnode.h
+++ b/include/dm/ofnode.h
@@ -555,12 +555,13 @@ int ofnode_parse_phandle_with_args(ofnode node, const char *list_name,
  * @node:	device tree node containing a list
  * @list_name:	property name that contains a list
  * @cells_name:	property name that specifies phandles' arguments count
+ * @cells_count: Cell count to use if @cells_name is NULL
  * @return number of phandle on success, -ENOENT if @list_name does not
  *      exist, -EINVAL if a phandle was not found, @cells_name could not
  *      be found.
  */
 int ofnode_count_phandle_with_args(ofnode node, const char *list_name,
-				   const char *cells_name);
+				   const char *cells_name, int cell_count);
 
 /**
  * ofnode_path() - find a node by full path
diff --git a/include/dm/read.h b/include/dm/read.h
index 67db94adfc..0585eb1228 100644
--- a/include/dm/read.h
+++ b/include/dm/read.h
@@ -429,12 +429,14 @@ int dev_read_phandle_with_args(const struct udevice *dev, const char *list_name,
  * @dev:	device whose node containing a list
  * @list_name:	property name that contains a list
  * @cells_name:	property name that specifies phandles' arguments count
+ * @cells_count: Cell count to use if @cells_name is NULL
  * @Returns number of phandle found on success, on error returns appropriate
  * errno value.
  */
 
 int dev_count_phandle_with_args(const struct udevice *dev,
-				const char *list_name, const char *cells_name);
+				const char *list_name, const char *cells_name,
+				int cell_count);
 
 /**
  * dev_read_addr_cells() - Get the number of address cells for a device's node
@@ -880,10 +882,10 @@ static inline int dev_read_phandle_with_args(const struct udevice *dev,
 }
 
 static inline int dev_count_phandle_with_args(const struct udevice *dev,
-		const char *list_name, const char *cells_name)
+		const char *list_name, const char *cells_name, int cell_count)
 {
 	return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
-					      cells_name);
+					      cells_name, cell_count);
 }
 
 static inline int dev_read_addr_cells(const struct udevice *dev)
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle
  2020-09-25  7:41 [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args Patrick Delaunay
@ 2020-09-25  7:41 ` Patrick Delaunay
  2020-10-05  1:42   ` Simon Glass
  2020-10-05 21:32   ` Simon Glass
  2020-09-25  7:41 ` [PATCH 3/3] test: dm: add test for phandle access functions Patrick Delaunay
  2020-10-05  1:42 ` [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args Simon Glass
  2 siblings, 2 replies; 8+ messages in thread
From: Patrick Delaunay @ 2020-09-25  7:41 UTC (permalink / raw)
  To: u-boot

The result of fdt_node_offset_by_phandle is negative for error,
so this patch corrects the check of this result in
fdtdec_parse_phandle_with_args.

This patch allows to have the same behavior with or without OF_LIVE
for the function dev_read_phandle_with_args with cell_name = NULL and
with invalid phandle.

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---

 lib/fdtdec.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index d3b22ec323..90d7e50646 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -746,7 +746,7 @@ int fdtdec_parse_phandle_with_args(const void *blob, int src_node,
 			if (cells_name || cur_index == index) {
 				node = fdt_node_offset_by_phandle(blob,
 								  phandle);
-				if (!node) {
+				if (node < 0) {
 					debug("%s: could not find phandle\n",
 					      fdt_get_name(blob, src_node,
 							   NULL));
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] test: dm: add test for phandle access functions
  2020-09-25  7:41 [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args Patrick Delaunay
  2020-09-25  7:41 ` [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle Patrick Delaunay
@ 2020-09-25  7:41 ` Patrick Delaunay
  2020-10-05  1:42   ` Simon Glass
  2020-10-05 21:32   ` Simon Glass
  2020-10-05  1:42 ` [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args Simon Glass
  2 siblings, 2 replies; 8+ messages in thread
From: Patrick Delaunay @ 2020-09-25  7:41 UTC (permalink / raw)
  To: u-boot

Add unitary test for phandle access functions
- ofnode_count_phandle_with_args
- ofnode_parse_phandle_with_args
- dev_count_phandle_with_args
- dev_read_phandle_with_args

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
---

 arch/sandbox/dts/test.dts |  1 +
 test/dm/ofnode.c          | 75 +++++++++++++++++++++++++++++++++++++++
 test/dm/test-fdt.c        | 65 +++++++++++++++++++++++++++++++++
 3 files changed, 141 insertions(+)

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 9f45c48e4e..25d4b2e598 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -128,6 +128,7 @@
 		str-value = "test string";
 		interrupts-extended = <&irq 3 0>;
 		acpi,name = "GHIJ";
+		phandle-value = <&gpio_c 10>, <0xFFFFFFFF 20>, <&gpio_a 30>;
 	};
 
 	junk {
diff --git a/test/dm/ofnode.c b/test/dm/ofnode.c
index 8bfb706602..84c49c4f18 100644
--- a/test/dm/ofnode.c
+++ b/test/dm/ofnode.c
@@ -87,6 +87,81 @@ static int dm_test_ofnode_read(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_ofnode_read, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 
+static int dm_test_ofnode_phandle(struct unit_test_state *uts)
+{
+	struct ofnode_phandle_args args;
+	ofnode node;
+	int ret;
+	const char prop[] = "test-gpios";
+	const char cell[] = "#gpio-cells";
+	const char prop2[] = "phandle-value";
+
+	node = ofnode_path("/a-test");
+	ut_assert(ofnode_valid(node));
+
+	/* Test ofnode_count_phandle_with_args with cell name */
+	ret = ofnode_count_phandle_with_args(node, "missing", cell, 0);
+	ut_asserteq(-ENOENT, ret);
+	ret = ofnode_count_phandle_with_args(node, prop, "#invalid", 0);
+	ut_asserteq(-EINVAL, ret);
+	ret = ofnode_count_phandle_with_args(node, prop, cell, 0);
+	ut_asserteq(5, ret);
+
+	/* Test ofnode_parse_phandle_with_args with cell name */
+	ret = ofnode_parse_phandle_with_args(node, "missing", cell, 0, 0,
+					     &args);
+	ut_asserteq(-ENOENT, ret);
+	ret = ofnode_parse_phandle_with_args(node, prop, "#invalid", 0, 0,
+					     &args);
+	ut_asserteq(-EINVAL, ret);
+	ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 0, &args);
+	ut_assertok(ret);
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(1, args.args[0]);
+	ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 1, &args);
+	ut_assertok(ret);
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(4, args.args[0]);
+	ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 2, &args);
+	ut_assertok(ret);
+	ut_asserteq(5, args.args_count);
+	ut_asserteq(5, args.args[0]);
+	ut_asserteq(1, args.args[4]);
+	ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 3, &args);
+	ut_asserteq(-ENOENT, ret);
+	ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 4, &args);
+	ut_assertok(ret);
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(12, args.args[0]);
+	ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 5, &args);
+	ut_asserteq(-ENOENT, ret);
+
+	/* Test ofnode_count_phandle_with_args with cell count */
+	ret = ofnode_count_phandle_with_args(node, "missing", NULL, 2);
+	ut_asserteq(-ENOENT, ret);
+	ret = ofnode_count_phandle_with_args(node, prop2, NULL, 1);
+	ut_asserteq(3, ret);
+
+	/* Test ofnode_parse_phandle_with_args with cell count */
+	ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 0, &args);
+	ut_assertok(ret);
+	ut_asserteq(1, ofnode_valid(args.node));
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(10, args.args[0]);
+	ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 1, &args);
+	ut_asserteq(-EINVAL, ret);
+	ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 2, &args);
+	ut_assertok(ret);
+	ut_asserteq(1, ofnode_valid(args.node));
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(30, args.args[0]);
+	ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 3, &args);
+	ut_asserteq(-ENOENT, ret);
+
+	return 0;
+}
+DM_TEST(dm_test_ofnode_phandle, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
 static int dm_test_ofnode_read_chosen(struct unit_test_state *uts)
 {
 	const char *str;
diff --git a/test/dm/test-fdt.c b/test/dm/test-fdt.c
index 04802deb7f..862b7ce8b1 100644
--- a/test/dm/test-fdt.c
+++ b/test/dm/test-fdt.c
@@ -968,6 +968,71 @@ static int dm_test_read_int_index(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_read_int_index, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 
+static int dm_test_read_phandle(struct unit_test_state *uts)
+{
+	struct udevice *dev;
+	struct ofnode_phandle_args args;
+	int ret;
+	const char prop[] = "test-gpios";
+	const char cell[] = "#gpio-cells";
+	const char prop2[] = "phandle-value";
+
+	ut_assertok(uclass_first_device_err(UCLASS_TEST_FDT, &dev));
+	ut_asserteq_str("a-test", dev->name);
+
+	/* Test dev_count_phandle_with_args with cell name */
+	ret = dev_count_phandle_with_args(dev, "missing", cell, 0);
+	ut_asserteq(-ENOENT, ret);
+	ret = dev_count_phandle_with_args(dev, prop, "#invalid", 0);
+	ut_asserteq(-EINVAL, ret);
+	ut_asserteq(5, dev_count_phandle_with_args(dev, prop, cell, 0));
+
+	/* Test dev_read_phandle_with_args with cell name */
+	ret = dev_read_phandle_with_args(dev, "missing", cell, 0, 0, &args);
+	ut_asserteq(-ENOENT, ret);
+	ret = dev_read_phandle_with_args(dev, prop, "#invalid", 0, 0, &args);
+	ut_asserteq(-EINVAL, ret);
+	ut_assertok(dev_read_phandle_with_args(dev, prop, cell, 0, 0, &args));
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(1, args.args[0]);
+	ut_assertok(dev_read_phandle_with_args(dev, prop, cell, 0, 1, &args));
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(4, args.args[0]);
+	ut_assertok(dev_read_phandle_with_args(dev, prop, cell, 0, 2, &args));
+	ut_asserteq(5, args.args_count);
+	ut_asserteq(5, args.args[0]);
+	ut_asserteq(1, args.args[4]);
+	ret = dev_read_phandle_with_args(dev, prop, cell, 0, 3, &args);
+	ut_asserteq(-ENOENT, ret);
+	ut_assertok(dev_read_phandle_with_args(dev, prop, cell, 0, 4, &args));
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(12, args.args[0]);
+	ret = dev_read_phandle_with_args(dev, prop, cell, 0, 5, &args);
+	ut_asserteq(-ENOENT, ret);
+
+	/* Test dev_count_phandle_with_args with cell count */
+	ret = dev_count_phandle_with_args(dev, "missing", NULL, 2);
+	ut_asserteq(-ENOENT, ret);
+	ut_asserteq(3, dev_count_phandle_with_args(dev, prop2, NULL, 1));
+
+	/* Test dev_read_phandle_with_args with cell count */
+	ut_assertok(dev_read_phandle_with_args(dev, prop2, NULL, 1, 0, &args));
+	ut_asserteq(1, ofnode_valid(args.node));
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(10, args.args[0]);
+	ret = dev_read_phandle_with_args(dev, prop2, NULL, 1, 1, &args);
+	ut_asserteq(-EINVAL, ret);
+	ut_assertok(dev_read_phandle_with_args(dev, prop2, NULL, 1, 2, &args));
+	ut_asserteq(1, ofnode_valid(args.node));
+	ut_asserteq(1, args.args_count);
+	ut_asserteq(30, args.args[0]);
+	ret = dev_read_phandle_with_args(dev, prop2, NULL, 1, 3, &args);
+	ut_asserteq(-ENOENT, ret);
+
+	return 0;
+}
+DM_TEST(dm_test_read_phandle, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
 /* Test iteration through devices by drvdata */
 static int dm_test_uclass_drvdata(struct unit_test_state *uts)
 {
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args
  2020-09-25  7:41 [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args Patrick Delaunay
  2020-09-25  7:41 ` [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle Patrick Delaunay
  2020-09-25  7:41 ` [PATCH 3/3] test: dm: add test for phandle access functions Patrick Delaunay
@ 2020-10-05  1:42 ` Simon Glass
  2 siblings, 0 replies; 8+ messages in thread
From: Simon Glass @ 2020-10-05  1:42 UTC (permalink / raw)
  To: u-boot

On Fri, 25 Sep 2020 at 01:41, Patrick Delaunay <patrick.delaunay@st.com> wrote:
>
> The cell_count argument is required when cells_name is NULL.
>
> This patch adds this parameter in live tree API
> - of_count_phandle_with_args
> - ofnode_count_phandle_with_args
> - dev_count_phandle_with_args
>
> This parameter solves issue when these API is used to count
> the number of element of a cell without cell name. This parameter
> allow to force the size cell.
>
> For example:
>   count = dev_count_phandle_with_args(dev, "array", NULL, 3);
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> ---
> It is linked to previous serie [1] but it is not a blocking point today
> as no user use this API with cells_name = NULL
> + dev_count_phandle_with_args
> + ofnode_count_phandle_with_args
>
> [1/3] was Previously sent in RFC [2] + missing impacts in:
>   drivers/net/designware.c
>   drivers/power/domain/power-domain-uclass.c
>   drivers/usb/host/ohci-da8xx.c
>   drivers/usb/host/ohci-generic.c
>
> I also add test in [3/3] for modified API.
>
> But I think it is the good time to modify these functions as they are not
> hugely used.
>
> [1] http://patchwork.ozlabs.org/project/uboot/list/?series=200899
>     "dm: add cells_count parameter in live DT APIs of_parse_phandle_with_args"
> [2] http://patchwork.ozlabs.org/project/uboot/list/?series=200906&state=*
>
>
>  board/st/stm32mp1/stm32mp1.c               | 2 +-
>  drivers/clk/clk-uclass.c                   | 4 ++--
>  drivers/core/of_access.c                   | 7 ++++---
>  drivers/core/ofnode.c                      | 6 +++---
>  drivers/core/read.c                        | 5 +++--
>  drivers/net/designware.c                   | 3 ++-
>  drivers/phy/phy-uclass.c                   | 2 +-
>  drivers/power/domain/power-domain-uclass.c | 2 +-
>  drivers/reset/reset-uclass.c               | 2 +-
>  drivers/usb/host/ehci-generic.c            | 4 ++--
>  drivers/usb/host/ohci-da8xx.c              | 3 ++-
>  drivers/usb/host/ohci-generic.c            | 6 ++++--
>  include/dm/of_access.h                     | 4 +++-
>  include/dm/ofnode.h                        | 3 ++-
>  include/dm/read.h                          | 8 +++++---
>  15 files changed, 36 insertions(+), 25 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle
  2020-09-25  7:41 ` [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle Patrick Delaunay
@ 2020-10-05  1:42   ` Simon Glass
  2020-10-05 21:32   ` Simon Glass
  1 sibling, 0 replies; 8+ messages in thread
From: Simon Glass @ 2020-10-05  1:42 UTC (permalink / raw)
  To: u-boot

On Fri, 25 Sep 2020 at 01:41, Patrick Delaunay <patrick.delaunay@st.com> wrote:
>
> The result of fdt_node_offset_by_phandle is negative for error,
> so this patch corrects the check of this result in
> fdtdec_parse_phandle_with_args.
>
> This patch allows to have the same behavior with or without OF_LIVE
> for the function dev_read_phandle_with_args with cell_name = NULL and
> with invalid phandle.
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> ---
>
>  lib/fdtdec.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 3/3] test: dm: add test for phandle access functions
  2020-09-25  7:41 ` [PATCH 3/3] test: dm: add test for phandle access functions Patrick Delaunay
@ 2020-10-05  1:42   ` Simon Glass
  2020-10-05 21:32   ` Simon Glass
  1 sibling, 0 replies; 8+ messages in thread
From: Simon Glass @ 2020-10-05  1:42 UTC (permalink / raw)
  To: u-boot

On Fri, 25 Sep 2020 at 01:41, Patrick Delaunay <patrick.delaunay@st.com> wrote:
>
> Add unitary test for phandle access functions
> - ofnode_count_phandle_with_args
> - ofnode_parse_phandle_with_args
> - dev_count_phandle_with_args
> - dev_read_phandle_with_args
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> ---
>
>  arch/sandbox/dts/test.dts |  1 +
>  test/dm/ofnode.c          | 75 +++++++++++++++++++++++++++++++++++++++
>  test/dm/test-fdt.c        | 65 +++++++++++++++++++++++++++++++++
>  3 files changed, 141 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 3/3] test: dm: add test for phandle access functions
  2020-09-25  7:41 ` [PATCH 3/3] test: dm: add test for phandle access functions Patrick Delaunay
  2020-10-05  1:42   ` Simon Glass
@ 2020-10-05 21:32   ` Simon Glass
  1 sibling, 0 replies; 8+ messages in thread
From: Simon Glass @ 2020-10-05 21:32 UTC (permalink / raw)
  To: u-boot

On Fri, 25 Sep 2020 at 01:41, Patrick Delaunay <patrick.delaunay@st.com> wrote:
>
> Add unitary test for phandle access functions
> - ofnode_count_phandle_with_args
> - ofnode_parse_phandle_with_args
> - dev_count_phandle_with_args
> - dev_read_phandle_with_args
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> ---
>
>  arch/sandbox/dts/test.dts |  1 +
>  test/dm/ofnode.c          | 75 +++++++++++++++++++++++++++++++++++++++
>  test/dm/test-fdt.c        | 65 +++++++++++++++++++++++++++++++++
>  3 files changed, 141 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot-dm/next, thanks!

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle
  2020-09-25  7:41 ` [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle Patrick Delaunay
  2020-10-05  1:42   ` Simon Glass
@ 2020-10-05 21:32   ` Simon Glass
  1 sibling, 0 replies; 8+ messages in thread
From: Simon Glass @ 2020-10-05 21:32 UTC (permalink / raw)
  To: u-boot

On Fri, 25 Sep 2020 at 01:41, Patrick Delaunay <patrick.delaunay@st.com> wrote:
>
> The result of fdt_node_offset_by_phandle is negative for error,
> so this patch corrects the check of this result in
> fdtdec_parse_phandle_with_args.
>
> This patch allows to have the same behavior with or without OF_LIVE
> for the function dev_read_phandle_with_args with cell_name = NULL and
> with invalid phandle.
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
> ---
>
>  lib/fdtdec.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot-dm/next, thanks!

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-10-05 21:32 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-25  7:41 [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args Patrick Delaunay
2020-09-25  7:41 ` [PATCH 2/3] fdtdec: correct test on return of fdt_node_offset_by_phandle Patrick Delaunay
2020-10-05  1:42   ` Simon Glass
2020-10-05 21:32   ` Simon Glass
2020-09-25  7:41 ` [PATCH 3/3] test: dm: add test for phandle access functions Patrick Delaunay
2020-10-05  1:42   ` Simon Glass
2020-10-05 21:32   ` Simon Glass
2020-10-05  1:42 ` [PATCH 1/3] dm: add cells_count parameter in *_count_phandle_with_args Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.