我们在编写或修改驱动时,经常会遇到时钟相关的问题,不知道从什么地方下手。在本文中,以i.MX6的3.0.35版本的内核举例时钟如何获取和使用。
我们常见的获取时钟的方法
❶ 通过名称获取
例如:获取时钟clko
clko = clk_get(NULL, “clko_clk”);
❷ 通过设备获取
例如在音频接口ssi的驱动中获时钟,
ssi->clk = clk_get(&pdev->dev, NULL); //设备的名字是 “imx-ssi”
我们可以通过查看函数clk_get的原型来进一步查看始终是怎么获取的
struct clk *clk_get(struct device *dev, const char *con_id)
{
const char *dev_id = dev ? dev_name(dev) : NULL;
return clk_get_sys(dev_id, con_id);
}
我们继续查看函数clk_get_sys,此函数通过设备的名字或时钟的名字来获取时钟
struct clk *clk_get_sys(const char *dev_id, const char *con_id)
{
struct clk_lookup *cl;
mutex_lock(&clocks_mutex);
cl = clk_find(dev_id, con_id);
if (cl && !__clk_get(cl->clk))
cl = NULL;
mutex_unlock(&clocks_mutex);
return cl ? cl