kunit: provide a set of fwnode-oriented helpers

Provide three new kunit-managed helpers for test cases that need to
register/create dynamic software nodes.

Reviewed-by: David Gow <david@davidgow.net>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Link: https://patch.msgid.link/20260713-swnode-fw-devlink-v4-1-d4f2dee27ad9@oss.qualcomm.com
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
Bartosz Golaszewski
2026-07-15 17:47:16 +02:00
committed by Danilo Krummrich
parent dc59e4fea9
commit 9fdbdb5284
3 changed files with 176 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* KUnit resource management helpers for firmware nodes.
*
* Copyright (C) Qualcomm Technologies, Inc. and/or its subsidiaries
*/
#ifndef _KUNIT_FWNODE_H
#define _KUNIT_FWNODE_H
struct device;
struct fwnode_handle;
struct kunit;
struct property_entry;
struct software_node;
struct fwnode_handle *
kunit_fwnode_create_software_node(struct kunit *test,
const struct property_entry *properties,
const struct fwnode_handle *parent);
struct fwnode_handle *
kunit_software_node_register(struct kunit *test,
const struct software_node *node);
int kunit_software_node_register_node_group(struct kunit *test,
const struct software_node *const *nodes);
int kunit_device_add_software_node(struct kunit *test, struct device *dev,
const struct software_node *node);
#endif /* _KUNIT_FWNODE_H */
+1
View File
@@ -11,6 +11,7 @@ kunit-objs += test.o \
attributes.o \
device.o \
platform.o \
fwnode.o \
bug.o
ifeq ($(CONFIG_KUNIT_DEBUGFS),y)
+146
View File
@@ -0,0 +1,146 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) Qualcomm Technologies, Inc. and/or its subsidiaries
*/
#include <kunit/fwnode.h>
#include <kunit/test.h>
#include <linux/fwnode.h>
#include <linux/property.h>
KUNIT_DEFINE_ACTION_WRAPPER(fwnode_remove_software_node_wrapper,
fwnode_remove_software_node,
struct fwnode_handle *);
/**
* kunit_fwnode_create_software_node() - Create a kunit-managed software node
* @test: Test context
* @properties: Properties to use to create the new software node
* @parent: Parent of this software node
*
* Create a test-managed software node and return its firmware node handle.
* The software node is removed after the test case completes.
*
* Returns:
* Firmware node handle of the newly created software node or IS_ERR() on
* failure.
*/
struct fwnode_handle *
kunit_fwnode_create_software_node(struct kunit *test,
const struct property_entry *properties,
const struct fwnode_handle *parent)
{
struct fwnode_handle *fwnode;
int ret;
fwnode = fwnode_create_software_node(properties, parent);
if (IS_ERR(fwnode))
return fwnode;
ret = kunit_add_action_or_reset(test, fwnode_remove_software_node_wrapper,
fwnode);
if (ret)
return ERR_PTR(ret);
return fwnode;
}
EXPORT_SYMBOL_GPL(kunit_fwnode_create_software_node);
KUNIT_DEFINE_ACTION_WRAPPER(software_node_unregister_wrapper,
software_node_unregister,
const struct software_node *);
/**
* kunit_software_node_register() - Register a kunit-managed software node
* @test: Test context
* @swnode: Software node to register
*
* Register a test-managed software node and return its firmware node handle.
* The software node is unregistered after the test case completes.
*
* Returns:
* Firmware node handle of the registered software node or IS_ERR() on failure.
*/
struct fwnode_handle *
kunit_software_node_register(struct kunit *test,
const struct software_node *swnode)
{
struct fwnode_handle *fwnode;
int ret;
ret = software_node_register(swnode);
if (ret)
return ERR_PTR(ret);
fwnode = software_node_fwnode(swnode);
if (WARN_ON(!fwnode))
return ERR_PTR(-ENOENT);
ret = kunit_add_action_or_reset(test, software_node_unregister_wrapper,
(void *)swnode);
if (ret)
return ERR_PTR(ret);
return fwnode;
}
EXPORT_SYMBOL_GPL(kunit_software_node_register);
KUNIT_DEFINE_ACTION_WRAPPER(software_node_unregister_node_group_wrapper,
software_node_unregister_node_group,
const struct software_node *const *);
/**
* kunit_software_node_register_node_group() - Register a kunit-managed software node group
* @test: Test context
* @nodes: Software node group to register
*
* Register a test-managed software node group. The nodes are unregistered
* after the test case completes.
*
* Returns:
* 0 on success, negative error number on failure.
*/
int kunit_software_node_register_node_group(struct kunit *test,
const struct software_node *const *nodes)
{
int ret;
ret = software_node_register_node_group(nodes);
if (ret)
return ret;
return kunit_add_action_or_reset(test, software_node_unregister_node_group_wrapper,
(void *)nodes);
}
EXPORT_SYMBOL_GPL(kunit_software_node_register_node_group);
KUNIT_DEFINE_ACTION_WRAPPER(device_remove_software_node_wrapper,
device_remove_software_node,
struct device *);
/**
* kunit_device_add_software_node() - Assign a kunit-managed software node to a device
* @test: Test context
* @dev: Device to assign the software node for
* @node: The software node to assign
*
* Make @node the secondary firmware node of @dev. If @dev has no primary
* firmware node, @node will become the primary node. The software node will
* be automatically removed from @dev when the test case completes.
*
* Returns:
* 0 on success, negative error number on failure.
*/
int kunit_device_add_software_node(struct kunit *test, struct device *dev,
const struct software_node *node)
{
int ret;
ret = device_add_software_node(dev, node);
if (ret)
return ret;
return kunit_add_action_or_reset(test, device_remove_software_node_wrapper, dev);
}
EXPORT_SYMBOL_GPL(kunit_device_add_software_node);