Lines Matching refs:clk
27 static void __clk_enable(struct clk *clk) in __clk_enable() argument
29 if (clk->parent) in __clk_enable()
30 __clk_enable(clk->parent); in __clk_enable()
31 clk->usecount++; in __clk_enable()
34 static void __clk_disable(struct clk *clk) in __clk_disable() argument
36 if (WARN_ON(clk->usecount == 0)) in __clk_disable()
38 --clk->usecount; in __clk_disable()
40 if (clk->parent) in __clk_disable()
41 __clk_disable(clk->parent); in __clk_disable()
44 int clk_enable(struct clk *clk) in clk_enable() argument
48 if (clk == NULL || IS_ERR(clk)) in clk_enable()
52 __clk_enable(clk); in clk_enable()
59 void clk_disable(struct clk *clk) in clk_disable() argument
63 if (clk == NULL || IS_ERR(clk)) in clk_disable()
67 __clk_disable(clk); in clk_disable()
72 unsigned long clk_get_rate(struct clk *clk) in clk_get_rate() argument
74 if (clk == NULL || IS_ERR(clk)) in clk_get_rate()
77 return clk->rate; in clk_get_rate()
81 long clk_round_rate(struct clk *clk, unsigned long rate) in clk_round_rate() argument
83 if (clk == NULL || IS_ERR(clk)) in clk_round_rate()
86 if (clk->round_rate) in clk_round_rate()
87 return clk->round_rate(clk, rate); in clk_round_rate()
89 return clk->rate; in clk_round_rate()
94 static void propagate_rate(struct clk *root) in propagate_rate()
96 struct clk *clk; in propagate_rate() local
98 list_for_each_entry(clk, &root->children, childnode) { in propagate_rate()
99 if (clk->recalc) in propagate_rate()
100 clk->rate = clk->recalc(clk); in propagate_rate()
101 propagate_rate(clk); in propagate_rate()
105 int clk_set_rate(struct clk *clk, unsigned long rate) in clk_set_rate() argument
110 if (clk == NULL || IS_ERR(clk)) in clk_set_rate()
113 if (clk->set_rate) in clk_set_rate()
114 ret = clk->set_rate(clk, rate); in clk_set_rate()
118 if (clk->recalc) in clk_set_rate()
119 clk->rate = clk->recalc(clk); in clk_set_rate()
120 propagate_rate(clk); in clk_set_rate()
128 int clk_set_parent(struct clk *clk, struct clk *parent) in clk_set_parent() argument
132 if (clk == NULL || IS_ERR(clk)) in clk_set_parent()
136 if (WARN_ON(clk->usecount)) in clk_set_parent()
140 clk->parent = parent; in clk_set_parent()
141 list_del_init(&clk->childnode); in clk_set_parent()
142 list_add(&clk->childnode, &clk->parent->children); in clk_set_parent()
146 if (clk->recalc) in clk_set_parent()
147 clk->rate = clk->recalc(clk); in clk_set_parent()
148 propagate_rate(clk); in clk_set_parent()
155 int clk_register(struct clk *clk) in clk_register() argument
157 if (clk == NULL || IS_ERR(clk)) in clk_register()
160 if (WARN(clk->parent && !clk->parent->rate, in clk_register()
162 clk->name, clk->parent->name)) in clk_register()
166 list_add_tail(&clk->node, &clocks); in clk_register()
167 if (clk->parent) in clk_register()
168 list_add_tail(&clk->childnode, &clk->parent->children); in clk_register()
172 if (clk->rate) in clk_register()
176 if (clk->recalc) in clk_register()
177 clk->rate = clk->recalc(clk); in clk_register()
180 else if (clk->parent) in clk_register()
181 clk->rate = clk->parent->rate; in clk_register()
187 void clk_unregister(struct clk *clk) in clk_unregister() argument
189 if (clk == NULL || IS_ERR(clk)) in clk_unregister()
193 list_del(&clk->node); in clk_unregister()
194 list_del(&clk->childnode); in clk_unregister()
205 static unsigned long clk_sysclk_recalc(struct clk *clk) in clk_sysclk_recalc() argument
209 unsigned long rate = clk->rate; in clk_sysclk_recalc()
211 if (WARN_ON(!clk->parent)) in clk_sysclk_recalc()
214 rate = clk->parent->rate; in clk_sysclk_recalc()
217 if (WARN_ON(!clk->parent->pll_data)) in clk_sysclk_recalc()
220 pll = clk->parent->pll_data; in clk_sysclk_recalc()
223 if (clk->flags & PRE_PLL) in clk_sysclk_recalc()
226 if (!clk->div) { in clk_sysclk_recalc()
228 clk->name, rate / 1000); in clk_sysclk_recalc()
232 if (clk->flags & FIXED_DIV_PLL) { in clk_sysclk_recalc()
233 rate /= clk->div; in clk_sysclk_recalc()
235 clk->name, clk->div, rate / 1000); in clk_sysclk_recalc()
239 v = pll_read(pll, clk->div); in clk_sysclk_recalc()
249 clk->name, plldiv, rate / 1000); in clk_sysclk_recalc()
254 static unsigned long clk_leafclk_recalc(struct clk *clk) in clk_leafclk_recalc() argument
256 if (WARN_ON(!clk->parent)) in clk_leafclk_recalc()
257 return clk->rate; in clk_leafclk_recalc()
260 clk->name, clk->parent->name, clk->parent->rate / 1000); in clk_leafclk_recalc()
262 return clk->parent->rate; in clk_leafclk_recalc()
265 static unsigned long clk_pllclk_recalc(struct clk *clk) in clk_pllclk_recalc() argument
269 struct pll_data *pll = clk->pll_data; in clk_pllclk_recalc()
270 unsigned long rate = clk->rate; in clk_pllclk_recalc()
272 if (clk->flags & FIXED_RATE_PLL) in clk_pllclk_recalc()
276 rate = pll->input_rate = clk->parent->rate; in clk_pllclk_recalc()
312 pll->num, clk->parent->rate / 1000000, in clk_pllclk_recalc()
316 pll->num, clk->parent->rate / 1000000); in clk_pllclk_recalc()
322 static void __init __init_clk(struct clk *clk) in __init_clk() argument
324 INIT_LIST_HEAD(&clk->node); in __init_clk()
325 INIT_LIST_HEAD(&clk->children); in __init_clk()
326 INIT_LIST_HEAD(&clk->childnode); in __init_clk()
328 if (!clk->recalc) { in __init_clk()
331 if (clk->pll_data) in __init_clk()
332 clk->recalc = clk_pllclk_recalc; in __init_clk()
335 else if (clk->flags & CLK_PLL) in __init_clk()
336 clk->recalc = clk_sysclk_recalc; in __init_clk()
339 else if (clk->parent) in __init_clk()
340 clk->recalc = clk_leafclk_recalc; in __init_clk()
347 struct clk *clk; in c6x_clks_init() local
350 for (c = clocks; c->clk; c++) { in c6x_clks_init()
351 clk = c->clk; in c6x_clks_init()
353 __init_clk(clk); in c6x_clks_init()
354 clk_register(clk); in c6x_clks_init()
358 if (clk->flags & ALWAYS_ENABLED) in c6x_clks_init()
359 clk_enable(clk); in c6x_clks_init()
375 dump_clock(struct seq_file *s, unsigned nest, struct clk *parent) in dump_clock()
379 struct clk *clk; in dump_clock() local
399 list_for_each_entry(clk, &parent->children, childnode) { in dump_clock()
400 dump_clock(s, nest + NEST_DELTA, clk); in dump_clock()
406 struct clk *clk; in c6x_ck_show() local
412 list_for_each_entry(clk, &clocks, node) in c6x_ck_show()
413 if (!clk->parent) in c6x_ck_show()
414 dump_clock(m, 0, clk); in c6x_ck_show()