* [PATCH v2 0/9] reset: rework reset-gpios handling
@ 2025-10-22 13:40 Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 1/9] software node: read the reference args via the fwnode API Bartosz Golaszewski
` (9 more replies)
0 siblings, 10 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:40 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
Machine GPIO lookup is a nice, if a bit clunky, mechanism when we have
absolutely no idea what the GPIO provider is or when it will be created.
However in the case of reset-gpios, we not only know if the chip is
there - we also already hold a reference to its firmware node.
In this case using fwnode lookup makes more sense. However, since the
reset provider is created dynamically, it doesn't have a corresponding
firmware node (in this case: an OF-node). That leaves us with software
nodes which currently cannot reference other implementations of the
fwnode API, only other struct software_node objects. This is a needless
limitation as it's imaginable that a dynamic auxiliary device (with a
software node attached) would want to reference a real device with an OF
node.
This series does three things: extends the software node implementation,
allowing its properties to reference not only static software nodes but
also existing firmware nodes, updates the GPIO property interface to use
the reworked swnode macros and finally makes the reset-gpio code the
first user by converting the GPIO lookup from machine to swnode.
Another user of the software node changes in the future could become the
shared GPIO modules that's in the works in parallel[1].
Merging strategy: the series is logically split into three parts: driver
core, GPIO and reset respectively. However there are build-time
dependencies between all three parts so I suggest the reset tree as the
right one to take it upstream with an immutable branch provided to
driver core and GPIO.
[1] https://lore.kernel.org/all/20250924-gpio-shared-v1-0-775e7efeb1a3@linaro.org/
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
Changes in v2:
- Don't use a union for different pointer types in the software node
reference struct
- Use fwnode_property_read_u32() instead of
fwnode_property_read_u32_array() as we're only reading a single
integer
- Rename reset_aux_device_release() to reset_gpio_aux_device_release()
- Initialize the device properties instead of memsetting them
- Fix typo in commit message
- As discussed on the list: I didn't change patch 7/9 because most of
it goes away anyway in patch 9/9 and the cleanup issues will be fixed
in the upcoming fwnode conversion
- Link to v1: https://lore.kernel.org/r/20251006-reset-gpios-swnodes-v1-0-6d3325b9af42@linaro.org
---
Bartosz Golaszewski (9):
software node: read the reference args via the fwnode API
software node: increase the reference of the swnode by its fwnode
software node: allow referencing firmware nodes
gpio: swnode: don't use the swnode's name as the key for GPIO lookup
gpio: swnode: update the property definitions
reset: order includes alphabetically in reset/core.c
reset: make the provider of reset-gpios the parent of the reset device
reset: gpio: convert the driver to using the auxiliary bus
reset: gpio: use software nodes to setup the GPIO lookup
drivers/base/swnode.c | 21 +++---
drivers/gpio/gpiolib-swnode.c | 16 ++---
drivers/reset/Kconfig | 1 +
drivers/reset/core.c | 150 ++++++++++++++++++++++++------------------
drivers/reset/reset-gpio.c | 19 +++---
include/linux/gpio/property.h | 5 +-
include/linux/property.h | 40 +++++++++--
7 files changed, 155 insertions(+), 97 deletions(-)
---
base-commit: 5d1aa1920fd17a271dc0f136e14901d8a7e01c26
change-id: 20250925-reset-gpios-swnodes-db553e67095b
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v2 1/9] software node: read the reference args via the fwnode API
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 2/9] software node: increase the reference of the swnode by its fwnode Bartosz Golaszewski
` (8 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Once we allow software nodes to reference all kinds of firmware nodes,
the refnode here will no longer necessarily be a software node so read
its proprties going through its fwnode implementation.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/base/swnode.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index be1e9e61a7bf4d1301a3e109628517cfd9214704..2994efaf1d5d74c82df70e7df8bddf61ba0bfd41 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -540,9 +540,8 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
return -ENOENT;
if (nargs_prop) {
- error = property_entry_read_int_array(ref->node->properties,
- nargs_prop, sizeof(u32),
- &nargs_prop_val, 1);
+ error = fwnode_property_read_u32(refnode, nargs_prop,
+ &nargs_prop_val);
if (error)
return error;
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 2/9] software node: increase the reference of the swnode by its fwnode
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 1/9] software node: read the reference args via the fwnode API Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 3/9] software node: allow referencing firmware nodes Bartosz Golaszewski
` (7 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Once we allow software nodes to reference other kinds of firmware nodes,
the node in args will no longer necessarily be a software node so bump
its reference count using its fwnode interface.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/base/swnode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 2994efaf1d5d74c82df70e7df8bddf61ba0bfd41..b7c3926b67be72671ba4e4c442b3acca80688cf7 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -554,7 +554,7 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
if (!args)
return 0;
- args->fwnode = software_node_get(refnode);
+ args->fwnode = fwnode_handle_get(refnode);
args->nargs = nargs;
for (i = 0; i < nargs; i++)
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 3/9] software node: allow referencing firmware nodes
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 1/9] software node: read the reference args via the fwnode API Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 2/9] software node: increase the reference of the swnode by its fwnode Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 18:59 ` Andy Shevchenko
2025-10-24 15:17 ` Sakari Ailus
2025-10-22 13:41 ` [PATCH v2 4/9] gpio: swnode: don't use the swnode's name as the key for GPIO lookup Bartosz Golaszewski
` (6 subsequent siblings)
9 siblings, 2 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
At the moment software nodes can only reference other software nodes.
This is a limitation for devices created, for instance, on the auxiliary
bus with a dynamic software node attached which cannot reference devices
the firmware node of which is "real" (as an OF node or otherwise).
Make it possible for a software node to reference all firmware nodes in
addition to static software nodes. To that end: use a union of different
pointers in struct software_node_ref_args and add an enum indicating
what kind of reference given instance of it is. Rework the helper macros
and deprecate the existing ones whose names don't indicate the reference
type.
Software node graphs remain the same, as in: the remote endpoints still
have to be software nodes.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/base/swnode.c | 14 ++++++++++----
include/linux/property.h | 40 +++++++++++++++++++++++++++++++++-------
2 files changed, 43 insertions(+), 11 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index b7c3926b67be72671ba4e4c442b3acca80688cf7..d08b914c07691336540cdf1dfbd77a697e7b4521 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -535,9 +535,12 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
ref_array = prop->pointer;
ref = &ref_array[index];
- refnode = software_node_fwnode(ref->node);
- if (!refnode)
- return -ENOENT;
+ if (ref->swnode)
+ refnode = software_node_fwnode(ref->swnode);
+ else if (ref->fwnode)
+ refnode = ref->fwnode;
+ else
+ return -EINVAL;
if (nargs_prop) {
error = fwnode_property_read_u32(refnode, nargs_prop,
@@ -634,7 +637,10 @@ software_node_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
ref = prop->pointer;
- return software_node_get(software_node_fwnode(ref[0].node));
+ if (!ref->swnode)
+ return NULL;
+
+ return software_node_get(software_node_fwnode(ref[0].swnode));
}
static struct fwnode_handle *
diff --git a/include/linux/property.h b/include/linux/property.h
index 50b26589dd70d1756f3b8644255c24a011e2617c..52e784a3dfd4c93cee8b35e1cef5e0600639ecc5 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -355,23 +355,37 @@ struct software_node;
/**
* struct software_node_ref_args - Reference property with additional arguments
- * @node: Reference to a software node
+ * @swnode: Reference to a software node
+ * @fwnode: Alternative reference to a firmware node handle
* @nargs: Number of elements in @args array
* @args: Integer arguments
*/
struct software_node_ref_args {
- const struct software_node *node;
+ const struct software_node *swnode;
+ struct fwnode_handle *fwnode;
unsigned int nargs;
u64 args[NR_FWNODE_REFERENCE_ARGS];
};
-#define SOFTWARE_NODE_REFERENCE(_ref_, ...) \
+#define __SOFTWARE_NODE_REF(_ref, _type, _node, ...) \
(const struct software_node_ref_args) { \
- .node = _ref_, \
+ ._node = _ref, \
.nargs = COUNT_ARGS(__VA_ARGS__), \
.args = { __VA_ARGS__ }, \
}
+#define SOFTWARE_NODE_REF_SWNODE(_ref, ...) \
+ __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_SWNODE, \
+ swnode, __VA_ARGS__)
+
+#define SOFTWARE_NODE_REF_FWNODE(_ref, ...) \
+ __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_FWNODE, \
+ fwnode, __VA_ARGS__)
+
+/* DEPRECATED, use SOFTWARE_NODE_REF_SWNODE() instead. */
+#define SOFTWARE_NODE_REFERENCE(_ref, ...) \
+ SOFTWARE_NODE_REF_SWNODE(_ref, __VA_ARGS__)
+
/**
* struct property_entry - "Built-in" device property representation.
* @name: Name of the property.
@@ -463,14 +477,26 @@ struct property_entry {
#define PROPERTY_ENTRY_STRING(_name_, _val_) \
__PROPERTY_ENTRY_ELEMENT(_name_, str, STRING, _val_)
-#define PROPERTY_ENTRY_REF(_name_, _ref_, ...) \
+#define __PROPERTY_ENTRY_REF(_type, _name, _ref, ...) \
(struct property_entry) { \
- .name = _name_, \
+ .name = _name, \
.length = sizeof(struct software_node_ref_args), \
.type = DEV_PROP_REF, \
- { .pointer = &SOFTWARE_NODE_REFERENCE(_ref_, ##__VA_ARGS__), }, \
+ { .pointer = &_type(_ref, ##__VA_ARGS__), }, \
}
+#define PROPERTY_ENTRY_REF_SWNODE(_name, _ref, ...) \
+ __PROPERTY_ENTRY_REF(SOFTWARE_NODE_REF_SWNODE, \
+ _name, _ref, __VA_ARGS__)
+
+#define PROPERTY_ENTRY_REF_FWNODE(_name, _ref, ...) \
+ __PROPERTY_ENTRY_REF(SOFTWARE_NODE_REF_FWNODE, \
+ _name, _ref, __VA_ARGS__)
+
+/* DEPRECATED, use PROPERTY_ENTRY_REF_SWNODE() instead. */
+#define PROPERTY_ENTRY_REF(_name, _ref, ...) \
+ PROPERTY_ENTRY_REF_SWNODE(_name, _ref, __VA_ARGS__)
+
#define PROPERTY_ENTRY_BOOL(_name_) \
(struct property_entry) { \
.name = _name_, \
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 4/9] gpio: swnode: don't use the swnode's name as the key for GPIO lookup
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
` (2 preceding siblings ...)
2025-10-22 13:41 ` [PATCH v2 3/9] software node: allow referencing firmware nodes Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 18:44 ` Andy Shevchenko
2025-10-22 13:41 ` [PATCH v2 5/9] gpio: swnode: update the property definitions Bartosz Golaszewski
` (5 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Looking up a GPIO controller by label that is the name of the software
node is wonky at best - the GPIO controller driver is free to set
a different label than the name of its firmware node. We're already being
passed a firmware node handle attached to the GPIO device to
swnode_get_gpio_device() so use it instead for a more precise lookup.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpiolib-swnode.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/drivers/gpio/gpiolib-swnode.c b/drivers/gpio/gpiolib-swnode.c
index f21dbc28cf2c8c2d06d034b7c89d302cc52bb9b5..573b5216cfda105bafa58e04fc5ad3a38d283698 100644
--- a/drivers/gpio/gpiolib-swnode.c
+++ b/drivers/gpio/gpiolib-swnode.c
@@ -7,6 +7,7 @@
#define pr_fmt(fmt) "gpiolib: swnode: " fmt
+#include <linux/cleanup.h>
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/export.h>
@@ -26,23 +27,20 @@
static struct gpio_device *swnode_get_gpio_device(struct fwnode_handle *fwnode)
{
- const struct software_node *gdev_node;
- struct gpio_device *gdev;
-
- gdev_node = to_software_node(fwnode);
- if (!gdev_node || !gdev_node->name)
- return ERR_PTR(-EINVAL);
+ struct gpio_device *gdev __free(gpio_device_put) =
+ gpio_device_find_by_fwnode(fwnode);
+ if (!gdev)
+ return ERR_PTR(-EPROBE_DEFER);
/*
* Check for a special node that identifies undefined GPIOs, this is
* primarily used as a key for internal chip selects in SPI bindings.
*/
if (IS_ENABLED(CONFIG_GPIO_SWNODE_UNDEFINED) &&
- !strcmp(gdev_node->name, GPIOLIB_SWNODE_UNDEFINED_NAME))
+ !strcmp(fwnode_get_name(fwnode), GPIOLIB_SWNODE_UNDEFINED_NAME))
return ERR_PTR(-ENOENT);
- gdev = gpio_device_find_by_label(gdev_node->name);
- return gdev ?: ERR_PTR(-EPROBE_DEFER);
+ return no_free_ptr(gdev);
}
static int swnode_gpio_get_reference(const struct fwnode_handle *fwnode,
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 5/9] gpio: swnode: update the property definitions
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
` (3 preceding siblings ...)
2025-10-22 13:41 ` [PATCH v2 4/9] gpio: swnode: don't use the swnode's name as the key for GPIO lookup Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 6/9] reset: order includes alphabetically in reset/core.c Bartosz Golaszewski
` (4 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Use the recommended macros for creating references to software and
firmware nodes attached to GPIO providers.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
include/linux/gpio/property.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/include/linux/gpio/property.h b/include/linux/gpio/property.h
index 0d220930800276a21b5ba96a68371ce66fc4ae3e..6b1c2ed9c57594bf3ead5edc82439f9fb7f514fd 100644
--- a/include/linux/gpio/property.h
+++ b/include/linux/gpio/property.h
@@ -7,7 +7,10 @@
struct software_node;
#define PROPERTY_ENTRY_GPIO(_name_, _chip_node_, _idx_, _flags_) \
- PROPERTY_ENTRY_REF(_name_, _chip_node_, _idx_, _flags_)
+ PROPERTY_ENTRY_REF_SWNODE(_name_, _chip_node_, _idx_, _flags_)
+
+#define PROPERTY_ENTRY_GPIO_FWNODE(_name_, _chip_node_, _idx_, _flags_) \
+ PROPERTY_ENTRY_REF_FWNODE(_name_, _chip_node_, _idx_, _flags_)
extern const struct software_node swnode_gpio_undefined;
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 6/9] reset: order includes alphabetically in reset/core.c
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
` (4 preceding siblings ...)
2025-10-22 13:41 ` [PATCH v2 5/9] gpio: swnode: update the property definitions Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 7/9] reset: make the provider of reset-gpios the parent of the reset device Bartosz Golaszewski
` (3 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
For better readability and easier maintenance order the includes
alphabetically.
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/reset/core.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index 22f67fc77ae531c6efba3ce92cc73a2d57397762..5a696e2dbcc224a633e2b321da53b7bc699cb5f3 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -4,19 +4,20 @@
*
* Copyright 2013 Philipp Zabel, Pengutronix
*/
+
+#include <linux/acpi.h>
#include <linux/atomic.h>
#include <linux/cleanup.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/export.h>
-#include <linux/kernel.h>
-#include <linux/kref.h>
#include <linux/gpio/driver.h>
#include <linux/gpio/machine.h>
#include <linux/idr.h>
+#include <linux/kernel.h>
+#include <linux/kref.h>
#include <linux/module.h>
#include <linux/of.h>
-#include <linux/acpi.h>
#include <linux/platform_device.h>
#include <linux/reset.h>
#include <linux/reset-controller.h>
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 7/9] reset: make the provider of reset-gpios the parent of the reset device
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
` (5 preceding siblings ...)
2025-10-22 13:41 ` [PATCH v2 6/9] reset: order includes alphabetically in reset/core.c Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 14:45 ` Philipp Zabel
2025-10-22 13:41 ` [PATCH v2 8/9] reset: gpio: convert the driver to using the auxiliary bus Bartosz Golaszewski
` (2 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Auxiliary devices really do need a parent so ahead of converting the
reset-gpios driver to registering on the auxiliary bus, make the GPIO
device that provides the reset GPIO the parent of the reset-gpio device.
To that end move the lookup of the GPIO device by fwnode to the
beginning of __reset_add_reset_gpio_device() which has the added benefor
of bailing out earlier, before allocating resources for the virtual
device, if the chip is not up yet.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/reset/core.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index 5a696e2dbcc224a633e2b321da53b7bc699cb5f3..ad85ddc8dd9fcf8b512cb09168586e0afca257f1 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -849,11 +849,11 @@ static void __reset_control_put_internal(struct reset_control *rstc)
kref_put(&rstc->refcnt, __reset_control_release);
}
-static int __reset_add_reset_gpio_lookup(int id, struct device_node *np,
+static int __reset_add_reset_gpio_lookup(struct gpio_device *gdev, int id,
+ struct device_node *np,
unsigned int gpio,
unsigned int of_flags)
{
- const struct fwnode_handle *fwnode = of_fwnode_handle(np);
unsigned int lookup_flags;
const char *label_tmp;
@@ -868,10 +868,6 @@ static int __reset_add_reset_gpio_lookup(int id, struct device_node *np,
return -EINVAL;
}
- struct gpio_device *gdev __free(gpio_device_put) = gpio_device_find_by_fwnode(fwnode);
- if (!gdev)
- return -EPROBE_DEFER;
-
label_tmp = gpio_device_get_label(gdev);
if (!label_tmp)
return -EINVAL;
@@ -919,6 +915,11 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
if (args->args_count != 2)
return -ENOENT;
+ struct gpio_device *gdev __free(gpio_device_put) =
+ gpio_device_find_by_fwnode(of_fwnode_handle(args->np));
+ if (!gdev)
+ return -EPROBE_DEFER;
+
/*
* Registering reset-gpio device might cause immediate
* bind, resulting in its probe() registering new reset controller thus
@@ -946,7 +947,7 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
goto err_ida_free;
}
- ret = __reset_add_reset_gpio_lookup(id, args->np, args->args[0],
+ ret = __reset_add_reset_gpio_lookup(gdev, id, args->np, args->args[0],
args->args[1]);
if (ret < 0)
goto err_kfree;
@@ -958,7 +959,8 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
* Hold reference as long as rgpio_dev memory is valid.
*/
of_node_get(rgpio_dev->of_args.np);
- pdev = platform_device_register_data(NULL, "reset-gpio", id,
+ pdev = platform_device_register_data(gpio_device_to_device(gdev),
+ "reset-gpio", id,
&rgpio_dev->of_args,
sizeof(rgpio_dev->of_args));
ret = PTR_ERR_OR_ZERO(pdev);
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 8/9] reset: gpio: convert the driver to using the auxiliary bus
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
` (6 preceding siblings ...)
2025-10-22 13:41 ` [PATCH v2 7/9] reset: make the provider of reset-gpios the parent of the reset device Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 18:38 ` Andy Shevchenko
2025-10-22 13:41 ` [PATCH v2 9/9] reset: gpio: use software nodes to setup the GPIO lookup Bartosz Golaszewski
2025-10-23 12:20 ` [PATCH v2 0/9] reset: rework reset-gpios handling Linus Walleij
9 siblings, 1 reply; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
As the reset-gpio devices are purely virtual and never instantiated from
real firmware nodes, let's convert the driver to using the - more
fitting - auxiliary bus.
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/reset/Kconfig | 1 +
drivers/reset/core.c | 14 ++++++--------
drivers/reset/reset-gpio.c | 19 ++++++++++---------
3 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index 3102f5d7a93690f262722733e475b1215f61051c..24c9048cc7a31d3a6c9fb9af0726a8387bb3154a 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -89,6 +89,7 @@ config RESET_EYEQ
config RESET_GPIO
tristate "GPIO reset controller"
depends on GPIOLIB
+ select AUXILIARY_BUS
help
This enables a generic reset controller for resets attached via
GPIOs. Typically for OF platforms this driver expects "reset-gpios"
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index ad85ddc8dd9fcf8b512cb09168586e0afca257f1..c9f13020ca3a7b9273488497a7d4240d0af762b0 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -7,6 +7,7 @@
#include <linux/acpi.h>
#include <linux/atomic.h>
+#include <linux/auxiliary_bus.h>
#include <linux/cleanup.h>
#include <linux/device.h>
#include <linux/err.h>
@@ -18,7 +19,6 @@
#include <linux/kref.h>
#include <linux/module.h>
#include <linux/of.h>
-#include <linux/platform_device.h>
#include <linux/reset.h>
#include <linux/reset-controller.h>
#include <linux/slab.h>
@@ -882,7 +882,7 @@ static int __reset_add_reset_gpio_lookup(struct gpio_device *gdev, int id,
if (!lookup)
return -ENOMEM;
- lookup->dev_id = kasprintf(GFP_KERNEL, "reset-gpio.%d", id);
+ lookup->dev_id = kasprintf(GFP_KERNEL, "reset.gpio.%d", id);
if (!lookup->dev_id)
return -ENOMEM;
@@ -903,7 +903,7 @@ static int __reset_add_reset_gpio_lookup(struct gpio_device *gdev, int id,
static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
{
struct reset_gpio_lookup *rgpio_dev;
- struct platform_device *pdev;
+ struct auxiliary_device *adev;
int id, ret;
/*
@@ -959,11 +959,9 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
* Hold reference as long as rgpio_dev memory is valid.
*/
of_node_get(rgpio_dev->of_args.np);
- pdev = platform_device_register_data(gpio_device_to_device(gdev),
- "reset-gpio", id,
- &rgpio_dev->of_args,
- sizeof(rgpio_dev->of_args));
- ret = PTR_ERR_OR_ZERO(pdev);
+ adev = auxiliary_device_create(gpio_device_to_device(gdev), "reset",
+ "gpio", &rgpio_dev->of_args, id);
+ ret = PTR_ERR_OR_ZERO(adev);
if (ret)
goto err_put;
diff --git a/drivers/reset/reset-gpio.c b/drivers/reset/reset-gpio.c
index 2290b25b6703536f2245f15cab870bd7092d3453..7b43d61d0467aef5fbbad53d531294fa62f8084a 100644
--- a/drivers/reset/reset-gpio.c
+++ b/drivers/reset/reset-gpio.c
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: GPL-2.0
+#include <linux/auxiliary_bus.h>
#include <linux/gpio/consumer.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/of.h>
-#include <linux/platform_device.h>
#include <linux/reset-controller.h>
struct reset_gpio_priv {
@@ -61,9 +61,10 @@ static void reset_gpio_of_node_put(void *data)
of_node_put(data);
}
-static int reset_gpio_probe(struct platform_device *pdev)
+static int reset_gpio_probe(struct auxiliary_device *adev,
+ const struct auxiliary_device_id *id)
{
- struct device *dev = &pdev->dev;
+ struct device *dev = &adev->dev;
struct of_phandle_args *platdata = dev_get_platdata(dev);
struct reset_gpio_priv *priv;
int ret;
@@ -75,7 +76,7 @@ static int reset_gpio_probe(struct platform_device *pdev)
if (!priv)
return -ENOMEM;
- platform_set_drvdata(pdev, &priv->rc);
+ auxiliary_set_drvdata(adev, &priv->rc);
priv->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(priv->reset))
@@ -99,20 +100,20 @@ static int reset_gpio_probe(struct platform_device *pdev)
return devm_reset_controller_register(dev, &priv->rc);
}
-static const struct platform_device_id reset_gpio_ids[] = {
- { .name = "reset-gpio", },
+static const struct auxiliary_device_id reset_gpio_ids[] = {
+ { .name = "reset.gpio", },
{}
};
-MODULE_DEVICE_TABLE(platform, reset_gpio_ids);
+MODULE_DEVICE_TABLE(auxiliary, reset_gpio_ids);
-static struct platform_driver reset_gpio_driver = {
+static struct auxiliary_driver reset_gpio_driver = {
.probe = reset_gpio_probe,
.id_table = reset_gpio_ids,
.driver = {
.name = "reset-gpio",
},
};
-module_platform_driver(reset_gpio_driver);
+module_auxiliary_driver(reset_gpio_driver);
MODULE_AUTHOR("Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>");
MODULE_DESCRIPTION("Generic GPIO reset driver");
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v2 9/9] reset: gpio: use software nodes to setup the GPIO lookup
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
` (7 preceding siblings ...)
2025-10-22 13:41 ` [PATCH v2 8/9] reset: gpio: convert the driver to using the auxiliary bus Bartosz Golaszewski
@ 2025-10-22 13:41 ` Bartosz Golaszewski
2025-10-22 14:45 ` Philipp Zabel
2025-10-23 12:20 ` [PATCH v2 0/9] reset: rework reset-gpios handling Linus Walleij
9 siblings, 1 reply; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 13:41 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Philipp Zabel,
Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
GPIO machine lookup is a nice mechanism for associating GPIOs with
consumers if we don't know what kind of device the GPIO provider is or
when it will become available. However in the case of the reset-gpio, we
are already holding a reference to the device and so can reference its
firmware node. Let's setup a software node that references the relevant
GPIO and attach it to the auxiliary device we're creating.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/reset/core.c | 131 ++++++++++++++++++++++++++++++---------------------
1 file changed, 77 insertions(+), 54 deletions(-)
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index c9f13020ca3a7b9273488497a7d4240d0af762b0..20378de4b813ab79a103ea81cf2cbcd2b76c0ccf 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -14,6 +14,7 @@
#include <linux/export.h>
#include <linux/gpio/driver.h>
#include <linux/gpio/machine.h>
+#include <linux/gpio/property.h>
#include <linux/idr.h>
#include <linux/kernel.h>
#include <linux/kref.h>
@@ -77,10 +78,12 @@ struct reset_control_array {
/**
* struct reset_gpio_lookup - lookup key for ad-hoc created reset-gpio devices
* @of_args: phandle to the reset controller with all the args like GPIO number
+ * @swnode: Software node containing the reference to the GPIO provider
* @list: list entry for the reset_gpio_lookup_list
*/
struct reset_gpio_lookup {
struct of_phandle_args of_args;
+ struct fwnode_handle *swnode;
struct list_head list;
};
@@ -849,52 +852,45 @@ static void __reset_control_put_internal(struct reset_control *rstc)
kref_put(&rstc->refcnt, __reset_control_release);
}
-static int __reset_add_reset_gpio_lookup(struct gpio_device *gdev, int id,
- struct device_node *np,
- unsigned int gpio,
- unsigned int of_flags)
+static void reset_gpio_aux_device_release(struct device *dev)
{
- unsigned int lookup_flags;
- const char *label_tmp;
+ struct auxiliary_device *adev = to_auxiliary_dev(dev);
- /*
- * Later we map GPIO flags between OF and Linux, however not all
- * constants from include/dt-bindings/gpio/gpio.h and
- * include/linux/gpio/machine.h match each other.
- */
- if (of_flags > GPIO_ACTIVE_LOW) {
- pr_err("reset-gpio code does not support GPIO flags %u for GPIO %u\n",
- of_flags, gpio);
- return -EINVAL;
+ kfree(adev);
+}
+
+static int reset_add_gpio_aux_device(struct device *parent,
+ struct fwnode_handle *swnode,
+ int id, void *pdata)
+{
+ struct auxiliary_device *adev;
+ int ret;
+
+ adev = kzalloc(sizeof(*adev), GFP_KERNEL);
+ if (!adev)
+ return -ENOMEM;
+
+ adev->id = id;
+ adev->name = "gpio";
+ adev->dev.parent = parent;
+ adev->dev.platform_data = pdata;
+ adev->dev.release = reset_gpio_aux_device_release;
+ device_set_node(&adev->dev, swnode);
+
+ ret = auxiliary_device_init(adev);
+ if (ret) {
+ kfree(adev);
+ return ret;
}
- label_tmp = gpio_device_get_label(gdev);
- if (!label_tmp)
- return -EINVAL;
+ ret = __auxiliary_device_add(adev, "reset");
+ if (ret) {
+ auxiliary_device_uninit(adev);
+ kfree(adev);
+ return ret;
+ }
- char *label __free(kfree) = kstrdup(label_tmp, GFP_KERNEL);
- if (!label)
- return -ENOMEM;
-
- /* Size: one lookup entry plus sentinel */
- struct gpiod_lookup_table *lookup __free(kfree) = kzalloc(struct_size(lookup, table, 2),
- GFP_KERNEL);
- if (!lookup)
- return -ENOMEM;
-
- lookup->dev_id = kasprintf(GFP_KERNEL, "reset.gpio.%d", id);
- if (!lookup->dev_id)
- return -ENOMEM;
-
- lookup_flags = GPIO_PERSISTENT;
- lookup_flags |= of_flags & GPIO_ACTIVE_LOW;
- lookup->table[0] = GPIO_LOOKUP(no_free_ptr(label), gpio, "reset",
- lookup_flags);
-
- /* Not freed on success, because it is persisent subsystem data. */
- gpiod_add_lookup_table(no_free_ptr(lookup));
-
- return 0;
+ return ret;
}
/*
@@ -902,9 +898,11 @@ static int __reset_add_reset_gpio_lookup(struct gpio_device *gdev, int id,
*/
static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
{
+ struct property_entry properties[] = { {}, {} };
struct reset_gpio_lookup *rgpio_dev;
- struct auxiliary_device *adev;
- int id, ret;
+ unsigned int offset, of_flags;
+ struct device *parent;
+ int id, ret, lflags;
/*
* Currently only #gpio-cells=2 is supported with the meaning of:
@@ -915,11 +913,30 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
if (args->args_count != 2)
return -ENOENT;
+ offset = args->args[0];
+ of_flags = args->args[1];
+
+ /*
+ * Later we map GPIO flags between OF and Linux, however not all
+ * constants from include/dt-bindings/gpio/gpio.h and
+ * include/linux/gpio/machine.h match each other.
+ *
+ * FIXME: Find a better way of translating OF flags to GPIO lookup
+ * flags.
+ */
+ if (of_flags > GPIO_ACTIVE_LOW) {
+ pr_err("reset-gpio code does not support GPIO flags %u for GPIO %u\n",
+ of_flags, offset);
+ return -EINVAL;
+ }
+
struct gpio_device *gdev __free(gpio_device_put) =
gpio_device_find_by_fwnode(of_fwnode_handle(args->np));
if (!gdev)
return -EPROBE_DEFER;
+ parent = gpio_device_to_device(gdev);
+
/*
* Registering reset-gpio device might cause immediate
* bind, resulting in its probe() registering new reset controller thus
@@ -936,6 +953,12 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
}
}
+ lflags = GPIO_PERSISTENT | (of_flags & GPIO_ACTIVE_LOW);
+
+ properties[0] = PROPERTY_ENTRY_GPIO_FWNODE("reset-gpios",
+ parent->fwnode,
+ offset, lflags);
+
id = ida_alloc(&reset_gpio_ida, GFP_KERNEL);
if (id < 0)
return id;
@@ -947,11 +970,6 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
goto err_ida_free;
}
- ret = __reset_add_reset_gpio_lookup(gdev, id, args->np, args->args[0],
- args->args[1]);
- if (ret < 0)
- goto err_kfree;
-
rgpio_dev->of_args = *args;
/*
* We keep the device_node reference, but of_args.np is put at the end
@@ -959,19 +977,24 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
* Hold reference as long as rgpio_dev memory is valid.
*/
of_node_get(rgpio_dev->of_args.np);
- adev = auxiliary_device_create(gpio_device_to_device(gdev), "reset",
- "gpio", &rgpio_dev->of_args, id);
- ret = PTR_ERR_OR_ZERO(adev);
+
+ rgpio_dev->swnode = fwnode_create_software_node(properties, NULL);
+ if (IS_ERR(rgpio_dev->swnode))
+ goto err_put_of_node;
+
+ ret = reset_add_gpio_aux_device(parent, rgpio_dev->swnode, id,
+ &rgpio_dev->of_args);
if (ret)
- goto err_put;
+ goto err_del_swnode;
list_add(&rgpio_dev->list, &reset_gpio_lookup_list);
return 0;
-err_put:
+err_del_swnode:
+ fwnode_remove_software_node(rgpio_dev->swnode);
+err_put_of_node:
of_node_put(rgpio_dev->of_args.np);
-err_kfree:
kfree(rgpio_dev);
err_ida_free:
ida_free(&reset_gpio_ida, id);
--
2.48.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v2 9/9] reset: gpio: use software nodes to setup the GPIO lookup
2025-10-22 13:41 ` [PATCH v2 9/9] reset: gpio: use software nodes to setup the GPIO lookup Bartosz Golaszewski
@ 2025-10-22 14:45 ` Philipp Zabel
0 siblings, 0 replies; 21+ messages in thread
From: Philipp Zabel @ 2025-10-22 14:45 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
On Mi, 2025-10-22 at 15:41 +0200, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> GPIO machine lookup is a nice mechanism for associating GPIOs with
> consumers if we don't know what kind of device the GPIO provider is or
> when it will become available. However in the case of the reset-gpio, we
> are already holding a reference to the device and so can reference its
> firmware node. Let's setup a software node that references the relevant
> GPIO and attach it to the auxiliary device we're creating.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
> drivers/reset/core.c | 131 ++++++++++++++++++++++++++++++---------------------
> 1 file changed, 77 insertions(+), 54 deletions(-)
>
> diff --git a/drivers/reset/core.c b/drivers/reset/core.c
> index c9f13020ca3a7b9273488497a7d4240d0af762b0..20378de4b813ab79a103ea81cf2cbcd2b76c0ccf 100644
> --- a/drivers/reset/core.c
> +++ b/drivers/reset/core.c
[...]
> @@ -915,11 +913,30 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
> if (args->args_count != 2)
> return -ENOENT;
>
> + offset = args->args[0];
> + of_flags = args->args[1];
> +
> + /*
> + * Later we map GPIO flags between OF and Linux, however not all
> + * constants from include/dt-bindings/gpio/gpio.h and
> + * include/linux/gpio/machine.h match each other.
> + *
> + * FIXME: Find a better way of translating OF flags to GPIO lookup
> + * flags.
> + */
> + if (of_flags > GPIO_ACTIVE_LOW) {
> + pr_err("reset-gpio code does not support GPIO flags %u for GPIO %u\n",
> + of_flags, offset);
> + return -EINVAL;
> + }
> +
Please move this ...
> struct gpio_device *gdev __free(gpio_device_put) =
> gpio_device_find_by_fwnode(of_fwnode_handle(args->np));
> if (!gdev)
> return -EPROBE_DEFER;
>
> + parent = gpio_device_to_device(gdev);
> +
... and this after the lockdep_asset_held() below.
With that,
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
regards
Philipp
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 7/9] reset: make the provider of reset-gpios the parent of the reset device
2025-10-22 13:41 ` [PATCH v2 7/9] reset: make the provider of reset-gpios the parent of the reset device Bartosz Golaszewski
@ 2025-10-22 14:45 ` Philipp Zabel
2025-10-22 14:52 ` Bartosz Golaszewski
0 siblings, 1 reply; 21+ messages in thread
From: Philipp Zabel @ 2025-10-22 14:45 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Andy Shevchenko,
Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman,
Rafael J. Wysocki, Danilo Krummrich, Krzysztof Kozlowski
Cc: linux-gpio, linux-kernel, linux-acpi, Bartosz Golaszewski
On Mi, 2025-10-22 at 15:41 +0200, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> Auxiliary devices really do need a parent so ahead of converting the
> reset-gpios driver to registering on the auxiliary bus, make the GPIO
> device that provides the reset GPIO the parent of the reset-gpio device.
> To that end move the lookup of the GPIO device by fwnode to the
> beginning of __reset_add_reset_gpio_device() which has the added benefor
Still typo: benefit.
> of bailing out earlier, before allocating resources for the virtual
> device, if the chip is not up yet.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
> drivers/reset/core.c | 18 ++++++++++--------
> 1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/reset/core.c b/drivers/reset/core.c
> index 5a696e2dbcc224a633e2b321da53b7bc699cb5f3..ad85ddc8dd9fcf8b512cb09168586e0afca257f1 100644
> --- a/drivers/reset/core.c
> +++ b/drivers/reset/core.c
[...]
> @@ -919,6 +915,11 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
> if (args->args_count != 2)
> return -ENOENT;
>
> + struct gpio_device *gdev __free(gpio_device_put) =
> + gpio_device_find_by_fwnode(of_fwnode_handle(args->np));
> + if (!gdev)
> + return -EPROBE_DEFER;
> +
> /*
> * Registering reset-gpio device might cause immediate
> * bind, resulting in its probe() registering new reset controller thus
Please move this after the lockdep_assert_not_held(), as discussed.
With that change,
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
regards
Philipp
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 7/9] reset: make the provider of reset-gpios the parent of the reset device
2025-10-22 14:45 ` Philipp Zabel
@ 2025-10-22 14:52 ` Bartosz Golaszewski
0 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-22 14:52 UTC (permalink / raw)
To: Philipp Zabel
Cc: Linus Walleij, Andy Shevchenko, Daniel Scally, Heikki Krogerus,
Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki,
Danilo Krummrich, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Wed, Oct 22, 2025 at 4:45 PM Philipp Zabel <p.zabel@pengutronix.de> wrote:
>
> On Mi, 2025-10-22 at 15:41 +0200, Bartosz Golaszewski wrote:
> > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> >
> > Auxiliary devices really do need a parent so ahead of converting the
> > reset-gpios driver to registering on the auxiliary bus, make the GPIO
> > device that provides the reset GPIO the parent of the reset-gpio device.
> > To that end move the lookup of the GPIO device by fwnode to the
> > beginning of __reset_add_reset_gpio_device() which has the added benefor
Wait... I remember fixing it and even mentioned it in the cover letter. :/
>
> Still typo: benefit.
>
> > of bailing out earlier, before allocating resources for the virtual
> > device, if the chip is not up yet.
> >
> > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > ---
> > drivers/reset/core.c | 18 ++++++++++--------
> > 1 file changed, 10 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/reset/core.c b/drivers/reset/core.c
> > index 5a696e2dbcc224a633e2b321da53b7bc699cb5f3..ad85ddc8dd9fcf8b512cb09168586e0afca257f1 100644
> > --- a/drivers/reset/core.c
> > +++ b/drivers/reset/core.c
> [...]
> > @@ -919,6 +915,11 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)
> > if (args->args_count != 2)
> > return -ENOENT;
> >
> > + struct gpio_device *gdev __free(gpio_device_put) =
> > + gpio_device_find_by_fwnode(of_fwnode_handle(args->np));
> > + if (!gdev)
> > + return -EPROBE_DEFER;
> > +
> > /*
> > * Registering reset-gpio device might cause immediate
> > * bind, resulting in its probe() registering new reset controller thus
>
> Please move this after the lockdep_assert_not_held(), as discussed.
>
Sorry, I missed that.
Bart
> With that change,
>
> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
>
> regards
> Philipp
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 8/9] reset: gpio: convert the driver to using the auxiliary bus
2025-10-22 13:41 ` [PATCH v2 8/9] reset: gpio: convert the driver to using the auxiliary bus Bartosz Golaszewski
@ 2025-10-22 18:38 ` Andy Shevchenko
0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2025-10-22 18:38 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Linus Walleij, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Wed, Oct 22, 2025 at 03:41:07PM +0200, Bartosz Golaszewski wrote:
>
> As the reset-gpio devices are purely virtual and never instantiated from
> real firmware nodes, let's convert the driver to using the - more
> fitting - auxiliary bus.
...
> -static const struct platform_device_id reset_gpio_ids[] = {
> - { .name = "reset-gpio", },
> +static const struct auxiliary_device_id reset_gpio_ids[] = {
> + { .name = "reset.gpio", },
While at it, the inner comma may be dropped for good.
> {}
> };
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 4/9] gpio: swnode: don't use the swnode's name as the key for GPIO lookup
2025-10-22 13:41 ` [PATCH v2 4/9] gpio: swnode: don't use the swnode's name as the key for GPIO lookup Bartosz Golaszewski
@ 2025-10-22 18:44 ` Andy Shevchenko
2025-10-24 7:17 ` Bartosz Golaszewski
0 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2025-10-22 18:44 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Linus Walleij, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Wed, Oct 22, 2025 at 03:41:03PM +0200, Bartosz Golaszewski wrote:
>
> Looking up a GPIO controller by label that is the name of the software
> node is wonky at best - the GPIO controller driver is free to set
> a different label than the name of its firmware node. We're already being
> passed a firmware node handle attached to the GPIO device to
> swnode_get_gpio_device() so use it instead for a more precise lookup.
...
> static struct gpio_device *swnode_get_gpio_device(struct fwnode_handle *fwnode)
> {
> + struct gpio_device *gdev __free(gpio_device_put) =
> + gpio_device_find_by_fwnode(fwnode);
> + if (!gdev)
> + return ERR_PTR(-EPROBE_DEFER);
>
> /*
> * Check for a special node that identifies undefined GPIOs, this is
> * primarily used as a key for internal chip selects in SPI bindings.
> */
> if (IS_ENABLED(CONFIG_GPIO_SWNODE_UNDEFINED) &&
> + !strcmp(fwnode_get_name(fwnode), GPIOLIB_SWNODE_UNDEFINED_NAME))
> return ERR_PTR(-ENOENT);
Now we might get EPROBE_DEREF for the cases when previously it was ENOENT.
Why is this not a problem? (I haven't found the answer neither in the comment
above, nor in the commit message)
> + return no_free_ptr(gdev);
> }
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/9] software node: allow referencing firmware nodes
2025-10-22 13:41 ` [PATCH v2 3/9] software node: allow referencing firmware nodes Bartosz Golaszewski
@ 2025-10-22 18:59 ` Andy Shevchenko
2025-10-24 7:06 ` Bartosz Golaszewski
2025-10-24 15:17 ` Sakari Ailus
1 sibling, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2025-10-22 18:59 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Linus Walleij, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Wed, Oct 22, 2025 at 03:41:02PM +0200, Bartosz Golaszewski wrote:
>
> At the moment software nodes can only reference other software nodes.
> This is a limitation for devices created, for instance, on the auxiliary
> bus with a dynamic software node attached which cannot reference devices
> the firmware node of which is "real" (as an OF node or otherwise).
>
> Make it possible for a software node to reference all firmware nodes in
> addition to static software nodes. To that end: use a union of different
Still union?
> pointers in struct software_node_ref_args and add an enum indicating
> what kind of reference given instance of it is. Rework the helper macros
> and deprecate the existing ones whose names don't indicate the reference
> type.
> Software node graphs remain the same, as in: the remote endpoints still
> have to be software nodes.
...
> - refnode = software_node_fwnode(ref->node);
> - if (!refnode)
> - return -ENOENT;
Why is this being dropped?
> + if (ref->swnode)
> + refnode = software_node_fwnode(ref->swnode);
> + else if (ref->fwnode)
> + refnode = ref->fwnode;
> + else
> + return -EINVAL;
>
...
> -#define SOFTWARE_NODE_REFERENCE(_ref_, ...) \
> +#define __SOFTWARE_NODE_REF(_ref, _type, _node, ...) \
> (const struct software_node_ref_args) { \
> - .node = _ref_, \
> + ._node = _ref, \
> .nargs = COUNT_ARGS(__VA_ARGS__), \
> .args = { __VA_ARGS__ }, \
> }
>
> +#define SOFTWARE_NODE_REF_SWNODE(_ref, ...) \
> + __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_SWNODE, \
> + swnode, __VA_ARGS__)
> +
> +#define SOFTWARE_NODE_REF_FWNODE(_ref, ...) \
> + __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_FWNODE, \
> + fwnode, __VA_ARGS__)
I do not see a point of making these three instead of two direct ones.
But I have no strong objection either.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 0/9] reset: rework reset-gpios handling
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
` (8 preceding siblings ...)
2025-10-22 13:41 ` [PATCH v2 9/9] reset: gpio: use software nodes to setup the GPIO lookup Bartosz Golaszewski
@ 2025-10-23 12:20 ` Linus Walleij
9 siblings, 0 replies; 21+ messages in thread
From: Linus Walleij @ 2025-10-23 12:20 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Wed, Oct 22, 2025 at 3:41 PM Bartosz Golaszewski <brgl@bgdev.pl> wrote:
> This series does three things: extends the software node implementation,
> allowing its properties to reference not only static software nodes but
> also existing firmware nodes, updates the GPIO property interface to use
> the reworked swnode macros and finally makes the reset-gpio code the
> first user by converting the GPIO lookup from machine to swnode.
This series as a whole look completely sound to me!
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/9] software node: allow referencing firmware nodes
2025-10-22 18:59 ` Andy Shevchenko
@ 2025-10-24 7:06 ` Bartosz Golaszewski
0 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-24 7:06 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Linus Walleij, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Wed, Oct 22, 2025 at 8:59 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> On Wed, Oct 22, 2025 at 03:41:02PM +0200, Bartosz Golaszewski wrote:
> >
> > At the moment software nodes can only reference other software nodes.
> > This is a limitation for devices created, for instance, on the auxiliary
> > bus with a dynamic software node attached which cannot reference devices
> > the firmware node of which is "real" (as an OF node or otherwise).
> >
> > Make it possible for a software node to reference all firmware nodes in
> > addition to static software nodes. To that end: use a union of different
>
> Still union?
>
Right.
> > pointers in struct software_node_ref_args and add an enum indicating
> > what kind of reference given instance of it is. Rework the helper macros
> > and deprecate the existing ones whose names don't indicate the reference
> > type.
>
> > Software node graphs remain the same, as in: the remote endpoints still
> > have to be software nodes.
>
> ...
>
> > - refnode = software_node_fwnode(ref->node);
>
> > - if (!refnode)
> > - return -ENOENT;
>
> Why is this being dropped?
>
I'll fix it.
> > + if (ref->swnode)
> > + refnode = software_node_fwnode(ref->swnode);
> > + else if (ref->fwnode)
> > + refnode = ref->fwnode;
> > + else
> > + return -EINVAL;
> >
>
> ...
>
> > -#define SOFTWARE_NODE_REFERENCE(_ref_, ...) \
> > +#define __SOFTWARE_NODE_REF(_ref, _type, _node, ...) \
> > (const struct software_node_ref_args) { \
> > - .node = _ref_, \
> > + ._node = _ref, \
> > .nargs = COUNT_ARGS(__VA_ARGS__), \
> > .args = { __VA_ARGS__ }, \
> > }
> >
> > +#define SOFTWARE_NODE_REF_SWNODE(_ref, ...) \
> > + __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_SWNODE, \
> > + swnode, __VA_ARGS__)
> > +
> > +#define SOFTWARE_NODE_REF_FWNODE(_ref, ...) \
> > + __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_FWNODE, \
> > + fwnode, __VA_ARGS__)
>
> I do not see a point of making these three instead of two direct ones.
> But I have no strong objection either.
>
Then I'll keep it for now.
Bart
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 4/9] gpio: swnode: don't use the swnode's name as the key for GPIO lookup
2025-10-22 18:44 ` Andy Shevchenko
@ 2025-10-24 7:17 ` Bartosz Golaszewski
0 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-24 7:17 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Linus Walleij, Daniel Scally, Heikki Krogerus, Sakari Ailus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Wed, Oct 22, 2025 at 8:44 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> On Wed, Oct 22, 2025 at 03:41:03PM +0200, Bartosz Golaszewski wrote:
> >
> > Looking up a GPIO controller by label that is the name of the software
> > node is wonky at best - the GPIO controller driver is free to set
> > a different label than the name of its firmware node. We're already being
> > passed a firmware node handle attached to the GPIO device to
> > swnode_get_gpio_device() so use it instead for a more precise lookup.
>
> ...
>
> > static struct gpio_device *swnode_get_gpio_device(struct fwnode_handle *fwnode)
> > {
> > + struct gpio_device *gdev __free(gpio_device_put) =
> > + gpio_device_find_by_fwnode(fwnode);
> > + if (!gdev)
> > + return ERR_PTR(-EPROBE_DEFER);
> >
> > /*
> > * Check for a special node that identifies undefined GPIOs, this is
> > * primarily used as a key for internal chip selects in SPI bindings.
> > */
> > if (IS_ENABLED(CONFIG_GPIO_SWNODE_UNDEFINED) &&
> > + !strcmp(fwnode_get_name(fwnode), GPIOLIB_SWNODE_UNDEFINED_NAME))
> > return ERR_PTR(-ENOENT);
>
> Now we might get EPROBE_DEREF for the cases when previously it was ENOENT.
> Why is this not a problem? (I haven't found the answer neither in the comment
> above, nor in the commit message)
>
Yeah, maybe it should only change the last part from looking up by
label to looking up by fwnode and leave the previous checks in place.
Bart
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/9] software node: allow referencing firmware nodes
2025-10-22 13:41 ` [PATCH v2 3/9] software node: allow referencing firmware nodes Bartosz Golaszewski
2025-10-22 18:59 ` Andy Shevchenko
@ 2025-10-24 15:17 ` Sakari Ailus
2025-10-24 15:27 ` Bartosz Golaszewski
1 sibling, 1 reply; 21+ messages in thread
From: Sakari Ailus @ 2025-10-24 15:17 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Linus Walleij, Andy Shevchenko, Daniel Scally, Heikki Krogerus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
Hi Bartosz,
On Wed, Oct 22, 2025 at 03:41:02PM +0200, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> At the moment software nodes can only reference other software nodes.
> This is a limitation for devices created, for instance, on the auxiliary
> bus with a dynamic software node attached which cannot reference devices
> the firmware node of which is "real" (as an OF node or otherwise).
That's not entirely true: you can add a software node as a secondary to an
existing OF or ACPI fwnode. This has not been used widely and it's not very
convenient to set up.
Additional properties in ACPI or OF nodes will still need the secondary
node, after these patches.
>
> Make it possible for a software node to reference all firmware nodes in
> addition to static software nodes. To that end: use a union of different
> pointers in struct software_node_ref_args and add an enum indicating
> what kind of reference given instance of it is. Rework the helper macros
> and deprecate the existing ones whose names don't indicate the reference
> type.
>
> Software node graphs remain the same, as in: the remote endpoints still
> have to be software nodes.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
> drivers/base/swnode.c | 14 ++++++++++----
> include/linux/property.h | 40 +++++++++++++++++++++++++++++++++-------
> 2 files changed, 43 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
> index b7c3926b67be72671ba4e4c442b3acca80688cf7..d08b914c07691336540cdf1dfbd77a697e7b4521 100644
> --- a/drivers/base/swnode.c
> +++ b/drivers/base/swnode.c
> @@ -535,9 +535,12 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
> ref_array = prop->pointer;
> ref = &ref_array[index];
>
> - refnode = software_node_fwnode(ref->node);
> - if (!refnode)
> - return -ENOENT;
> + if (ref->swnode)
> + refnode = software_node_fwnode(ref->swnode);
> + else if (ref->fwnode)
> + refnode = ref->fwnode;
> + else
> + return -EINVAL;
>
> if (nargs_prop) {
> error = fwnode_property_read_u32(refnode, nargs_prop,
> @@ -634,7 +637,10 @@ software_node_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
>
> ref = prop->pointer;
>
> - return software_node_get(software_node_fwnode(ref[0].node));
> + if (!ref->swnode)
> + return NULL;
> +
> + return software_node_get(software_node_fwnode(ref[0].swnode));
> }
>
> static struct fwnode_handle *
> diff --git a/include/linux/property.h b/include/linux/property.h
> index 50b26589dd70d1756f3b8644255c24a011e2617c..52e784a3dfd4c93cee8b35e1cef5e0600639ecc5 100644
> --- a/include/linux/property.h
> +++ b/include/linux/property.h
> @@ -355,23 +355,37 @@ struct software_node;
>
> /**
> * struct software_node_ref_args - Reference property with additional arguments
> - * @node: Reference to a software node
> + * @swnode: Reference to a software node
> + * @fwnode: Alternative reference to a firmware node handle
> * @nargs: Number of elements in @args array
> * @args: Integer arguments
> */
> struct software_node_ref_args {
> - const struct software_node *node;
> + const struct software_node *swnode;
> + struct fwnode_handle *fwnode;
> unsigned int nargs;
> u64 args[NR_FWNODE_REFERENCE_ARGS];
> };
>
> -#define SOFTWARE_NODE_REFERENCE(_ref_, ...) \
> +#define __SOFTWARE_NODE_REF(_ref, _type, _node, ...) \
> (const struct software_node_ref_args) { \
> - .node = _ref_, \
> + ._node = _ref, \
> .nargs = COUNT_ARGS(__VA_ARGS__), \
> .args = { __VA_ARGS__ }, \
> }
>
> +#define SOFTWARE_NODE_REF_SWNODE(_ref, ...) \
> + __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_SWNODE, \
> + swnode, __VA_ARGS__)
> +
> +#define SOFTWARE_NODE_REF_FWNODE(_ref, ...) \
> + __SOFTWARE_NODE_REF(_ref, SOFTWARE_NODE_REF_FWNODE, \
> + fwnode, __VA_ARGS__)
> +
> +/* DEPRECATED, use SOFTWARE_NODE_REF_SWNODE() instead. */
> +#define SOFTWARE_NODE_REFERENCE(_ref, ...) \
> + SOFTWARE_NODE_REF_SWNODE(_ref, __VA_ARGS__)
> +
> /**
> * struct property_entry - "Built-in" device property representation.
> * @name: Name of the property.
> @@ -463,14 +477,26 @@ struct property_entry {
> #define PROPERTY_ENTRY_STRING(_name_, _val_) \
> __PROPERTY_ENTRY_ELEMENT(_name_, str, STRING, _val_)
>
> -#define PROPERTY_ENTRY_REF(_name_, _ref_, ...) \
> +#define __PROPERTY_ENTRY_REF(_type, _name, _ref, ...) \
> (struct property_entry) { \
> - .name = _name_, \
> + .name = _name, \
> .length = sizeof(struct software_node_ref_args), \
> .type = DEV_PROP_REF, \
> - { .pointer = &SOFTWARE_NODE_REFERENCE(_ref_, ##__VA_ARGS__), }, \
> + { .pointer = &_type(_ref, ##__VA_ARGS__), }, \
> }
>
> +#define PROPERTY_ENTRY_REF_SWNODE(_name, _ref, ...) \
> + __PROPERTY_ENTRY_REF(SOFTWARE_NODE_REF_SWNODE, \
> + _name, _ref, __VA_ARGS__)
> +
> +#define PROPERTY_ENTRY_REF_FWNODE(_name, _ref, ...) \
> + __PROPERTY_ENTRY_REF(SOFTWARE_NODE_REF_FWNODE, \
> + _name, _ref, __VA_ARGS__)
> +
> +/* DEPRECATED, use PROPERTY_ENTRY_REF_SWNODE() instead. */
> +#define PROPERTY_ENTRY_REF(_name, _ref, ...) \
> + PROPERTY_ENTRY_REF_SWNODE(_name, _ref, __VA_ARGS__)
> +
> #define PROPERTY_ENTRY_BOOL(_name_) \
> (struct property_entry) { \
> .name = _name_, \
>
--
Regards,
Sakari Ailus
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2 3/9] software node: allow referencing firmware nodes
2025-10-24 15:17 ` Sakari Ailus
@ 2025-10-24 15:27 ` Bartosz Golaszewski
0 siblings, 0 replies; 21+ messages in thread
From: Bartosz Golaszewski @ 2025-10-24 15:27 UTC (permalink / raw)
To: Sakari Ailus
Cc: Linus Walleij, Andy Shevchenko, Daniel Scally, Heikki Krogerus,
Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
Philipp Zabel, Krzysztof Kozlowski, linux-gpio, linux-kernel,
linux-acpi, Bartosz Golaszewski
On Fri, Oct 24, 2025 at 5:17 PM Sakari Ailus
<sakari.ailus@linux.intel.com> wrote:
>
> Hi Bartosz,
>
> On Wed, Oct 22, 2025 at 03:41:02PM +0200, Bartosz Golaszewski wrote:
> > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> >
> > At the moment software nodes can only reference other software nodes.
> > This is a limitation for devices created, for instance, on the auxiliary
> > bus with a dynamic software node attached which cannot reference devices
> > the firmware node of which is "real" (as an OF node or otherwise).
>
> That's not entirely true: you can add a software node as a secondary to an
> existing OF or ACPI fwnode. This has not been used widely and it's not very
> convenient to set up.
First: set_secondary_fwnode() API seems to require a struct device,
what if we don't have one yet? Unless you're talking about a different
interface.
Second: are we even allowed to modify an existing fwnode from a random
place in the kernel? I mean: I'm module X and there's an fwnode Y, I
don't know what it is. Can I just arbitrarily add a secondary node to
it?
>
> Additional properties in ACPI or OF nodes will still need the secondary
> node, after these patches.
>
That's not the goal of this series. Being able to create software
nodes that reference real devices. In this particular case: a software
node for the reset-gpio device that will allow it to resolve the
reference to the physical GPIO provider.
Bart
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2025-10-24 15:27 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-22 13:40 [PATCH v2 0/9] reset: rework reset-gpios handling Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 1/9] software node: read the reference args via the fwnode API Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 2/9] software node: increase the reference of the swnode by its fwnode Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 3/9] software node: allow referencing firmware nodes Bartosz Golaszewski
2025-10-22 18:59 ` Andy Shevchenko
2025-10-24 7:06 ` Bartosz Golaszewski
2025-10-24 15:17 ` Sakari Ailus
2025-10-24 15:27 ` Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 4/9] gpio: swnode: don't use the swnode's name as the key for GPIO lookup Bartosz Golaszewski
2025-10-22 18:44 ` Andy Shevchenko
2025-10-24 7:17 ` Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 5/9] gpio: swnode: update the property definitions Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 6/9] reset: order includes alphabetically in reset/core.c Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 7/9] reset: make the provider of reset-gpios the parent of the reset device Bartosz Golaszewski
2025-10-22 14:45 ` Philipp Zabel
2025-10-22 14:52 ` Bartosz Golaszewski
2025-10-22 13:41 ` [PATCH v2 8/9] reset: gpio: convert the driver to using the auxiliary bus Bartosz Golaszewski
2025-10-22 18:38 ` Andy Shevchenko
2025-10-22 13:41 ` [PATCH v2 9/9] reset: gpio: use software nodes to setup the GPIO lookup Bartosz Golaszewski
2025-10-22 14:45 ` Philipp Zabel
2025-10-23 12:20 ` [PATCH v2 0/9] reset: rework reset-gpios handling Linus Walleij
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).