From 42325f2defd237dbd7dfd2200e0c8da61f1f1bde Mon Sep 17 00:00:00 2001 From: Shengjiu Wang Date: Mon, 7 Jul 2014 19:03:21 +0800 Subject: ENGR00321941 ASoC: fsl_spdif: fix that can't get the Rx Sample Rate The SRPC register should be volatile, LOCK bit is set by the hardware. Signed-off-by: Shengjiu Wang (cherry picked from commit 35ac9096cbe158962e779fd9bc64aeb74abbc745) --- sound/soc/fsl/fsl_spdif.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c index 17b57caf49c9..0e7f37be2b50 100644 --- a/sound/soc/fsl/fsl_spdif.c +++ b/sound/soc/fsl/fsl_spdif.c @@ -113,6 +113,8 @@ struct fsl_spdif_priv { struct clk *dmaclk; struct snd_dmaengine_dai_dma_data dma_params_tx; struct snd_dmaengine_dai_dma_data dma_params_rx; + /* regcache for SRPC */ + u32 regcache_srpc; /* The name space will be allocated dynamically */ char name[0]; @@ -1028,6 +1030,7 @@ static bool fsl_spdif_readable_reg(struct device *dev, unsigned int reg) static bool fsl_spdif_volatile_reg(struct device *dev, unsigned int reg) { switch (reg) { + case REG_SPDIF_SRPC: case REG_SPDIF_SIS: case REG_SPDIF_SRL: case REG_SPDIF_SRR: @@ -1327,6 +1330,9 @@ static int fsl_spdif_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); regcache_mark_dirty(spdif_priv->regmap); @@ -1338,6 +1344,11 @@ static int fsl_spdif_resume(struct device *dev) struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); regcache_cache_only(spdif_priv->regmap, false); + + 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); } #endif /* CONFIG_PM_SLEEP */ -- cgit v1.2.3