Lines Matching +full:clk +full:- +full:out +full:- +full:frequency
1 // SPDX-License-Identifier: GPL-2.0
3 // Helper routines for R-Car sound ADG.
7 #include <linux/clk-provider.h>
29 struct clk *clk[CLKMAX]; member
30 struct clk *clkout[CLKOUTMAX];
49 ((pos) = adg->clk[i]); \
54 ((pos) = adg->clkout[i]); \
56 #define rsnd_priv_to_adg(priv) ((struct rsnd_adg *)(priv)->adg)
72 for (i = 3; i >= 0; i--) { in rsnd_adg_calculate_rbgx()
75 return (u32)((i << 8) | ((div / ratio) - 1)); in rsnd_adg_calculate_rbgx()
118 adg->clk_rate[CLKA], /* 0000: CLKA */ in __rsnd_adg_get_timesel_ratio()
119 adg->clk_rate[CLKB], /* 0001: CLKB */ in __rsnd_adg_get_timesel_ratio()
120 adg->clk_rate[CLKC], /* 0010: CLKC */ in __rsnd_adg_get_timesel_ratio()
121 adg->rbga_rate_for_441khz, /* 0011: RBGA */ in __rsnd_adg_get_timesel_ratio()
122 adg->rbgb_rate_for_48khz, /* 0100: RBGB */ in __rsnd_adg_get_timesel_ratio()
136 diff = abs(target_rate - sel_rate[sel] / div); in __rsnd_adg_get_timesel_ratio()
145 * are out of order in __rsnd_adg_get_timesel_ratio()
171 u32 *in, u32 *out, u32 *en) in rsnd_adg_get_timesel_ratio() argument
187 if (runtime->rate != in_rate) { in rsnd_adg_get_timesel_ratio()
190 } else if (runtime->rate != out_rate) { in rsnd_adg_get_timesel_ratio()
202 if (out) in rsnd_adg_get_timesel_ratio()
203 *out = _out; in rsnd_adg_get_timesel_ratio()
239 u32 in, out; in rsnd_adg_set_src_timesel_gen2() local
248 &in, &out, &en); in rsnd_adg_set_src_timesel_gen2()
251 out = out << shift; in rsnd_adg_set_src_timesel_gen2()
255 rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL(id / 2), mask, out); in rsnd_adg_set_src_timesel_gen2()
292 struct clk *clk; in rsnd_adg_clk_query() local
305 for_each_rsnd_clk(clk, adg, i) { in rsnd_adg_clk_query()
306 if (rate == adg->clk_rate[i]) in rsnd_adg_clk_query()
313 if (rate == adg->rbga_rate_for_441khz) in rsnd_adg_clk_query()
316 if (rate == adg->rbgb_rate_for_48khz) in rsnd_adg_clk_query()
319 return -EIO; in rsnd_adg_clk_query()
352 rsnd_mod_bset(adg_mod, BRGCKR, 0x80770000, adg->ckr | ckr); in rsnd_adg_ssi_clk_try_start()
353 rsnd_mod_write(adg_mod, BRRA, adg->rbga); in rsnd_adg_ssi_clk_try_start()
354 rsnd_mod_write(adg_mod, BRRB, adg->rbgb); in rsnd_adg_ssi_clk_try_start()
358 (ckr) ? adg->rbgb_rate_for_48khz : in rsnd_adg_ssi_clk_try_start()
359 adg->rbga_rate_for_441khz); in rsnd_adg_ssi_clk_try_start()
368 struct clk *clk; in rsnd_adg_clk_control() local
371 for_each_rsnd_clk(clk, adg, i) { in rsnd_adg_clk_control()
374 ret = clk_prepare_enable(clk); in rsnd_adg_clk_control()
381 adg->clk_rate[i] = clk_get_rate(adg->clk[i]); in rsnd_adg_clk_control()
383 clk_disable_unprepare(clk); in rsnd_adg_clk_control()
387 dev_warn(dev, "can't use clk %d\n", i); in rsnd_adg_clk_control()
395 struct clk *clk; in rsnd_adg_get_clkin() local
399 clk = devm_clk_get(dev, clk_name[i]); in rsnd_adg_get_clkin()
400 adg->clk[i] = IS_ERR(clk) ? NULL : clk; in rsnd_adg_get_clkin()
407 struct clk *clk; in rsnd_adg_get_clkout() local
409 struct device_node *np = dev->of_node; in rsnd_adg_get_clkout()
440 prop = of_find_property(np, "clock-frequency", NULL); in rsnd_adg_get_clkout()
444 req_size = prop->length / sizeof(u32); in rsnd_adg_get_clkout()
447 "too many clock-frequency, use top %d\n", REQ_SIZE); in rsnd_adg_get_clkout()
451 of_property_read_u32_array(np, "clock-frequency", req_rate, req_size); in rsnd_adg_get_clkout()
464 if (of_get_property(np, "clkout-lr-asynchronous", NULL)) in rsnd_adg_get_clkout()
471 * SSI itself can divide parent clock by 1/1 - 1/16 in rsnd_adg_get_clkout()
476 adg->rbga_rate_for_441khz = 0; in rsnd_adg_get_clkout()
477 adg->rbgb_rate_for_48khz = 0; in rsnd_adg_get_clkout()
478 for_each_rsnd_clk(clk, adg, i) { in rsnd_adg_get_clkout()
479 rate = clk_get_rate(clk); in rsnd_adg_get_clkout()
485 if (!adg->rbga_rate_for_441khz && (0 == rate % 44100)) { in rsnd_adg_get_clkout()
492 adg->rbga_rate_for_441khz = rate / div; in rsnd_adg_get_clkout()
496 parent_clk_name = __clk_get_name(clk); in rsnd_adg_get_clkout()
501 if (!adg->rbgb_rate_for_48khz && (0 == rate % 48000)) { in rsnd_adg_get_clkout()
508 adg->rbgb_rate_for_48khz = rate / div; in rsnd_adg_get_clkout()
512 parent_clk_name = __clk_get_name(clk); in rsnd_adg_get_clkout()
522 of_property_read_u32(np, "#clock-cells", &count); in rsnd_adg_get_clkout()
527 clk = clk_register_fixed_rate(dev, clkout_name[CLKOUT], in rsnd_adg_get_clkout()
529 if (!IS_ERR(clk)) { in rsnd_adg_get_clkout()
530 adg->clkout[CLKOUT] = clk; in rsnd_adg_get_clkout()
531 of_clk_add_provider(np, of_clk_src_simple_get, clk); in rsnd_adg_get_clkout()
539 clk = clk_register_fixed_rate(dev, clkout_name[i], in rsnd_adg_get_clkout()
542 if (!IS_ERR(clk)) in rsnd_adg_get_clkout()
543 adg->clkout[i] = clk; in rsnd_adg_get_clkout()
545 adg->onecell.clks = adg->clkout; in rsnd_adg_get_clkout()
546 adg->onecell.clk_num = CLKOUTMAX; in rsnd_adg_get_clkout()
548 &adg->onecell); in rsnd_adg_get_clkout()
552 adg->ckr = ckr; in rsnd_adg_get_clkout()
553 adg->rbga = rbga; in rsnd_adg_get_clkout()
554 adg->rbgb = rbgb; in rsnd_adg_get_clkout()
561 struct clk *clk; in rsnd_adg_clk_dbg_info() local
564 for_each_rsnd_clk(clk, adg, i) in rsnd_adg_clk_dbg_info()
566 clk_name[i], clk, clk_get_rate(clk)); in rsnd_adg_clk_dbg_info()
569 adg->ckr, adg->rbga, adg->rbgb); in rsnd_adg_clk_dbg_info()
570 dev_dbg(dev, "BRGA (for 44100 base) = %d\n", adg->rbga_rate_for_441khz); in rsnd_adg_clk_dbg_info()
571 dev_dbg(dev, "BRGB (for 48000 base) = %d\n", adg->rbgb_rate_for_48khz); in rsnd_adg_clk_dbg_info()
577 for_each_rsnd_clkout(clk, adg, i) in rsnd_adg_clk_dbg_info()
579 clk, clk_get_rate(clk)); in rsnd_adg_clk_dbg_info()
593 return -ENOMEM; in rsnd_adg_probe()
595 ret = rsnd_mod_init(priv, &adg->mod, &adg_ops, in rsnd_adg_probe()
604 priv->adg = adg; in rsnd_adg_probe()
614 struct device_node *np = dev->of_node; in rsnd_adg_remove()
615 struct rsnd_adg *adg = priv->adg; in rsnd_adg_remove()
616 struct clk *clk; in rsnd_adg_remove() local
619 for_each_rsnd_clkout(clk, adg, i) in rsnd_adg_remove()
620 if (adg->clkout[i]) in rsnd_adg_remove()
621 clk_unregister_fixed_rate(adg->clkout[i]); in rsnd_adg_remove()