Browse Source

ASoC: fix PXA SSP port resume

Unconditionally save the register states when suspending and restore
them again at resume time. Register contents were not preserved over
suspend, and hence the driver takes false assumptions about them.

The clock must be enabled to access the register block.

Signed-off-by: Daniel Mack <daniel@caiaq.de>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Daniel Mack 15 years ago
parent
commit
026384d614
1 changed files with 7 additions and 5 deletions
  1. 7 5
      sound/soc/pxa/pxa-ssp.c

+ 7 - 5
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;
 	struct ssp_priv *priv = cpu_dai->private_data;
 
 
 	if (!cpu_dai->active)
 	if (!cpu_dai->active)
-		return 0;
+		clk_enable(priv->dev.ssp->clk);
 
 
 	ssp_save_state(&priv->dev, &priv->state);
 	ssp_save_state(&priv->dev, &priv->state);
 	clk_disable(priv->dev.ssp->clk);
 	clk_disable(priv->dev.ssp->clk);
+
 	return 0;
 	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;
 	struct ssp_priv *priv = cpu_dai->private_data;
 
 
-	if (!cpu_dai->active)
-		return 0;
-
 	clk_enable(priv->dev.ssp->clk);
 	clk_enable(priv->dev.ssp->clk);
 	ssp_restore_state(&priv->dev, &priv->state);
 	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;
 	return 0;
 }
 }