Boot Loader/U-BOOT

static int initf_dm(void)

최재국 2019. 9. 30. 15:38

/common/board_f.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static int initf_dm(void)
{
#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN)
    int ret;
 
    ret = dm_init_and_scan(true);
    if (ret)
        return ret;
#endif
#ifdef CONFIG_TIMER_EARLY
    ret = dm_timer_init();
    if (ret)
        return ret;
#endif
 
    return 0;
}
 
 

 

 

/drivers/core/root.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int dm_init_and_scan(bool pre_reloc_only)
{
    int ret;
 
    ret = dm_init();
    if (ret) {
        debug("dm_init() failed: %d\n", ret);
        return ret;
    }
    ret = dm_scan_platdata(pre_reloc_only);
    if (ret) {
        debug("dm_scan_platdata() failed: %d\n", ret);
        return ret;
    }
 
    if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
        ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
        if (ret) {
            debug("dm_scan_fdt() failed: %d\n", ret);
            return ret;
        }
    }
 
    ret = dm_scan_other(pre_reloc_only);
    if (ret)
        return ret;
 
    return 0;
}
 
 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int dm_init(void)
{
    int ret;
 
    if (gd->dm_root) {
        dm_warn("Virtual root driver already exists!\n");
        return -EINVAL;
    }
    INIT_LIST_HEAD(&DM_UCLASS_ROOT_NON_CONST);
 
#if defined(CONFIG_NEEDS_MANUAL_RELOC)
    fix_drivers();
    fix_uclass();
    fix_devices();
#endif
 
    ret = device_bind_by_name(NULLfalse&root_info, &DM_ROOT_NON_CONST);
    if (ret)
        return ret;
#if CONFIG_IS_ENABLED(OF_CONTROL)
    DM_ROOT_NON_CONST->of_offset = 0;
#endif
    ret = device_probe(DM_ROOT_NON_CONST);
    if (ret)
        return ret;
 
    return 0;
}
 
 

 

/include/linux/list.h

1
2
3
4
5
static inline void INIT_LIST_HEAD(struct list_head *list)
{
    list->next = list;
    list->prev = list;
}
 
 

 

 

/include/dm/device-internal.h

1
2
#define DM_ROOT_NON_CONST        (((gd_t *)gd)->dm_root)
#define DM_UCLASS_ROOT_NON_CONST    (((gd_t *)gd)->uclass_root)
 

/drivers/core/device.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
            const struct driver_info *info, struct udevice **devp)
{
    struct driver *drv;
    uint platdata_size = 0;
 
    drv = lists_driver_lookup_name(info->name);
    if (!drv)
        return -ENOENT;
    if (pre_reloc_only && !(drv->flags & DM_FLAG_PRE_RELOC))
        return -EPERM;
 
#if CONFIG_IS_ENABLED(OF_PLATDATA)
    platdata_size = info->platdata_size;
#endif
    return device_bind_common(parent, drv, info->name,
            (void *)info->platdata, 0-1, platdata_size, devp);
}