[alsa-devel] [PATCH] ALSA: ASoC: fix PXA SSP port resume

Daniel Mack daniel at caiaq.de
Tue Feb 2 04:32:55 CET 2010


Unconditionally save the register states in resume and restore them
again at resume time. Register contents are not preserved over suspend,
and the driver takes false assumptions about them otherwise.

The clock must be enabled to access the register block.

Signed-off-by: Daniel Mack <daniel at caiaq.de>
Cc: Eric Miao <eric.y.miao at gmail.com>
Cc: Mark Brown <broonie at opensource.wolfsonmicro.com>
Cc: Philipp Zabel <philipp.zabel at gmail.com>
---
 sound/soc/pxa/pxa-ssp.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
index 3bd7712..e69397f 100644
--- a/sound/soc/pxa/pxa-ssp.c
+++ b/sound/soc/pxa/pxa-ssp.c
@@ -135,10 +135,11 @@ static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai)
 	struct ssp_priv *priv = cpu_dai->private_data;
 
 	if (!cpu_dai->active)
-		return 0;
+		clk_enable(priv->dev.ssp->clk);
 
 	ssp_save_state(&priv->dev, &priv->state);
 	clk_disable(priv->dev.ssp->clk);
+
 	return 0;
 }
 
@@ -146,12 +147,13 @@ static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai)
 {
 	struct ssp_priv *priv = cpu_dai->private_data;
 
-	if (!cpu_dai->active)
-		return 0;
-
 	clk_enable(priv->dev.ssp->clk);
 	ssp_restore_state(&priv->dev, &priv->state);
-	ssp_enable(&priv->dev);
+
+	if (cpu_dai->active)
+		ssp_enable(&priv->dev);
+	else
+		clk_disable(priv->dev.ssp->clk);
 
 	return 0;
 }
-- 
1.6.3.3



More information about the Alsa-devel mailing list