使用宏“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);
阅读全文
0 0
- 使用宏“CLK_OF_DECLARE” 注册clock
- clock()函数的使用
- clock()的使用
- clock()函数的使用
- clock
- clock
- clock
- Clock
- CLOCK
- clock
- Clock
- clock
- clock
- CLOCK
- clock
- Clock
- Clock
- clock
- 一个 Linux 上分析死锁的简单方法
- 笔记·Spring框架第一天
- static 静态变量
- Java/Android设计模式<三> 代理模式
- Java项目以配置文件的方式使用spring定时
- 使用宏“CLK_OF_DECLARE” 注册clock
- FreeRTOS Suspend-Resume
- ubuntu 实现开机自动执行,类似于Windows开机自启动
- 如何将操作按钮悬浮固定在微信小程序底部?
- 详谈C++游戏程序员发展前景
- java函数按值传递和按引用传递
- Android逆向分析之Xposed的hook技术
- sqlserver(持续更新)
- 50道JAVA基础编程练习题