On Mon, Feb 8, 2021 at 7:53 PM Mark Brown <broonie@xxxxxxxxxx> wrote: > > On Sun, Feb 07, 2021 at 06:23:50PM +0800, Shengjiu Wang wrote: > > > +static int fsl_rpmsg_hw_params(struct snd_pcm_substream *substream, > > + struct snd_pcm_hw_params *params, > > + struct snd_soc_dai *dai) > > +{ > > ... > > > + ret = clk_prepare_enable(rpmsg->mclk); > > + if (ret) > > + dev_err(dai->dev, "failed to enable mclk: %d\n", ret); > > + > > + return ret; > > +} > > + > > +static int fsl_rpmsg_hw_free(struct snd_pcm_substream *substream, > > + struct snd_soc_dai *dai) > > +{ > > + struct fsl_rpmsg *rpmsg = snd_soc_dai_get_drvdata(dai); > > + > > + clk_disable_unprepare(rpmsg->mclk); > > hw_params() can be called multiple times and there's no need for it to > be balanced with hw_free(), I'd move this to a different callback (DAPM > should work well). Which callback should I use? Is there an example? best regards wang shengjiu