实例记录的是AM335X 时钟初始化框架,具体细节还没来得及深究,仅供自己记录学习用。
/arch/arm/mach-omap2/board_generic.c
DT_MACHINE_START(AM33XX_DT, "Generic AM33XX (Flattened Device Tree)")
.reserve = omap_reserve,
.map_io = am33xx_map_io,
.init_early = am33xx_init_early,
.init_machine = omap_generic_init,
.init_late = am33xx_init_late,
.init_time = omap3_gptimer_timer_init,
.dt_compat = am33xx_boards_compat,
.restart = am33xx_restart,
MACHINE_END
时钟初始化入口,主要是在start_kernel中调用time_init,然后调用omap3_gptimer_timer_init.
----->omap_clk_init ----------------arch/arm/mach-omap2/timer.c
------>of_clk_init --------------------------driver/clk/clk.c这个函数里主要是初始化所有通过CLK_OF_DECLARE宏函数注册到__clk_of_table结构体中和DTS中设备节点对应的of_device_id结构体。通过“.compatible”匹配。一旦匹配成功,通过
CLK_OF_DECLARE宏关联的时钟初始化函数可得到执行。
如果需要新添加clk设备节点和驱动,可按上述步骤操作。
clk驱动主要集中在driver/clk/xxx.c。也可通过.compatible属性值来查找对应的代码。