[alsa-devel] [PATCH V2] ASoC: fsl_esai: Add pm runtime function
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@nxp.com
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 intfsl_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 intfsl_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
On Fri, Apr 19, 2019 at 11:01:21AM +0000, S.j. Wang wrote:
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)?
It gets used to help drivers get into the correct state on startup, if you're unsure if it's 100% required it shouldn't hurt.
participants (2)
-
Mark Brown -
S.j. Wang