Lines Matching refs:clk
34 static void __clk_enable(struct clk *clk) in __clk_enable() argument
36 if (clk->parent) in __clk_enable()
37 __clk_enable(clk->parent); in __clk_enable()
38 if (clk->usecount++ == 0) { in __clk_enable()
39 if (clk->flags & CLK_PSC) in __clk_enable()
40 davinci_psc_config(clk->domain, clk->gpsc, clk->lpsc, in __clk_enable()
41 true, clk->flags); in __clk_enable()
42 else if (clk->clk_enable) in __clk_enable()
43 clk->clk_enable(clk); in __clk_enable()
47 static void __clk_disable(struct clk *clk) in __clk_disable() argument
49 if (WARN_ON(clk->usecount == 0)) in __clk_disable()
51 if (--clk->usecount == 0) { in __clk_disable()
52 if (!(clk->flags & CLK_PLL) && (clk->flags & CLK_PSC)) in __clk_disable()
53 davinci_psc_config(clk->domain, clk->gpsc, clk->lpsc, in __clk_disable()
54 false, clk->flags); in __clk_disable()
55 else if (clk->clk_disable) in __clk_disable()
56 clk->clk_disable(clk); in __clk_disable()
58 if (clk->parent) in __clk_disable()
59 __clk_disable(clk->parent); in __clk_disable()
62 int davinci_clk_reset(struct clk *clk, bool reset) in davinci_clk_reset() argument
66 if (clk == NULL || IS_ERR(clk)) in davinci_clk_reset()
70 if (clk->flags & CLK_PSC) in davinci_clk_reset()
71 davinci_psc_reset(clk->gpsc, clk->lpsc, reset); in davinci_clk_reset()
78 int davinci_clk_reset_assert(struct clk *clk) in davinci_clk_reset_assert() argument
80 if (clk == NULL || IS_ERR(clk) || !clk->reset) in davinci_clk_reset_assert()
83 return clk->reset(clk, true); in davinci_clk_reset_assert()
87 int davinci_clk_reset_deassert(struct clk *clk) in davinci_clk_reset_deassert() argument
89 if (clk == NULL || IS_ERR(clk) || !clk->reset) in davinci_clk_reset_deassert()
92 return clk->reset(clk, false); in davinci_clk_reset_deassert()
96 int clk_enable(struct clk *clk) in clk_enable() argument
100 if (!clk) in clk_enable()
102 else if (IS_ERR(clk)) in clk_enable()
106 __clk_enable(clk); in clk_enable()
113 void clk_disable(struct clk *clk) in clk_disable() argument
117 if (clk == NULL || IS_ERR(clk)) in clk_disable()
121 __clk_disable(clk); in clk_disable()
126 unsigned long clk_get_rate(struct clk *clk) in clk_get_rate() argument
128 if (clk == NULL || IS_ERR(clk)) in clk_get_rate()
131 return clk->rate; in clk_get_rate()
135 long clk_round_rate(struct clk *clk, unsigned long rate) in clk_round_rate() argument
137 if (clk == NULL || IS_ERR(clk)) in clk_round_rate()
140 if (clk->round_rate) in clk_round_rate()
141 return clk->round_rate(clk, rate); in clk_round_rate()
143 return clk->rate; in clk_round_rate()
148 static void propagate_rate(struct clk *root) in propagate_rate()
150 struct clk *clk; in propagate_rate() local
152 list_for_each_entry(clk, &root->children, childnode) { in propagate_rate()
153 if (clk->recalc) in propagate_rate()
154 clk->rate = clk->recalc(clk); in propagate_rate()
155 propagate_rate(clk); in propagate_rate()
159 int clk_set_rate(struct clk *clk, unsigned long rate) in clk_set_rate() argument
164 if (!clk) in clk_set_rate()
166 else if (IS_ERR(clk)) in clk_set_rate()
169 if (clk->set_rate) in clk_set_rate()
170 ret = clk->set_rate(clk, rate); in clk_set_rate()
174 if (clk->recalc) in clk_set_rate()
175 clk->rate = clk->recalc(clk); in clk_set_rate()
176 propagate_rate(clk); in clk_set_rate()
184 int clk_set_parent(struct clk *clk, struct clk *parent) in clk_set_parent() argument
188 if (!clk) in clk_set_parent()
190 else if (IS_ERR(clk)) in clk_set_parent()
194 if (WARN_ON(clk->usecount)) in clk_set_parent()
198 clk->parent = parent; in clk_set_parent()
199 list_del_init(&clk->childnode); in clk_set_parent()
200 list_add(&clk->childnode, &clk->parent->children); in clk_set_parent()
204 if (clk->recalc) in clk_set_parent()
205 clk->rate = clk->recalc(clk); in clk_set_parent()
206 propagate_rate(clk); in clk_set_parent()
213 int clk_register(struct clk *clk) in clk_register() argument
215 if (clk == NULL || IS_ERR(clk)) in clk_register()
218 if (WARN(clk->parent && !clk->parent->rate, in clk_register()
220 clk->name, clk->parent->name)) in clk_register()
223 INIT_LIST_HEAD(&clk->children); in clk_register()
226 list_add_tail(&clk->node, &clocks); in clk_register()
227 if (clk->parent) in clk_register()
228 list_add_tail(&clk->childnode, &clk->parent->children); in clk_register()
232 if (clk->rate) in clk_register()
236 if (clk->recalc) in clk_register()
237 clk->rate = clk->recalc(clk); in clk_register()
240 else if (clk->parent) in clk_register()
241 clk->rate = clk->parent->rate; in clk_register()
247 void clk_unregister(struct clk *clk) in clk_unregister() argument
249 if (clk == NULL || IS_ERR(clk)) in clk_unregister()
253 list_del(&clk->node); in clk_unregister()
254 list_del(&clk->childnode); in clk_unregister()
265 struct clk *ck; in davinci_clk_disable_unused()
289 static unsigned long clk_sysclk_recalc(struct clk *clk) in clk_sysclk_recalc() argument
293 unsigned long rate = clk->rate; in clk_sysclk_recalc()
296 if (clk->pll_data) in clk_sysclk_recalc()
299 if (WARN_ON(!clk->parent)) in clk_sysclk_recalc()
302 rate = clk->parent->rate; in clk_sysclk_recalc()
305 if (WARN_ON(!clk->parent->pll_data)) in clk_sysclk_recalc()
308 pll = clk->parent->pll_data; in clk_sysclk_recalc()
311 if (clk->flags & PRE_PLL) in clk_sysclk_recalc()
314 if (!clk->div_reg) in clk_sysclk_recalc()
317 v = __raw_readl(pll->base + clk->div_reg); in clk_sysclk_recalc()
327 int davinci_set_sysclk_rate(struct clk *clk, unsigned long rate) in davinci_set_sysclk_rate() argument
335 if (clk->pll_data) in davinci_set_sysclk_rate()
339 if (WARN_ON(!clk->parent)) in davinci_set_sysclk_rate()
343 if (WARN_ON(!clk->parent->pll_data)) in davinci_set_sysclk_rate()
347 if (WARN_ON(!clk->div_reg)) in davinci_set_sysclk_rate()
350 pll = clk->parent->pll_data; in davinci_set_sysclk_rate()
352 input = clk->parent->rate; in davinci_set_sysclk_rate()
355 if (clk->flags & PRE_PLL) in davinci_set_sysclk_rate()
364 if (clk->maxrate) { in davinci_set_sysclk_rate()
366 if (input / ratio > clk->maxrate) in davinci_set_sysclk_rate()
383 v = __raw_readl(pll->base + clk->div_reg); in davinci_set_sysclk_rate()
386 __raw_writel(v, pll->base + clk->div_reg); in davinci_set_sysclk_rate()
400 static unsigned long clk_leafclk_recalc(struct clk *clk) in clk_leafclk_recalc() argument
402 if (WARN_ON(!clk->parent)) in clk_leafclk_recalc()
403 return clk->rate; in clk_leafclk_recalc()
405 return clk->parent->rate; in clk_leafclk_recalc()
408 int davinci_simple_set_rate(struct clk *clk, unsigned long rate) in davinci_simple_set_rate() argument
410 clk->rate = rate; in davinci_simple_set_rate()
414 static unsigned long clk_pllclk_recalc(struct clk *clk) in clk_pllclk_recalc() argument
418 struct pll_data *pll = clk->pll_data; in clk_pllclk_recalc()
419 unsigned long rate = clk->rate; in clk_pllclk_recalc()
422 rate = pll->input_rate = clk->parent->rate; in clk_pllclk_recalc()
461 pll->num, clk->parent->rate / 1000000); in clk_pllclk_recalc()
569 struct clk *refclk; in davinci_set_refclk_rate()
587 struct clk *clk; in davinci_clk_init() local
590 for (c = clocks; c->clk; c++) { in davinci_clk_init()
591 clk = c->clk; in davinci_clk_init()
593 if (!clk->recalc) { in davinci_clk_init()
596 if (clk->pll_data) in davinci_clk_init()
597 clk->recalc = clk_pllclk_recalc; in davinci_clk_init()
600 else if (clk->flags & CLK_PLL) in davinci_clk_init()
601 clk->recalc = clk_sysclk_recalc; in davinci_clk_init()
604 else if (clk->parent) in davinci_clk_init()
605 clk->recalc = clk_leafclk_recalc; in davinci_clk_init()
608 if (clk->pll_data) { in davinci_clk_init()
609 struct pll_data *pll = clk->pll_data; in davinci_clk_init()
620 if (clk->recalc) in davinci_clk_init()
621 clk->rate = clk->recalc(clk); in davinci_clk_init()
623 if (clk->lpsc) in davinci_clk_init()
624 clk->flags |= CLK_PSC; in davinci_clk_init()
626 if (clk->flags & PSC_LRST) in davinci_clk_init()
627 clk->reset = davinci_clk_reset; in davinci_clk_init()
629 clk_register(clk); in davinci_clk_init()
633 if (clk->flags & ALWAYS_ENABLED) in davinci_clk_init()
634 clk_enable(clk); in davinci_clk_init()
652 dump_clock(struct seq_file *s, unsigned nest, struct clk *parent) in dump_clock()
656 struct clk *clk; in dump_clock() local
678 list_for_each_entry(clk, &parent->children, childnode) { in dump_clock()
679 dump_clock(s, nest + NEST_DELTA, clk); in dump_clock()
685 struct clk *clk; in davinci_ck_show() local
691 list_for_each_entry(clk, &clocks, node) in davinci_ck_show()
692 if (!clk->parent) in davinci_ck_show()
693 dump_clock(m, 0, clk); in davinci_ck_show()