Lines Matching refs:clk
39 void clk_rate_table_build(struct clk *clk, in clk_rate_table_build() argument
49 clk->nr_freqs = nr_freqs; in clk_rate_table_build()
64 freq = clk->parent->rate * mult / div; in clk_rate_table_build()
137 long clk_rate_table_round(struct clk *clk, in clk_rate_table_round() argument
143 .max = clk->nr_freqs - 1, in clk_rate_table_round()
149 if (clk->nr_freqs < 1) in clk_rate_table_round()
161 long clk_rate_div_range_round(struct clk *clk, unsigned int div_min, in clk_rate_div_range_round() argument
168 .arg = clk_get_parent(clk), in clk_rate_div_range_round()
181 long clk_rate_mult_range_round(struct clk *clk, unsigned int mult_min, in clk_rate_mult_range_round() argument
188 .arg = clk_get_parent(clk), in clk_rate_mult_range_round()
195 int clk_rate_table_find(struct clk *clk, in clk_rate_table_find() argument
209 unsigned long followparent_recalc(struct clk *clk) in followparent_recalc() argument
211 return clk->parent ? clk->parent->rate : 0; in followparent_recalc()
214 int clk_reparent(struct clk *child, struct clk *parent) in clk_reparent()
225 void propagate_rate(struct clk *tclk) in propagate_rate()
227 struct clk *clkp; in propagate_rate()
237 static void __clk_disable(struct clk *clk) in __clk_disable() argument
239 if (WARN(!clk->usecount, "Trying to disable clock %p with 0 usecount\n", in __clk_disable()
240 clk)) in __clk_disable()
243 if (!(--clk->usecount)) { in __clk_disable()
244 if (likely(allow_disable && clk->ops && clk->ops->disable)) in __clk_disable()
245 clk->ops->disable(clk); in __clk_disable()
246 if (likely(clk->parent)) in __clk_disable()
247 __clk_disable(clk->parent); in __clk_disable()
251 void clk_disable(struct clk *clk) in clk_disable() argument
255 if (!clk) in clk_disable()
259 __clk_disable(clk); in clk_disable()
264 static int __clk_enable(struct clk *clk) in __clk_enable() argument
268 if (clk->usecount++ == 0) { in __clk_enable()
269 if (clk->parent) { in __clk_enable()
270 ret = __clk_enable(clk->parent); in __clk_enable()
275 if (clk->ops && clk->ops->enable) { in __clk_enable()
276 ret = clk->ops->enable(clk); in __clk_enable()
278 if (clk->parent) in __clk_enable()
279 __clk_disable(clk->parent); in __clk_enable()
287 clk->usecount--; in __clk_enable()
291 int clk_enable(struct clk *clk) in clk_enable() argument
296 if (!clk) in clk_enable()
300 ret = __clk_enable(clk); in clk_enable()
318 struct clk *clkp; in recalculate_root_clocks()
329 static struct clk *lookup_root_clock(struct clk *clk) in lookup_root_clock() argument
331 while (clk->parent) in lookup_root_clock()
332 clk = clk->parent; in lookup_root_clock()
334 return clk; in lookup_root_clock()
337 static int clk_establish_mapping(struct clk *clk) in clk_establish_mapping() argument
339 struct clk_mapping *mapping = clk->mapping; in clk_establish_mapping()
345 struct clk *clkp; in clk_establish_mapping()
350 if (!clk->parent) { in clk_establish_mapping()
351 clk->mapping = &dummy_mapping; in clk_establish_mapping()
359 clkp = lookup_root_clock(clk); in clk_establish_mapping()
380 clk->mapping = mapping; in clk_establish_mapping()
382 clk->mapped_reg = clk->mapping->base; in clk_establish_mapping()
383 clk->mapped_reg += (phys_addr_t)clk->enable_reg - clk->mapping->phys; in clk_establish_mapping()
396 static void clk_teardown_mapping(struct clk *clk) in clk_teardown_mapping() argument
398 struct clk_mapping *mapping = clk->mapping; in clk_teardown_mapping()
405 clk->mapping = NULL; in clk_teardown_mapping()
407 clk->mapped_reg = NULL; in clk_teardown_mapping()
410 int clk_register(struct clk *clk) in clk_register() argument
414 if (IS_ERR_OR_NULL(clk)) in clk_register()
420 if (clk->node.next || clk->node.prev) in clk_register()
425 INIT_LIST_HEAD(&clk->children); in clk_register()
426 clk->usecount = 0; in clk_register()
428 ret = clk_establish_mapping(clk); in clk_register()
432 if (clk->parent) in clk_register()
433 list_add(&clk->sibling, &clk->parent->children); in clk_register()
435 list_add(&clk->sibling, &root_clks); in clk_register()
437 list_add(&clk->node, &clock_list); in clk_register()
440 if (clk->ops && clk->ops->init) in clk_register()
441 clk->ops->init(clk); in clk_register()
451 void clk_unregister(struct clk *clk) in clk_unregister() argument
454 list_del(&clk->sibling); in clk_unregister()
455 list_del(&clk->node); in clk_unregister()
456 clk_teardown_mapping(clk); in clk_unregister()
463 struct clk *clkp; in clk_enable_init_clocks()
470 unsigned long clk_get_rate(struct clk *clk) in clk_get_rate() argument
472 return clk->rate; in clk_get_rate()
476 int clk_set_rate(struct clk *clk, unsigned long rate) in clk_set_rate() argument
483 if (likely(clk->ops && clk->ops->set_rate)) { in clk_set_rate()
484 ret = clk->ops->set_rate(clk, rate); in clk_set_rate()
488 clk->rate = rate; in clk_set_rate()
492 if (clk->ops && clk->ops->recalc) in clk_set_rate()
493 clk->rate = clk->ops->recalc(clk); in clk_set_rate()
495 propagate_rate(clk); in clk_set_rate()
504 int clk_set_parent(struct clk *clk, struct clk *parent) in clk_set_parent() argument
509 if (!parent || !clk) in clk_set_parent()
511 if (clk->parent == parent) in clk_set_parent()
515 if (clk->usecount == 0) { in clk_set_parent()
516 if (clk->ops->set_parent) in clk_set_parent()
517 ret = clk->ops->set_parent(clk, parent); in clk_set_parent()
519 ret = clk_reparent(clk, parent); in clk_set_parent()
522 if (clk->ops->recalc) in clk_set_parent()
523 clk->rate = clk->ops->recalc(clk); in clk_set_parent()
525 clk, clk->parent, clk->rate); in clk_set_parent()
526 propagate_rate(clk); in clk_set_parent()
536 struct clk *clk_get_parent(struct clk *clk) in clk_get_parent() argument
538 return clk->parent; in clk_get_parent()
542 long clk_round_rate(struct clk *clk, unsigned long rate) in clk_round_rate() argument
544 if (likely(clk->ops && clk->ops->round_rate)) { in clk_round_rate()
548 rounded = clk->ops->round_rate(clk, rate); in clk_round_rate()
554 return clk_get_rate(clk); in clk_round_rate()
558 long clk_round_parent(struct clk *clk, unsigned long target, in clk_round_parent() argument
564 struct clk *parent = clk_get_parent(clk); in clk_round_parent()
568 *best_freq = clk_round_rate(clk, target); in clk_round_parent()
649 struct clk *clkp; in clks_core_resume()
682 struct clk *clk; in clk_late_init() local
688 list_for_each_entry(clk, &clock_list, node) in clk_late_init()
689 if (!clk->usecount && clk->ops && clk->ops->disable) in clk_late_init()
690 clk->ops->disable(clk); in clk_late_init()