1*9fdbdb52SBartosz Golaszewski // SPDX-License-Identifier: GPL-2.0 2*9fdbdb52SBartosz Golaszewski /* 3*9fdbdb52SBartosz Golaszewski * Copyright (C) Qualcomm Technologies, Inc. and/or its subsidiaries 4*9fdbdb52SBartosz Golaszewski */ 5*9fdbdb52SBartosz Golaszewski 6*9fdbdb52SBartosz Golaszewski #include <kunit/fwnode.h> 7*9fdbdb52SBartosz Golaszewski #include <kunit/test.h> 8*9fdbdb52SBartosz Golaszewski 9*9fdbdb52SBartosz Golaszewski #include <linux/fwnode.h> 10*9fdbdb52SBartosz Golaszewski #include <linux/property.h> 11*9fdbdb52SBartosz Golaszewski 12*9fdbdb52SBartosz Golaszewski KUNIT_DEFINE_ACTION_WRAPPER(fwnode_remove_software_node_wrapper, 13*9fdbdb52SBartosz Golaszewski fwnode_remove_software_node, 14*9fdbdb52SBartosz Golaszewski struct fwnode_handle *); 15*9fdbdb52SBartosz Golaszewski 16*9fdbdb52SBartosz Golaszewski /** 17*9fdbdb52SBartosz Golaszewski * kunit_fwnode_create_software_node() - Create a kunit-managed software node 18*9fdbdb52SBartosz Golaszewski * @test: Test context 19*9fdbdb52SBartosz Golaszewski * @properties: Properties to use to create the new software node 20*9fdbdb52SBartosz Golaszewski * @parent: Parent of this software node 21*9fdbdb52SBartosz Golaszewski * 22*9fdbdb52SBartosz Golaszewski * Create a test-managed software node and return its firmware node handle. 23*9fdbdb52SBartosz Golaszewski * The software node is removed after the test case completes. 24*9fdbdb52SBartosz Golaszewski * 25*9fdbdb52SBartosz Golaszewski * Returns: 26*9fdbdb52SBartosz Golaszewski * Firmware node handle of the newly created software node or IS_ERR() on 27*9fdbdb52SBartosz Golaszewski * failure. 28*9fdbdb52SBartosz Golaszewski */ 29*9fdbdb52SBartosz Golaszewski struct fwnode_handle * 30*9fdbdb52SBartosz Golaszewski kunit_fwnode_create_software_node(struct kunit *test, 31*9fdbdb52SBartosz Golaszewski const struct property_entry *properties, 32*9fdbdb52SBartosz Golaszewski const struct fwnode_handle *parent) 33*9fdbdb52SBartosz Golaszewski { 34*9fdbdb52SBartosz Golaszewski struct fwnode_handle *fwnode; 35*9fdbdb52SBartosz Golaszewski int ret; 36*9fdbdb52SBartosz Golaszewski 37*9fdbdb52SBartosz Golaszewski fwnode = fwnode_create_software_node(properties, parent); 38*9fdbdb52SBartosz Golaszewski if (IS_ERR(fwnode)) 39*9fdbdb52SBartosz Golaszewski return fwnode; 40*9fdbdb52SBartosz Golaszewski 41*9fdbdb52SBartosz Golaszewski ret = kunit_add_action_or_reset(test, fwnode_remove_software_node_wrapper, 42*9fdbdb52SBartosz Golaszewski fwnode); 43*9fdbdb52SBartosz Golaszewski if (ret) 44*9fdbdb52SBartosz Golaszewski return ERR_PTR(ret); 45*9fdbdb52SBartosz Golaszewski 46*9fdbdb52SBartosz Golaszewski return fwnode; 47*9fdbdb52SBartosz Golaszewski } 48*9fdbdb52SBartosz Golaszewski EXPORT_SYMBOL_GPL(kunit_fwnode_create_software_node); 49*9fdbdb52SBartosz Golaszewski 50*9fdbdb52SBartosz Golaszewski KUNIT_DEFINE_ACTION_WRAPPER(software_node_unregister_wrapper, 51*9fdbdb52SBartosz Golaszewski software_node_unregister, 52*9fdbdb52SBartosz Golaszewski const struct software_node *); 53*9fdbdb52SBartosz Golaszewski 54*9fdbdb52SBartosz Golaszewski /** 55*9fdbdb52SBartosz Golaszewski * kunit_software_node_register() - Register a kunit-managed software node 56*9fdbdb52SBartosz Golaszewski * @test: Test context 57*9fdbdb52SBartosz Golaszewski * @swnode: Software node to register 58*9fdbdb52SBartosz Golaszewski * 59*9fdbdb52SBartosz Golaszewski * Register a test-managed software node and return its firmware node handle. 60*9fdbdb52SBartosz Golaszewski * The software node is unregistered after the test case completes. 61*9fdbdb52SBartosz Golaszewski * 62*9fdbdb52SBartosz Golaszewski * Returns: 63*9fdbdb52SBartosz Golaszewski * Firmware node handle of the registered software node or IS_ERR() on failure. 64*9fdbdb52SBartosz Golaszewski */ 65*9fdbdb52SBartosz Golaszewski struct fwnode_handle * 66*9fdbdb52SBartosz Golaszewski kunit_software_node_register(struct kunit *test, 67*9fdbdb52SBartosz Golaszewski const struct software_node *swnode) 68*9fdbdb52SBartosz Golaszewski { 69*9fdbdb52SBartosz Golaszewski struct fwnode_handle *fwnode; 70*9fdbdb52SBartosz Golaszewski int ret; 71*9fdbdb52SBartosz Golaszewski 72*9fdbdb52SBartosz Golaszewski ret = software_node_register(swnode); 73*9fdbdb52SBartosz Golaszewski if (ret) 74*9fdbdb52SBartosz Golaszewski return ERR_PTR(ret); 75*9fdbdb52SBartosz Golaszewski 76*9fdbdb52SBartosz Golaszewski fwnode = software_node_fwnode(swnode); 77*9fdbdb52SBartosz Golaszewski if (WARN_ON(!fwnode)) 78*9fdbdb52SBartosz Golaszewski return ERR_PTR(-ENOENT); 79*9fdbdb52SBartosz Golaszewski 80*9fdbdb52SBartosz Golaszewski ret = kunit_add_action_or_reset(test, software_node_unregister_wrapper, 81*9fdbdb52SBartosz Golaszewski (void *)swnode); 82*9fdbdb52SBartosz Golaszewski if (ret) 83*9fdbdb52SBartosz Golaszewski return ERR_PTR(ret); 84*9fdbdb52SBartosz Golaszewski 85*9fdbdb52SBartosz Golaszewski return fwnode; 86*9fdbdb52SBartosz Golaszewski } 87*9fdbdb52SBartosz Golaszewski EXPORT_SYMBOL_GPL(kunit_software_node_register); 88*9fdbdb52SBartosz Golaszewski 89*9fdbdb52SBartosz Golaszewski KUNIT_DEFINE_ACTION_WRAPPER(software_node_unregister_node_group_wrapper, 90*9fdbdb52SBartosz Golaszewski software_node_unregister_node_group, 91*9fdbdb52SBartosz Golaszewski const struct software_node *const *); 92*9fdbdb52SBartosz Golaszewski 93*9fdbdb52SBartosz Golaszewski /** 94*9fdbdb52SBartosz Golaszewski * kunit_software_node_register_node_group() - Register a kunit-managed software node group 95*9fdbdb52SBartosz Golaszewski * @test: Test context 96*9fdbdb52SBartosz Golaszewski * @nodes: Software node group to register 97*9fdbdb52SBartosz Golaszewski * 98*9fdbdb52SBartosz Golaszewski * Register a test-managed software node group. The nodes are unregistered 99*9fdbdb52SBartosz Golaszewski * after the test case completes. 100*9fdbdb52SBartosz Golaszewski * 101*9fdbdb52SBartosz Golaszewski * Returns: 102*9fdbdb52SBartosz Golaszewski * 0 on success, negative error number on failure. 103*9fdbdb52SBartosz Golaszewski */ 104*9fdbdb52SBartosz Golaszewski int kunit_software_node_register_node_group(struct kunit *test, 105*9fdbdb52SBartosz Golaszewski const struct software_node *const *nodes) 106*9fdbdb52SBartosz Golaszewski { 107*9fdbdb52SBartosz Golaszewski int ret; 108*9fdbdb52SBartosz Golaszewski 109*9fdbdb52SBartosz Golaszewski ret = software_node_register_node_group(nodes); 110*9fdbdb52SBartosz Golaszewski if (ret) 111*9fdbdb52SBartosz Golaszewski return ret; 112*9fdbdb52SBartosz Golaszewski 113*9fdbdb52SBartosz Golaszewski return kunit_add_action_or_reset(test, software_node_unregister_node_group_wrapper, 114*9fdbdb52SBartosz Golaszewski (void *)nodes); 115*9fdbdb52SBartosz Golaszewski } 116*9fdbdb52SBartosz Golaszewski EXPORT_SYMBOL_GPL(kunit_software_node_register_node_group); 117*9fdbdb52SBartosz Golaszewski 118*9fdbdb52SBartosz Golaszewski KUNIT_DEFINE_ACTION_WRAPPER(device_remove_software_node_wrapper, 119*9fdbdb52SBartosz Golaszewski device_remove_software_node, 120*9fdbdb52SBartosz Golaszewski struct device *); 121*9fdbdb52SBartosz Golaszewski 122*9fdbdb52SBartosz Golaszewski /** 123*9fdbdb52SBartosz Golaszewski * kunit_device_add_software_node() - Assign a kunit-managed software node to a device 124*9fdbdb52SBartosz Golaszewski * @test: Test context 125*9fdbdb52SBartosz Golaszewski * @dev: Device to assign the software node for 126*9fdbdb52SBartosz Golaszewski * @node: The software node to assign 127*9fdbdb52SBartosz Golaszewski * 128*9fdbdb52SBartosz Golaszewski * Make @node the secondary firmware node of @dev. If @dev has no primary 129*9fdbdb52SBartosz Golaszewski * firmware node, @node will become the primary node. The software node will 130*9fdbdb52SBartosz Golaszewski * be automatically removed from @dev when the test case completes. 131*9fdbdb52SBartosz Golaszewski * 132*9fdbdb52SBartosz Golaszewski * Returns: 133*9fdbdb52SBartosz Golaszewski * 0 on success, negative error number on failure. 134*9fdbdb52SBartosz Golaszewski */ 135*9fdbdb52SBartosz Golaszewski int kunit_device_add_software_node(struct kunit *test, struct device *dev, 136*9fdbdb52SBartosz Golaszewski const struct software_node *node) 137*9fdbdb52SBartosz Golaszewski { 138*9fdbdb52SBartosz Golaszewski int ret; 139*9fdbdb52SBartosz Golaszewski 140*9fdbdb52SBartosz Golaszewski ret = device_add_software_node(dev, node); 141*9fdbdb52SBartosz Golaszewski if (ret) 142*9fdbdb52SBartosz Golaszewski return ret; 143*9fdbdb52SBartosz Golaszewski 144*9fdbdb52SBartosz Golaszewski return kunit_add_action_or_reset(test, device_remove_software_node_wrapper, dev); 145*9fdbdb52SBartosz Golaszewski } 146*9fdbdb52SBartosz Golaszewski EXPORT_SYMBOL_GPL(kunit_device_add_software_node); 147