* [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps
@ 2026-10-20 13:00 Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 1/8] of: base: Fix stack overflow in of_parse_phandle_with_args_map() Ernest Van Hoecke
` (7 more replies)
0 siblings, 8 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke, Uwe Kleine-König, stable,
Bartosz Golaszewski
This series fixes an fw_devlink supplier-resolution problem reported by
Leonardo Costa while using a Devicetree nexus to describe GPIO and PWM
resources routed through an LVDS connector. Consumers referencing the
nexus could remain deferred because fw_devlink linked them to the nexus
rather than to the providers selected by gpio-map and pwm-map. [1]
GPIO, PWM and clock consumer APIs use of_parse_phandle_with_args_map()
to resolve specifiers through gpio-map, pwm-map and clock-map
properties. The corresponding fw_devlink parsers use direct phandle
parsing instead. Given a consumer which references a nexus, the consumer
API and fw_devlink therefore resolve the reference to different nodes:
consumer API: consumer -> nexus -> mapped provider
fw_devlink: consumer -> nexus
A nexus is a translation node rather than the resource provider and need
not have a driver. The link to it can consequently remain unresolved and
defer the consumer even though the mapped provider is available.
Make the fw_devlink GPIO, PWM and clock parsers use the same map-aware
resolver as their consumer APIs. The resolver also handles valid direct
references by returning the original provider when no map is present.
Use dedicated exact-name and suffix declaration macros to opt these
bindings into map-aware parsing without changing unrelated property
parsers. Retain GPIO's existing exclusions and compatibility handling.
Since fw_devlink runs the resolver for every consumer when its device is
created, patch 1 first fixes a stack buffer overflow in the resolver
when the provider referenced by the consumer has more than
MAX_PHANDLE_ARGS cells.
The regression tests call the OF add_links operation and verify that a
mapped reference creates exactly one link to the provider selected by
the referenced map entry, not to the nexus. They also cover valid direct
references. The GPIO tests exercise all property spellings recognized by
fw_devlink, including the deprecated singular and unprefixed forms.
The clock patch fixes aacc54c67869 ("clk: Add support for clock nexus dt
bindings"), which has been in clk-next and linux-next with the same hash
since next-20260907. There is no build-time dependency on it, but the
clock patch should not reach mainline before it. The series applies to
next-20261014.
Tested with:
- The CONFIG_OF_UNITTEST cases under QEMU/x86_64: all passed. With the
fw_devlink parser changes reverted, exactly the six mapped consumer
cases fail.
- W=1 builds of each patch on arm64, including the OF unittest data
- Toradex Verdin iMX8M Plus hardware using a connector nexus for the
display GPIO and PWM resources (v2, same fw_devlink changes): the
display probes successfully
[1] https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
Changes in v3:
- New patch 1 fixing a stack overflow in
of_parse_phandle_with_args_map() (Uwe)
- Tests: route map entries to different providers and reference a
non-first entry with non-zero cells (Herve)
- Collected R-b tags
- Rebased onto next-20261014
- Link to v2: https://lore.kernel.org/r/20260910-fw-devlink-nexus-ready-v2-0-17ac82dbe226@toradex.com
Changes in v2:
- Split the unit tests into per-resource follow-up commits
- Added clock nexus as well because the clock nexus series was merged:
https://lore.kernel.org/all/20260807-schneider-v7-2-rc1-eip201-upstream-v5-0-8785f9531cf0@bootlin.com/
- Link to v1: https://lore.kernel.org/r/20260902-fw-devlink-nexus-ready-v1-0-68fe1996e78a@toradex.com
---
Ernest Van Hoecke (8):
of: base: Fix stack overflow in of_parse_phandle_with_args_map()
of: property: fw_devlink: Follow GPIO nexus maps
of: property: fw_devlink: Report unsupported supplier linking
of: unittest: Test fw_devlink with GPIO nexus maps
of: property: fw_devlink: Follow PWM nexus maps
of: unittest: Test fw_devlink with PWM nexus maps
of: property: fw_devlink: Follow clock nexus maps
of: unittest: Test fw_devlink with clock nexus maps
drivers/of/base.c | 5 ++
drivers/of/property.c | 53 ++++++++++++++-----
drivers/of/unittest-data/tests-phandle.dtsi | 81 +++++++++++++++++++++++++++++
drivers/of/unittest.c | 79 ++++++++++++++++++++++++++++
4 files changed, 205 insertions(+), 13 deletions(-)
---
base-commit: d419d682257d813f6cb7a28e42b35d0edf4ad038
change-id: 20260901-fw-devlink-nexus-ready-c859706b019d
Best regards,
--
Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 1/8] of: base: Fix stack overflow in of_parse_phandle_with_args_map()
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 13:58 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 2/8] of: property: fw_devlink: Follow GPIO nexus maps Ernest Van Hoecke
` (6 subsequent siblings)
7 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke, Uwe Kleine-König, stable
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
of_parse_phandle_with_args_map() reads the #<stem>-cells property of the
provider referenced by the consumer into list_size. It then copies that
many cells of the consumer's specifier from out_args->args[] into the
on-stack initial_match_array[]. Both arrays hold MAX_PHANDLE_ARGS cells,
but list_size is never checked against that limit. A malformed
Devicetree with a larger cell count therefore makes the copy read past
out_args->args[] and write past initial_match_array[].
The cell count of each provider selected by a <stem>-map entry is
already rejected when it exceeds MAX_PHANDLE_ARGS. Apply the same limit
to the provider referenced by the consumer.
A plain reference to such a provider, without a map, now also fails.
Previously it succeeded with the specifier truncated to MAX_PHANDLE_ARGS
cells by __of_parse_phandle_with_args().
Fixes: bd6f2fd5a1d5 ("of: Support parsing phandle argument lists through a nexus node")
Suggested-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/all/aq1CSswlo57jZpMH@monoceros/
Cc: stable@vger.kernel.org
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
v3: New patch (Uwe)
---
drivers/of/base.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/of/base.c b/drivers/of/base.c
index f63a9486b130..5abadab22392 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -1587,6 +1587,11 @@ int of_parse_phandle_with_args_map(const struct device_node *np,
if (ret < 0)
goto put;
+ if (list_size > MAX_PHANDLE_ARGS) {
+ ret = -EINVAL;
+ goto put;
+ }
+
/* Precalculate the match array - this simplifies match loop */
for (i = 0; i < list_size; i++)
initial_match_array[i] = cpu_to_be32(out_args->args[i]);
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 2/8] of: property: fw_devlink: Follow GPIO nexus maps
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 1/8] of: base: Fix stack overflow in of_parse_phandle_with_args_map() Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 3/8] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
` (5 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke, stable, Bartosz Golaszewski
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
GPIO consumers use of_parse_phandle_with_args_map() to resolve
specifiers through gpio-map properties. fw_devlink instead parses GPIO
properties as direct phandle references, so it records the nexus node as
the supplier rather than the mapped GPIO provider.
A nexus is a translation node, not the GPIO provider, and need not be
populated as a device. The resulting fwnode link can therefore remain
unresolved and indefinitely defer the consumer while
device_links_check_suppliers() waits for the nexus.
Use the map-aware parser for all supported GPIO property spellings. This
makes fw_devlink resolve the same provider as the GPIO consumer API.
Direct GPIO references continue to work because the map-aware parser
returns the original provider when no gpio-map property is present.
Fixes: 7f00be96f125 ("of: property: Add device link support for interrupt-parent, dmas and -gpio(s)")
Reported-by: Leonardo Costa <leonardo.costa@toradex.com>
Link: https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
Tested-by: Leonardo Costa <leonardo.costa@toradex.com>
Cc: stable@vger.kernel.org
Reviewed-by: Linus Walleij <linusw@kernel.org>
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/property.c | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 45e55f618488..aa65976739e1 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1311,6 +1311,19 @@ static struct device_node *parse_prop_cells(struct device_node *np,
return sup_args.np;
}
+static struct device_node *parse_nexus_prop(struct device_node *np,
+ const char *prop_name, int index,
+ const char *stem_name)
+{
+ struct of_phandle_args sup_args;
+
+ if (of_parse_phandle_with_args_map(np, prop_name, stem_name, index,
+ &sup_args))
+ return NULL;
+
+ return sup_args.np;
+}
+
#define DEFINE_SIMPLE_PROP(fname, name, cells) \
static struct device_node *parse_##fname(struct device_node *np, \
const char *prop_name, int index) \
@@ -1361,6 +1374,15 @@ static struct device_node *parse_##fname(struct device_node *np, \
return parse_suffix_prop_cells(np, prop_name, index, suffix, cells); \
}
+#define DEFINE_SUFFIX_NEXUS_PROP(fname, suffix, stem) \
+static struct device_node *parse_##fname(struct device_node *np, \
+ const char *prop_name, int index) \
+{ \
+ if (!strends(prop_name, suffix)) \
+ return NULL; \
+ return parse_nexus_prop(np, prop_name, index, stem); \
+}
+
/**
* struct supplier_bindings - Property parsing functions for suppliers
*
@@ -1416,7 +1438,7 @@ DEFINE_SIMPLE_PROP(pses, "pses", "#pse-cells")
DEFINE_SIMPLE_PROP(power_supplies, "power-supplies", NULL)
DEFINE_SIMPLE_PROP(mmc_pwrseq, "mmc-pwrseq", NULL)
DEFINE_SUFFIX_PROP(regulators, "-supply", NULL)
-DEFINE_SUFFIX_PROP(gpio, "-gpio", "#gpio-cells")
+DEFINE_SUFFIX_NEXUS_PROP(gpio, "-gpio", "gpio")
static struct device_node *parse_pinctrl_n(struct device_node *np,
const char *prop_name, int index)
@@ -1436,8 +1458,10 @@ static struct device_node *parse_gpios(struct device_node *np,
if (strends(prop_name, ",nr-gpios"))
return NULL;
- return parse_suffix_prop_cells(np, prop_name, index, "-gpios",
- "#gpio-cells");
+ if (!strends(prop_name, "-gpios"))
+ return NULL;
+
+ return parse_nexus_prop(np, prop_name, index, "gpio");
}
static struct device_node *parse_iommu_maps(struct device_node *np,
@@ -1452,8 +1476,6 @@ static struct device_node *parse_iommu_maps(struct device_node *np,
static struct device_node *parse_gpio_compat(struct device_node *np,
const char *prop_name, int index)
{
- struct of_phandle_args sup_args;
-
if (strcmp(prop_name, "gpio") && strcmp(prop_name, "gpios"))
return NULL;
@@ -1464,11 +1486,7 @@ static struct device_node *parse_gpio_compat(struct device_node *np,
if (of_property_read_bool(np, "gpio-hog"))
return NULL;
- if (of_parse_phandle_with_args(np, prop_name, "#gpio-cells", index,
- &sup_args))
- return NULL;
-
- return sup_args.np;
+ return parse_nexus_prop(np, prop_name, index, "gpio");
}
static struct device_node *parse_i2c_parent(struct device_node *np,
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 3/8] of: property: fw_devlink: Report unsupported supplier linking
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 1/8] of: base: Fix stack overflow in of_parse_phandle_with_args_map() Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 2/8] of: property: fw_devlink: Follow GPIO nexus maps Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
` (4 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
OF supplier linking is deliberately disabled on OLPC and Intel CE4100
systems. The add_links operation currently returns zero on these systems,
so callers cannot distinguish unsupported linking from success.
Return -EOPNOTSUPP when supplier linking is unsupported. This allows OF
unit tests to skip link assertions on these systems without exposing the
private platform-support predicate.
The driver core ignores the add_links return value and marks the fwnode
as processed regardless, so its link creation and retry behavior remain
unchanged.
Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/property.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index aa65976739e1..99381c07848d 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1708,7 +1708,7 @@ static int of_fwnode_add_links(struct fwnode_handle *fwnode)
struct device_node *con_np = to_of_node(fwnode);
if (!of_is_fwnode_add_links_supported())
- return 0;
+ return -EOPNOTSUPP;
if (!con_np)
return -EINVAL;
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (2 preceding siblings ...)
2026-10-20 13:00 ` [PATCH v3 3/8] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 14:05 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 5/8] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
` (3 subsequent siblings)
7 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke, Bartosz Golaszewski
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Add OF unit tests that call the fw_devlink add_links operation for GPIOs
routed through nexus maps. Verify that each mapped consumer has exactly
one link to the final GPIO provider rather than to the nexus.
Also cover direct references and all GPIO property spellings recognized
by fw_devlink, including the deprecated singular and unprefixed forms.
The gpio-map routes its entries to different providers so that selecting
the wrong entry is caught as well.
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
v3: Route gpio-map entries to two providers, use a middle entry (Herve)
v2: https://lore.kernel.org/r/20260910-fw-devlink-nexus-ready-v2-3-17ac82dbe226@toradex.com
---
drivers/of/unittest-data/tests-phandle.dtsi | 39 +++++++++++++++
drivers/of/unittest.c | 75 +++++++++++++++++++++++++++++
2 files changed, 114 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index 554a996b2ef1..f5d7ee072c90 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -79,6 +79,45 @@ consumer-b {
phandle-list-bad-args = <&provider2 1 0>,
<&provider4 0>;
};
+
+ fw-devlink-tests {
+ gpio_provider_a: gpio-controller-a {
+ #gpio-cells = <2>;
+ };
+
+ gpio_provider_b: gpio-controller-b {
+ #gpio-cells = <2>;
+ };
+
+ fwdevlink_nexus: nexus {
+ #gpio-cells = <2>;
+ gpio-map = <1 0 &gpio_provider_a 3 0>,
+ <2 0 &gpio_provider_b 5 0>,
+ <3 0 &gpio_provider_a 7 0>;
+ gpio-map-mask = <0xffffffff 0>;
+ gpio-map-pass-thru = <0 0xffffffff>;
+ };
+
+ gpio-compat-consumer {
+ gpios = <&fwdevlink_nexus 2 1>;
+ };
+
+ gpio-compat-singular-consumer {
+ gpio = <&fwdevlink_nexus 2 1>;
+ };
+
+ gpio-consumer {
+ test-gpios = <&fwdevlink_nexus 2 1>;
+ };
+
+ gpio-direct-consumer {
+ test-gpios = <&gpio_provider_a 1 0>;
+ };
+
+ gpio-singular-consumer {
+ test-gpio = <&fwdevlink_nexus 2 1>;
+ };
+ };
};
};
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index e255f54f4d76..f15c110dbf4d 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -10,6 +10,7 @@
#include <linux/dma-direct.h> /* to test phys_to_dma/dma_to_phys */
#include <linux/err.h>
#include <linux/errno.h>
+#include <linux/fwnode.h>
#include <linux/hashtable.h>
#include <linux/libfdt.h>
#include <linux/of.h>
@@ -710,6 +711,79 @@ static void __init of_unittest_parse_phandle_with_args_map(void)
}
}
+static void __init of_unittest_fw_devlink_supplier(struct device_node *tests,
+ const char *consumer_name,
+ const char *supplier_name)
+{
+ struct device_node *consumer, *supplier;
+ struct fwnode_handle *consumer_fwnode;
+ struct fwnode_link *link;
+ unsigned int link_count = 0;
+ bool found = false;
+ int rc;
+
+ consumer = of_get_child_by_name(tests, consumer_name);
+ supplier = of_get_child_by_name(tests, supplier_name);
+ if (unittest(consumer && supplier, "missing consumer %s or supplier %s\n",
+ consumer_name, supplier_name))
+ goto put_nodes;
+
+ consumer_fwnode = of_fwnode_handle(consumer);
+ fwnode_links_purge(consumer_fwnode);
+ rc = fwnode_call_int_op(consumer_fwnode, add_links);
+ if (rc == -EOPNOTSUPP) {
+ pr_info_once("fw_devlink tests skipped: OF supplier links are not supported\n");
+ goto purge_links;
+ }
+ if (unittest(!rc, "failed to add links for %pOF: %d\n", consumer, rc))
+ goto purge_links;
+
+ /*
+ * The suppliers list should normally be accessed with fwnode_link_lock
+ * held, but that lock is private to the driver core. These test nodes
+ * are isolated and have no concurrent link updates.
+ */
+ list_for_each_entry(link, &consumer_fwnode->suppliers, c_hook) {
+ link_count++;
+ if (link->supplier == of_fwnode_handle(supplier))
+ found = true;
+ }
+
+ unittest(link_count == 1, "%pOF has %u suppliers, expected 1\n", consumer, link_count);
+ unittest(found, "%pOF is not linked to supplier %pOF\n", consumer, supplier);
+
+purge_links:
+ fwnode_links_purge(consumer_fwnode);
+put_nodes:
+ of_node_put(consumer);
+ of_node_put(supplier);
+}
+
+static void __init of_unittest_fw_devlink(void)
+{
+ static const struct {
+ const char *consumer;
+ const char *supplier;
+ } cases[] = {
+ { "gpio-compat-consumer", "gpio-controller-b" },
+ { "gpio-compat-singular-consumer", "gpio-controller-b" },
+ { "gpio-consumer", "gpio-controller-b" },
+ { "gpio-direct-consumer", "gpio-controller-a" },
+ { "gpio-singular-consumer", "gpio-controller-b" },
+ };
+ struct device_node *tests;
+ int i;
+
+ tests = of_find_node_by_path("/testcase-data/phandle-tests/fw-devlink-tests");
+ if (unittest(tests, "missing fw_devlink test data\n"))
+ return;
+
+ for (i = 0; i < ARRAY_SIZE(cases); i++)
+ of_unittest_fw_devlink_supplier(tests, cases[i].consumer, cases[i].supplier);
+
+ of_node_put(tests);
+}
+
static void __init of_unittest_property_string(void)
{
const char *strings[4];
@@ -4533,6 +4607,7 @@ static int __init of_unittest(void)
of_unittest_dynamic();
of_unittest_parse_phandle_with_args();
of_unittest_parse_phandle_with_args_map();
+ of_unittest_fw_devlink();
of_unittest_printf();
of_unittest_property_string();
of_unittest_property_copy();
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 5/8] of: property: fw_devlink: Follow PWM nexus maps
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (3 preceding siblings ...)
2026-10-20 13:00 ` [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 6/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
` (2 subsequent siblings)
7 siblings, 0 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke, stable
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
PWM consumers use of_parse_phandle_with_args_map() to resolve specifiers
through pwm-map properties. fw_devlink instead parses the pwms property
as a direct phandle reference, so it records the nexus node as the
supplier rather than the mapped PWM provider.
A nexus is a translation node, not the PWM provider, and need not be
populated as a device. The resulting fwnode link can therefore remain
unresolved and indefinitely defer the consumer while
device_links_check_suppliers() waits for the nexus.
Use the map-aware parser for pwms so fw_devlink resolves the same
provider as the PWM consumer API. Direct PWM references continue to work
because the map-aware parser returns the original provider when no
pwm-map property is present.
Fixes: e71e46a6f19c ("pwm: Add support for pwm nexus dt bindings")
Reported-by: Leonardo Costa <leonardo.costa@toradex.com>
Link: https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
Tested-by: Leonardo Costa <leonardo.costa@toradex.com>
Cc: stable@vger.kernel.org
Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/property.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 99381c07848d..53301cdac6a9 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1331,6 +1331,15 @@ static struct device_node *parse_##fname(struct device_node *np, \
return parse_prop_cells(np, prop_name, index, name, cells); \
}
+#define DEFINE_SIMPLE_NEXUS_PROP(fname, name, stem) \
+static struct device_node *parse_##fname(struct device_node *np, \
+ const char *prop_name, int index) \
+{ \
+ if (strcmp(prop_name, name)) \
+ return NULL; \
+ return parse_nexus_prop(np, prop_name, index, stem); \
+}
+
/**
* parse_suffix_prop_cells - Suffix property parsing function for suppliers
*
@@ -1426,7 +1435,7 @@ DEFINE_SIMPLE_PROP(extcon, "extcon", 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(pwms, "pwms", "#pwm-cells")
+DEFINE_SIMPLE_NEXUS_PROP(pwms, "pwms", "pwm")
DEFINE_SIMPLE_PROP(resets, "resets", "#reset-cells")
DEFINE_SIMPLE_PROP(leds, "leds", NULL)
DEFINE_SIMPLE_PROP(backlight, "backlight", NULL)
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 6/8] of: unittest: Test fw_devlink with PWM nexus maps
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (4 preceding siblings ...)
2026-10-20 13:00 ` [PATCH v3 5/8] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 14:11 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 7/8] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 8/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
7 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Extend the fw_devlink OF unit tests with PWM references routed through a
nexus map. Verify that the mapped consumer has exactly one link to the
final PWM provider rather than to the nexus.
Also cover a direct PWM reference to ensure that it continues to resolve
to the original provider when no map is present.
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
v3: Route pwm-map entries to two providers, use a middle entry (Herve)
v2: https://lore.kernel.org/r/20260910-fw-devlink-nexus-ready-v2-5-17ac82dbe226@toradex.com
---
drivers/of/unittest-data/tests-phandle.dtsi | 22 ++++++++++++++++++++++
drivers/of/unittest.c | 2 ++
2 files changed, 24 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index f5d7ee072c90..1fd465bb8f79 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -89,13 +89,27 @@ gpio_provider_b: gpio-controller-b {
#gpio-cells = <2>;
};
+ pwm_provider_a: pwm-controller-a {
+ #pwm-cells = <2>;
+ };
+
+ pwm_provider_b: pwm-controller-b {
+ #pwm-cells = <2>;
+ };
+
fwdevlink_nexus: nexus {
#gpio-cells = <2>;
+ #pwm-cells = <2>;
gpio-map = <1 0 &gpio_provider_a 3 0>,
<2 0 &gpio_provider_b 5 0>,
<3 0 &gpio_provider_a 7 0>;
gpio-map-mask = <0xffffffff 0>;
gpio-map-pass-thru = <0 0xffffffff>;
+ pwm-map = <1 0 &pwm_provider_a 3 0>,
+ <2 0 &pwm_provider_b 5 0>,
+ <3 0 &pwm_provider_a 7 0>;
+ pwm-map-mask = <0xffffffff 0>;
+ pwm-map-pass-thru = <0 0xffffffff>;
};
gpio-compat-consumer {
@@ -117,6 +131,14 @@ gpio-direct-consumer {
gpio-singular-consumer {
test-gpio = <&fwdevlink_nexus 2 1>;
};
+
+ pwm-consumer {
+ pwms = <&fwdevlink_nexus 2 1000>;
+ };
+
+ pwm-direct-consumer {
+ pwms = <&pwm_provider_a 1 0>;
+ };
};
};
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index f15c110dbf4d..320a992c4310 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -770,6 +770,8 @@ static void __init of_unittest_fw_devlink(void)
{ "gpio-consumer", "gpio-controller-b" },
{ "gpio-direct-consumer", "gpio-controller-a" },
{ "gpio-singular-consumer", "gpio-controller-b" },
+ { "pwm-consumer", "pwm-controller-b" },
+ { "pwm-direct-consumer", "pwm-controller-a" },
};
struct device_node *tests;
int i;
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 7/8] of: property: fw_devlink: Follow clock nexus maps
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (5 preceding siblings ...)
2026-10-20 13:00 ` [PATCH v3 6/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 14:23 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 8/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
7 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Clock consumers use of_parse_phandle_with_args_map() to resolve
specifiers through clock-map properties. fw_devlink instead parses the
clocks property as a direct phandle reference, so it records the nexus
node as the supplier rather than the mapped clock provider.
A nexus is a translation node, not the clock provider, and need not be
populated as a device. The resulting fwnode link can therefore remain
unresolved and indefinitely defer the consumer while
device_links_check_suppliers() waits for the nexus.
Use the map-aware parser for clocks so fw_devlink resolves the same
provider as the clock consumer API. Direct clock references continue to
work because the map-aware parser returns the original provider when no
clock-map property is present.
Fixes: aacc54c67869 ("clk: Add support for clock nexus dt bindings")
Link: https://lore.kernel.org/all/20260807-schneider-v7-2-rc1-eip201-upstream-v5-0-8785f9531cf0@bootlin.com/
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
aacc54c67869 ("clk: Add support for clock nexus dt bindings") has been
in clk-next and linux-next with the same hash since next-20260907. There
is no build-time dependency on it, but this patch should not reach
mainline before it.
---
drivers/of/property.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 53301cdac6a9..2388d607136f 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1422,7 +1422,7 @@ struct supplier_bindings {
u8 fwlink_flags;
};
-DEFINE_SIMPLE_PROP(clocks, "clocks", "#clock-cells")
+DEFINE_SIMPLE_NEXUS_PROP(clocks, "clocks", "clock")
DEFINE_SIMPLE_PROP(interconnects, "interconnects", "#interconnect-cells")
DEFINE_SIMPLE_PROP(iommus, "iommus", "#iommu-cells")
DEFINE_SIMPLE_PROP(mboxes, "mboxes", "#mbox-cells")
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 8/8] of: unittest: Test fw_devlink with clock nexus maps
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (6 preceding siblings ...)
2026-10-20 13:00 ` [PATCH v3 7/8] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
@ 2026-10-20 13:00 ` Ernest Van Hoecke
2026-10-20 14:27 ` Herve Codina
7 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-10-20 13:00 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Herve Codina, Greg Kroah-Hartman,
Geert Uytterhoeven, Leonardo Costa, Frieder Schrempf, devicetree,
linux-clk, linux-gpio, linux-pwm, linux-kernel,
Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Extend the fw_devlink OF unit tests with clock references routed through
a nexus map. Verify that the mapped consumer has exactly one link to the
final clock provider rather than to the nexus.
Also cover a direct clock reference to ensure that it continues to
resolve to the original provider when no map is present.
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
v3: Route clock-map entries to two providers, use a middle entry (Herve)
No clock-map-mask: only clock-map applies to clocks (aacc54c67869)
v2: https://lore.kernel.org/r/20260910-fw-devlink-nexus-ready-v2-7-17ac82dbe226@toradex.com
---
drivers/of/unittest-data/tests-phandle.dtsi | 20 ++++++++++++++++++++
drivers/of/unittest.c | 2 ++
2 files changed, 22 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index 1fd465bb8f79..8f86fcee4093 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -81,6 +81,14 @@ consumer-b {
};
fw-devlink-tests {
+ clock_provider_a: clock-controller-a {
+ #clock-cells = <1>;
+ };
+
+ clock_provider_b: clock-controller-b {
+ #clock-cells = <1>;
+ };
+
gpio_provider_a: gpio-controller-a {
#gpio-cells = <2>;
};
@@ -98,8 +106,12 @@ pwm_provider_b: pwm-controller-b {
};
fwdevlink_nexus: nexus {
+ #clock-cells = <1>;
#gpio-cells = <2>;
#pwm-cells = <2>;
+ clock-map = <1 &clock_provider_a 3>,
+ <2 &clock_provider_b 5>,
+ <3 &clock_provider_a 7>;
gpio-map = <1 0 &gpio_provider_a 3 0>,
<2 0 &gpio_provider_b 5 0>,
<3 0 &gpio_provider_a 7 0>;
@@ -112,6 +124,14 @@ fwdevlink_nexus: nexus {
pwm-map-pass-thru = <0 0xffffffff>;
};
+ clock-consumer {
+ clocks = <&fwdevlink_nexus 2>;
+ };
+
+ clock-direct-consumer {
+ clocks = <&clock_provider_a 1>;
+ };
+
gpio-compat-consumer {
gpios = <&fwdevlink_nexus 2 1>;
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 320a992c4310..40d010c55b8f 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -765,6 +765,8 @@ static void __init of_unittest_fw_devlink(void)
const char *consumer;
const char *supplier;
} cases[] = {
+ { "clock-consumer", "clock-controller-b" },
+ { "clock-direct-consumer", "clock-controller-a" },
{ "gpio-compat-consumer", "gpio-controller-b" },
{ "gpio-compat-singular-consumer", "gpio-controller-b" },
{ "gpio-consumer", "gpio-controller-b" },
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 1/8] of: base: Fix stack overflow in of_parse_phandle_with_args_map()
2026-10-20 13:00 ` [PATCH v3 1/8] of: base: Fix stack overflow in of_parse_phandle_with_args_map() Ernest Van Hoecke
@ 2026-10-20 13:58 ` Herve Codina
0 siblings, 0 replies; 14+ messages in thread
From: Herve Codina @ 2026-10-20 13:58 UTC (permalink / raw)
To: Ernest Van Hoecke
Cc: Rob Herring, Saravana Kannan, Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, Frieder Schrempf, devicetree, linux-clk,
linux-gpio, linux-pwm, linux-kernel, Ernest Van Hoecke,
Uwe Kleine-König, stable
Hi Ernest,
On Tue, 20 Oct 2026 15:00:12 +0200
Ernest Van Hoecke <ernestvanhoecke@gmail.com> wrote:
> From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
>
> of_parse_phandle_with_args_map() reads the #<stem>-cells property of the
> provider referenced by the consumer into list_size. It then copies that
> many cells of the consumer's specifier from out_args->args[] into the
> on-stack initial_match_array[]. Both arrays hold MAX_PHANDLE_ARGS cells,
> but list_size is never checked against that limit. A malformed
> Devicetree with a larger cell count therefore makes the copy read past
> out_args->args[] and write past initial_match_array[].
>
> The cell count of each provider selected by a <stem>-map entry is
> already rejected when it exceeds MAX_PHANDLE_ARGS. Apply the same limit
> to the provider referenced by the consumer.
>
> A plain reference to such a provider, without a map, now also fails.
> Previously it succeeded with the specifier truncated to MAX_PHANDLE_ARGS
> cells by __of_parse_phandle_with_args().
>
> Fixes: bd6f2fd5a1d5 ("of: Support parsing phandle argument lists through a nexus node")
> Suggested-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
> Link: https://lore.kernel.org/all/aq1CSswlo57jZpMH@monoceros/
> Cc: stable@vger.kernel.org
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
> v3: New patch (Uwe)
> ---
> drivers/of/base.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index f63a9486b130..5abadab22392 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -1587,6 +1587,11 @@ int of_parse_phandle_with_args_map(const struct device_node *np,
> if (ret < 0)
> goto put;
>
> + if (list_size > MAX_PHANDLE_ARGS) {
> + ret = -EINVAL;
> + goto put;
> + }
> +
I would be stricter here and avoid the usage of MAX_PHANDLE_ARGS.
First I would check the arrays size to be sure that they are consistent and
then check list_size against the array size.
--- 8< ---
BUILD_BUG_ON(ARRAY_SIZE(initial_match_array) != ARRAY_SIZE(out_args->args))
if (list_size > ARRAY_SIZE(initial_match_array)) {
ret = -EINVAL;
goto put;
}
--- 8< ---
IMHO, this is more robust against modification of the 'args' field
definition in struct of_phandle_args or modification of the MAX_PHANDLE_ARGS
value which could lead to some inconsistencies.
Best regards,
Hervé
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps
2026-10-20 13:00 ` [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
@ 2026-10-20 14:05 ` Herve Codina
0 siblings, 0 replies; 14+ messages in thread
From: Herve Codina @ 2026-10-20 14:05 UTC (permalink / raw)
To: Ernest Van Hoecke
Cc: Rob Herring, Saravana Kannan, Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, Frieder Schrempf, devicetree, linux-clk,
linux-gpio, linux-pwm, linux-kernel, Ernest Van Hoecke,
Bartosz Golaszewski
Hi Ernest,
On Tue, 20 Oct 2026 15:00:15 +0200
Ernest Van Hoecke <ernestvanhoecke@gmail.com> wrote:
> From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
>
> Add OF unit tests that call the fw_devlink add_links operation for GPIOs
> routed through nexus maps. Verify that each mapped consumer has exactly
> one link to the final GPIO provider rather than to the nexus.
>
> Also cover direct references and all GPIO property spellings recognized
> by fw_devlink, including the deprecated singular and unprefixed forms.
>
> The gpio-map routes its entries to different providers so that selecting
> the wrong entry is caught as well.
>
> Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
> Reviewed-by: Linus Walleij <linusw@kernel.org>
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
> v3: Route gpio-map entries to two providers, use a middle entry (Herve)
> v2: https://lore.kernel.org/r/20260910-fw-devlink-nexus-ready-v2-3-17ac82dbe226@toradex.com
> ---
> drivers/of/unittest-data/tests-phandle.dtsi | 39 +++++++++++++++
> drivers/of/unittest.c | 75 +++++++++++++++++++++++++++++
> 2 files changed, 114 insertions(+)
>
Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Best regards,
Hervé
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 6/8] of: unittest: Test fw_devlink with PWM nexus maps
2026-10-20 13:00 ` [PATCH v3 6/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
@ 2026-10-20 14:11 ` Herve Codina
0 siblings, 0 replies; 14+ messages in thread
From: Herve Codina @ 2026-10-20 14:11 UTC (permalink / raw)
To: Ernest Van Hoecke
Cc: Rob Herring, Saravana Kannan, Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, Frieder Schrempf, devicetree, linux-clk,
linux-gpio, linux-pwm, linux-kernel, Ernest Van Hoecke
Hi Ernest,
On Tue, 20 Oct 2026 15:00:17 +0200
Ernest Van Hoecke <ernestvanhoecke@gmail.com> wrote:
> From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
>
> Extend the fw_devlink OF unit tests with PWM references routed through a
> nexus map. Verify that the mapped consumer has exactly one link to the
> final PWM provider rather than to the nexus.
>
> Also cover a direct PWM reference to ensure that it continues to resolve
> to the original provider when no map is present.
>
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
> v3: Route pwm-map entries to two providers, use a middle entry (Herve)
> v2: https://lore.kernel.org/r/20260910-fw-devlink-nexus-ready-v2-5-17ac82dbe226@toradex.com
> ---
> drivers/of/unittest-data/tests-phandle.dtsi | 22 ++++++++++++++++++++++
> drivers/of/unittest.c | 2 ++
> 2 files changed, 24 insertions(+)
>
Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Best regards,
Hervé
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 7/8] of: property: fw_devlink: Follow clock nexus maps
2026-10-20 13:00 ` [PATCH v3 7/8] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
@ 2026-10-20 14:23 ` Herve Codina
0 siblings, 0 replies; 14+ messages in thread
From: Herve Codina @ 2026-10-20 14:23 UTC (permalink / raw)
To: Ernest Van Hoecke
Cc: Rob Herring, Saravana Kannan, Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, Frieder Schrempf, devicetree, linux-clk,
linux-gpio, linux-pwm, linux-kernel, Ernest Van Hoecke
Hi Ernest,
On Tue, 20 Oct 2026 15:00:18 +0200
Ernest Van Hoecke <ernestvanhoecke@gmail.com> wrote:
> From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
>
> Clock consumers use of_parse_phandle_with_args_map() to resolve
> specifiers through clock-map properties. fw_devlink instead parses the
> clocks property as a direct phandle reference, so it records the nexus
> node as the supplier rather than the mapped clock provider.
>
> A nexus is a translation node, not the clock provider, and need not be
> populated as a device. The resulting fwnode link can therefore remain
> unresolved and indefinitely defer the consumer while
> device_links_check_suppliers() waits for the nexus.
>
> Use the map-aware parser for clocks so fw_devlink resolves the same
> provider as the clock consumer API. Direct clock references continue to
> work because the map-aware parser returns the original provider when no
> clock-map property is present.
>
> Fixes: aacc54c67869 ("clk: Add support for clock nexus dt bindings")
> Link: https://lore.kernel.org/all/20260807-schneider-v7-2-rc1-eip201-upstream-v5-0-8785f9531cf0@bootlin.com/
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
> aacc54c67869 ("clk: Add support for clock nexus dt bindings") has been
> in clk-next and linux-next with the same hash since next-20260907. There
> is no build-time dependency on it, but this patch should not reach
> mainline before it.
> ---
> drivers/of/property.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/of/property.c b/drivers/of/property.c
> index 53301cdac6a9..2388d607136f 100644
> --- a/drivers/of/property.c
> +++ b/drivers/of/property.c
> @@ -1422,7 +1422,7 @@ struct supplier_bindings {
> u8 fwlink_flags;
> };
>
> -DEFINE_SIMPLE_PROP(clocks, "clocks", "#clock-cells")
> +DEFINE_SIMPLE_NEXUS_PROP(clocks, "clocks", "clock")
> DEFINE_SIMPLE_PROP(interconnects, "interconnects", "#interconnect-cells")
> DEFINE_SIMPLE_PROP(iommus, "iommus", "#iommu-cells")
> DEFINE_SIMPLE_PROP(mboxes, "mboxes", "#mbox-cells")
>
Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Best regards,
Hervé
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 8/8] of: unittest: Test fw_devlink with clock nexus maps
2026-10-20 13:00 ` [PATCH v3 8/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
@ 2026-10-20 14:27 ` Herve Codina
0 siblings, 0 replies; 14+ messages in thread
From: Herve Codina @ 2026-10-20 14:27 UTC (permalink / raw)
To: Ernest Van Hoecke
Cc: Rob Herring, Saravana Kannan, Miquel Raynal (Schneider Electric),
Frank Li, Kieran Bingham, Pengutronix Kernel Team, Stephen Boyd,
Brian Masney, Linus Walleij, Bartosz Golaszewski,
Uwe Kleine-König, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, Frieder Schrempf, devicetree, linux-clk,
linux-gpio, linux-pwm, linux-kernel, Ernest Van Hoecke
Hi Ernest,
On Tue, 20 Oct 2026 15:00:19 +0200
Ernest Van Hoecke <ernestvanhoecke@gmail.com> wrote:
> From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
>
> Extend the fw_devlink OF unit tests with clock references routed through
> a nexus map. Verify that the mapped consumer has exactly one link to the
> final clock provider rather than to the nexus.
>
> Also cover a direct clock reference to ensure that it continues to
> resolve to the original provider when no map is present.
>
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
> v3: Route clock-map entries to two providers, use a middle entry (Herve)
> No clock-map-mask: only clock-map applies to clocks (aacc54c67869)
> v2: https://lore.kernel.org/r/20260910-fw-devlink-nexus-ready-v2-7-17ac82dbe226@toradex.com
> ---
> drivers/of/unittest-data/tests-phandle.dtsi | 20 ++++++++++++++++++++
> drivers/of/unittest.c | 2 ++
> 2 files changed, 22 insertions(+)
>
Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Best regards,
Hervé
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-10-20 14:27 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 1/8] of: base: Fix stack overflow in of_parse_phandle_with_args_map() Ernest Van Hoecke
2026-10-20 13:58 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 2/8] of: property: fw_devlink: Follow GPIO nexus maps Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 3/8] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
2026-10-20 14:05 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 5/8] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
2026-10-20 13:00 ` [PATCH v3 6/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
2026-10-20 14:11 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 7/8] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
2026-10-20 14:23 ` Herve Codina
2026-10-20 13:00 ` [PATCH v3 8/8] of: unittest: Test fw_devlink with " Ernest Van Hoecke
2026-10-20 14:27 ` Herve Codina
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®