Lines Matching refs:fll
2104 static int arizona_validate_fll(struct arizona_fll *fll,
2110 if (fll->fout && Fout != fll->fout) {
2111 arizona_fll_err(fll,
2117 arizona_fll_err(fll,
2123 Fvco_min = ARIZONA_FLL_MIN_FVCO * fll->vco_mult;
2125 arizona_fll_err(fll, "No FLL_OUTDIV for Fout=%uHz\n",
2149 static int arizona_calc_fratio(struct arizona_fll *fll,
2172 arizona_fll_err(fll, "Unable to find FRATIO for Fref=%uHz\n",
2177 switch (fll->arizona->type) {
2183 if (fll->arizona->rev < 3 || sync)
2197 arizona_fll_dbg(fll, "pseudo: initial ratio=%u fref=%u refdiv=%u\n",
2208 arizona_fll_dbg(fll,
2218 (fll->vco_mult * ratio) < Fref) {
2219 arizona_fll_dbg(fll, "pseudo: hit VCO corner\n");
2224 arizona_fll_dbg(fll,
2234 arizona_fll_dbg(fll,
2245 arizona_fll_dbg(fll,
2250 arizona_fll_warn(fll, "Falling back to integer mode operation\n");
2254 static int arizona_calc_fll(struct arizona_fll *fll,
2261 arizona_fll_dbg(fll, "Fref=%u Fout=%u\n", Fref, fll->fout);
2265 while (fll->fout * div < ARIZONA_FLL_MIN_FVCO * fll->vco_mult) {
2270 target = fll->fout * div / fll->vco_mult;
2273 arizona_fll_dbg(fll, "Fvco=%dHz\n", target);
2276 ratio = arizona_calc_fratio(fll, cfg, target, Fref, sync);
2287 arizona_fll_dbg(fll, "GCD=%u\n", gcd_fll);
2313 arizona_fll_err(fll, "Unable to find gain for Fref=%uHz\n",
2318 arizona_fll_dbg(fll, "N=%d THETA=%d LAMBDA=%d\n",
2320 arizona_fll_dbg(fll, "FRATIO=0x%x(%d) OUTDIV=%d REFCLK_DIV=0x%x(%d)\n",
2323 arizona_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain);
2363 static int arizona_is_enabled_fll(struct arizona_fll *fll, int base)
2365 struct arizona *arizona = fll->arizona;
2371 arizona_fll_err(fll, "Failed to read current state: %d\n",
2379 static int arizona_set_fll_clks(struct arizona_fll *fll, int base, bool ena)
2381 struct arizona *arizona = fll->arizona;
2388 arizona_fll_err(fll, "Failed to read current source: %d\n",
2415 static int arizona_enable_fll(struct arizona_fll *fll)
2417 struct arizona *arizona = fll->arizona;
2419 int already_enabled = arizona_is_enabled_fll(fll, fll->base);
2420 int sync_enabled = arizona_is_enabled_fll(fll, fll->base + 0x10);
2432 regmap_update_bits(fll->arizona->regmap, fll->base + 1,
2435 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9,
2438 if (arizona_is_enabled_fll(fll, fll->base + 0x10) > 0)
2439 arizona_set_fll_clks(fll, fll->base + 0x10, false);
2440 arizona_set_fll_clks(fll, fll->base, false);
2447 if (fll->ref_src >= 0 && fll->ref_freq &&
2448 fll->ref_src != fll->sync_src) {
2449 arizona_calc_fll(fll, &cfg, fll->ref_freq, false);
2452 if (fll->sync_src >= 0 && cfg.lambda)
2455 arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src,
2457 if (fll->sync_src >= 0) {
2458 arizona_calc_fll(fll, &cfg, fll->sync_freq, true);
2460 arizona_apply_fll(arizona, fll->base + 0x10, &cfg,
2461 fll->sync_src, true);
2464 } else if (fll->sync_src >= 0) {
2465 arizona_calc_fll(fll, &cfg, fll->sync_freq, false);
2467 arizona_apply_fll(arizona, fll->base, &cfg,
2468 fll->sync_src, false);
2470 regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
2473 arizona_fll_err(fll, "No clocks provided\n");
2478 arizona_fll_warn(fll, "Synchroniser changed on active FLL\n");
2484 if (use_sync && fll->sync_freq > 100000)
2485 regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
2488 regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
2496 arizona_set_fll_clks(fll, fll->base + 0x10, true);
2497 regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
2501 arizona_set_fll_clks(fll, fll->base, true);
2502 regmap_update_bits_async(arizona->regmap, fll->base + 1,
2506 regmap_update_bits_async(arizona->regmap, fll->base + 1,
2509 arizona_fll_dbg(fll, "Waiting for FLL lock...\n");
2520 if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1)))
2524 arizona_fll_warn(fll, "Timed out waiting for lock\n");
2526 arizona_fll_dbg(fll, "FLL locked (%d polls)\n", i);
2531 static void arizona_disable_fll(struct arizona_fll *fll)
2533 struct arizona *arizona = fll->arizona;
2536 regmap_update_bits_async(arizona->regmap, fll->base + 1,
2538 regmap_update_bits_check(arizona->regmap, fll->base + 1,
2540 regmap_update_bits_check(arizona->regmap, fll->base + 0x11,
2542 regmap_update_bits_async(arizona->regmap, fll->base + 1,
2546 arizona_set_fll_clks(fll, fll->base + 0x10, false);
2549 arizona_set_fll_clks(fll, fll->base, false);
2554 int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
2559 if (fll->ref_src == source && fll->ref_freq == Fref)
2562 if (fll->fout && Fref > 0) {
2563 ret = arizona_validate_fll(fll, Fref, fll->fout);
2568 fll->ref_src = source;
2569 fll->ref_freq = Fref;
2571 if (fll->fout && Fref > 0)
2572 ret = arizona_enable_fll(fll);
2578 int arizona_set_fll(struct arizona_fll *fll, int source,
2583 if (fll->sync_src == source &&
2584 fll->sync_freq == Fref && fll->fout == Fout)
2588 if (fll->ref_src >= 0) {
2589 ret = arizona_validate_fll(fll, fll->ref_freq, Fout);
2594 ret = arizona_validate_fll(fll, Fref, Fout);
2599 fll->sync_src = source;
2600 fll->sync_freq = Fref;
2601 fll->fout = Fout;
2604 ret = arizona_enable_fll(fll);
2606 arizona_disable_fll(fll);
2613 int ok_irq, struct arizona_fll *fll)
2617 fll->id = id;
2618 fll->base = base;
2619 fll->arizona = arizona;
2620 fll->sync_src = ARIZONA_FLL_SRC_NONE;
2627 fll->ref_src = val & ARIZONA_CLK_32K_SRC_MASK;
2630 fll->ref_src = ARIZONA_FLL_SRC_NONE;
2632 fll->ref_freq = 32768;
2634 snprintf(fll->lock_name, sizeof(fll->lock_name), "FLL%d lock", id);
2635 snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name),
2638 regmap_update_bits(arizona->regmap, fll->base + 1,