前言
分析下 clk_register 的流程。
重要的结构体
分析一个函数的流程之前,必须要搞清楚结构体的定义,才能知道其背后的用途。
clk_hw
struct clk_hw {
struct clk *clk;
const struct clk_init_data *init;
};
其中的 clk结构体,用来表示 clk之前的关系(parent,children),以及当前的频率(clk rate)用,
clk_init_data 结构体,提供了体层的操作函数 fops。
函数分析
struct clk *clk_register(struct device *dev, struct clk_hw *hw)
{
//传入dev的参数可以为NULL
int ret;
struct clk *clk;
//创建一个 clk结构体
clk = kzalloc(sizeof(*clk), GFP_KERNEL);
if (!clk) {
pr_err("%s: could not allocate clk\n", __func__);
ret = -ENOMEM;
goto fail_out;
}
ret = _clk_register(dev, hw, clk);
if (!ret)
return clk;
kfree(clk);
fail_out:
return ERR_PTR(ret);
}
接下来 是 _clk_register 函数