On Wed, Sep 18, 2019 at 12:46:29PM +0200, Sylwester Nawrocki wrote: > As an intermediate step before covering the clocking subsystem > of the CODEC entirely by the clk API add handling of external CODEC's > master clocks in DAPM events when the AIFn clocks are sourced directly > from MCLKn; when FLLn are used we enable/disable respective MCLKn > before/after FLLn is enabled/disabled. > > Signed-off-by: Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx> > --- > @@ -2260,8 +2321,28 @@ static int _wm8994_set_fll(struct snd_soc_component *component, int id, int src, > /* Clear any pending completion from a previous failure */ > try_wait_for_completion(&wm8994->fll_locked[id]); > > + switch (src) { > + case WM8994_FLL_SRC_MCLK1: > + mclk = control->mclk[0].clk; > + break; > + case WM8994_FLL_SRC_MCLK2: > + mclk = control->mclk[1].clk; > + break; > + default: > + mclk = NULL; > + } > + > /* Enable (with fractional mode if required) */ > if (freq_out) { > + if (mclk) { > + ret = clk_prepare_enable(mclk); > + if (ret < 0) { > + dev_err(component->dev, > + "Failed to enable MCLK for FLL%d\n", > + id + 1); > + return ret; > + } > + } > /* Enable VMID if we need it */ > if (!was_enabled) { > active_reference(component); > @@ -2315,6 +2396,8 @@ static int _wm8994_set_fll(struct snd_soc_component *component, int id, int src, > > active_dereference(component); > } > + if (mclk) > + clk_disable_unprepare(mclk); I don't think this works in the case of changing active FLLs. The driver looks like it allows changing the FLL configuration whilst the FLL is already active in which case it you would have two wm8994_set_fll calls enabling the FLL but only a single one disabling it. Resulting in the FLL being off but the MCLK being left enabled. Thanks, Charles