include/dm/device.h
/* Declare a new U-Boot driver */ #define U_BOOT_DRIVER(__name) \ ll_entry_declare(struct driver, __name, driver)
/* Get a pointer to a given driver */ #define DM_GET_DRIVER(__name) \ ll_entry_get(struct driver, __name, driver)
include/linker_lists.h
#define ll_entry_declare(_type, _name, _list) \ _type _u_boot_list_2_##_list##_2_##_name __aligned(4) \ __attribute__((unused, \ section(".u_boot_list_2_"#_list"_2_"#_name)))
#define ll_entry_get(_type, _name, _list) \ ({ \ extern _type _u_boot_list_2_##_list##_2_##_name; \ _type *_ll_result = \ &_u_boot_list_2_##_list##_2_##_name; \ _ll_result; \ })
示例:
U_BOOT_DRIVER(pmic_act8846) = { .name = "act8846 pmic", .id = UCLASS_PMIC, .of_match = act8846_ids, .bind = act8846_bind, .ops = &act8846_ops, };
U_BOOT_DRIVER(at91_master_clk) = { .name = "at91-master-clk", .id = UCLASS_CLK, .of_match = at91_master_clk_match, .ops = &at91_master_clk_ops, };
U_BOOT_DRIVER(i2c_designware) = { .name = "i2c_designware", .id = UCLASS_I2C, .of_match = designware_i2c_ids, .bind = designware_i2c_bind, .probe = designware_i2c_probe, .priv_auto_alloc_size = sizeof(struct dw_i2c), .ops = &designware_i2c_ops, };