* [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps
@ 2026-09-10 14:16 Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
` (6 more replies)
0 siblings, 7 replies; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, stable
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.
The regression tests call the OF add_links operation and verify that a
mapped reference creates exactly one link to the final provider, 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.
Tested with:
- The new CONFIG_OF_UNITTEST fw_devlink cases under QEMU/x86_64 all
passed
- W=1 builds on x86_64 and arm64, including the OF unittest data
- Toradex Verdin iMX8M Plus hardware using a connector nexus for the
display GPIO and PWM resources: the display probes successfully
[1] https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@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 (7):
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/property.c | 53 ++++++++++++++-----
drivers/of/unittest-data/tests-phandle.dtsi | 63 +++++++++++++++++++++++
drivers/of/unittest.c | 79 +++++++++++++++++++++++++++++
3 files changed, 182 insertions(+), 13 deletions(-)
---
base-commit: 91b1b8d437abe0cd83210d8f257b785a63047aa9
change-id: 20260901-fw-devlink-nexus-ready-c859706b019d
Best regards,
--
Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
` (5 subsequent siblings)
6 siblings, 1 reply; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, stable
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
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 72cf12907de0..380df0861ab9 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_interrupts(struct device_node *np,
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, 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.
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 380df0861ab9..eba7e9fe6c38 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1691,7 +1691,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 related [flat|nested] 10+ messages in thread
* [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 4/7] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
` (3 subsequent siblings)
6 siblings, 1 reply; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke
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.
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/unittest-data/tests-phandle.dtsi | 33 +++++++++++++
drivers/of/unittest.c | 75 +++++++++++++++++++++++++++++
2 files changed, 108 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index 554a996b2ef1..c3727ed15bde 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -79,6 +79,39 @@ consumer-b {
phandle-list-bad-args = <&provider2 1 0>,
<&provider4 0>;
};
+
+ fw-devlink-tests {
+ gpio_provider: gpio-controller {
+ #gpio-cells = <2>;
+ };
+
+ fwdevlink_nexus: nexus {
+ #gpio-cells = <2>;
+ gpio-map = <0 0 &gpio_provider 1 0>;
+ gpio-map-mask = <0xffffffff 0>;
+ gpio-map-pass-thru = <0 0xffffffff>;
+ };
+
+ gpio-compat-consumer {
+ gpios = <&fwdevlink_nexus 0 0>;
+ };
+
+ gpio-compat-singular-consumer {
+ gpio = <&fwdevlink_nexus 0 0>;
+ };
+
+ gpio-consumer {
+ test-gpios = <&fwdevlink_nexus 0 0>;
+ };
+
+ gpio-direct-consumer {
+ test-gpios = <&gpio_provider 1 0>;
+ };
+
+ gpio-singular-consumer {
+ test-gpio = <&fwdevlink_nexus 0 0>;
+ };
+ };
};
};
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index e255f54f4d76..dfa3c885d142 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" },
+ { "gpio-compat-singular-consumer", "gpio-controller" },
+ { "gpio-consumer", "gpio-controller" },
+ { "gpio-direct-consumer", "gpio-controller" },
+ { "gpio-singular-consumer", "gpio-controller" },
+ };
+ 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 related [flat|nested] 10+ messages in thread
* [PATCH v2 4/7] of: property: fw_devlink: Follow PWM nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (2 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 5/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, 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
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 eba7e9fe6c38..a9c51d639a2b 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 related [flat|nested] 10+ messages in thread
* [PATCH v2 5/7] of: unittest: Test fw_devlink with PWM nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (3 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 4/7] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 6/7] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 7/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
6 siblings, 0 replies; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, 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>
---
drivers/of/unittest-data/tests-phandle.dtsi | 16 ++++++++++++++++
drivers/of/unittest.c | 2 ++
2 files changed, 18 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index c3727ed15bde..eef966615b22 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -85,11 +85,19 @@ gpio_provider: gpio-controller {
#gpio-cells = <2>;
};
+ pwm_provider: pwm-controller {
+ #pwm-cells = <2>;
+ };
+
fwdevlink_nexus: nexus {
#gpio-cells = <2>;
+ #pwm-cells = <2>;
gpio-map = <0 0 &gpio_provider 1 0>;
gpio-map-mask = <0xffffffff 0>;
gpio-map-pass-thru = <0 0xffffffff>;
+ pwm-map = <0 0 &pwm_provider 1 0>;
+ pwm-map-mask = <0xffffffff 0>;
+ pwm-map-pass-thru = <0 0xffffffff>;
};
gpio-compat-consumer {
@@ -111,6 +119,14 @@ gpio-direct-consumer {
gpio-singular-consumer {
test-gpio = <&fwdevlink_nexus 0 0>;
};
+
+ pwm-consumer {
+ pwms = <&fwdevlink_nexus 0 0>;
+ };
+
+ pwm-direct-consumer {
+ pwms = <&pwm_provider 1 0>;
+ };
};
};
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index dfa3c885d142..b739a69997a9 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" },
{ "gpio-direct-consumer", "gpio-controller" },
{ "gpio-singular-consumer", "gpio-controller" },
+ { "pwm-consumer", "pwm-controller" },
+ { "pwm-direct-consumer", "pwm-controller" },
};
struct device_node *tests;
int i;
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 6/7] of: property: fw_devlink: Follow clock nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (4 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 5/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 7/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
6 siblings, 0 replies; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, 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>
---
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 a9c51d639a2b..48e05f7bae2f 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 related [flat|nested] 10+ messages in thread
* [PATCH v2 7/7] of: unittest: Test fw_devlink with clock nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (5 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 6/7] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
6 siblings, 0 replies; 10+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 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, 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>
---
drivers/of/unittest-data/tests-phandle.dtsi | 14 ++++++++++++++
drivers/of/unittest.c | 2 ++
2 files changed, 16 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index eef966615b22..aaf0b871c01d 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -81,6 +81,10 @@ consumer-b {
};
fw-devlink-tests {
+ clock_provider: clock-controller {
+ #clock-cells = <1>;
+ };
+
gpio_provider: gpio-controller {
#gpio-cells = <2>;
};
@@ -90,8 +94,10 @@ pwm_provider: pwm-controller {
};
fwdevlink_nexus: nexus {
+ #clock-cells = <1>;
#gpio-cells = <2>;
#pwm-cells = <2>;
+ clock-map = <0 &clock_provider 1>;
gpio-map = <0 0 &gpio_provider 1 0>;
gpio-map-mask = <0xffffffff 0>;
gpio-map-pass-thru = <0 0xffffffff>;
@@ -100,6 +106,14 @@ fwdevlink_nexus: nexus {
pwm-map-pass-thru = <0 0xffffffff>;
};
+ clock-consumer {
+ clocks = <&fwdevlink_nexus 0>;
+ };
+
+ clock-direct-consumer {
+ clocks = <&clock_provider 1>;
+ };
+
gpio-compat-consumer {
gpios = <&fwdevlink_nexus 0 0>;
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index b739a69997a9..2859a44c3fe5 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" },
+ { "clock-direct-consumer", "clock-controller" },
{ "gpio-compat-consumer", "gpio-controller" },
{ "gpio-compat-singular-consumer", "gpio-controller" },
{ "gpio-consumer", "gpio-controller" },
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO nexus maps
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
@ 2026-09-11 7:51 ` Bartosz Golaszewski
0 siblings, 0 replies; 10+ messages in thread
From: Bartosz Golaszewski @ 2026-09-11 7:51 UTC (permalink / raw)
To: Ernest Van Hoecke
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, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, stable, Rob Herring,
Saravana Kannan
On Thu, 10 Sep 2026 16:16:42 +0200, Ernest Van Hoecke
<ernestvanhoecke@gmail.com> said:
> 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
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
@ 2026-09-11 7:51 ` Bartosz Golaszewski
0 siblings, 0 replies; 10+ messages in thread
From: Bartosz Golaszewski @ 2026-09-11 7:51 UTC (permalink / raw)
To: Ernest Van Hoecke
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, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, Rob Herring, Saravana Kannan
On Thu, 10 Sep 2026 16:16:44 +0200, Ernest Van Hoecke
<ernestvanhoecke@gmail.com> said:
> 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.
>
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-09-11 7:52 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 4/7] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 5/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 6/7] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 7/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox