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 == NULL || IS_ERR(clk)) in clk_enable()
104 __clk_enable(clk); in clk_enable()
111 void clk_disable(struct clk *clk) in clk_disable() argument
115 if (clk == NULL || IS_ERR(clk)) in clk_disable()
119 __clk_disable(clk); in clk_disable()
124 unsigned long clk_get_rate(struct clk *clk) in clk_get_rate() argument
126 if (clk == NULL || IS_ERR(clk)) in clk_get_rate()
129 return clk->rate; in clk_get_rate()
133 long clk_round_rate(struct clk *clk, unsigned long rate) in clk_round_rate() argument
135 if (clk == NULL || IS_ERR(clk)) in clk_round_rate()
138 if (clk->round_rate) in clk_round_rate()
139 return clk->round_rate(clk, rate); in clk_round_rate()
141 return clk->rate; in clk_round_rate()
146 static void propagate_rate(struct clk *root) in propagate_rate()
148 struct clk *clk; in propagate_rate() local
150 list_for_each_entry(clk, &root->children, childnode) { in propagate_rate()
151 if (clk->recalc) in propagate_rate()
152 clk->rate = clk->recalc(clk); in propagate_rate()
153 propagate_rate(clk); in propagate_rate()
157 int clk_set_rate(struct clk *clk, unsigned long rate) in clk_set_rate() argument
162 if (clk == NULL || IS_ERR(clk)) in clk_set_rate()
165 if (clk->set_rate) in clk_set_rate()
166 ret = clk->set_rate(clk, rate); in clk_set_rate()
170 if (clk->recalc) in clk_set_rate()
171 clk->rate = clk->recalc(clk); in clk_set_rate()
172 propagate_rate(clk); in clk_set_rate()
180 int clk_set_parent(struct clk *clk, struct clk *parent) in clk_set_parent() argument
184 if (clk == NULL || IS_ERR(clk)) in clk_set_parent()
188 if (WARN_ON(clk->usecount)) in clk_set_parent()
192 clk->parent = parent; in clk_set_parent()
193 list_del_init(&clk->childnode); in clk_set_parent()
194 list_add(&clk->childnode, &clk->parent->children); in clk_set_parent()
198 if (clk->recalc) in clk_set_parent()
199 clk->rate = clk->recalc(clk); in clk_set_parent()
200 propagate_rate(clk); in clk_set_parent()
207 int clk_register(struct clk *clk) in clk_register() argument
209 if (clk == NULL || IS_ERR(clk)) in clk_register()
212 if (WARN(clk->parent && !clk->parent->rate, in clk_register()
214 clk->name, clk->parent->name)) in clk_register()
217 INIT_LIST_HEAD(&clk->children); in clk_register()
220 list_add_tail(&clk->node, &clocks); in clk_register()
221 if (clk->parent) in clk_register()
222 list_add_tail(&clk->childnode, &clk->parent->children); in clk_register()
226 if (clk->rate) in clk_register()
230 if (clk->recalc) in clk_register()
231 clk->rate = clk->recalc(clk); in clk_register()
234 else if (clk->parent) in clk_register()
235 clk->rate = clk->parent->rate; in clk_register()
241 void clk_unregister(struct clk *clk) in clk_unregister() argument
243 if (clk == NULL || IS_ERR(clk)) in clk_unregister()
247 list_del(&clk->node); in clk_unregister()
248 list_del(&clk->childnode); in clk_unregister()
259 struct clk *ck; in davinci_clk_disable_unused()
283 static unsigned long clk_sysclk_recalc(struct clk *clk) in clk_sysclk_recalc() argument
287 unsigned long rate = clk->rate; in clk_sysclk_recalc()
290 if (clk->pll_data) in clk_sysclk_recalc()
293 if (WARN_ON(!clk->parent)) in clk_sysclk_recalc()
296 rate = clk->parent->rate; in clk_sysclk_recalc()
299 if (WARN_ON(!clk->parent->pll_data)) in clk_sysclk_recalc()
302 pll = clk->parent->pll_data; in clk_sysclk_recalc()
305 if (clk->flags & PRE_PLL) in clk_sysclk_recalc()
308 if (!clk->div_reg) in clk_sysclk_recalc()
311 v = __raw_readl(pll->base + clk->div_reg); in clk_sysclk_recalc()
321 int davinci_set_sysclk_rate(struct clk *clk, unsigned long rate) in davinci_set_sysclk_rate() argument
329 if (clk->pll_data) in davinci_set_sysclk_rate()
333 if (WARN_ON(!clk->parent)) in davinci_set_sysclk_rate()
337 if (WARN_ON(!clk->parent->pll_data)) in davinci_set_sysclk_rate()
341 if (WARN_ON(!clk->div_reg)) in davinci_set_sysclk_rate()
344 pll = clk->parent->pll_data; in davinci_set_sysclk_rate()
346 input = clk->parent->rate; in davinci_set_sysclk_rate()
349 if (clk->flags & PRE_PLL) in davinci_set_sysclk_rate()
358 if (clk->maxrate) { in davinci_set_sysclk_rate()
360 if (input / ratio > clk->maxrate) in davinci_set_sysclk_rate()
377 v = __raw_readl(pll->base + clk->div_reg); in davinci_set_sysclk_rate()
380 __raw_writel(v, pll->base + clk->div_reg); in davinci_set_sysclk_rate()
394 static unsigned long clk_leafclk_recalc(struct clk *clk) in clk_leafclk_recalc() argument
396 if (WARN_ON(!clk->parent)) in clk_leafclk_recalc()
397 return clk->rate; in clk_leafclk_recalc()
399 return clk->parent->rate; in clk_leafclk_recalc()
402 int davinci_simple_set_rate(struct clk *clk, unsigned long rate) in davinci_simple_set_rate() argument
404 clk->rate = rate; in davinci_simple_set_rate()
408 static unsigned long clk_pllclk_recalc(struct clk *clk) in clk_pllclk_recalc() argument
412 struct pll_data *pll = clk->pll_data; in clk_pllclk_recalc()
413 unsigned long rate = clk->rate; in clk_pllclk_recalc()
416 rate = pll->input_rate = clk->parent->rate; in clk_pllclk_recalc()
455 pll->num, clk->parent->rate / 1000000); in clk_pllclk_recalc()
563 struct clk *refclk; in davinci_set_refclk_rate()
581 struct clk *clk; in davinci_clk_init() local
584 for (c = clocks; c->clk; c++) { in davinci_clk_init()
585 clk = c->clk; in davinci_clk_init()
587 if (!clk->recalc) { in davinci_clk_init()
590 if (clk->pll_data) in davinci_clk_init()
591 clk->recalc = clk_pllclk_recalc; in davinci_clk_init()
594 else if (clk->flags & CLK_PLL) in davinci_clk_init()
595 clk->recalc = clk_sysclk_recalc; in davinci_clk_init()
598 else if (clk->parent) in davinci_clk_init()
599 clk->recalc = clk_leafclk_recalc; in davinci_clk_init()
602 if (clk->pll_data) { in davinci_clk_init()
603 struct pll_data *pll = clk->pll_data; in davinci_clk_init()
614 if (clk->recalc) in davinci_clk_init()
615 clk->rate = clk->recalc(clk); in davinci_clk_init()
617 if (clk->lpsc) in davinci_clk_init()
618 clk->flags |= CLK_PSC; in davinci_clk_init()
620 if (clk->flags & PSC_LRST) in davinci_clk_init()
621 clk->reset = davinci_clk_reset; in davinci_clk_init()
623 clk_register(clk); in davinci_clk_init()
627 if (clk->flags & ALWAYS_ENABLED) in davinci_clk_init()
628 clk_enable(clk); in davinci_clk_init()
646 dump_clock(struct seq_file *s, unsigned nest, struct clk *parent) in dump_clock()
650 struct clk *clk; in dump_clock() local
672 list_for_each_entry(clk, &parent->children, childnode) { in dump_clock()
673 dump_clock(s, nest + NEST_DELTA, clk); in dump_clock()
679 struct clk *clk; in davinci_ck_show() local
685 list_for_each_entry(clk, &clocks, node) in davinci_ck_show()
686 if (!clk->parent) in davinci_ck_show()
687 dump_clock(m, 0, clk); in davinci_ck_show()