xref: /rk3399_rockchip-uboot/test/dm/bus.c (revision ba8da9dc43ac8ae3351345df12dc7f9d1cd07ae0)
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>
12cdc133bdSSimon 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 
18cdc133bdSSimon Glass struct dm_test_parent_platdata {
19cdc133bdSSimon Glass 	int count;
20cdc133bdSSimon Glass };
21cdc133bdSSimon 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),
70cdc133bdSSimon Glass 	.per_child_platdata_auto_alloc_size =
71cdc133bdSSimon 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);
281cdc133bdSSimon Glass 
282*ba8da9dcSSimon Glass static int test_bus_parent_platdata(struct dm_test_state *dms)
283cdc133bdSSimon Glass {
284cdc133bdSSimon Glass 	struct dm_test_parent_platdata *plat;
285cdc133bdSSimon Glass 	struct udevice *bus, *dev;
286cdc133bdSSimon Glass 	int child_count;
287cdc133bdSSimon Glass 
288cdc133bdSSimon Glass 	/* Check that the bus has no children */
289cdc133bdSSimon Glass 	ut_assertok(uclass_find_device(UCLASS_TEST_BUS, 0, &bus));
290cdc133bdSSimon Glass 	device_find_first_child(bus, &dev);
291cdc133bdSSimon Glass 	ut_asserteq_ptr(NULL, dev);
292cdc133bdSSimon Glass 
293cdc133bdSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus));
294cdc133bdSSimon Glass 
295cdc133bdSSimon Glass 	for (device_find_first_child(bus, &dev), child_count = 0;
296cdc133bdSSimon Glass 	     dev;
297cdc133bdSSimon Glass 	     device_find_next_child(&dev)) {
298cdc133bdSSimon Glass 		/* Check that platform data is allocated */
299cdc133bdSSimon Glass 		plat = dev_get_parent_platdata(dev);
300cdc133bdSSimon Glass 		ut_assert(plat != NULL);
301cdc133bdSSimon Glass 
302cdc133bdSSimon Glass 		/*
303cdc133bdSSimon Glass 		 * Check that it is not affected by the device being
304cdc133bdSSimon Glass 		 * probed/removed
305cdc133bdSSimon Glass 		 */
306cdc133bdSSimon Glass 		plat->count++;
307cdc133bdSSimon Glass 		ut_asserteq(1, plat->count);
308cdc133bdSSimon Glass 		device_probe(dev);
309cdc133bdSSimon Glass 		device_remove(dev);
310cdc133bdSSimon Glass 
311cdc133bdSSimon Glass 		ut_asserteq_ptr(plat, dev_get_parent_platdata(dev));
312cdc133bdSSimon Glass 		ut_asserteq(1, plat->count);
313cdc133bdSSimon Glass 		ut_assertok(device_probe(dev));
314cdc133bdSSimon Glass 		child_count++;
315cdc133bdSSimon Glass 	}
316cdc133bdSSimon Glass 	ut_asserteq(3, child_count);
317cdc133bdSSimon Glass 
318cdc133bdSSimon Glass 	/* Removing the bus should also have no effect (it is still bound) */
319cdc133bdSSimon Glass 	device_remove(bus);
320cdc133bdSSimon Glass 	for (device_find_first_child(bus, &dev), child_count = 0;
321cdc133bdSSimon Glass 	     dev;
322cdc133bdSSimon Glass 	     device_find_next_child(&dev)) {
323cdc133bdSSimon Glass 		/* Check that platform data is allocated */
324cdc133bdSSimon Glass 		plat = dev_get_parent_platdata(dev);
325cdc133bdSSimon Glass 		ut_assert(plat != NULL);
326cdc133bdSSimon Glass 		ut_asserteq(1, plat->count);
327cdc133bdSSimon Glass 		child_count++;
328cdc133bdSSimon Glass 	}
329cdc133bdSSimon Glass 	ut_asserteq(3, child_count);
330cdc133bdSSimon Glass 
331cdc133bdSSimon Glass 	/* Unbind all the children */
332cdc133bdSSimon Glass 	do {
333cdc133bdSSimon Glass 		device_find_first_child(bus, &dev);
334cdc133bdSSimon Glass 		if (dev)
335cdc133bdSSimon Glass 			device_unbind(dev);
336cdc133bdSSimon Glass 	} while (dev);
337cdc133bdSSimon Glass 
338cdc133bdSSimon Glass 	/* Now the child platdata should be removed and re-added */
339cdc133bdSSimon Glass 	device_probe(bus);
340cdc133bdSSimon Glass 	for (device_find_first_child(bus, &dev), child_count = 0;
341cdc133bdSSimon Glass 	     dev;
342cdc133bdSSimon Glass 	     device_find_next_child(&dev)) {
343cdc133bdSSimon Glass 		/* Check that platform data is allocated */
344cdc133bdSSimon Glass 		plat = dev_get_parent_platdata(dev);
345cdc133bdSSimon Glass 		ut_assert(plat != NULL);
346cdc133bdSSimon Glass 		ut_asserteq(0, plat->count);
347cdc133bdSSimon Glass 		child_count++;
348cdc133bdSSimon Glass 	}
349cdc133bdSSimon Glass 	ut_asserteq(3, child_count);
350cdc133bdSSimon Glass 
351cdc133bdSSimon Glass 	return 0;
352cdc133bdSSimon Glass }
353*ba8da9dcSSimon Glass 
354*ba8da9dcSSimon Glass /* Test that the bus can store platform data about each child */
355*ba8da9dcSSimon Glass static int dm_test_bus_parent_platdata(struct dm_test_state *dms)
356*ba8da9dcSSimon Glass {
357*ba8da9dcSSimon Glass 	return test_bus_parent_platdata(dms);
358*ba8da9dcSSimon Glass }
359cdc133bdSSimon Glass DM_TEST(dm_test_bus_parent_platdata, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
360*ba8da9dcSSimon Glass 
361*ba8da9dcSSimon Glass /* As above but the size is controlled by the uclass */
362*ba8da9dcSSimon Glass static int dm_test_bus_parent_platdata_uclass(struct dm_test_state *dms)
363*ba8da9dcSSimon Glass {
364*ba8da9dcSSimon Glass 	struct udevice *bus;
365*ba8da9dcSSimon Glass 	int size;
366*ba8da9dcSSimon Glass 	int ret;
367*ba8da9dcSSimon Glass 
368*ba8da9dcSSimon Glass 	/* Set the driver size to 0 so that the uclass size is used */
369*ba8da9dcSSimon Glass 	ut_assertok(uclass_find_device(UCLASS_TEST_BUS, 0, &bus));
370*ba8da9dcSSimon Glass 	size = bus->driver->per_child_platdata_auto_alloc_size;
371*ba8da9dcSSimon Glass 	bus->uclass->uc_drv->per_child_platdata_auto_alloc_size = size;
372*ba8da9dcSSimon Glass 	bus->driver->per_child_platdata_auto_alloc_size = 0;
373*ba8da9dcSSimon Glass 	ret = test_bus_parent_platdata(dms);
374*ba8da9dcSSimon Glass 	if (ret)
375*ba8da9dcSSimon Glass 		return ret;
376*ba8da9dcSSimon Glass 	bus->uclass->uc_drv->per_child_platdata_auto_alloc_size = 0;
377*ba8da9dcSSimon Glass 	bus->driver->per_child_platdata_auto_alloc_size = size;
378*ba8da9dcSSimon Glass 
379*ba8da9dcSSimon Glass 	return 0;
380*ba8da9dcSSimon Glass }
381*ba8da9dcSSimon Glass DM_TEST(dm_test_bus_parent_platdata_uclass,
382*ba8da9dcSSimon Glass 	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
383