Lines Matching +full:0 +full:- +full:dev
1 // SPDX-License-Identifier: GPL-2.0+
11 #include <dm/device-internal.h>
13 #include <dm/uclass-internal.h>
27 FLAG_CHILD_REMOVED = -7,
32 static int testbus_drv_probe(struct udevice *dev) in testbus_drv_probe() argument
34 return dm_scan_fdt_dev(dev); in testbus_drv_probe()
37 static int testbus_child_post_bind(struct udevice *dev) in testbus_child_post_bind() argument
41 plat = dev_get_parent_platdata(dev); in testbus_child_post_bind()
42 plat->bind_flag = 1; in testbus_child_post_bind()
43 plat->uclass_bind_flag = 2; in testbus_child_post_bind()
45 return 0; in testbus_child_post_bind()
48 static int testbus_child_pre_probe(struct udevice *dev) in testbus_child_pre_probe() argument
50 struct dm_test_parent_data *parent_data = dev_get_parent_priv(dev); in testbus_child_pre_probe()
52 parent_data->flag += FLAG_CHILD_PROBED; in testbus_child_pre_probe()
54 return 0; in testbus_child_pre_probe()
57 static int testbus_child_pre_probe_uclass(struct udevice *dev) in testbus_child_pre_probe_uclass() argument
59 struct dm_test_priv *priv = dev_get_priv(dev); in testbus_child_pre_probe_uclass()
61 priv->uclass_flag++; in testbus_child_pre_probe_uclass()
63 return 0; in testbus_child_pre_probe_uclass()
66 static int testbus_child_post_probe_uclass(struct udevice *dev) in testbus_child_post_probe_uclass() argument
68 struct dm_test_priv *priv = dev_get_priv(dev); in testbus_child_post_probe_uclass()
70 priv->uclass_postp++; in testbus_child_post_probe_uclass()
72 return 0; in testbus_child_post_probe_uclass()
75 static int testbus_child_post_remove(struct udevice *dev) in testbus_child_post_remove() argument
77 struct dm_test_parent_data *parent_data = dev_get_parent_priv(dev); in testbus_child_post_remove()
80 parent_data->flag += FLAG_CHILD_REMOVED; in testbus_child_post_remove()
82 dms->removed = dev; in testbus_child_post_remove()
84 return 0; in testbus_child_post_remove()
89 .compatible = "denx,u-boot-test-bus",
125 ut_asserteq(num_devices, list_count_items(&uc->dev_head)); in dm_test_bus_children()
128 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_children()
132 ut_asserteq(num_devices, list_count_items(&uc->dev_head)); in dm_test_bus_children()
136 return 0; in dm_test_bus_children()
143 const void *blob = gd->fdt_blob; in dm_test_bus_children_funcs()
144 struct udevice *bus, *dev; in dm_test_bus_children_funcs() local
147 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_children_funcs()
150 ut_assertok(device_get_child(bus, 0, &dev)); in dm_test_bus_children_funcs()
151 ut_asserteq(-ENODEV, device_get_child(bus, 4, &dev)); in dm_test_bus_children_funcs()
152 ut_assertok(device_get_child_by_seq(bus, 5, &dev)); in dm_test_bus_children_funcs()
153 ut_assert(dev->flags & DM_FLAG_ACTIVATED); in dm_test_bus_children_funcs()
154 ut_asserteq_str("c-test@5", dev->name); in dm_test_bus_children_funcs()
156 /* Device with sequence number 0 should be accessible */ in dm_test_bus_children_funcs()
157 ut_asserteq(-ENODEV, device_find_child_by_seq(bus, -1, true, &dev)); in dm_test_bus_children_funcs()
158 ut_assertok(device_find_child_by_seq(bus, 0, true, &dev)); in dm_test_bus_children_funcs()
159 ut_assert(!(dev->flags & DM_FLAG_ACTIVATED)); in dm_test_bus_children_funcs()
160 ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 0, false, &dev)); in dm_test_bus_children_funcs()
161 ut_assertok(device_get_child_by_seq(bus, 0, &dev)); in dm_test_bus_children_funcs()
162 ut_assert(dev->flags & DM_FLAG_ACTIVATED); in dm_test_bus_children_funcs()
165 ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 2, false, &dev)); in dm_test_bus_children_funcs()
166 ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 2, true, &dev)); in dm_test_bus_children_funcs()
167 ut_asserteq(-ENODEV, device_get_child_by_seq(bus, 2, &dev)); in dm_test_bus_children_funcs()
171 ut_asserteq(-ENODEV, device_find_child_by_of_offset(bus, node, &dev)); in dm_test_bus_children_funcs()
172 node = fdt_path_offset(blob, "/d-test"); in dm_test_bus_children_funcs()
173 ut_asserteq(-ENODEV, device_find_child_by_of_offset(bus, node, &dev)); in dm_test_bus_children_funcs()
175 return 0; in dm_test_bus_children_funcs()
181 const void *blob = gd->fdt_blob; in dm_test_bus_children_of_offset()
182 struct udevice *bus, *dev; in dm_test_bus_children_of_offset() local
185 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_children_of_offset()
189 node = fdt_path_offset(blob, "/some-bus/c-test@1"); in dm_test_bus_children_of_offset()
190 ut_assert(node > 0); in dm_test_bus_children_of_offset()
191 ut_assertok(device_find_child_by_of_offset(bus, node, &dev)); in dm_test_bus_children_of_offset()
192 ut_assertnonnull(dev); in dm_test_bus_children_of_offset()
193 ut_assert(!(dev->flags & DM_FLAG_ACTIVATED)); in dm_test_bus_children_of_offset()
194 ut_assertok(device_get_child_by_of_offset(bus, node, &dev)); in dm_test_bus_children_of_offset()
195 ut_assertnonnull(dev); in dm_test_bus_children_of_offset()
196 ut_assert(dev->flags & DM_FLAG_ACTIVATED); in dm_test_bus_children_of_offset()
198 return 0; in dm_test_bus_children_of_offset()
206 struct udevice *bus, *dev, *child; in dm_test_bus_children_iterators() local
209 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_children_iterators()
210 ut_assertok(device_find_first_child(bus, &dev)); in dm_test_bus_children_iterators()
211 ut_asserteq_str("c-test@5", dev->name); in dm_test_bus_children_iterators()
212 ut_assertok(device_find_next_child(&dev)); in dm_test_bus_children_iterators()
213 ut_asserteq_str("c-test@0", dev->name); in dm_test_bus_children_iterators()
214 ut_assertok(device_find_next_child(&dev)); in dm_test_bus_children_iterators()
215 ut_asserteq_str("c-test@1", dev->name); in dm_test_bus_children_iterators()
216 ut_assertok(device_find_next_child(&dev)); in dm_test_bus_children_iterators()
217 ut_asserteq_ptr(dev, NULL); in dm_test_bus_children_iterators()
220 ut_assertok(device_find_child_by_seq(bus, 5, true, &dev)); in dm_test_bus_children_iterators()
221 ut_asserteq_str("c-test@5", dev->name); in dm_test_bus_children_iterators()
222 ut_assertok(device_find_next_child(&dev)); in dm_test_bus_children_iterators()
223 ut_asserteq_str("c-test@0", dev->name); in dm_test_bus_children_iterators()
226 ut_assertok(device_find_first_child(dev, &child)); in dm_test_bus_children_iterators()
229 return 0; in dm_test_bus_children_iterators()
238 struct udevice *bus, *dev; in test_bus_parent_data() local
242 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in test_bus_parent_data()
245 ut_assertok(device_find_child_by_seq(bus, 0, true, &dev)); in test_bus_parent_data()
246 ut_asserteq_ptr(NULL, dev_get_parent_priv(dev)); in test_bus_parent_data()
247 ut_assertok(device_get_child_by_seq(bus, 0, &dev)); in test_bus_parent_data()
248 parent_data = dev_get_parent_priv(dev); in test_bus_parent_data()
251 /* Check that it starts at 0 and goes away when device is removed */ in test_bus_parent_data()
252 parent_data->sum += 5; in test_bus_parent_data()
253 ut_asserteq(5, parent_data->sum); in test_bus_parent_data()
254 device_remove(dev, DM_REMOVE_NORMAL); in test_bus_parent_data()
255 ut_asserteq_ptr(NULL, dev_get_parent_priv(dev)); in test_bus_parent_data()
258 ut_assertok(device_get_child_by_seq(bus, 0, &dev)); in test_bus_parent_data()
259 parent_data = dev_get_parent_priv(dev); in test_bus_parent_data()
261 parent_data->sum += 5; in test_bus_parent_data()
262 ut_asserteq(5, parent_data->sum); in test_bus_parent_data()
267 uclass_foreach_dev(dev, uc) { in test_bus_parent_data()
269 if (dev->parent != bus) { in test_bus_parent_data()
270 ut_asserteq_ptr(NULL, dev_get_parent_priv(dev)); in test_bus_parent_data()
273 ut_assertok(device_probe(dev)); in test_bus_parent_data()
274 parent_data = dev_get_parent_priv(dev); in test_bus_parent_data()
276 parent_data->sum = value; in test_bus_parent_data()
282 uclass_foreach_dev(dev, uc) { in test_bus_parent_data()
284 if (dev->parent != bus) in test_bus_parent_data()
286 parent_data = dev_get_parent_priv(dev); in test_bus_parent_data()
288 ut_asserteq(value, parent_data->sum); in test_bus_parent_data()
292 return 0; in test_bus_parent_data()
309 /* Set the driver size to 0 so that the uclass size is used */ in dm_test_bus_parent_data_uclass()
310 ut_assertok(uclass_find_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_parent_data_uclass()
311 drv = (struct driver *)bus->driver; in dm_test_bus_parent_data_uclass()
312 size = drv->per_child_auto_alloc_size; in dm_test_bus_parent_data_uclass()
315 os_mprotect_allow(bus->uclass->uc_drv, sizeof(*bus->uclass->uc_drv)); in dm_test_bus_parent_data_uclass()
318 bus->uclass->uc_drv->per_child_auto_alloc_size = size; in dm_test_bus_parent_data_uclass()
319 drv->per_child_auto_alloc_size = 0; in dm_test_bus_parent_data_uclass()
323 bus->uclass->uc_drv->per_child_auto_alloc_size = 0; in dm_test_bus_parent_data_uclass()
324 drv->per_child_auto_alloc_size = size; in dm_test_bus_parent_data_uclass()
326 return 0; in dm_test_bus_parent_data_uclass()
335 struct dm_test_state *dms = uts->priv; in dm_test_bus_parent_ops()
336 struct udevice *bus, *dev; in dm_test_bus_parent_ops() local
340 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_parent_ops()
343 uclass_foreach_dev(dev, uc) { in dm_test_bus_parent_ops()
345 if (dev->parent != bus) in dm_test_bus_parent_ops()
347 ut_asserteq_ptr(NULL, dev_get_parent_priv(dev)); in dm_test_bus_parent_ops()
349 ut_assertok(device_probe(dev)); in dm_test_bus_parent_ops()
350 parent_data = dev_get_parent_priv(dev); in dm_test_bus_parent_ops()
351 ut_asserteq(FLAG_CHILD_PROBED, parent_data->flag); in dm_test_bus_parent_ops()
354 uclass_foreach_dev(dev, uc) { in dm_test_bus_parent_ops()
356 if (dev->parent != bus) in dm_test_bus_parent_ops()
358 parent_data = dev_get_parent_priv(dev); in dm_test_bus_parent_ops()
359 ut_asserteq(FLAG_CHILD_PROBED, parent_data->flag); in dm_test_bus_parent_ops()
360 ut_assertok(device_remove(dev, DM_REMOVE_NORMAL)); in dm_test_bus_parent_ops()
361 ut_asserteq_ptr(NULL, dev_get_parent_priv(dev)); in dm_test_bus_parent_ops()
362 ut_asserteq_ptr(dms->removed, dev); in dm_test_bus_parent_ops()
366 return 0; in dm_test_bus_parent_ops()
373 struct udevice *bus, *dev; in test_bus_parent_platdata() local
377 ut_assertok(uclass_find_device(UCLASS_TEST_BUS, 0, &bus)); in test_bus_parent_platdata()
378 device_find_first_child(bus, &dev); in test_bus_parent_platdata()
379 ut_asserteq_ptr(NULL, dev); in test_bus_parent_platdata()
381 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in test_bus_parent_platdata()
383 for (device_find_first_child(bus, &dev), child_count = 0; in test_bus_parent_platdata()
384 dev; in test_bus_parent_platdata()
385 device_find_next_child(&dev)) { in test_bus_parent_platdata()
387 plat = dev_get_parent_platdata(dev); in test_bus_parent_platdata()
394 plat->count++; in test_bus_parent_platdata()
395 ut_asserteq(1, plat->count); in test_bus_parent_platdata()
396 device_probe(dev); in test_bus_parent_platdata()
397 device_remove(dev, DM_REMOVE_NORMAL); in test_bus_parent_platdata()
399 ut_asserteq_ptr(plat, dev_get_parent_platdata(dev)); in test_bus_parent_platdata()
400 ut_asserteq(1, plat->count); in test_bus_parent_platdata()
401 ut_assertok(device_probe(dev)); in test_bus_parent_platdata()
408 for (device_find_first_child(bus, &dev), child_count = 0; in test_bus_parent_platdata()
409 dev; in test_bus_parent_platdata()
410 device_find_next_child(&dev)) { in test_bus_parent_platdata()
412 plat = dev_get_parent_platdata(dev); in test_bus_parent_platdata()
414 ut_asserteq(1, plat->count); in test_bus_parent_platdata()
421 device_find_first_child(bus, &dev); in test_bus_parent_platdata()
422 if (dev) in test_bus_parent_platdata()
423 device_unbind(dev); in test_bus_parent_platdata()
424 } while (dev); in test_bus_parent_platdata()
426 /* Now the child platdata should be removed and re-added */ in test_bus_parent_platdata()
428 for (device_find_first_child(bus, &dev), child_count = 0; in test_bus_parent_platdata()
429 dev; in test_bus_parent_platdata()
430 device_find_next_child(&dev)) { in test_bus_parent_platdata()
432 plat = dev_get_parent_platdata(dev); in test_bus_parent_platdata()
434 ut_asserteq(0, plat->count); in test_bus_parent_platdata()
439 return 0; in test_bus_parent_platdata()
457 /* Set the driver size to 0 so that the uclass size is used */ in dm_test_bus_parent_platdata_uclass()
458 ut_assertok(uclass_find_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_parent_platdata_uclass()
459 drv = (struct driver *)bus->driver; in dm_test_bus_parent_platdata_uclass()
460 size = drv->per_child_platdata_auto_alloc_size; in dm_test_bus_parent_platdata_uclass()
462 os_mprotect_allow(bus->uclass->uc_drv, sizeof(*bus->uclass->uc_drv)); in dm_test_bus_parent_platdata_uclass()
465 bus->uclass->uc_drv->per_child_platdata_auto_alloc_size = size; in dm_test_bus_parent_platdata_uclass()
466 drv->per_child_platdata_auto_alloc_size = 0; in dm_test_bus_parent_platdata_uclass()
470 bus->uclass->uc_drv->per_child_platdata_auto_alloc_size = 0; in dm_test_bus_parent_platdata_uclass()
471 drv->per_child_platdata_auto_alloc_size = size; in dm_test_bus_parent_platdata_uclass()
473 return 0; in dm_test_bus_parent_platdata_uclass()
482 struct udevice *bus, *dev; in dm_test_bus_child_post_bind() local
485 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_child_post_bind()
486 for (device_find_first_child(bus, &dev), child_count = 0; in dm_test_bus_child_post_bind()
487 dev; in dm_test_bus_child_post_bind()
488 device_find_next_child(&dev)) { in dm_test_bus_child_post_bind()
490 plat = dev_get_parent_platdata(dev); in dm_test_bus_child_post_bind()
492 ut_asserteq(1, plat->bind_flag); in dm_test_bus_child_post_bind()
497 return 0; in dm_test_bus_child_post_bind()
505 struct udevice *bus, *dev; in dm_test_bus_child_post_bind_uclass() local
508 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_child_post_bind_uclass()
509 for (device_find_first_child(bus, &dev), child_count = 0; in dm_test_bus_child_post_bind_uclass()
510 dev; in dm_test_bus_child_post_bind_uclass()
511 device_find_next_child(&dev)) { in dm_test_bus_child_post_bind_uclass()
513 plat = dev_get_parent_platdata(dev); in dm_test_bus_child_post_bind_uclass()
515 ut_asserteq(2, plat->uclass_bind_flag); in dm_test_bus_child_post_bind_uclass()
520 return 0; in dm_test_bus_child_post_bind_uclass()
531 struct udevice *bus, *dev; in dm_test_bus_child_pre_probe_uclass() local
538 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_child_pre_probe_uclass()
539 for (device_find_first_child(bus, &dev), child_count = 0; in dm_test_bus_child_pre_probe_uclass()
540 dev; in dm_test_bus_child_pre_probe_uclass()
541 device_find_next_child(&dev)) { in dm_test_bus_child_pre_probe_uclass()
542 struct dm_test_priv *priv = dev_get_priv(dev); in dm_test_bus_child_pre_probe_uclass()
546 ut_assertok(device_probe(dev)); in dm_test_bus_child_pre_probe_uclass()
548 priv = dev_get_priv(dev); in dm_test_bus_child_pre_probe_uclass()
550 ut_asserteq(1, priv->uclass_flag); in dm_test_bus_child_pre_probe_uclass()
551 ut_asserteq(1, priv->uclass_total); in dm_test_bus_child_pre_probe_uclass()
556 return 0; in dm_test_bus_child_pre_probe_uclass()
567 struct udevice *bus, *dev; in dm_test_bus_child_post_probe_uclass() local
574 ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); in dm_test_bus_child_post_probe_uclass()
575 for (device_find_first_child(bus, &dev), child_count = 0; in dm_test_bus_child_post_probe_uclass()
576 dev; in dm_test_bus_child_post_probe_uclass()
577 device_find_next_child(&dev)) { in dm_test_bus_child_post_probe_uclass()
578 struct dm_test_priv *priv = dev_get_priv(dev); in dm_test_bus_child_post_probe_uclass()
582 ut_assertok(device_probe(dev)); in dm_test_bus_child_post_probe_uclass()
584 priv = dev_get_priv(dev); in dm_test_bus_child_post_probe_uclass()
586 ut_asserteq(0, priv->uclass_postp); in dm_test_bus_child_post_probe_uclass()
591 return 0; in dm_test_bus_child_post_probe_uclass()