xref: /linux/lib/kunit/fwnode.c (revision 7711f4417f1870e4bfbee1a7d501f789255bc7aa)
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