使用宏“CLK_OF_DECLARE” 注册clock

来源:互联网 发布:小田切让的长相知乎 编辑:程序博客网 时间:2024/06/17 01:41

github 使用“CLK_OF_DECLARE” 例子:点击查看github,使用该宏注册clk

static void __init wm8650_pll_init(struct device_node *node){vtwm_pll_clk_init(node, PLL_TYPE_WM8650);}CLK_OF_DECLARE(wm8650_pll, "wm,wm8650-pll-clock", wm8650_pll_init);
“CLK_OF_DECLARE” 宏定义所在位置:

kernel-4.4/include/linux/clk-provider.h#define CLK_OF_DECLARE(name, compat, fn) OF_DECLARE_1(clk, name, compat, fn)/kernel-4.4/include/linux/of.h#define OF_DECLARE_1(table, name, compat, fn) \_OF_DECLARE(table, name, compat, fn, of_init_fn_1)#define _OF_DECLARE(table, name, compat, fn, fn_type)\static const struct of_device_id __of_table_##name\__used __section(__##table##_of_table)\ = { .compatible = compat,\     .data = (fn == (fn_type)NULL) ? fn : fn  }

由上方的宏定义展开“CLK_OF_DECLARE(wm8650_pll,"wm,wm8650-pll-clock", wm8650_pll_init)” 。

static const struct of_device_id __of_table_wm8650_pll__used __section(__clk_of_table) = { .compatible = "wm,wm8650-pll-clock",     .data = wm8650_pll_init   }

看上去是将“{.compatible, .data }”插入到setcion “__clk_of_table”。

“__clk_of_table” 是由“CLK_OF_TABLES()” 这个宏定义出来的:

/kernel-4.4/include/asm-generic/vmlinux.lds.h#define CLK_OF_TABLES()OF_TABLE(CONFIG_COMMON_CLK, clk)#define OF_TABLE(cfg, name)__OF_TABLE(config_enabled(cfg), name)#define _OF_TABLE_1(name)\. = ALIGN(8);\VMLINUX_SYMBOL(__##name##_of_table) = .;\*(__##name##_of_table)\*(__##name##_of_table_end)


“__clk_of_table”是在哪里被解析和应用的:
kernel-4.4/drivers/clk/clk.cvoid __init of_clk_init(const struct of_device_id *matches){if (!matches)matches = &__clk_of_table;for_each_matching_node_and_match(np, matches, &match) {parent->clk_init_cb = match->data;parent->np = of_node_get(np);list_add_tail(&parent->node, &clk_provider_list);}while (!list_empty(&clk_provider_list)) {list_for_each_entry_safe(clk_provider, next,&clk_provider_list, node) {if (force || parent_ready(clk_provider->np)) {clk_provider->clk_init_cb(clk_provider->np);  of_clk_set_defaults(clk_provider->np, true);}}}


“of_clk_init()”里遍历“__clk_of_table” ,并且回调 data 成员。
“of_clk_init()”被调用的地方:
/kernel-4.4/init/main.casmlinkage __visible void __init start_kernel(void)time_init();    /kernel-4.4/arch/arm64/kernel/time.c    void __init time_init(void)        of_clk_init(NULL);




原创粉丝点击