Lines Matching refs:fll

3468 static int madera_find_fratio(struct madera_fll *fll, unsigned int fref,  in madera_find_fratio()  argument
3471 switch (fll->madera->type) { in madera_find_fratio()
3473 switch (fll->madera->rev) { in madera_find_fratio()
3482 fll->fout, in madera_find_fratio()
3494 return madera_find_main_fratio(fref, fll->fout, fratio); in madera_find_fratio()
3498 static int madera_calc_fratio(struct madera_fll *fll, in madera_calc_fratio() argument
3518 init_ratio = madera_find_fratio(fll, fref, sync, &cfg->fratio); in madera_calc_fratio()
3520 madera_fll_err(fll, "Unable to find FRATIO for fref=%uHz\n", in madera_calc_fratio()
3528 switch (fll->madera->type) { in madera_calc_fratio()
3530 switch (fll->madera->rev) { in madera_calc_fratio()
3560 if (fll->fout % (ratio * fref)) { in madera_calc_fratio()
3576 if (fll->fout % (ratio * fref)) { in madera_calc_fratio()
3586 init_ratio = madera_find_fratio(fll, fref, sync, NULL); in madera_calc_fratio()
3589 madera_fll_warn(fll, "Falling back to integer mode operation\n"); in madera_calc_fratio()
3594 static int madera_find_fll_gain(struct madera_fll *fll, in madera_find_fll_gain() argument
3610 madera_fll_err(fll, "Unable to find gain for fref=%uHz\n", fref); in madera_find_fll_gain()
3615 static int madera_calc_fll(struct madera_fll *fll, in madera_calc_fll() argument
3624 madera_fll_dbg(fll, "fref=%u Fout=%u fvco=%u\n", in madera_calc_fll()
3625 fref, fll->fout, fll->fout * MADERA_FLL_VCO_MULT); in madera_calc_fll()
3628 ratio = madera_calc_fratio(fll, cfg, fref, sync); in madera_calc_fll()
3635 cfg->n = fll->fout / (ratio * fref); in madera_calc_fll()
3637 if (fll->fout % (ratio * fref)) { in madera_calc_fll()
3638 gcd_fll = gcd(fll->fout, ratio * fref); in madera_calc_fll()
3639 madera_fll_dbg(fll, "GCD=%u\n", gcd_fll); in madera_calc_fll()
3641 cfg->theta = (fll->fout - (cfg->n * ratio * fref)) in madera_calc_fll()
3659 switch (fll->madera->type) { in madera_calc_fll()
3661 switch (fll->madera->rev) { in madera_calc_fll()
3695 ret = madera_find_fll_gain(fll, cfg, fref, gains, n_gains); in madera_calc_fll()
3699 madera_fll_dbg(fll, "N=%d THETA=%d LAMBDA=%d\n", in madera_calc_fll()
3701 madera_fll_dbg(fll, "FRATIO=0x%x(%d) REFCLK_DIV=0x%x(%d)\n", in madera_calc_fll()
3703 madera_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain); in madera_calc_fll()
3765 static int madera_is_enabled_fll(struct madera_fll *fll, int base) in madera_is_enabled_fll() argument
3767 struct madera *madera = fll->madera; in madera_is_enabled_fll()
3774 madera_fll_err(fll, "Failed to read current state: %d\n", ret); in madera_is_enabled_fll()
3781 static int madera_wait_for_fll(struct madera_fll *fll, bool requested) in madera_wait_for_fll() argument
3783 struct madera *madera = fll->madera; in madera_wait_for_fll()
3788 madera_fll_dbg(fll, "Waiting for FLL...\n"); in madera_wait_for_fll()
3792 status = val & (MADERA_FLL1_LOCK_STS1 << (fll->id - 1)); in madera_wait_for_fll()
3809 madera_fll_warn(fll, "Timed out waiting for lock\n"); in madera_wait_for_fll()
3814 static bool madera_set_fll_phase_integrator(struct madera_fll *fll, in madera_set_fll_phase_integrator() argument
3827 regmap_update_bits_check(fll->madera->regmap, in madera_set_fll_phase_integrator()
3828 fll->base + MADERA_FLL_EFS_2_OFFS, in madera_set_fll_phase_integrator()
3836 static int madera_set_fll_clks_reg(struct madera_fll *fll, bool ena, in madera_set_fll_clks_reg() argument
3840 struct madera *madera = fll->madera; in madera_set_fll_clks_reg()
3847 madera_fll_err(fll, "Failed to read current source: %d\n", in madera_set_fll_clks_reg()
3876 static inline int madera_set_fll_clks(struct madera_fll *fll, int base, bool ena) in madera_set_fll_clks() argument
3878 return madera_set_fll_clks_reg(fll, ena, in madera_set_fll_clks()
3884 static inline int madera_set_fllao_clks(struct madera_fll *fll, int base, bool ena) in madera_set_fllao_clks() argument
3886 return madera_set_fll_clks_reg(fll, ena, in madera_set_fllao_clks()
3892 static inline int madera_set_fllhj_clks(struct madera_fll *fll, int base, bool ena) in madera_set_fllhj_clks() argument
3894 return madera_set_fll_clks_reg(fll, ena, in madera_set_fllhj_clks()
3900 static void madera_disable_fll(struct madera_fll *fll) in madera_disable_fll() argument
3902 struct madera *madera = fll->madera; in madera_disable_fll()
3908 sync_base = fll->base + CS47L35_FLL_SYNCHRONISER_OFFS; in madera_disable_fll()
3911 sync_base = fll->base + MADERA_FLL_SYNCHRONISER_OFFS; in madera_disable_fll()
3915 madera_fll_dbg(fll, "Disabling FLL\n"); in madera_disable_fll()
3918 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3921 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3927 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3930 madera_wait_for_fll(fll, false); in madera_disable_fll()
3933 madera_set_fll_clks(fll, sync_base, false); in madera_disable_fll()
3936 madera_set_fll_clks(fll, fll->base, false); in madera_disable_fll()
3941 static int madera_enable_fll(struct madera_fll *fll) in madera_enable_fll() argument
3943 struct madera *madera = fll->madera; in madera_enable_fll()
3945 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_enable_fll()
3955 if (fll->ref_src < 0 || fll->ref_freq == 0) { in madera_enable_fll()
3956 madera_fll_err(fll, "No REFCLK\n"); in madera_enable_fll()
3961 madera_fll_dbg(fll, "Enabling FLL, initially %s\n", in madera_enable_fll()
3964 if (fll->fout < MADERA_FLL_MIN_FOUT || in madera_enable_fll()
3965 fll->fout > MADERA_FLL_MAX_FOUT) { in madera_enable_fll()
3966 madera_fll_err(fll, "invalid fout %uHz\n", fll->fout); in madera_enable_fll()
3973 sync_base = fll->base + CS47L35_FLL_SYNCHRONISER_OFFS; in madera_enable_fll()
3976 sync_base = fll->base + MADERA_FLL_SYNCHRONISER_OFFS; in madera_enable_fll()
3980 sync_enabled = madera_is_enabled_fll(fll, sync_base); in madera_enable_fll()
3986 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
3987 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
3991 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
3992 fll->base + MADERA_FLL_CONTROL_7_OFFS, in madera_enable_fll()
3996 madera_set_fll_clks(fll, sync_base, false); in madera_enable_fll()
3997 madera_set_fll_clks(fll, fll->base, false); in madera_enable_fll()
4001 if (fll->sync_src >= 0) { in madera_enable_fll()
4002 ret = madera_calc_fll(fll, &cfg, fll->sync_freq, true); in madera_enable_fll()
4007 &cfg, fll->sync_src, in madera_enable_fll()
4013 madera_fll_warn(fll, "Synchroniser changed on active FLL\n"); in madera_enable_fll()
4016 ret = madera_calc_fll(fll, &cfg, fll->ref_freq, false); in madera_enable_fll()
4024 switch (fll->madera->type) { in madera_enable_fll()
4026 switch (fll->madera->rev) { in madera_enable_fll()
4032 madera_set_fll_phase_integrator(fll, &cfg, in madera_enable_fll()
4046 fll_change |= madera_set_fll_phase_integrator(fll, &cfg, in madera_enable_fll()
4055 fll_change |= madera_write_fll(madera, fll->base, in madera_enable_fll()
4056 &cfg, fll->ref_src, in madera_enable_fll()
4063 if (have_sync && fll->sync_freq > 100000) in madera_enable_fll()
4077 madera_set_fll_clks(fll, sync_base, true); in madera_enable_fll()
4084 madera_set_fll_clks(fll, fll->base, true); in madera_enable_fll()
4086 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
4091 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
4095 madera_wait_for_fll(fll, true); in madera_enable_fll()
4101 madera_disable_fll(fll); in madera_enable_fll()
4106 static int madera_apply_fll(struct madera_fll *fll) in madera_apply_fll() argument
4108 if (fll->fout) { in madera_apply_fll()
4109 return madera_enable_fll(fll); in madera_apply_fll()
4111 madera_disable_fll(fll); in madera_apply_fll()
4116 int madera_set_fll_syncclk(struct madera_fll *fll, int source, in madera_set_fll_syncclk() argument
4125 if (fll->sync_src == source && fll->sync_freq == fref) in madera_set_fll_syncclk()
4128 fll->sync_src = source; in madera_set_fll_syncclk()
4129 fll->sync_freq = fref; in madera_set_fll_syncclk()
4131 return madera_apply_fll(fll); in madera_set_fll_syncclk()
4135 int madera_set_fll_refclk(struct madera_fll *fll, int source, in madera_set_fll_refclk() argument
4140 if (fll->ref_src == source && in madera_set_fll_refclk()
4141 fll->ref_freq == fref && fll->fout == fout) in madera_set_fll_refclk()
4148 if (fout && fout != fll->fout) { in madera_set_fll_refclk()
4149 ret = madera_is_enabled_fll(fll, fll->base); in madera_set_fll_refclk()
4154 madera_fll_err(fll, "Can't change Fout on active FLL\n"); in madera_set_fll_refclk()
4159 fll->ref_src = source; in madera_set_fll_refclk()
4160 fll->ref_freq = fref; in madera_set_fll_refclk()
4161 fll->fout = fout; in madera_set_fll_refclk()
4163 return madera_apply_fll(fll); in madera_set_fll_refclk()
4168 struct madera_fll *fll) in madera_init_fll() argument
4170 fll->id = id; in madera_init_fll()
4171 fll->base = base; in madera_init_fll()
4172 fll->madera = madera; in madera_init_fll()
4173 fll->ref_src = MADERA_FLL_SRC_NONE; in madera_init_fll()
4174 fll->sync_src = MADERA_FLL_SRC_NONE; in madera_init_fll()
4177 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_init_fll()
4233 static int madera_enable_fll_ao(struct madera_fll *fll, in madera_enable_fll_ao() argument
4237 struct madera *madera = fll->madera; in madera_enable_fll_ao()
4238 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_enable_fll_ao()
4248 madera_fll_dbg(fll, "Enabling FLL_AO, initially %s\n", in madera_enable_fll_ao()
4252 regmap_update_bits(fll->madera->regmap, in madera_enable_fll_ao()
4253 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4257 madera_set_fllao_clks(fll, fll->base, false); in madera_enable_fll_ao()
4265 val |= (fll->ref_src << MADERA_FLL_AO_REFCLK_SRC_SHIFT) in madera_enable_fll_ao()
4272 madera_set_fllao_clks(fll, fll->base, true); in madera_enable_fll_ao()
4275 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4280 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4284 madera_wait_for_fll(fll, true); in madera_enable_fll_ao()
4289 static int madera_disable_fll_ao(struct madera_fll *fll) in madera_disable_fll_ao() argument
4291 struct madera *madera = fll->madera; in madera_disable_fll_ao()
4294 madera_fll_dbg(fll, "Disabling FLL_AO\n"); in madera_disable_fll_ao()
4297 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_disable_fll_ao()
4300 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_disable_fll_ao()
4303 madera_wait_for_fll(fll, false); in madera_disable_fll_ao()
4314 fll->base + MADERA_FLLAO_CONTROL_2_OFFS, in madera_disable_fll_ao()
4318 madera_set_fllao_clks(fll, fll->base, false); in madera_disable_fll_ao()
4325 int madera_set_fll_ao_refclk(struct madera_fll *fll, int source, in madera_set_fll_ao_refclk() argument
4333 if (fll->ref_src == source && in madera_set_fll_ao_refclk()
4334 fll->ref_freq == fin && fll->fout == fout) in madera_set_fll_ao_refclk()
4337 madera_fll_dbg(fll, "Change FLL_AO refclk to fin=%u fout=%u source=%d\n", in madera_set_fll_ao_refclk()
4340 if (fout && (fll->ref_freq != fin || fll->fout != fout)) { in madera_set_fll_ao_refclk()
4348 madera_fll_err(fll, in madera_set_fll_ao_refclk()
4357 fll->ref_src = source; in madera_set_fll_ao_refclk()
4358 fll->ref_freq = fin; in madera_set_fll_ao_refclk()
4359 fll->fout = fout; in madera_set_fll_ao_refclk()
4362 ret = madera_enable_fll_ao(fll, patch, patch_size); in madera_set_fll_ao_refclk()
4364 madera_disable_fll_ao(fll); in madera_set_fll_ao_refclk()
4370 static int madera_fllhj_disable(struct madera_fll *fll) in madera_fllhj_disable() argument
4372 struct madera *madera = fll->madera; in madera_fllhj_disable()
4375 madera_fll_dbg(fll, "Disabling FLL\n"); in madera_fllhj_disable()
4384 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_disable()
4387 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_disable()
4390 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_disable()
4393 madera_wait_for_fll(fll, false); in madera_fllhj_disable()
4403 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_disable()
4407 madera_set_fllhj_clks(fll, fll->base, false); in madera_fllhj_disable()
4414 static int madera_fllhj_apply(struct madera_fll *fll, int fin) in madera_fllhj_apply() argument
4416 struct madera *madera = fll->madera; in madera_fllhj_apply()
4422 madera_fll_dbg(fll, "fin=%d, fout=%d\n", fin, fll->fout); in madera_fllhj_apply()
4434 fout = fll->fout; in madera_fllhj_apply()
4457 fout = fll->fout * 6; in madera_fllhj_apply()
4473 madera_fll_dbg(fll, "refdiv=%d, fref=%d, frac:%d\n", in madera_fllhj_apply()
4479 madera_fll_err(fll, "FBDIV (%d) must be >= 1\n", fbdiv); in madera_fllhj_apply()
4486 madera_fll_err(fll, "FBDIV (%u) >= 1024\n", fbdiv); in madera_fllhj_apply()
4491 madera_fll_dbg(fll, "lockdet=%d, hp=0x%x, fbdiv:%d\n", in madera_fllhj_apply()
4501 madera_fll_dbg(fll, "fll_n=%d, gcd=%d, theta=%d, lambda=%d\n", in madera_fllhj_apply()
4506 madera_fll_err(fll, "N not in valid %s mode range %d-%d: %d\n", in madera_fllhj_apply()
4512 madera_fll_err(fll, "Invalid fbdiv for %s mode (%u)\n", in madera_fllhj_apply()
4519 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_apply()
4522 fll->base + MADERA_FLL_CONTROL_3_OFFS, in madera_fllhj_apply()
4526 fll->base + MADERA_FLL_CONTROL_4_OFFS, in madera_fllhj_apply()
4530 fll->base + MADERA_FLL_CONTROL_5_OFFS, in madera_fllhj_apply()
4534 fll->base + MADERA_FLL_CONTROL_6_OFFS, in madera_fllhj_apply()
4538 fll->base + MADERA_FLL_GAIN_OFFS, in madera_fllhj_apply()
4544 fll->base + MADERA_FLL_CONTROL_10_OFFS, in madera_fllhj_apply()
4548 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_apply()
4552 fll->base + MADERA_FLL1_DIGITAL_TEST_1_OFFS, in madera_fllhj_apply()
4560 static int madera_fllhj_enable(struct madera_fll *fll) in madera_fllhj_enable() argument
4562 struct madera *madera = fll->madera; in madera_fllhj_enable()
4563 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_fllhj_enable()
4572 madera_fll_dbg(fll, "Enabling FLL, initially %s\n", in madera_fllhj_enable()
4576 regmap_update_bits(fll->madera->regmap, in madera_fllhj_enable()
4577 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4582 madera_set_fllhj_clks(fll, fll->base, false); in madera_fllhj_enable()
4585 ret = madera_fllhj_apply(fll, fll->ref_freq); in madera_fllhj_enable()
4587 madera_fll_err(fll, "Failed to set FLL: %d\n", ret); in madera_fllhj_enable()
4591 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4593 fll->ref_src << CS47L92_FLL1_REFCLK_SRC_SHIFT); in madera_fllhj_enable()
4595 madera_set_fllhj_clks(fll, fll->base, true); in madera_fllhj_enable()
4598 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4604 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_enable()
4609 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_enable()
4615 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4620 madera_wait_for_fll(fll, true); in madera_fllhj_enable()
4625 static int madera_fllhj_validate(struct madera_fll *fll, in madera_fllhj_validate() argument
4630 madera_fll_err(fll, "fllout set without valid input clk\n"); in madera_fllhj_validate()
4634 if (fll->fout && fout != fll->fout) { in madera_fllhj_validate()
4635 madera_fll_err(fll, "Can't change output on active FLL\n"); in madera_fllhj_validate()
4640 madera_fll_err(fll, "Can't scale %dMHz to <=13MHz\n", ref_in); in madera_fllhj_validate()
4647 int madera_fllhj_set_refclk(struct madera_fll *fll, int source, in madera_fllhj_set_refclk() argument
4659 if (fll->ref_src == source && fll->ref_freq == fin && in madera_fllhj_set_refclk()
4660 fll->fout == fout) in madera_fllhj_set_refclk()
4663 if (fin && fout && madera_fllhj_validate(fll, fin, fout)) in madera_fllhj_set_refclk()
4666 fll->ref_src = source; in madera_fllhj_set_refclk()
4667 fll->ref_freq = fin; in madera_fllhj_set_refclk()
4668 fll->fout = fout; in madera_fllhj_set_refclk()
4671 ret = madera_fllhj_enable(fll); in madera_fllhj_set_refclk()
4673 madera_fllhj_disable(fll); in madera_fllhj_set_refclk()