分析下 clk_register 的流程。
重要的结构体分析一个函数的流程之前,必须要搞清楚结构体的定义,才能知道其背后的用途。
clk_hwstruct 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的参数可以为NULLint ret;struct clk *clk;//创建一个 clk结构体clk = kzalloc(sizeof(*clk), GFP_KERNEL);if (!clk) {pr_err("%s: could not allocate clkn", __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 函数