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