Files
linux/lib/kunit/fwnode.c
Bartosz Golaszewski 9fdbdb5284 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>
2026-07-15 17:47:16 +02:00

147 lines
4.1 KiB
C

// 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);