Lines Matching refs:fll
3474 static int madera_find_fratio(struct madera_fll *fll, unsigned int fref, in madera_find_fratio() argument
3477 switch (fll->madera->type) { in madera_find_fratio()
3479 switch (fll->madera->rev) { in madera_find_fratio()
3488 fll->fout, in madera_find_fratio()
3500 return madera_find_main_fratio(fref, fll->fout, fratio); in madera_find_fratio()
3504 static int madera_calc_fratio(struct madera_fll *fll, in madera_calc_fratio() argument
3524 init_ratio = madera_find_fratio(fll, fref, sync, &cfg->fratio); in madera_calc_fratio()
3526 madera_fll_err(fll, "Unable to find FRATIO for fref=%uHz\n", in madera_calc_fratio()
3534 switch (fll->madera->type) { in madera_calc_fratio()
3536 switch (fll->madera->rev) { in madera_calc_fratio()
3566 if (fll->fout % (ratio * fref)) { in madera_calc_fratio()
3582 if (fll->fout % (ratio * fref)) { in madera_calc_fratio()
3592 init_ratio = madera_find_fratio(fll, fref, sync, NULL); in madera_calc_fratio()
3595 madera_fll_warn(fll, "Falling back to integer mode operation\n"); in madera_calc_fratio()
3600 static int madera_find_fll_gain(struct madera_fll *fll, in madera_find_fll_gain() argument
3616 madera_fll_err(fll, "Unable to find gain for fref=%uHz\n", fref); in madera_find_fll_gain()
3621 static int madera_calc_fll(struct madera_fll *fll, in madera_calc_fll() argument
3630 madera_fll_dbg(fll, "fref=%u Fout=%u fvco=%u\n", in madera_calc_fll()
3631 fref, fll->fout, fll->fout * MADERA_FLL_VCO_MULT); in madera_calc_fll()
3634 ratio = madera_calc_fratio(fll, cfg, fref, sync); in madera_calc_fll()
3641 cfg->n = fll->fout / (ratio * fref); in madera_calc_fll()
3643 if (fll->fout % (ratio * fref)) { in madera_calc_fll()
3644 gcd_fll = gcd(fll->fout, ratio * fref); in madera_calc_fll()
3645 madera_fll_dbg(fll, "GCD=%u\n", gcd_fll); in madera_calc_fll()
3647 cfg->theta = (fll->fout - (cfg->n * ratio * fref)) in madera_calc_fll()
3665 switch (fll->madera->type) { in madera_calc_fll()
3667 switch (fll->madera->rev) { in madera_calc_fll()
3701 ret = madera_find_fll_gain(fll, cfg, fref, gains, n_gains); in madera_calc_fll()
3705 madera_fll_dbg(fll, "N=%d THETA=%d LAMBDA=%d\n", in madera_calc_fll()
3707 madera_fll_dbg(fll, "FRATIO=0x%x(%d) REFCLK_DIV=0x%x(%d)\n", in madera_calc_fll()
3709 madera_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain); in madera_calc_fll()
3771 static int madera_is_enabled_fll(struct madera_fll *fll, int base) in madera_is_enabled_fll() argument
3773 struct madera *madera = fll->madera; in madera_is_enabled_fll()
3780 madera_fll_err(fll, "Failed to read current state: %d\n", ret); in madera_is_enabled_fll()
3787 static int madera_wait_for_fll(struct madera_fll *fll, bool requested) in madera_wait_for_fll() argument
3789 struct madera *madera = fll->madera; in madera_wait_for_fll()
3794 madera_fll_dbg(fll, "Waiting for FLL...\n"); in madera_wait_for_fll()
3798 status = val & (MADERA_FLL1_LOCK_STS1 << (fll->id - 1)); in madera_wait_for_fll()
3815 madera_fll_warn(fll, "Timed out waiting for lock\n"); in madera_wait_for_fll()
3820 static bool madera_set_fll_phase_integrator(struct madera_fll *fll, in madera_set_fll_phase_integrator() argument
3833 regmap_update_bits_check(fll->madera->regmap, in madera_set_fll_phase_integrator()
3834 fll->base + MADERA_FLL_EFS_2_OFFS, in madera_set_fll_phase_integrator()
3842 static int madera_set_fll_clks_reg(struct madera_fll *fll, bool ena, in madera_set_fll_clks_reg() argument
3846 struct madera *madera = fll->madera; in madera_set_fll_clks_reg()
3853 madera_fll_err(fll, "Failed to read current source: %d\n", in madera_set_fll_clks_reg()
3882 static inline int madera_set_fll_clks(struct madera_fll *fll, int base, bool ena) in madera_set_fll_clks() argument
3884 return madera_set_fll_clks_reg(fll, ena, in madera_set_fll_clks()
3890 static inline int madera_set_fllao_clks(struct madera_fll *fll, int base, bool ena) in madera_set_fllao_clks() argument
3892 return madera_set_fll_clks_reg(fll, ena, in madera_set_fllao_clks()
3898 static inline int madera_set_fllhj_clks(struct madera_fll *fll, int base, bool ena) in madera_set_fllhj_clks() argument
3900 return madera_set_fll_clks_reg(fll, ena, in madera_set_fllhj_clks()
3906 static void madera_disable_fll(struct madera_fll *fll) in madera_disable_fll() argument
3908 struct madera *madera = fll->madera; in madera_disable_fll()
3914 sync_base = fll->base + CS47L35_FLL_SYNCHRONISER_OFFS; in madera_disable_fll()
3917 sync_base = fll->base + MADERA_FLL_SYNCHRONISER_OFFS; in madera_disable_fll()
3921 madera_fll_dbg(fll, "Disabling FLL\n"); in madera_disable_fll()
3924 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3927 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3933 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3936 madera_wait_for_fll(fll, false); in madera_disable_fll()
3939 madera_set_fll_clks(fll, sync_base, false); in madera_disable_fll()
3942 madera_set_fll_clks(fll, fll->base, false); in madera_disable_fll()
3947 static int madera_enable_fll(struct madera_fll *fll) in madera_enable_fll() argument
3949 struct madera *madera = fll->madera; in madera_enable_fll()
3951 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_enable_fll()
3961 if (fll->ref_src < 0 || fll->ref_freq == 0) { in madera_enable_fll()
3962 madera_fll_err(fll, "No REFCLK\n"); in madera_enable_fll()
3967 madera_fll_dbg(fll, "Enabling FLL, initially %s\n", in madera_enable_fll()
3970 if (fll->fout < MADERA_FLL_MIN_FOUT || in madera_enable_fll()
3971 fll->fout > MADERA_FLL_MAX_FOUT) { in madera_enable_fll()
3972 madera_fll_err(fll, "invalid fout %uHz\n", fll->fout); in madera_enable_fll()
3979 sync_base = fll->base + CS47L35_FLL_SYNCHRONISER_OFFS; in madera_enable_fll()
3982 sync_base = fll->base + MADERA_FLL_SYNCHRONISER_OFFS; in madera_enable_fll()
3986 sync_enabled = madera_is_enabled_fll(fll, sync_base); in madera_enable_fll()
3992 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
3993 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
3997 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
3998 fll->base + MADERA_FLL_CONTROL_7_OFFS, in madera_enable_fll()
4002 madera_set_fll_clks(fll, sync_base, false); in madera_enable_fll()
4003 madera_set_fll_clks(fll, fll->base, false); in madera_enable_fll()
4007 if (fll->sync_src >= 0) { in madera_enable_fll()
4008 ret = madera_calc_fll(fll, &cfg, fll->sync_freq, true); in madera_enable_fll()
4013 &cfg, fll->sync_src, in madera_enable_fll()
4019 madera_fll_warn(fll, "Synchroniser changed on active FLL\n"); in madera_enable_fll()
4022 ret = madera_calc_fll(fll, &cfg, fll->ref_freq, false); in madera_enable_fll()
4030 switch (fll->madera->type) { in madera_enable_fll()
4032 switch (fll->madera->rev) { in madera_enable_fll()
4038 madera_set_fll_phase_integrator(fll, &cfg, in madera_enable_fll()
4052 fll_change |= madera_set_fll_phase_integrator(fll, &cfg, in madera_enable_fll()
4061 fll_change |= madera_write_fll(madera, fll->base, in madera_enable_fll()
4062 &cfg, fll->ref_src, in madera_enable_fll()
4069 if (have_sync && fll->sync_freq > 100000) in madera_enable_fll()
4083 madera_set_fll_clks(fll, sync_base, true); in madera_enable_fll()
4090 madera_set_fll_clks(fll, fll->base, true); in madera_enable_fll()
4092 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
4097 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
4101 madera_wait_for_fll(fll, true); in madera_enable_fll()
4107 madera_disable_fll(fll); in madera_enable_fll()
4112 static int madera_apply_fll(struct madera_fll *fll) in madera_apply_fll() argument
4114 if (fll->fout) { in madera_apply_fll()
4115 return madera_enable_fll(fll); in madera_apply_fll()
4117 madera_disable_fll(fll); in madera_apply_fll()
4122 int madera_set_fll_syncclk(struct madera_fll *fll, int source, in madera_set_fll_syncclk() argument
4131 if (fll->sync_src == source && fll->sync_freq == fref) in madera_set_fll_syncclk()
4134 fll->sync_src = source; in madera_set_fll_syncclk()
4135 fll->sync_freq = fref; in madera_set_fll_syncclk()
4137 return madera_apply_fll(fll); in madera_set_fll_syncclk()
4141 int madera_set_fll_refclk(struct madera_fll *fll, int source, in madera_set_fll_refclk() argument
4146 if (fll->ref_src == source && in madera_set_fll_refclk()
4147 fll->ref_freq == fref && fll->fout == fout) in madera_set_fll_refclk()
4154 if (fout && fout != fll->fout) { in madera_set_fll_refclk()
4155 ret = madera_is_enabled_fll(fll, fll->base); in madera_set_fll_refclk()
4160 madera_fll_err(fll, "Can't change Fout on active FLL\n"); in madera_set_fll_refclk()
4165 fll->ref_src = source; in madera_set_fll_refclk()
4166 fll->ref_freq = fref; in madera_set_fll_refclk()
4167 fll->fout = fout; in madera_set_fll_refclk()
4169 return madera_apply_fll(fll); in madera_set_fll_refclk()
4174 struct madera_fll *fll) in madera_init_fll() argument
4176 fll->id = id; in madera_init_fll()
4177 fll->base = base; in madera_init_fll()
4178 fll->madera = madera; in madera_init_fll()
4179 fll->ref_src = MADERA_FLL_SRC_NONE; in madera_init_fll()
4180 fll->sync_src = MADERA_FLL_SRC_NONE; in madera_init_fll()
4183 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_init_fll()
4239 static int madera_enable_fll_ao(struct madera_fll *fll, in madera_enable_fll_ao() argument
4243 struct madera *madera = fll->madera; in madera_enable_fll_ao()
4244 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_enable_fll_ao()
4254 madera_fll_dbg(fll, "Enabling FLL_AO, initially %s\n", in madera_enable_fll_ao()
4258 regmap_update_bits(fll->madera->regmap, in madera_enable_fll_ao()
4259 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4263 madera_set_fllao_clks(fll, fll->base, false); in madera_enable_fll_ao()
4271 val |= (fll->ref_src << MADERA_FLL_AO_REFCLK_SRC_SHIFT) in madera_enable_fll_ao()
4278 madera_set_fllao_clks(fll, fll->base, true); in madera_enable_fll_ao()
4281 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4286 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4290 madera_wait_for_fll(fll, true); in madera_enable_fll_ao()
4295 static int madera_disable_fll_ao(struct madera_fll *fll) in madera_disable_fll_ao() argument
4297 struct madera *madera = fll->madera; in madera_disable_fll_ao()
4300 madera_fll_dbg(fll, "Disabling FLL_AO\n"); in madera_disable_fll_ao()
4303 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_disable_fll_ao()
4306 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_disable_fll_ao()
4309 madera_wait_for_fll(fll, false); in madera_disable_fll_ao()
4320 fll->base + MADERA_FLLAO_CONTROL_2_OFFS, in madera_disable_fll_ao()
4324 madera_set_fllao_clks(fll, fll->base, false); in madera_disable_fll_ao()
4331 int madera_set_fll_ao_refclk(struct madera_fll *fll, int source, in madera_set_fll_ao_refclk() argument
4339 if (fll->ref_src == source && in madera_set_fll_ao_refclk()
4340 fll->ref_freq == fin && fll->fout == fout) in madera_set_fll_ao_refclk()
4343 madera_fll_dbg(fll, "Change FLL_AO refclk to fin=%u fout=%u source=%d\n", in madera_set_fll_ao_refclk()
4346 if (fout && (fll->ref_freq != fin || fll->fout != fout)) { in madera_set_fll_ao_refclk()
4354 madera_fll_err(fll, in madera_set_fll_ao_refclk()
4363 fll->ref_src = source; in madera_set_fll_ao_refclk()
4364 fll->ref_freq = fin; in madera_set_fll_ao_refclk()
4365 fll->fout = fout; in madera_set_fll_ao_refclk()
4368 ret = madera_enable_fll_ao(fll, patch, patch_size); in madera_set_fll_ao_refclk()
4370 madera_disable_fll_ao(fll); in madera_set_fll_ao_refclk()
4376 static int madera_fllhj_disable(struct madera_fll *fll) in madera_fllhj_disable() argument
4378 struct madera *madera = fll->madera; in madera_fllhj_disable()
4381 madera_fll_dbg(fll, "Disabling FLL\n"); in madera_fllhj_disable()
4390 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_disable()
4393 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_disable()
4396 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_disable()
4399 madera_wait_for_fll(fll, false); in madera_fllhj_disable()
4409 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_disable()
4413 madera_set_fllhj_clks(fll, fll->base, false); in madera_fllhj_disable()
4420 static int madera_fllhj_apply(struct madera_fll *fll, int fin) in madera_fllhj_apply() argument
4422 struct madera *madera = fll->madera; in madera_fllhj_apply()
4428 madera_fll_dbg(fll, "fin=%d, fout=%d\n", fin, fll->fout); in madera_fllhj_apply()
4440 fout = fll->fout; in madera_fllhj_apply()
4463 fout = fll->fout * 6; in madera_fllhj_apply()
4479 madera_fll_dbg(fll, "refdiv=%d, fref=%d, frac:%d\n", in madera_fllhj_apply()
4485 madera_fll_err(fll, "FBDIV (%d) must be >= 1\n", fbdiv); in madera_fllhj_apply()
4492 madera_fll_err(fll, "FBDIV (%u) >= 1024\n", fbdiv); in madera_fllhj_apply()
4497 madera_fll_dbg(fll, "lockdet=%d, hp=0x%x, fbdiv:%d\n", in madera_fllhj_apply()
4507 madera_fll_dbg(fll, "fll_n=%d, gcd=%d, theta=%d, lambda=%d\n", in madera_fllhj_apply()
4512 madera_fll_err(fll, "N not in valid %s mode range %d-%d: %d\n", in madera_fllhj_apply()
4518 madera_fll_err(fll, "Invalid fbdiv for %s mode (%u)\n", in madera_fllhj_apply()
4525 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_apply()
4528 fll->base + MADERA_FLL_CONTROL_3_OFFS, in madera_fllhj_apply()
4532 fll->base + MADERA_FLL_CONTROL_4_OFFS, in madera_fllhj_apply()
4536 fll->base + MADERA_FLL_CONTROL_5_OFFS, in madera_fllhj_apply()
4540 fll->base + MADERA_FLL_CONTROL_6_OFFS, in madera_fllhj_apply()
4544 fll->base + MADERA_FLL_GAIN_OFFS, in madera_fllhj_apply()
4550 fll->base + MADERA_FLL_CONTROL_10_OFFS, in madera_fllhj_apply()
4554 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_apply()
4558 fll->base + MADERA_FLL1_DIGITAL_TEST_1_OFFS, in madera_fllhj_apply()
4566 static int madera_fllhj_enable(struct madera_fll *fll) in madera_fllhj_enable() argument
4568 struct madera *madera = fll->madera; in madera_fllhj_enable()
4569 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_fllhj_enable()
4578 madera_fll_dbg(fll, "Enabling FLL, initially %s\n", in madera_fllhj_enable()
4582 regmap_update_bits(fll->madera->regmap, in madera_fllhj_enable()
4583 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4588 madera_set_fllhj_clks(fll, fll->base, false); in madera_fllhj_enable()
4591 ret = madera_fllhj_apply(fll, fll->ref_freq); in madera_fllhj_enable()
4593 madera_fll_err(fll, "Failed to set FLL: %d\n", ret); in madera_fllhj_enable()
4597 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4599 fll->ref_src << CS47L92_FLL1_REFCLK_SRC_SHIFT); in madera_fllhj_enable()
4601 madera_set_fllhj_clks(fll, fll->base, true); in madera_fllhj_enable()
4604 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4610 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_enable()
4615 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_enable()
4621 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4626 madera_wait_for_fll(fll, true); in madera_fllhj_enable()
4631 static int madera_fllhj_validate(struct madera_fll *fll, in madera_fllhj_validate() argument
4636 madera_fll_err(fll, "fllout set without valid input clk\n"); in madera_fllhj_validate()
4640 if (fll->fout && fout != fll->fout) { in madera_fllhj_validate()
4641 madera_fll_err(fll, "Can't change output on active FLL\n"); in madera_fllhj_validate()
4646 madera_fll_err(fll, "Can't scale %dMHz to <=13MHz\n", ref_in); in madera_fllhj_validate()
4653 int madera_fllhj_set_refclk(struct madera_fll *fll, int source, in madera_fllhj_set_refclk() argument
4665 if (fll->ref_src == source && fll->ref_freq == fin && in madera_fllhj_set_refclk()
4666 fll->fout == fout) in madera_fllhj_set_refclk()
4669 if (fin && fout && madera_fllhj_validate(fll, fin, fout)) in madera_fllhj_set_refclk()
4672 fll->ref_src = source; in madera_fllhj_set_refclk()
4673 fll->ref_freq = fin; in madera_fllhj_set_refclk()
4674 fll->fout = fout; in madera_fllhj_set_refclk()
4677 ret = madera_fllhj_enable(fll); in madera_fllhj_set_refclk()
4679 madera_fllhj_disable(fll); in madera_fllhj_set_refclk()