From: Ernest Van Hoecke <ernestvanhoecke@gmail.com>
To: Rob Herring <robh@kernel.org>, Saravana Kannan <saravanak@kernel.org>
Cc: "Miquel Raynal (Schneider Electric)" <miquel.raynal@bootlin.com>,
"Frank Li" <Frank.li@oss.nxp.com>,
"Kieran Bingham" <kieran.bingham@ideasonboard.com>,
"Pengutronix Kernel Team" <kernel@pengutronix.de>,
"Stephen Boyd" <sboyd@kernel.org>,
"Brian Masney" <bmasney@redhat.com>,
"Linus Walleij" <linusw@kernel.org>,
"Bartosz Golaszewski" <brgl@kernel.org>,
"Uwe Kleine-König" <ukleinek@kernel.org>,
"Herve Codina" <herve.codina@bootlin.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Geert Uytterhoeven" <geert@linux-m68k.org>,
"Leonardo Costa" <leonardo.costa@toradex.com>,
"Frieder Schrempf" <frieder.schrempf@kontron.de>,
devicetree@vger.kernel.org, linux-clk@vger.kernel.org,
linux-gpio@vger.kernel.org, linux-pwm@vger.kernel.org,
linux-kernel@vger.kernel.org,
"Ernest Van Hoecke" <ernest.vanhoecke@toradex.com>,
"Bartosz Golaszewski" <bartosz.golaszewski@oss.qualcomm.com>
Subject: [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps
Date: Tue, 20 Oct 2026 15:00:15 +0200 [thread overview]
Message-ID: <20261020-fw-devlink-nexus-ready-v3-4-fd6f1c17e16d@toradex.com> (raw)
In-Reply-To: <20261020-fw-devlink-nexus-ready-v3-0-fd6f1c17e16d@toradex.com>
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
next prev parent reply other threads:[~2026-10-20 13:00 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-20 13:00 [PATCH v3 0/8] of: property: Make fw_devlink follow GPIO, PWM and clock " 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 ` Ernest Van Hoecke [this message]
2026-10-20 14:05 ` [PATCH v3 4/8] of: unittest: Test fw_devlink with GPIO nexus maps 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261020-fw-devlink-nexus-ready-v3-4-fd6f1c17e16d@toradex.com \
--to=ernestvanhoecke@gmail.com \
--cc=Frank.li@oss.nxp.com \
--cc=bartosz.golaszewski@oss.qualcomm.com \
--cc=bmasney@redhat.com \
--cc=brgl@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=ernest.vanhoecke@toradex.com \
--cc=frieder.schrempf@kontron.de \
--cc=geert@linux-m68k.org \
--cc=gregkh@linuxfoundation.org \
--cc=herve.codina@bootlin.com \
--cc=kernel@pengutronix.de \
--cc=kieran.bingham@ideasonboard.com \
--cc=leonardo.costa@toradex.com \
--cc=linusw@kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=miquel.raynal@bootlin.com \
--cc=robh@kernel.org \
--cc=saravanak@kernel.org \
--cc=sboyd@kernel.org \
--cc=ukleinek@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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®