xref: /rk3399_rockchip-uboot/test/dm/bus.c (revision cdc133bde9dd221319b9cf7fd99fcb4da8ba195c)
11ca7e206SSimon Glass /*
21ca7e206SSimon Glass  * Copyright (c) 2014 Google, Inc
31ca7e206SSimon Glass  *
41ca7e206SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
51ca7e206SSimon Glass  */
61ca7e206SSimon Glass 
71ca7e206SSimon Glass #include <common.h>
81ca7e206SSimon Glass #include <dm.h>
9e59f458dSSimon Glass #include <dm/device-internal.h>
101ca7e206SSimon Glass #include <dm/root.h>
111ca7e206SSimon Glass #include <dm/test.h>
12*cdc133bdSSimon Glass #include <dm/uclass-internal.h>
131ca7e206SSimon Glass #include <dm/ut.h>
141ca7e206SSimon Glass #include <dm/util.h>
151ca7e206SSimon Glass 
161ca7e206SSimon Glass DECLARE_GLOBAL_DATA_PTR;
171ca7e206SSimon Glass 
18*cdc133bdSSimon Glass struct dm_test_parent_platdata {
19*cdc133bdSSimon Glass 	int count;
20*cdc133bdSSimon Glass };
21*cdc133bdSSimon Glass 
22a327dee0SSimon Glass enum {
23a327dee0SSimon Glass 	FLAG_CHILD_PROBED	= 10,
24a327dee0SSimon Glass 	FLAG_CHILD_REMOVED	= -7,
25a327dee0SSimon Glass };
26a327dee0SSimon Glass 
27a327dee0SSimon Glass static struct dm_test_state *test_state;
28a327dee0SSimon Glass 
291ca7e206SSimon Glass static int testbus_drv_probe(struct udevice *dev)
301ca7e206SSimon Glass {
311ca7e206SSimon Glass 	return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
321ca7e206SSimon Glass }
331ca7e206SSimon Glass 
34a327dee0SSimon Glass static int testbus_child_pre_probe(struct udevice *dev)
35a327dee0SSimon Glass {
36a327dee0SSimon Glass 	struct dm_test_parent_data *parent_data = dev_get_parentdata(dev);
37a327dee0SSimon Glass 
38a327dee0SSimon Glass 	parent_data->flag += FLAG_CHILD_PROBED;
39a327dee0SSimon Glass 
40a327dee0SSimon Glass 	return 0;
41a327dee0SSimon Glass }
42a327dee0SSimon Glass 
43a327dee0SSimon Glass static int testbus_child_post_remove(struct udevice *dev)
44a327dee0SSimon Glass {
45a327dee0SSimon Glass 	struct dm_test_parent_data *parent_data = dev_get_parentdata(dev);
46a327dee0SSimon Glass 	struct dm_test_state *dms = test_state;
47a327dee0SSimon Glass 
48a327dee0SSimon Glass 	parent_data->flag += FLAG_CHILD_REMOVED;
49a327dee0SSimon Glass 	if (dms)
50a327dee0SSimon Glass 		dms->removed = dev;
51a327dee0SSimon Glass 
52a327dee0SSimon Glass 	return 0;
53a327dee0SSimon Glass }
54a327dee0SSimon Glass 
551ca7e206SSimon Glass static const struct udevice_id testbus_ids[] = {
561ca7e206SSimon Glass 	{
571ca7e206SSimon Glass 		.compatible = "denx,u-boot-test-bus",
581ca7e206SSimon Glass 		.data = DM_TEST_TYPE_FIRST },
591ca7e206SSimon Glass 	{ }
601ca7e206SSimon Glass };
611ca7e206SSimon Glass 
621ca7e206SSimon Glass U_BOOT_DRIVER(testbus_drv) = {
631ca7e206SSimon Glass 	.name	= "testbus_drv",
641ca7e206SSimon Glass 	.of_match	= testbus_ids,
651ca7e206SSimon Glass 	.id	= UCLASS_TEST_BUS,
661ca7e206SSimon Glass 	.probe	= testbus_drv_probe,
671ca7e206SSimon Glass 	.priv_auto_alloc_size = sizeof(struct dm_test_priv),
681ca7e206SSimon Glass 	.platdata_auto_alloc_size = sizeof(struct dm_test_pdata),
69e59f458dSSimon Glass 	.per_child_auto_alloc_size = sizeof(struct dm_test_parent_data),
70*cdc133bdSSimon Glass 	.per_child_platdata_auto_alloc_size =
71*cdc133bdSSimon Glass 			sizeof(struct dm_test_parent_platdata),
72a327dee0SSimon Glass 	.child_pre_probe = testbus_child_pre_probe,
73a327dee0SSimon Glass 	.child_post_remove = testbus_child_post_remove,
741ca7e206SSimon Glass };
751ca7e206SSimon Glass 
761ca7e206SSimon Glass UCLASS_DRIVER(testbus) = {
771ca7e206SSimon Glass 	.name		= "testbus",
781ca7e206SSimon Glass 	.id		= UCLASS_TEST_BUS,
791ca7e206SSimon Glass };
801ca7e206SSimon Glass 
811ca7e206SSimon Glass /* Test that we can probe for children */
821ca7e206SSimon Glass static int dm_test_bus_children(struct dm_test_state *dms)
831ca7e206SSimon Glass {
841ca7e206SSimon Glass 	int num_devices = 4;
851ca7e206SSimon Glass 	struct udevice *bus;
861ca7e206SSimon Glass 	struct uclass *uc;
871ca7e206SSimon Glass 
881ca7e206SSimon Glass 	ut_assertok(uclass_get(UCLASS_TEST_FDT, &uc));
891ca7e206SSimon Glass 	ut_asserteq(num_devices, list_count_items(&uc->dev_head));
901ca7e206SSimon Glass 
911ca7e206SSimon Glass 	/* Probe the bus, which should yield 3 more devices */
921ca7e206SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus));
931ca7e206SSimon Glass 	num_devices += 3;
941ca7e206SSimon Glass 
951ca7e206SSimon Glass 	ut_assertok(uclass_get(UCLASS_TEST_FDT, &uc));
961ca7e206SSimon Glass 	ut_asserteq(num_devices, list_count_items(&uc->dev_head));
971ca7e206SSimon Glass 
981ca7e206SSimon Glass 	ut_assert(!dm_check_devices(dms, num_devices));
991ca7e206SSimon Glass 
1001ca7e206SSimon Glass 	return 0;
1011ca7e206SSimon Glass }
1021ca7e206SSimon Glass DM_TEST(dm_test_bus_children, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
103997c87bbSSimon Glass 
104997c87bbSSimon Glass /* Test our functions for accessing children */
105997c87bbSSimon Glass static int dm_test_bus_children_funcs(struct dm_test_state *dms)
106997c87bbSSimon Glass {
107997c87bbSSimon Glass 	const void *blob = gd->fdt_blob;
108997c87bbSSimon Glass 	struct udevice *bus, *dev;
109997c87bbSSimon Glass 	int node;
110997c87bbSSimon Glass 
111997c87bbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus));
112997c87bbSSimon Glass 
113997c87bbSSimon Glass 	/* device_get_child() */
114997c87bbSSimon Glass 	ut_assertok(device_get_child(bus, 0, &dev));
115997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_get_child(bus, 4, &dev));
116997c87bbSSimon Glass 	ut_assertok(device_get_child_by_seq(bus, 5, &dev));
117997c87bbSSimon Glass 	ut_assert(dev->flags & DM_FLAG_ACTIVATED);
118997c87bbSSimon Glass 	ut_asserteq_str("c-test@5", dev->name);
119997c87bbSSimon Glass 
120997c87bbSSimon Glass 	/* Device with sequence number 0 should be accessible */
121997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_find_child_by_seq(bus, -1, true, &dev));
122997c87bbSSimon Glass 	ut_assertok(device_find_child_by_seq(bus, 0, true, &dev));
123997c87bbSSimon Glass 	ut_assert(!(dev->flags & DM_FLAG_ACTIVATED));
124997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 0, false, &dev));
125997c87bbSSimon Glass 	ut_assertok(device_get_child_by_seq(bus, 0, &dev));
126997c87bbSSimon Glass 	ut_assert(dev->flags & DM_FLAG_ACTIVATED);
127997c87bbSSimon Glass 
128997c87bbSSimon Glass 	/* There is no device with sequence number 2 */
129997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 2, false, &dev));
130997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 2, true, &dev));
131997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_get_child_by_seq(bus, 2, &dev));
132997c87bbSSimon Glass 
133997c87bbSSimon Glass 	/* Looking for something that is not a child */
134997c87bbSSimon Glass 	node = fdt_path_offset(blob, "/junk");
135997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_find_child_by_of_offset(bus, node, &dev));
136997c87bbSSimon Glass 	node = fdt_path_offset(blob, "/d-test");
137997c87bbSSimon Glass 	ut_asserteq(-ENODEV, device_find_child_by_of_offset(bus, node, &dev));
138997c87bbSSimon Glass 
139997c87bbSSimon Glass 	/* Find a valid child */
140997c87bbSSimon Glass 	node = fdt_path_offset(blob, "/some-bus/c-test@1");
141997c87bbSSimon Glass 	ut_assertok(device_find_child_by_of_offset(bus, node, &dev));
142997c87bbSSimon Glass 	ut_assert(!(dev->flags & DM_FLAG_ACTIVATED));
143997c87bbSSimon Glass 	ut_assertok(device_get_child_by_of_offset(bus, node, &dev));
144997c87bbSSimon Glass 	ut_assert(dev->flags & DM_FLAG_ACTIVATED);
145997c87bbSSimon Glass 
146997c87bbSSimon Glass 	return 0;
147997c87bbSSimon Glass }
148997c87bbSSimon Glass DM_TEST(dm_test_bus_children_funcs, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
149e59f458dSSimon Glass 
150a8981d4fSSimon Glass /* Test that we can iterate through children */
151a8981d4fSSimon Glass static int dm_test_bus_children_iterators(struct dm_test_state *dms)
152a8981d4fSSimon Glass {
153a8981d4fSSimon Glass 	struct udevice *bus, *dev, *child;
154a8981d4fSSimon Glass 
155a8981d4fSSimon Glass 	/* Walk through the children one by one */
156a8981d4fSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus));
157a8981d4fSSimon Glass 	ut_assertok(device_find_first_child(bus, &dev));
158a8981d4fSSimon Glass 	ut_asserteq_str("c-test@5", dev->name);
159a8981d4fSSimon Glass 	ut_assertok(device_find_next_child(&dev));
160a8981d4fSSimon Glass 	ut_asserteq_str("c-test@0", dev->name);
161a8981d4fSSimon Glass 	ut_assertok(device_find_next_child(&dev));
162a8981d4fSSimon Glass 	ut_asserteq_str("c-test@1", dev->name);
163a8981d4fSSimon Glass 	ut_assertok(device_find_next_child(&dev));
164a8981d4fSSimon Glass 	ut_asserteq_ptr(dev, NULL);
165a8981d4fSSimon Glass 
166a8981d4fSSimon Glass 	/* Move to the next child without using device_find_first_child() */
167a8981d4fSSimon Glass 	ut_assertok(device_find_child_by_seq(bus, 5, true, &dev));
168a8981d4fSSimon Glass 	ut_asserteq_str("c-test@5", dev->name);
169a8981d4fSSimon Glass 	ut_assertok(device_find_next_child(&dev));
170a8981d4fSSimon Glass 	ut_asserteq_str("c-test@0", dev->name);
171a8981d4fSSimon Glass 
172a8981d4fSSimon Glass 	/* Try a device with no children */
173a8981d4fSSimon Glass 	ut_assertok(device_find_first_child(dev, &child));
174a8981d4fSSimon Glass 	ut_asserteq_ptr(child, NULL);
175a8981d4fSSimon Glass 
176a8981d4fSSimon Glass 	return 0;
177a8981d4fSSimon Glass }
178a8981d4fSSimon Glass DM_TEST(dm_test_bus_children_iterators,
179a8981d4fSSimon Glass 	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
180a8981d4fSSimon Glass 
181e59f458dSSimon Glass /* Test that the bus can store data about each child */
182e59f458dSSimon Glass static int dm_test_bus_parent_data(struct dm_test_state *dms)
183e59f458dSSimon Glass {
184e59f458dSSimon Glass 	struct dm_test_parent_data *parent_data;
185e59f458dSSimon Glass 	struct udevice *bus, *dev;
186e59f458dSSimon Glass 	struct uclass *uc;
187e59f458dSSimon Glass 	int value;
188e59f458dSSimon Glass 
189e59f458dSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus));
190e59f458dSSimon Glass 
191e59f458dSSimon Glass 	/* Check that parent data is allocated */
192e59f458dSSimon Glass 	ut_assertok(device_find_child_by_seq(bus, 0, true, &dev));
193e59f458dSSimon Glass 	ut_asserteq_ptr(NULL, dev_get_parentdata(dev));
194e59f458dSSimon Glass 	ut_assertok(device_get_child_by_seq(bus, 0, &dev));
195e59f458dSSimon Glass 	parent_data = dev_get_parentdata(dev);
196e59f458dSSimon Glass 	ut_assert(NULL != parent_data);
197e59f458dSSimon Glass 
198e59f458dSSimon Glass 	/* Check that it starts at 0 and goes away when device is removed */
199e59f458dSSimon Glass 	parent_data->sum += 5;
200e59f458dSSimon Glass 	ut_asserteq(5, parent_data->sum);
201e59f458dSSimon Glass 	device_remove(dev);
202e59f458dSSimon Glass 	ut_asserteq_ptr(NULL, dev_get_parentdata(dev));
203e59f458dSSimon Glass 
204e59f458dSSimon Glass 	/* Check that we can do this twice */
205e59f458dSSimon Glass 	ut_assertok(device_get_child_by_seq(bus, 0, &dev));
206e59f458dSSimon Glass 	parent_data = dev_get_parentdata(dev);
207e59f458dSSimon Glass 	ut_assert(NULL != parent_data);
208e59f458dSSimon Glass 	parent_data->sum += 5;
209e59f458dSSimon Glass 	ut_asserteq(5, parent_data->sum);
210e59f458dSSimon Glass 
211e59f458dSSimon Glass 	/* Add parent data to all children */
212e59f458dSSimon Glass 	ut_assertok(uclass_get(UCLASS_TEST_FDT, &uc));
213e59f458dSSimon Glass 	value = 5;
214e59f458dSSimon Glass 	uclass_foreach_dev(dev, uc) {
215e59f458dSSimon Glass 		/* Ignore these if they are not on this bus */
216e59f458dSSimon Glass 		if (dev->parent != bus) {
217e59f458dSSimon Glass 			ut_asserteq_ptr(NULL, dev_get_parentdata(dev));
218e59f458dSSimon Glass 			continue;
219e59f458dSSimon Glass 		}
220e59f458dSSimon Glass 		ut_assertok(device_probe(dev));
221e59f458dSSimon Glass 		parent_data = dev_get_parentdata(dev);
222e59f458dSSimon Glass 
223e59f458dSSimon Glass 		parent_data->sum = value;
224e59f458dSSimon Glass 		value += 5;
225e59f458dSSimon Glass 	}
226e59f458dSSimon Glass 
227e59f458dSSimon Glass 	/* Check it is still there */
228e59f458dSSimon Glass 	value = 5;
229e59f458dSSimon Glass 	uclass_foreach_dev(dev, uc) {
230e59f458dSSimon Glass 		/* Ignore these if they are not on this bus */
231e59f458dSSimon Glass 		if (dev->parent != bus)
232e59f458dSSimon Glass 			continue;
233e59f458dSSimon Glass 		parent_data = dev_get_parentdata(dev);
234e59f458dSSimon Glass 
235e59f458dSSimon Glass 		ut_asserteq(value, parent_data->sum);
236e59f458dSSimon Glass 		value += 5;
237e59f458dSSimon Glass 	}
238e59f458dSSimon Glass 
239e59f458dSSimon Glass 	return 0;
240e59f458dSSimon Glass }
241e59f458dSSimon Glass 
242e59f458dSSimon Glass DM_TEST(dm_test_bus_parent_data, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
243a327dee0SSimon Glass 
244a327dee0SSimon Glass /* Test that the bus ops are called when a child is probed/removed */
245a327dee0SSimon Glass static int dm_test_bus_parent_ops(struct dm_test_state *dms)
246a327dee0SSimon Glass {
247a327dee0SSimon Glass 	struct dm_test_parent_data *parent_data;
248a327dee0SSimon Glass 	struct udevice *bus, *dev;
249a327dee0SSimon Glass 	struct uclass *uc;
250a327dee0SSimon Glass 
251a327dee0SSimon Glass 	test_state = dms;
252a327dee0SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus));
253a327dee0SSimon Glass 	ut_assertok(uclass_get(UCLASS_TEST_FDT, &uc));
254a327dee0SSimon Glass 
255a327dee0SSimon Glass 	uclass_foreach_dev(dev, uc) {
256a327dee0SSimon Glass 		/* Ignore these if they are not on this bus */
257a327dee0SSimon Glass 		if (dev->parent != bus)
258a327dee0SSimon Glass 			continue;
259a327dee0SSimon Glass 		ut_asserteq_ptr(NULL, dev_get_parentdata(dev));
260a327dee0SSimon Glass 
261a327dee0SSimon Glass 		ut_assertok(device_probe(dev));
262a327dee0SSimon Glass 		parent_data = dev_get_parentdata(dev);
263a327dee0SSimon Glass 		ut_asserteq(FLAG_CHILD_PROBED, parent_data->flag);
264a327dee0SSimon Glass 	}
265a327dee0SSimon Glass 
266a327dee0SSimon Glass 	uclass_foreach_dev(dev, uc) {
267a327dee0SSimon Glass 		/* Ignore these if they are not on this bus */
268a327dee0SSimon Glass 		if (dev->parent != bus)
269a327dee0SSimon Glass 			continue;
270a327dee0SSimon Glass 		parent_data = dev_get_parentdata(dev);
271a327dee0SSimon Glass 		ut_asserteq(FLAG_CHILD_PROBED, parent_data->flag);
272a327dee0SSimon Glass 		ut_assertok(device_remove(dev));
273a327dee0SSimon Glass 		ut_asserteq_ptr(NULL, dev_get_parentdata(dev));
274a327dee0SSimon Glass 		ut_asserteq_ptr(dms->removed, dev);
275a327dee0SSimon Glass 	}
276a327dee0SSimon Glass 	test_state = NULL;
277a327dee0SSimon Glass 
278a327dee0SSimon Glass 	return 0;
279a327dee0SSimon Glass }
280a327dee0SSimon Glass DM_TEST(dm_test_bus_parent_ops, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
281*cdc133bdSSimon Glass 
282*cdc133bdSSimon Glass /* Test that the bus can store platform data about each child */
283*cdc133bdSSimon Glass static int dm_test_bus_parent_platdata(struct dm_test_state *dms)
284*cdc133bdSSimon Glass {
285*cdc133bdSSimon Glass 	struct dm_test_parent_platdata *plat;
286*cdc133bdSSimon Glass 	struct udevice *bus, *dev;
287*cdc133bdSSimon Glass 	int child_count;
288*cdc133bdSSimon Glass 
289*cdc133bdSSimon Glass 	/* Check that the bus has no children */
290*cdc133bdSSimon Glass 	ut_assertok(uclass_find_device(UCLASS_TEST_BUS, 0, &bus));
291*cdc133bdSSimon Glass 	device_find_first_child(bus, &dev);
292*cdc133bdSSimon Glass 	ut_asserteq_ptr(NULL, dev);
293*cdc133bdSSimon Glass 
294*cdc133bdSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus));
295*cdc133bdSSimon Glass 
296*cdc133bdSSimon Glass 	for (device_find_first_child(bus, &dev), child_count = 0;
297*cdc133bdSSimon Glass 	     dev;
298*cdc133bdSSimon Glass 	     device_find_next_child(&dev)) {
299*cdc133bdSSimon Glass 		/* Check that platform data is allocated */
300*cdc133bdSSimon Glass 		plat = dev_get_parent_platdata(dev);
301*cdc133bdSSimon Glass 		ut_assert(plat != NULL);
302*cdc133bdSSimon Glass 
303*cdc133bdSSimon Glass 		/*
304*cdc133bdSSimon Glass 		 * Check that it is not affected by the device being
305*cdc133bdSSimon Glass 		 * probed/removed
306*cdc133bdSSimon Glass 		 */
307*cdc133bdSSimon Glass 		plat->count++;
308*cdc133bdSSimon Glass 		ut_asserteq(1, plat->count);
309*cdc133bdSSimon Glass 		device_probe(dev);
310*cdc133bdSSimon Glass 		device_remove(dev);
311*cdc133bdSSimon Glass 
312*cdc133bdSSimon Glass 		ut_asserteq_ptr(plat, dev_get_parent_platdata(dev));
313*cdc133bdSSimon Glass 		ut_asserteq(1, plat->count);
314*cdc133bdSSimon Glass 		ut_assertok(device_probe(dev));
315*cdc133bdSSimon Glass 		child_count++;
316*cdc133bdSSimon Glass 	}
317*cdc133bdSSimon Glass 	ut_asserteq(3, child_count);
318*cdc133bdSSimon Glass 
319*cdc133bdSSimon Glass 	/* Removing the bus should also have no effect (it is still bound) */
320*cdc133bdSSimon Glass 	device_remove(bus);
321*cdc133bdSSimon Glass 	for (device_find_first_child(bus, &dev), child_count = 0;
322*cdc133bdSSimon Glass 	     dev;
323*cdc133bdSSimon Glass 	     device_find_next_child(&dev)) {
324*cdc133bdSSimon Glass 		/* Check that platform data is allocated */
325*cdc133bdSSimon Glass 		plat = dev_get_parent_platdata(dev);
326*cdc133bdSSimon Glass 		ut_assert(plat != NULL);
327*cdc133bdSSimon Glass 		ut_asserteq(1, plat->count);
328*cdc133bdSSimon Glass 		child_count++;
329*cdc133bdSSimon Glass 	}
330*cdc133bdSSimon Glass 	ut_asserteq(3, child_count);
331*cdc133bdSSimon Glass 
332*cdc133bdSSimon Glass 	/* Unbind all the children */
333*cdc133bdSSimon Glass 	do {
334*cdc133bdSSimon Glass 		device_find_first_child(bus, &dev);
335*cdc133bdSSimon Glass 		if (dev)
336*cdc133bdSSimon Glass 			device_unbind(dev);
337*cdc133bdSSimon Glass 	} while (dev);
338*cdc133bdSSimon Glass 
339*cdc133bdSSimon Glass 	/* Now the child platdata should be removed and re-added */
340*cdc133bdSSimon Glass 	device_probe(bus);
341*cdc133bdSSimon Glass 	for (device_find_first_child(bus, &dev), child_count = 0;
342*cdc133bdSSimon Glass 	     dev;
343*cdc133bdSSimon Glass 	     device_find_next_child(&dev)) {
344*cdc133bdSSimon Glass 		/* Check that platform data is allocated */
345*cdc133bdSSimon Glass 		plat = dev_get_parent_platdata(dev);
346*cdc133bdSSimon Glass 		ut_assert(plat != NULL);
347*cdc133bdSSimon Glass 		ut_asserteq(0, plat->count);
348*cdc133bdSSimon Glass 		child_count++;
349*cdc133bdSSimon Glass 	}
350*cdc133bdSSimon Glass 	ut_asserteq(3, child_count);
351*cdc133bdSSimon Glass 
352*cdc133bdSSimon Glass 	return 0;
353*cdc133bdSSimon Glass }
354*cdc133bdSSimon Glass DM_TEST(dm_test_bus_parent_platdata, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
355