Commit 35722815 authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown
Browse files

ASoC: arizona: Factor out FLL enable



In preparation for additional features on the FLL this patch factors out
the code for enabling an FLL into a seperate function.

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 7604054e
Loading
Loading
Loading
Loading
+36 −30
Original line number Diff line number Diff line
@@ -1090,6 +1090,41 @@ static bool arizona_is_enabled_fll(struct arizona_fll *fll)
	return reg & ARIZONA_FLL1_ENA;
}

static void arizona_enable_fll(struct arizona_fll *fll,
			      struct arizona_fll_cfg *ref,
			      struct arizona_fll_cfg *sync)
{
	struct arizona *arizona = fll->arizona;
	int ret;

	regmap_update_bits(arizona->regmap, fll->base + 5,
			   ARIZONA_FLL1_OUTDIV_MASK,
			   ref->outdiv << ARIZONA_FLL1_OUTDIV_SHIFT);

	arizona_apply_fll(arizona, fll->base, ref, fll->ref_src);
	if (fll->sync_src >= 0)
		arizona_apply_fll(arizona, fll->base + 0x10, sync,
				  fll->sync_src);

	if (!arizona_is_enabled_fll(fll))
		pm_runtime_get(arizona->dev);

	/* Clear any pending completions */
	try_wait_for_completion(&fll->ok);

	regmap_update_bits(arizona->regmap, fll->base + 1,
			   ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
	if (fll->sync_src >= 0)
		regmap_update_bits(arizona->regmap, fll->base + 0x11,
				   ARIZONA_FLL1_SYNC_ENA,
				   ARIZONA_FLL1_SYNC_ENA);

	ret = wait_for_completion_timeout(&fll->ok,
					  msecs_to_jiffies(250));
	if (ret == 0)
		arizona_fll_warn(fll, "Timed out waiting for lock\n");
}

static void arizona_disable_fll(struct arizona_fll *fll)
{
	struct arizona *arizona = fll->arizona;
@@ -1107,9 +1142,7 @@ static void arizona_disable_fll(struct arizona_fll *fll)
int arizona_set_fll(struct arizona_fll *fll, int source,
		    unsigned int Fref, unsigned int Fout)
{
	struct arizona *arizona = fll->arizona;
	struct arizona_fll_cfg ref, sync;
	bool ena;
	int ret;

	if (fll->fref == Fref && fll->fout == Fout)
@@ -1140,35 +1173,8 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
		fll->sync_freq = Fref;
	}

	ena = arizona_is_enabled_fll(fll);

	if (Fout) {
		regmap_update_bits(arizona->regmap, fll->base + 5,
				   ARIZONA_FLL1_OUTDIV_MASK,
				   ref.outdiv << ARIZONA_FLL1_OUTDIV_SHIFT);

		arizona_apply_fll(arizona, fll->base, &ref, fll->ref_src);
		if (fll->sync_src >= 0)
			arizona_apply_fll(arizona, fll->base + 0x10, &sync,
					  fll->sync_src);

		if (!ena)
			pm_runtime_get(arizona->dev);

		/* Clear any pending completions */
		try_wait_for_completion(&fll->ok);

		regmap_update_bits(arizona->regmap, fll->base + 1,
				   ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
		if (fll->sync_src >= 0)
			regmap_update_bits(arizona->regmap, fll->base + 0x11,
					   ARIZONA_FLL1_SYNC_ENA,
					   ARIZONA_FLL1_SYNC_ENA);

		ret = wait_for_completion_timeout(&fll->ok,
						  msecs_to_jiffies(250));
		if (ret == 0)
			arizona_fll_warn(fll, "Timed out waiting for lock\n");
		arizona_enable_fll(fll, &ref, &sync);
	} else {
		arizona_disable_fll(fll);
	}