From: Nicolin Chen <nicoleotsuka@gmail.com>
To: Shengjiu Wang <shengjiu.wang@nxp.com>
Cc: alsa-devel@alsa-project.org, timur@kernel.org,
Xiubo.Lee@gmail.com, linuxppc-dev@lists.ozlabs.org,
tiwai@suse.com, lgirdwood@gmail.com, broonie@kernel.org,
festevam@gmail.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] ASoC: fsl_asrc: Merge suspend/resume function to runtime_suspend/resume
Date: Sun, 24 May 2020 22:09:51 -0700 [thread overview]
Message-ID: <20200525050950.GA1244@Asurada> (raw)
In-Reply-To: <1590141444-28668-1-git-send-email-shengjiu.wang@nxp.com>
On Fri, May 22, 2020 at 05:57:24PM +0800, Shengjiu Wang wrote:
> With dedicated power domain for asrc, power can be disabled after
> probe and pm runtime suspend, then the value of all registers need to
> be restored in pm runtime resume. So we can merge suspend/resume function
> to runtime_suspend/resume function and enable regcache only in end of
> probe.
>
> Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
> ---
> sound/soc/fsl/fsl_asrc.c | 70 ++++++++++++++++------------------------
> 1 file changed, 27 insertions(+), 43 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
> index 432936039de4..3ebbe15ac378 100644
> --- a/sound/soc/fsl/fsl_asrc.c
> +++ b/sound/soc/fsl/fsl_asrc.c
> @@ -1100,6 +1100,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
> platform_set_drvdata(pdev, asrc);
> pm_runtime_enable(&pdev->dev);
> spin_lock_init(&asrc->lock);
> + regcache_cache_only(asrc->regmap, true);
>
> ret = devm_snd_soc_register_component(&pdev->dev, &fsl_asrc_component,
> &fsl_asrc_dai, 1);
> @@ -1117,6 +1118,7 @@ static int fsl_asrc_runtime_resume(struct device *dev)
> struct fsl_asrc *asrc = dev_get_drvdata(dev);
> struct fsl_asrc_priv *asrc_priv = asrc->private;
> int i, ret;
> + u32 asrctr;
>
> ret = clk_prepare_enable(asrc->mem_clk);
> if (ret)
> @@ -1135,6 +1137,24 @@ static int fsl_asrc_runtime_resume(struct device *dev)
> goto disable_asrck_clk;
> }
>
> + /* Stop all pairs provisionally */
> + regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
> + regmap_update_bits(asrc->regmap, REG_ASRCTR,
> + ASRCTR_ASRCEi_ALL_MASK, 0);
> +
> + /* Restore all registers */
> + regcache_cache_only(asrc->regmap, false);
> + regcache_mark_dirty(asrc->regmap);
I see you doing regcache_mark_dirty() in the resume() now,
being different from previously doing in suspend()?
Thanks
Nic
> + regcache_sync(asrc->regmap);
> +
> + regmap_update_bits(asrc->regmap, REG_ASRCFG,
> + ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
> + ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
> +
> + /* Restart enabled pairs */
> + regmap_update_bits(asrc->regmap, REG_ASRCTR,
> + ASRCTR_ASRCEi_ALL_MASK, asrctr);
> +
> return 0;
>
> disable_asrck_clk:
> @@ -1155,6 +1175,11 @@ static int fsl_asrc_runtime_suspend(struct device *dev)
> struct fsl_asrc_priv *asrc_priv = asrc->private;
> int i;
>
> + regmap_read(asrc->regmap, REG_ASRCFG,
> + &asrc_priv->regcache_cfg);
> +
> + regcache_cache_only(asrc->regmap, true);
> +
> for (i = 0; i < ASRC_CLK_MAX_NUM; i++)
> clk_disable_unprepare(asrc_priv->asrck_clk[i]);
> if (!IS_ERR(asrc->spba_clk))
> @@ -1166,51 +1191,10 @@ static int fsl_asrc_runtime_suspend(struct device *dev)
> }
> #endif /* CONFIG_PM */
>
> -#ifdef CONFIG_PM_SLEEP
> -static int fsl_asrc_suspend(struct device *dev)
> -{
> - struct fsl_asrc *asrc = dev_get_drvdata(dev);
> - struct fsl_asrc_priv *asrc_priv = asrc->private;
> -
> - regmap_read(asrc->regmap, REG_ASRCFG,
> - &asrc_priv->regcache_cfg);
> -
> - regcache_cache_only(asrc->regmap, true);
> - regcache_mark_dirty(asrc->regmap);
> -
> - return 0;
> -}
> -
> -static int fsl_asrc_resume(struct device *dev)
> -{
> - struct fsl_asrc *asrc = dev_get_drvdata(dev);
> - struct fsl_asrc_priv *asrc_priv = asrc->private;
> - u32 asrctr;
> -
> - /* Stop all pairs provisionally */
> - regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
> - regmap_update_bits(asrc->regmap, REG_ASRCTR,
> - ASRCTR_ASRCEi_ALL_MASK, 0);
> -
> - /* Restore all registers */
> - regcache_cache_only(asrc->regmap, false);
> - regcache_sync(asrc->regmap);
> -
> - regmap_update_bits(asrc->regmap, REG_ASRCFG,
> - ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
> - ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
> -
> - /* Restart enabled pairs */
> - regmap_update_bits(asrc->regmap, REG_ASRCTR,
> - ASRCTR_ASRCEi_ALL_MASK, asrctr);
> -
> - return 0;
> -}
> -#endif /* CONFIG_PM_SLEEP */
> -
> static const struct dev_pm_ops fsl_asrc_pm = {
> SET_RUNTIME_PM_OPS(fsl_asrc_runtime_suspend, fsl_asrc_runtime_resume, NULL)
> - SET_SYSTEM_SLEEP_PM_OPS(fsl_asrc_suspend, fsl_asrc_resume)
> + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
> + pm_runtime_force_resume)
> };
>
> static const struct fsl_asrc_soc_data fsl_asrc_imx35_data = {
> --
> 2.21.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Nicolin Chen <nicoleotsuka@gmail.com>
To: Shengjiu Wang <shengjiu.wang@nxp.com>
Cc: alsa-devel@alsa-project.org, timur@kernel.org,
Xiubo.Lee@gmail.com, linuxppc-dev@lists.ozlabs.org,
tiwai@suse.com, lgirdwood@gmail.com, perex@perex.cz,
broonie@kernel.org, festevam@gmail.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] ASoC: fsl_asrc: Merge suspend/resume function to runtime_suspend/resume
Date: Sun, 24 May 2020 22:09:51 -0700 [thread overview]
Message-ID: <20200525050950.GA1244@Asurada> (raw)
In-Reply-To: <1590141444-28668-1-git-send-email-shengjiu.wang@nxp.com>
On Fri, May 22, 2020 at 05:57:24PM +0800, Shengjiu Wang wrote:
> With dedicated power domain for asrc, power can be disabled after
> probe and pm runtime suspend, then the value of all registers need to
> be restored in pm runtime resume. So we can merge suspend/resume function
> to runtime_suspend/resume function and enable regcache only in end of
> probe.
>
> Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
> ---
> sound/soc/fsl/fsl_asrc.c | 70 ++++++++++++++++------------------------
> 1 file changed, 27 insertions(+), 43 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
> index 432936039de4..3ebbe15ac378 100644
> --- a/sound/soc/fsl/fsl_asrc.c
> +++ b/sound/soc/fsl/fsl_asrc.c
> @@ -1100,6 +1100,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
> platform_set_drvdata(pdev, asrc);
> pm_runtime_enable(&pdev->dev);
> spin_lock_init(&asrc->lock);
> + regcache_cache_only(asrc->regmap, true);
>
> ret = devm_snd_soc_register_component(&pdev->dev, &fsl_asrc_component,
> &fsl_asrc_dai, 1);
> @@ -1117,6 +1118,7 @@ static int fsl_asrc_runtime_resume(struct device *dev)
> struct fsl_asrc *asrc = dev_get_drvdata(dev);
> struct fsl_asrc_priv *asrc_priv = asrc->private;
> int i, ret;
> + u32 asrctr;
>
> ret = clk_prepare_enable(asrc->mem_clk);
> if (ret)
> @@ -1135,6 +1137,24 @@ static int fsl_asrc_runtime_resume(struct device *dev)
> goto disable_asrck_clk;
> }
>
> + /* Stop all pairs provisionally */
> + regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
> + regmap_update_bits(asrc->regmap, REG_ASRCTR,
> + ASRCTR_ASRCEi_ALL_MASK, 0);
> +
> + /* Restore all registers */
> + regcache_cache_only(asrc->regmap, false);
> + regcache_mark_dirty(asrc->regmap);
I see you doing regcache_mark_dirty() in the resume() now,
being different from previously doing in suspend()?
Thanks
Nic
> + regcache_sync(asrc->regmap);
> +
> + regmap_update_bits(asrc->regmap, REG_ASRCFG,
> + ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
> + ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
> +
> + /* Restart enabled pairs */
> + regmap_update_bits(asrc->regmap, REG_ASRCTR,
> + ASRCTR_ASRCEi_ALL_MASK, asrctr);
> +
> return 0;
>
> disable_asrck_clk:
> @@ -1155,6 +1175,11 @@ static int fsl_asrc_runtime_suspend(struct device *dev)
> struct fsl_asrc_priv *asrc_priv = asrc->private;
> int i;
>
> + regmap_read(asrc->regmap, REG_ASRCFG,
> + &asrc_priv->regcache_cfg);
> +
> + regcache_cache_only(asrc->regmap, true);
> +
> for (i = 0; i < ASRC_CLK_MAX_NUM; i++)
> clk_disable_unprepare(asrc_priv->asrck_clk[i]);
> if (!IS_ERR(asrc->spba_clk))
> @@ -1166,51 +1191,10 @@ static int fsl_asrc_runtime_suspend(struct device *dev)
> }
> #endif /* CONFIG_PM */
>
> -#ifdef CONFIG_PM_SLEEP
> -static int fsl_asrc_suspend(struct device *dev)
> -{
> - struct fsl_asrc *asrc = dev_get_drvdata(dev);
> - struct fsl_asrc_priv *asrc_priv = asrc->private;
> -
> - regmap_read(asrc->regmap, REG_ASRCFG,
> - &asrc_priv->regcache_cfg);
> -
> - regcache_cache_only(asrc->regmap, true);
> - regcache_mark_dirty(asrc->regmap);
> -
> - return 0;
> -}
> -
> -static int fsl_asrc_resume(struct device *dev)
> -{
> - struct fsl_asrc *asrc = dev_get_drvdata(dev);
> - struct fsl_asrc_priv *asrc_priv = asrc->private;
> - u32 asrctr;
> -
> - /* Stop all pairs provisionally */
> - regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
> - regmap_update_bits(asrc->regmap, REG_ASRCTR,
> - ASRCTR_ASRCEi_ALL_MASK, 0);
> -
> - /* Restore all registers */
> - regcache_cache_only(asrc->regmap, false);
> - regcache_sync(asrc->regmap);
> -
> - regmap_update_bits(asrc->regmap, REG_ASRCFG,
> - ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
> - ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
> -
> - /* Restart enabled pairs */
> - regmap_update_bits(asrc->regmap, REG_ASRCTR,
> - ASRCTR_ASRCEi_ALL_MASK, asrctr);
> -
> - return 0;
> -}
> -#endif /* CONFIG_PM_SLEEP */
> -
> static const struct dev_pm_ops fsl_asrc_pm = {
> SET_RUNTIME_PM_OPS(fsl_asrc_runtime_suspend, fsl_asrc_runtime_resume, NULL)
> - SET_SYSTEM_SLEEP_PM_OPS(fsl_asrc_suspend, fsl_asrc_resume)
> + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
> + pm_runtime_force_resume)
> };
>
> static const struct fsl_asrc_soc_data fsl_asrc_imx35_data = {
> --
> 2.21.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Nicolin Chen <nicoleotsuka@gmail.com>
To: Shengjiu Wang <shengjiu.wang@nxp.com>
Cc: timur@kernel.org, Xiubo.Lee@gmail.com, festevam@gmail.com,
broonie@kernel.org, alsa-devel@alsa-project.org,
lgirdwood@gmail.com, perex@perex.cz, tiwai@suse.com,
linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] ASoC: fsl_asrc: Merge suspend/resume function to runtime_suspend/resume
Date: Sun, 24 May 2020 22:09:51 -0700 [thread overview]
Message-ID: <20200525050950.GA1244@Asurada> (raw)
In-Reply-To: <1590141444-28668-1-git-send-email-shengjiu.wang@nxp.com>
On Fri, May 22, 2020 at 05:57:24PM +0800, Shengjiu Wang wrote:
> With dedicated power domain for asrc, power can be disabled after
> probe and pm runtime suspend, then the value of all registers need to
> be restored in pm runtime resume. So we can merge suspend/resume function
> to runtime_suspend/resume function and enable regcache only in end of
> probe.
>
> Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
> ---
> sound/soc/fsl/fsl_asrc.c | 70 ++++++++++++++++------------------------
> 1 file changed, 27 insertions(+), 43 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
> index 432936039de4..3ebbe15ac378 100644
> --- a/sound/soc/fsl/fsl_asrc.c
> +++ b/sound/soc/fsl/fsl_asrc.c
> @@ -1100,6 +1100,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
> platform_set_drvdata(pdev, asrc);
> pm_runtime_enable(&pdev->dev);
> spin_lock_init(&asrc->lock);
> + regcache_cache_only(asrc->regmap, true);
>
> ret = devm_snd_soc_register_component(&pdev->dev, &fsl_asrc_component,
> &fsl_asrc_dai, 1);
> @@ -1117,6 +1118,7 @@ static int fsl_asrc_runtime_resume(struct device *dev)
> struct fsl_asrc *asrc = dev_get_drvdata(dev);
> struct fsl_asrc_priv *asrc_priv = asrc->private;
> int i, ret;
> + u32 asrctr;
>
> ret = clk_prepare_enable(asrc->mem_clk);
> if (ret)
> @@ -1135,6 +1137,24 @@ static int fsl_asrc_runtime_resume(struct device *dev)
> goto disable_asrck_clk;
> }
>
> + /* Stop all pairs provisionally */
> + regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
> + regmap_update_bits(asrc->regmap, REG_ASRCTR,
> + ASRCTR_ASRCEi_ALL_MASK, 0);
> +
> + /* Restore all registers */
> + regcache_cache_only(asrc->regmap, false);
> + regcache_mark_dirty(asrc->regmap);
I see you doing regcache_mark_dirty() in the resume() now,
being different from previously doing in suspend()?
Thanks
Nic
> + regcache_sync(asrc->regmap);
> +
> + regmap_update_bits(asrc->regmap, REG_ASRCFG,
> + ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
> + ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
> +
> + /* Restart enabled pairs */
> + regmap_update_bits(asrc->regmap, REG_ASRCTR,
> + ASRCTR_ASRCEi_ALL_MASK, asrctr);
> +
> return 0;
>
> disable_asrck_clk:
> @@ -1155,6 +1175,11 @@ static int fsl_asrc_runtime_suspend(struct device *dev)
> struct fsl_asrc_priv *asrc_priv = asrc->private;
> int i;
>
> + regmap_read(asrc->regmap, REG_ASRCFG,
> + &asrc_priv->regcache_cfg);
> +
> + regcache_cache_only(asrc->regmap, true);
> +
> for (i = 0; i < ASRC_CLK_MAX_NUM; i++)
> clk_disable_unprepare(asrc_priv->asrck_clk[i]);
> if (!IS_ERR(asrc->spba_clk))
> @@ -1166,51 +1191,10 @@ static int fsl_asrc_runtime_suspend(struct device *dev)
> }
> #endif /* CONFIG_PM */
>
> -#ifdef CONFIG_PM_SLEEP
> -static int fsl_asrc_suspend(struct device *dev)
> -{
> - struct fsl_asrc *asrc = dev_get_drvdata(dev);
> - struct fsl_asrc_priv *asrc_priv = asrc->private;
> -
> - regmap_read(asrc->regmap, REG_ASRCFG,
> - &asrc_priv->regcache_cfg);
> -
> - regcache_cache_only(asrc->regmap, true);
> - regcache_mark_dirty(asrc->regmap);
> -
> - return 0;
> -}
> -
> -static int fsl_asrc_resume(struct device *dev)
> -{
> - struct fsl_asrc *asrc = dev_get_drvdata(dev);
> - struct fsl_asrc_priv *asrc_priv = asrc->private;
> - u32 asrctr;
> -
> - /* Stop all pairs provisionally */
> - regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
> - regmap_update_bits(asrc->regmap, REG_ASRCTR,
> - ASRCTR_ASRCEi_ALL_MASK, 0);
> -
> - /* Restore all registers */
> - regcache_cache_only(asrc->regmap, false);
> - regcache_sync(asrc->regmap);
> -
> - regmap_update_bits(asrc->regmap, REG_ASRCFG,
> - ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
> - ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
> -
> - /* Restart enabled pairs */
> - regmap_update_bits(asrc->regmap, REG_ASRCTR,
> - ASRCTR_ASRCEi_ALL_MASK, asrctr);
> -
> - return 0;
> -}
> -#endif /* CONFIG_PM_SLEEP */
> -
> static const struct dev_pm_ops fsl_asrc_pm = {
> SET_RUNTIME_PM_OPS(fsl_asrc_runtime_suspend, fsl_asrc_runtime_resume, NULL)
> - SET_SYSTEM_SLEEP_PM_OPS(fsl_asrc_suspend, fsl_asrc_resume)
> + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
> + pm_runtime_force_resume)
> };
>
> static const struct fsl_asrc_soc_data fsl_asrc_imx35_data = {
> --
> 2.21.0
>
next prev parent reply other threads:[~2020-05-25 5:11 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-22 9:57 [PATCH] ASoC: fsl_asrc: Merge suspend/resume function to runtime_suspend/resume Shengjiu Wang
2020-05-25 5:09 ` Nicolin Chen [this message]
2020-05-25 5:09 ` Nicolin Chen
2020-05-25 5:09 ` Nicolin Chen
2020-05-25 6:11 ` Shengjiu Wang
2020-05-25 6:11 ` Shengjiu Wang
2020-05-25 6:18 ` Nicolin Chen
2020-05-25 6:18 ` Nicolin Chen
2020-05-25 6:16 ` Nicolin Chen
2020-05-25 6:16 ` Nicolin Chen
2020-05-25 6:16 ` Nicolin Chen
2020-05-25 14:57 ` Mark Brown
2020-05-25 14:57 ` Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200525050950.GA1244@Asurada \
--to=nicoleotsuka@gmail.com \
--cc=Xiubo.Lee@gmail.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=festevam@gmail.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=shengjiu.wang@nxp.com \
--cc=timur@kernel.org \
--cc=tiwai@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.