2015-06-05 4 views
0

У меня есть следующая проблема: я хочу определить часы, которые процессор должен использовать во время переходов частоты в дереве устройств, а не в коде драйвера часов (таким образом это будет более общий). Я хочу, чтобы определить «переходное время» свойство в дереве устройств, что-то вроде:Как получить часы из узла дерева устройств

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) 

Любые идеи приветствуются :)

ответ

0

ОК, я получил это понял, в то же время и с тех пор никто не ответил, я собираюсь предоставить мое решение (возможно, кто-то еще врезается в этом вопросе):

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 определена где-то в другом месте и делает именно то, что предлагает ее название)

Смежные вопросы