Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}