Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

ASoC: arizona: Add support for directly setting the FLL REFCLK



This patch allows the REFCLK to be set directly allowing much greater
flexibility in how the FLLs are configured.

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent de1e6eed
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -1139,6 +1139,45 @@ static void arizona_disable_fll(struct arizona_fll *fll)
		pm_runtime_put_autosuspend(arizona->dev);
}

int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
			   unsigned int Fref, unsigned int Fout)
{
	struct arizona_fll_cfg ref, sync;
	int ret;

	if (source < 0)
		return -EINVAL;

	if (fll->ref_src == source && fll->ref_freq == Fref &&
	    fll->fout == Fout)
		return 0;

	if (Fout) {
		ret = arizona_calc_fll(fll, &ref, Fref, Fout);
		if (ret != 0)
			return ret;

		if (fll->sync_src >= 0) {
			ret = arizona_calc_fll(fll, &sync, fll->sync_freq, Fout);
			if (ret != 0)
				return ret;
		}
	}

	fll->ref_src = source;
	fll->ref_freq = Fref;
	fll->fout = Fout;

	if (Fout) {
		arizona_enable_fll(fll, &ref, &sync);
	} else {
		arizona_disable_fll(fll);
	}

	return 0;
}
EXPORT_SYMBOL_GPL(arizona_set_fll_refclk);

int arizona_set_fll(struct arizona_fll *fll, int source,
		    unsigned int Fref, unsigned int Fout)
{
+2 −0
Original line number Diff line number Diff line
@@ -211,6 +211,8 @@ struct arizona_fll {

extern int arizona_init_fll(struct arizona *arizona, int id, int base,
			    int lock_irq, int ok_irq, struct arizona_fll *fll);
extern int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
				  unsigned int Fref, unsigned int Fout);
extern int arizona_set_fll(struct arizona_fll *fll, int source,
			   unsigned int Fref, unsigned int Fout);

+6 −0
Original line number Diff line number Diff line
@@ -1483,6 +1483,12 @@ static int wm5102_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
		return arizona_set_fll(&wm5102->fll[0], source, Fref, Fout);
	case WM5102_FLL2:
		return arizona_set_fll(&wm5102->fll[1], source, Fref, Fout);
	case WM5102_FLL1_REFCLK:
		return arizona_set_fll_refclk(&wm5102->fll[0], source, Fref,
					      Fout);
	case WM5102_FLL2_REFCLK:
		return arizona_set_fll_refclk(&wm5102->fll[1], source, Fref,
					      Fout);
	default:
		return -EINVAL;
	}
+4 −2
Original line number Diff line number Diff line
@@ -17,5 +17,7 @@

#define WM5102_FLL1        1
#define WM5102_FLL2        2
#define WM5102_FLL1_REFCLK 3
#define WM5102_FLL2_REFCLK 4

#endif
+6 −0
Original line number Diff line number Diff line
@@ -880,6 +880,12 @@ static int wm5110_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
		return arizona_set_fll(&wm5110->fll[0], source, Fref, Fout);
	case WM5110_FLL2:
		return arizona_set_fll(&wm5110->fll[1], source, Fref, Fout);
	case WM5110_FLL1_REFCLK:
		return arizona_set_fll_refclk(&wm5110->fll[0], source, Fref,
					      Fout);
	case WM5110_FLL2_REFCLK:
		return arizona_set_fll_refclk(&wm5110->fll[1], source, Fref,
					      Fout);
	default:
		return -EINVAL;
	}
Loading