如何从设备树节点

时间:2015-06-05 11:00:56

标签: c linux-kernel embedded linux-device-driver device-tree

我有以下问题:我想定义CPU在设备树中的频率转换期间应该使用的时钟而不是时钟驱动程序代码(这样它将更通用)。我想定义"转换时钟"设备树中的属性,如:

 232         cpu: cpu@01c20050 {
 233             #clock-cells = <0>;
 234             compatible = "allwinner,sun4i-a10-cpu-clk";
 235             reg = <0x01c20050 0x4>;
-----
 243             clocks = <&osc32k>, <&osc24M>, <&pll1>, <&pll1>;
 244             transition-clock = <&osc24M>;
 245             clock-output-names = "cpu";
 246         };

我更改了文件&#34; drivers / clk / clkdev.c&#34;搜索这个属性,这样我就可以获得一个clk指针并将其存储在cpu时钟结构的新属性中。这是我到目前为止所管理的内容(更改从第78行开始):

 59 static struct clk *__of_clk_get(struct device_node *np, int index,
 60                    const char *dev_id, const char *con_id)
 61 {
 62     struct of_phandle_args clkspec;
 63     struct clk *clk, *transition_clk;
 64     struct device_node *clock_node, *transition_clock_node;
 65     int rc;
 66     
 67     if (index < 0)
 68         return ERR_PTR(-EINVAL);
 69         
 70     rc = of_parse_phandle_with_args(np, "clocks", "#clock-cells", index,
 71                     &clkspec);
 72     if (rc)         
 73         return ERR_PTR(rc);
 74         
 75     clk = __of_clk_get_by_clkspec(&clkspec, dev_id, con_id);
 76     of_node_put(clkspec.np);
 77     
 78     clock_node = of_parse_phandle(np, "clocks", 0);
 79     pr_err("-------------------- parsing node %s\n", np->name);
 80     if (clock_node!=NULL) {
 81         pr_err("============ Clock node found %p\n", clock_node);
 82         transition_clock_node =
 83             of_parse_phandle(clock_node, "transition-clock", 0);
 84         if (transition_clock_node!=NULL) {
 85             pr_err("============ Transition clock node found %p\n",
 86                 transition_clock_node);
 87             transition_clk = clk_get(clock_node, 0);
 88             pr_err("============ Transition clock %p\n", transition_clk);
 89         }
 90     }
 91     
 92     return clk;
 93 }

我得到时钟节点和转换时钟节点的指针,但是当我尝试从中获取时钟指针时,我得到0xfffffffe,这看起来像是一个错误:

[    2.540542] -------------------- parsing node cpu
[    2.540546] ============ Clock node found eeef9520
[    2.540550] ============ Transition clock node found eeef8934
[    2.540555] ============ Transition clock fffffffe

我想要一个时钟对象,我稍后可以在

中使用它
clk_set_parent(cpu_clk, cpu_clk->transition_clk)

欢迎任何想法:)

1 个答案:

答案 0 :(得分:1)

好的,我在此期间弄明白了,因为没有人回答我会提供我的解决方案(可能还有其他人讨论这个问题):

 81     if (clock_node != NULL) {
 82         rc = of_parse_phandle_with_args(clock_node, "transition-clock", NULL,
 83             0, &transition_clkspec);
 84         of_node_put(transition_clkspec.np);
 85 
 86         if (!rc) {
 87             transition_clock = __of_clk_get_by_clkspec(&transition_clkspec,
 88                 dev_id, con_id);
 89             clk_set_transition_parent(clk, transition_clock);
 90         }
 91     }

因此,解决方案是获取类型为“of_phandle_args”的对象,并使用__of_clk_get_by_clkspec从那里获取时钟。

(clk_set_transition_parent函数在其他地方定义,它完全按照它的名字建议)