/* Test our functions for accessing children */ static int dm_test_bus_children_funcs(struct unit_test_state *uts) { const void *blob = gd->fdt_blob; struct udevice *bus, *dev; int node; ut_assertok(uclass_get_device(UCLASS_TEST_BUS, 0, &bus)); /* device_get_child() */ ut_assertok(device_get_child(bus, 0, &dev)); ut_asserteq(-ENODEV, device_get_child(bus, 4, &dev)); ut_assertok(device_get_child_by_seq(bus, 5, &dev)); ut_assert(dev->flags & DM_FLAG_ACTIVATED); ut_asserteq_str("c-test@5", dev->name); /* Device with sequence number 0 should be accessible */ ut_asserteq(-ENODEV, device_find_child_by_seq(bus, -1, true, &dev)); ut_assertok(device_find_child_by_seq(bus, 0, true, &dev)); ut_assert(!(dev->flags & DM_FLAG_ACTIVATED)); ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 0, false, &dev)); ut_assertok(device_get_child_by_seq(bus, 0, &dev)); ut_assert(dev->flags & DM_FLAG_ACTIVATED); /* There is no device with sequence number 2 */ ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 2, false, &dev)); ut_asserteq(-ENODEV, device_find_child_by_seq(bus, 2, true, &dev)); ut_asserteq(-ENODEV, device_get_child_by_seq(bus, 2, &dev)); /* Looking for something that is not a child */ node = fdt_path_offset(blob, "/junk"); ut_asserteq(-ENODEV, device_find_child_by_of_offset(bus, node, &dev)); node = fdt_path_offset(blob, "/d-test"); ut_asserteq(-ENODEV, device_find_child_by_of_offset(bus, node, &dev)); /* Find a valid child */ node = fdt_path_offset(blob, "/some-bus/c-test@1"); ut_assertok(device_find_child_by_of_offset(bus, node, &dev)); ut_assert(!(dev->flags & DM_FLAG_ACTIVATED)); ut_assertok(device_get_child_by_of_offset(bus, node, &dev)); ut_assert(dev->flags & DM_FLAG_ACTIVATED); return 0; }
static int sunxi_gpio_xlate(struct udevice *dev, struct gpio_desc *desc, struct ofnode_phandle_args *args) { int ret; ret = device_get_child(dev, args->args[0], &desc->dev); if (ret) return ret; desc->offset = args->args[1]; desc->flags = args->args[2] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0; return 0; }
/* Test if it's possible to read bus directly and indirectly */ static int dm_test_spmi_access(struct unit_test_state *uts) { const char *pmic_name = "pm8916@0"; struct udevice *bus, *pmic; ut_assertok(uclass_get_device(UCLASS_SPMI, 0, &bus)); ut_assertok(device_get_child(bus, 0, &pmic)); /* Sanity check if it's proper PMIC */ ut_asserteq_str(pmic_name, pmic->name); /* Read PMIC ID reg using SPMI bus - it assumes it has slaveID == 0*/ ut_asserteq(spmi_reg_read(bus, 0, 0xC0, 0x4), 0x10); ut_asserteq(spmi_reg_read(bus, 0, 0xC0, 0x5), 0x5); /* Read ID reg via pmic interface */ ut_asserteq(pmic_reg_read(pmic, 0xC004), 0x10); ut_asserteq(pmic_reg_read(pmic, 0xC005), 0x5); return 0; }