static int i2c_bus_fdt_init(char *node_path, FDTMachineInfo *fdti, void *priv) { Object *parent; DeviceState *dev; char parent_node_path[DT_PATH_LENGTH]; char *node_name = qemu_devtree_get_node_name(fdti->fdt, node_path); DB_PRINT_NP(1, "\n"); /* FIXME: share this code with fdt_generic_util.c/fdt_init_qdev() */ if (qemu_devtree_getparent(fdti->fdt, parent_node_path, node_path)) { abort(); } while (!fdt_init_has_opaque(fdti, parent_node_path)) { fdt_init_yield(fdti); } parent = fdt_init_get_opaque(fdti, parent_node_path); dev = (DeviceState *)object_dynamic_cast(parent, TYPE_DEVICE); if (parent && dev) { while (!dev->realized) { fdt_init_yield(fdti); } DB_PRINT_NP(0, "parenting i2c bus to %s bus %s\n", parent_node_path, node_name); fdt_init_set_opaque(fdti, node_path, qdev_get_child_bus(dev, node_name)); } else { DB_PRINT_NP(0, "orphaning i2c bus\n"); } return 0; }
hwaddr fdt_get_parent_base(const char *node_path, FDTMachineInfo *fdti) { hwaddr base = fdti->sysbus_base; char parent[DT_PATH_LENGTH]; if (!qemu_devtree_getparent(fdti->fdt, parent, node_path)) { do { Error *errp = NULL; int64_t parent_base = 0; parent_base = qemu_devtree_getprop_cell(fdti->fdt, parent, "reg", 0, false, &errp); if (errp == NULL) { base += (hwaddr)parent_base; } } while (!qemu_devtree_getparent(fdti->fdt, parent, parent)); } return base; }