可以使用clk_register_mux()函数注册一个时钟选择器,在使用时可以通过clk_set_parent()函数设置该时钟的父时钟。 Divider Clock(时钟分频器):将输入时钟的频率分频后得到输出时钟。可以使用clk_register_divider()函数注册一个时钟分频器,在使用时可以通过clk_set_rate()函数设置该时钟的频率。 Fractional-N PLL Clo...
2、时钟使能与禁止:通过clk_enable和clk_disable函数控制clock的开关。 3、时钟频率设置:通过clk_set_rate函数设置clock的频率。 4、时钟父级关系管理:通过clk_set_parent函数设置clock的父级clock。 5、时钟状态查询:通过clk_get_rate和clk_is_enabled等函数查询clock的状态和频率。 四、时钟链表 在Linux中,所有的...
parent - clk是由parent分出来的。那么如果parent关闭了,当前clk也就没有了。 secondary - 第二时钟源,用于enable/disable当前clk。 usecount - 引用计数。 get_rate, set_rate, enable, disable, set_parent - 很显然,这些函数指针指到实际操作的函数。clk.h中的各接口函数最后都会调用到这里的函数指针。函数...
int clk_set_parent(struct clk *clk, struct clk *parent); struct clk *clk_get_parent(struct clk *clk); struct clk *clk_get_sys(const char *dev_id, const char *con_id); int clk_add_alias(const char *alias, const char *alias_dev_name, char *id, struct device *dev); ...
and possibly also pointing to the CLK_SET_PARENT_GATE flag. > On platforms that I have worked on this is OK, but I suppose there could > be some platform out there where a clock is prepared and disabled, and > briefly enabling the clock during the reparent operation somehow puts ...
这一类clock具有固定的factor(即multiplier和divider),clock的频率是由parent clock的频率,乘以mul,除以div,多用于一些具有固定分频系数的clock。由于parent clock的频率可以改变,因而fix factor clock也可该改变频率,因此也会提供.recalc_rate/.set_rate/.round_rate等回调。以第一行的clk为例,这里的"sys_pll1_50m...
_set_rate()、clk_get_parent()、clk_set_parent()等通用API,但是这些API由每个SoC单独实现,而且各个SoC供应商在实现方面的差异很大,于是内核增加了一个新的通用时钟框架以解决这个碎片化问题。之所以称为通用时钟,是因为这个通用主要体现在: 1)统一的clk结构体,统一的定义于clk.h中的clk API,这些API会调用统一...
clk->rate = clk_get_rate(clk->parent); } static int lcd_func_clk_enable(struct clk *clk) { unsigned long flags; spin_lock_irqsave(&lcd_ci_share_lock, flags); CLK_SET_BITS((LCD_CLK_EN | LCD_CLK_RST), 0); spin_unlock_irqrestore(&lcd_ci_share_lock, flags); ...
Parent clocks for muxes are cached in clk->parents to avoid frequent lookups, however the cache allocation happens only during clock registeration and later clk_set_parent() assumes a cache space available and allocated. This is not entirely true for platforms which do early clock registerations...
int (*set_phase)(struct clk *clk, int degrees); /** * set_parent() - Set current clock parent * * @clk: The clock to manipulate. * @parent: New clock parent. * @return zero on success, or -ve error code. */ int (*set_parent)(struct clk *clk, struct clk *parent); /**...