Lines Matching refs:fll
2105 static int arizona_validate_fll(struct arizona_fll *fll, in arizona_validate_fll() argument
2111 if (fll->fout && Fout != fll->fout) { in arizona_validate_fll()
2112 arizona_fll_err(fll, in arizona_validate_fll()
2118 arizona_fll_err(fll, in arizona_validate_fll()
2124 Fvco_min = ARIZONA_FLL_MIN_FVCO * fll->vco_mult; in arizona_validate_fll()
2126 arizona_fll_err(fll, "No FLL_OUTDIV for Fout=%uHz\n", in arizona_validate_fll()
2150 static int arizona_calc_fratio(struct arizona_fll *fll, in arizona_calc_fratio() argument
2173 arizona_fll_err(fll, "Unable to find FRATIO for Fref=%uHz\n", in arizona_calc_fratio()
2178 switch (fll->arizona->type) { in arizona_calc_fratio()
2184 if (fll->arizona->rev < 3 || sync) in arizona_calc_fratio()
2198 arizona_fll_dbg(fll, "pseudo: initial ratio=%u fref=%u refdiv=%u\n", in arizona_calc_fratio()
2209 arizona_fll_dbg(fll, in arizona_calc_fratio()
2219 (fll->vco_mult * ratio) < Fref) { in arizona_calc_fratio()
2220 arizona_fll_dbg(fll, "pseudo: hit VCO corner\n"); in arizona_calc_fratio()
2225 arizona_fll_dbg(fll, in arizona_calc_fratio()
2235 arizona_fll_dbg(fll, in arizona_calc_fratio()
2246 arizona_fll_dbg(fll, in arizona_calc_fratio()
2251 arizona_fll_warn(fll, "Falling back to integer mode operation\n"); in arizona_calc_fratio()
2255 static int arizona_calc_fll(struct arizona_fll *fll, in arizona_calc_fll() argument
2262 arizona_fll_dbg(fll, "Fref=%u Fout=%u\n", Fref, fll->fout); in arizona_calc_fll()
2266 while (fll->fout * div < ARIZONA_FLL_MIN_FVCO * fll->vco_mult) { in arizona_calc_fll()
2271 target = fll->fout * div / fll->vco_mult; in arizona_calc_fll()
2274 arizona_fll_dbg(fll, "Fvco=%dHz\n", target); in arizona_calc_fll()
2277 ratio = arizona_calc_fratio(fll, cfg, target, Fref, sync); in arizona_calc_fll()
2288 arizona_fll_dbg(fll, "GCD=%u\n", gcd_fll); in arizona_calc_fll()
2314 arizona_fll_err(fll, "Unable to find gain for Fref=%uHz\n", in arizona_calc_fll()
2319 arizona_fll_dbg(fll, "N=%d THETA=%d LAMBDA=%d\n", in arizona_calc_fll()
2321 arizona_fll_dbg(fll, "FRATIO=0x%x(%d) OUTDIV=%d REFCLK_DIV=0x%x(%d)\n", in arizona_calc_fll()
2324 arizona_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain); in arizona_calc_fll()
2364 static int arizona_is_enabled_fll(struct arizona_fll *fll, int base) in arizona_is_enabled_fll() argument
2366 struct arizona *arizona = fll->arizona; in arizona_is_enabled_fll()
2372 arizona_fll_err(fll, "Failed to read current state: %d\n", in arizona_is_enabled_fll()
2380 static int arizona_set_fll_clks(struct arizona_fll *fll, int base, bool ena) in arizona_set_fll_clks() argument
2382 struct arizona *arizona = fll->arizona; in arizona_set_fll_clks()
2389 arizona_fll_err(fll, "Failed to read current source: %d\n", in arizona_set_fll_clks()
2416 static int arizona_enable_fll(struct arizona_fll *fll) in arizona_enable_fll() argument
2418 struct arizona *arizona = fll->arizona; in arizona_enable_fll()
2420 int already_enabled = arizona_is_enabled_fll(fll, fll->base); in arizona_enable_fll()
2421 int sync_enabled = arizona_is_enabled_fll(fll, fll->base + 0x10); in arizona_enable_fll()
2433 regmap_update_bits(fll->arizona->regmap, fll->base + 1, in arizona_enable_fll()
2436 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9, in arizona_enable_fll()
2439 if (arizona_is_enabled_fll(fll, fll->base + 0x10) > 0) in arizona_enable_fll()
2440 arizona_set_fll_clks(fll, fll->base + 0x10, false); in arizona_enable_fll()
2441 arizona_set_fll_clks(fll, fll->base, false); in arizona_enable_fll()
2448 if (fll->ref_src >= 0 && fll->ref_freq && in arizona_enable_fll()
2449 fll->ref_src != fll->sync_src) { in arizona_enable_fll()
2450 arizona_calc_fll(fll, &cfg, fll->ref_freq, false); in arizona_enable_fll()
2453 if (fll->sync_src >= 0 && cfg.lambda) in arizona_enable_fll()
2456 arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src, in arizona_enable_fll()
2458 if (fll->sync_src >= 0) { in arizona_enable_fll()
2459 arizona_calc_fll(fll, &cfg, fll->sync_freq, true); in arizona_enable_fll()
2461 arizona_apply_fll(arizona, fll->base + 0x10, &cfg, in arizona_enable_fll()
2462 fll->sync_src, true); in arizona_enable_fll()
2465 } else if (fll->sync_src >= 0) { in arizona_enable_fll()
2466 arizona_calc_fll(fll, &cfg, fll->sync_freq, false); in arizona_enable_fll()
2468 arizona_apply_fll(arizona, fll->base, &cfg, in arizona_enable_fll()
2469 fll->sync_src, false); in arizona_enable_fll()
2471 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, in arizona_enable_fll()
2474 arizona_fll_err(fll, "No clocks provided\n"); in arizona_enable_fll()
2479 arizona_fll_warn(fll, "Synchroniser changed on active FLL\n"); in arizona_enable_fll()
2485 if (use_sync && fll->sync_freq > 100000) in arizona_enable_fll()
2486 regmap_update_bits_async(arizona->regmap, fll->base + 0x17, in arizona_enable_fll()
2489 regmap_update_bits_async(arizona->regmap, fll->base + 0x17, in arizona_enable_fll()
2497 arizona_set_fll_clks(fll, fll->base + 0x10, true); in arizona_enable_fll()
2498 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, in arizona_enable_fll()
2502 arizona_set_fll_clks(fll, fll->base, true); in arizona_enable_fll()
2503 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_enable_fll()
2507 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_enable_fll()
2510 arizona_fll_dbg(fll, "Waiting for FLL lock...\n"); in arizona_enable_fll()
2521 if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1))) in arizona_enable_fll()
2525 arizona_fll_warn(fll, "Timed out waiting for lock\n"); in arizona_enable_fll()
2527 arizona_fll_dbg(fll, "FLL locked (%d polls)\n", i); in arizona_enable_fll()
2532 static void arizona_disable_fll(struct arizona_fll *fll) in arizona_disable_fll() argument
2534 struct arizona *arizona = fll->arizona; in arizona_disable_fll()
2537 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2539 regmap_update_bits_check(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2541 regmap_update_bits_check(arizona->regmap, fll->base + 0x11, in arizona_disable_fll()
2543 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2547 arizona_set_fll_clks(fll, fll->base + 0x10, false); in arizona_disable_fll()
2550 arizona_set_fll_clks(fll, fll->base, false); in arizona_disable_fll()
2555 int arizona_set_fll_refclk(struct arizona_fll *fll, int source, in arizona_set_fll_refclk() argument
2560 if (fll->ref_src == source && fll->ref_freq == Fref) in arizona_set_fll_refclk()
2563 if (fll->fout && Fref > 0) { in arizona_set_fll_refclk()
2564 ret = arizona_validate_fll(fll, Fref, fll->fout); in arizona_set_fll_refclk()
2569 fll->ref_src = source; in arizona_set_fll_refclk()
2570 fll->ref_freq = Fref; in arizona_set_fll_refclk()
2572 if (fll->fout && Fref > 0) in arizona_set_fll_refclk()
2573 ret = arizona_enable_fll(fll); in arizona_set_fll_refclk()
2579 int arizona_set_fll(struct arizona_fll *fll, int source, in arizona_set_fll() argument
2584 if (fll->sync_src == source && in arizona_set_fll()
2585 fll->sync_freq == Fref && fll->fout == Fout) in arizona_set_fll()
2589 if (fll->ref_src >= 0) { in arizona_set_fll()
2590 ret = arizona_validate_fll(fll, fll->ref_freq, Fout); in arizona_set_fll()
2595 ret = arizona_validate_fll(fll, Fref, Fout); in arizona_set_fll()
2600 fll->sync_src = source; in arizona_set_fll()
2601 fll->sync_freq = Fref; in arizona_set_fll()
2602 fll->fout = Fout; in arizona_set_fll()
2605 ret = arizona_enable_fll(fll); in arizona_set_fll()
2607 arizona_disable_fll(fll); in arizona_set_fll()
2614 int ok_irq, struct arizona_fll *fll) in arizona_init_fll() argument
2618 fll->id = id; in arizona_init_fll()
2619 fll->base = base; in arizona_init_fll()
2620 fll->arizona = arizona; in arizona_init_fll()
2621 fll->sync_src = ARIZONA_FLL_SRC_NONE; in arizona_init_fll()
2628 fll->ref_src = val & ARIZONA_CLK_32K_SRC_MASK; in arizona_init_fll()
2631 fll->ref_src = ARIZONA_FLL_SRC_NONE; in arizona_init_fll()
2633 fll->ref_freq = 32768; in arizona_init_fll()
2635 snprintf(fll->lock_name, sizeof(fll->lock_name), "FLL%d lock", id); in arizona_init_fll()
2636 snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name), in arizona_init_fll()
2639 regmap_update_bits(arizona->regmap, fll->base + 1, in arizona_init_fll()