Lines Matching refs:clk

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