u-boot device_alloc_priv函数

 

 

分配设备的私有数据

static int device_alloc_priv(struct udevice *dev)
{
    const struct driver *drv;
    void *ptr;
    int size;
//通过设备来获得他的驱动
    drv = dev->driver;
    assert(drv);
//设定dev->priv指针和分配空间
    /* Allocate private data if requested and not reentered */
    if (drv->priv_auto && !dev_get_priv(dev)) {
        ptr = alloc_priv(drv->priv_auto, drv->flags);
        if (!ptr)
            return -ENOMEM;
        dev_set_priv(dev, ptr);
    }
//设定dev->uclass_priv_指针和分配空间
    /* Allocate private data if requested and not reentered */
    size = dev->uclass->uc_drv->per_device_auto;
    if (size && !dev_get_uclass_priv(dev)) {
        ptr = alloc_priv(size, dev->uclass->uc_drv->flags);
        if (!ptr)
            return -ENOMEM;
        dev_set_uclass_priv(dev, ptr);
    }
//设定dev->parent_priv_指针和分配空间
    /* Allocate parent data for this child */
    if (dev->parent) {
        size = dev->parent->driver->per_child_auto;
        if (!size)
            size = dev->parent->uclass->uc_drv->per_child_auto;
        if (size && !dev_get_parent_priv(dev)) {
            ptr = alloc_priv(size, drv->flags);
            if (!ptr)
                return -ENOMEM;
            dev_set_parent_priv(dev, ptr);
        }
    }

    return 0;
}



//
//DM_FLAG_ALLOC_PRIV_DMA
//


static void *alloc_priv(int size, uint flags)
{
    void *priv;

    if (flags & DM_FLAG_ALLOC_PRIV_DMA) {
        size = ROUND(size, ARCH_DMA_MINALIGN);
        priv = memalign(ARCH_DMA_MINALIGN, size);
        if (priv) {
            memset(priv, '\0', size);
 
#ifndef CONFIG_MICROBLAZE
            flush_dcache_range((ulong)priv, (ulong)priv + size);
#endif
        }
    } else {
        priv = calloc(1, size);
    }

    return priv;
}



posted @ 2022-02-21 20:28  liujunhuasd  阅读(96)  评论(0编辑  收藏  举报