Hi > > > Add pm runtime support and move clock handling there. > fsl_esai_suspend is replaced by pm_runtime_force_suspend. > fsl_esai_resume is replaced by pm_runtime_force_resume. > > Signed-off-by: Shengjiu Wang <shengjiu.wang@xxxxxxx> > --- > Changes in v2 > -refine the commit comments. > -move regcache_mark_dirty to runtime suspend. > > sound/soc/fsl/fsl_esai.c | 141 ++++++++++++++++++++++++++-------------------- > - > 1 file changed, 77 insertions(+), 64 deletions(-) > > diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c index > bad0dfed6b68..10d2210c91ef 100644 > --- a/sound/soc/fsl/fsl_esai.c > +++ b/sound/soc/fsl/fsl_esai.c > @@ -9,6 +9,7 @@ > #include <linux/module.h> > #include <linux/of_irq.h> > #include <linux/of_platform.h> > +#include <linux/pm_runtime.h> > #include <sound/dmaengine_pcm.h> > #include <sound/pcm_params.h> > > @@ -466,30 +467,6 @@ static int fsl_esai_startup(struct > snd_pcm_substream *substream, > struct snd_soc_dai *dai) { > struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); > - int ret; > - > - /* > - * Some platforms might use the same bit to gate all three or two of > - * clocks, so keep all clocks open/close at the same time for safety > - */ > - ret = clk_prepare_enable(esai_priv->coreclk); > - if (ret) > - return ret; > - if (!IS_ERR(esai_priv->spbaclk)) { > - ret = clk_prepare_enable(esai_priv->spbaclk); > - if (ret) > - goto err_spbaclk; > - } > - if (!IS_ERR(esai_priv->extalclk)) { > - ret = clk_prepare_enable(esai_priv->extalclk); > - if (ret) > - goto err_extalck; > - } > - if (!IS_ERR(esai_priv->fsysclk)) { > - ret = clk_prepare_enable(esai_priv->fsysclk); > - if (ret) > - goto err_fsysclk; > - } > > if (!dai->active) { > /* Set synchronous mode */ @@ -506,16 +483,6 @@ static int > fsl_esai_startup(struct snd_pcm_substream *substream, > > return 0; > > -err_fsysclk: > - if (!IS_ERR(esai_priv->extalclk)) > - clk_disable_unprepare(esai_priv->extalclk); > -err_extalck: > - if (!IS_ERR(esai_priv->spbaclk)) > - clk_disable_unprepare(esai_priv->spbaclk); > -err_spbaclk: > - clk_disable_unprepare(esai_priv->coreclk); > - > - return ret; > } > > static int fsl_esai_hw_params(struct snd_pcm_substream *substream, @@ > -576,20 +543,6 @@ static int fsl_esai_hw_params(struct > snd_pcm_substream *substream, > return 0; > } > > -static void fsl_esai_shutdown(struct snd_pcm_substream *substream, > - struct snd_soc_dai *dai) > -{ > - struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); > - > - if (!IS_ERR(esai_priv->fsysclk)) > - clk_disable_unprepare(esai_priv->fsysclk); > - if (!IS_ERR(esai_priv->extalclk)) > - clk_disable_unprepare(esai_priv->extalclk); > - if (!IS_ERR(esai_priv->spbaclk)) > - clk_disable_unprepare(esai_priv->spbaclk); > - clk_disable_unprepare(esai_priv->coreclk); > -} > - > static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd, > struct snd_soc_dai *dai) { @@ -658,7 +611,6 @@ static int > fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd, > > static const struct snd_soc_dai_ops fsl_esai_dai_ops = { > .startup = fsl_esai_startup, > - .shutdown = fsl_esai_shutdown, > .trigger = fsl_esai_trigger, > .hw_params = fsl_esai_hw_params, > .set_sysclk = fsl_esai_set_dai_sysclk, @@ -947,6 +899,10 @@ static int > fsl_esai_probe(struct platform_device *pdev) > return ret; > } > > + pm_runtime_enable(&pdev->dev); > + I just have a question, do I need to add pm_runtime_idle(&pdev->dev)? Best regards Wang shengjiu _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx https://mailman.alsa-project.org/mailman/listinfo/alsa-devel