]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
software node: allow passing reference args to PROPERTY_ENTRY_REF()
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 7 Jun 2026 03:51:29 +0000 (20:51 -0700)
committerDanilo Krummrich <dakr@kernel.org>
Tue, 9 Jun 2026 22:58:04 +0000 (00:58 +0200)
When dynamically creating software nodes and properties for subsequent
use with software_node_register() current implementation of
PROPERTY_ENTRY_REF() is not suitable because it creates a temporary
instance of struct software_node_ref_args on stack which will later
disappear, and software_node_register() only does shallow copy of
properties.

Fix this by allowing to pass address of reference arguments structure
directly into PROPERTY_ENTRY_REF(), so that caller can manage lifetime
of the object properly.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/aiTo4dvKu8pyimHA@google.com
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
include/linux/property.h

index e30ef23a9af3396455d5bb19bb6d41089d81d77f..14c304db4664817a7e2ec90945d00097349e5dc3 100644 (file)
@@ -471,12 +471,18 @@ struct property_entry {
 #define PROPERTY_ENTRY_STRING(_name_, _val_)                           \
        __PROPERTY_ENTRY_ELEMENT(_name_, str, STRING, _val_)
 
+#define __PROPERTY_ENTRY_REF_ARGS(_ref_, ...)                          \
+       _Generic(_ref_,                                                 \
+                const struct software_node_ref_args *: _ref_,          \
+                struct software_node_ref_args *: _ref_,                \
+                default: &SOFTWARE_NODE_REFERENCE(_ref_, ##__VA_ARGS__))
+
 #define PROPERTY_ENTRY_REF(_name_, _ref_, ...)                         \
 (struct property_entry) {                                              \
        .name = _name_,                                                 \
        .length = sizeof(struct software_node_ref_args),                \
        .type = DEV_PROP_REF,                                           \
-       { .pointer = &SOFTWARE_NODE_REFERENCE(_ref_, ##__VA_ARGS__), }, \
+       { .pointer = __PROPERTY_ENTRY_REF_ARGS(_ref_, ##__VA_ARGS__) }, \
 }
 
 #define PROPERTY_ENTRY_BOOL(_name_)            \