У меня есть следующая проблема: я хочу определить часы, которые процессор должен использовать во время переходов частоты в дереве устройств, а не в коде драйвера часов (таким образом это будет более общий). Я хочу, чтобы определить «переходное время» свойство в дереве устройств, что-то вроде:Как получить часы из узла дерева устройств
232 cpu: [email protected] {
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 };
Я изменил файл «драйвера/CLK/clkdev.c» искать это свойство, так что я могу получить указатель CLK и сохранить его в новом свойстве в структуре часов процессора. Это то, что мне удалось до сих пор (изменения начинаются в строке 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)
Любые идеи приветствуются :)