mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 14:33:24 -04:00
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>
147 lines
4.1 KiB
C
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);
|