From c84933c819154957f09929ea8926854e459f7daa Mon Sep 17 00:00:00 2001 From: Shengjiu Wang Date: Wed, 12 Jul 2017 18:01:07 +0800 Subject: MLK-15960-3: ASoC: fsl_spdif: refine pm runtime function In imx8qm/imx8qxp, the power domain of IP is enabled when pm_runtime_get_sync() is called, and disabled when pm_runtime _put_sync() is called. when power domain is disabled, the value of registers will lost, so we need to use the regcache_sync() to restore the registers in fsl_spdif_runtime_resume. Signed-off-by: Shengjiu Wang --- sound/soc/fsl/fsl_spdif.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'sound/soc/fsl/fsl_spdif.c') diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c index 5d350689c2fb..c2dcf385dbdb 100644 --- a/sound/soc/fsl/fsl_spdif.c +++ b/sound/soc/fsl/fsl_spdif.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -1443,6 +1444,32 @@ static int fsl_spdif_probe(struct platform_device *pdev) return ret; } +#ifdef CONFIG_PM +static int fsl_spdif_runtime_resume(struct device *dev) +{ + struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); + + regcache_cache_only(spdif_priv->regmap, false); + regcache_mark_dirty(spdif_priv->regmap); + + regmap_update_bits(spdif_priv->regmap, REG_SPDIF_SRPC, + SRPC_CLKSRC_SEL_MASK | SRPC_GAINSEL_MASK, + spdif_priv->regcache_srpc); + + return regcache_sync(spdif_priv->regmap); +} + +static int fsl_spdif_runtime_suspend(struct device *dev) +{ + struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); + + regmap_read(spdif_priv->regmap, REG_SPDIF_SRPC, + &spdif_priv->regcache_srpc); + regcache_cache_only(spdif_priv->regmap, true); + return 0; +} +#endif + #ifdef CONFIG_PM_SLEEP static int fsl_spdif_suspend(struct device *dev) { @@ -1470,6 +1497,8 @@ static int fsl_spdif_resume(struct device *dev) static const struct dev_pm_ops fsl_spdif_pm = { SET_SYSTEM_SLEEP_PM_OPS(fsl_spdif_suspend, fsl_spdif_resume) + SET_RUNTIME_PM_OPS(fsl_spdif_runtime_suspend, fsl_spdif_runtime_resume, + NULL) }; static struct platform_driver fsl_spdif_driver = { -- cgit v1.2.3