Ver Fonte

ASoC: STA32x: Preserve reserved register bits

Chip documentation explicitly requires that the reset values
of reserved register bits are left untouched.  It is possible
there are differences between STA326 and STA328 or future
chip revisions in these bits, and clobbering them might
cause malfunction.

Signed-off-by: Johannes Stezenbach <js@sig21.net>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Johannes Stezenbach há 14 anos atrás
pai
commit
889ebae537
1 ficheiros alterados com 16 adições e 0 exclusões
  1. 16 0
      sound/soc/codecs/sta32x.c

+ 16 - 0
sound/soc/codecs/sta32x.c

@@ -756,6 +756,22 @@ static int sta32x_probe(struct snd_soc_codec *codec)
 	for (i = 0; i < STA32X_REGISTER_COUNT; i++)
 		snd_soc_cache_write(codec, i, sta32x_regs[i]);
 
+	/* preserve reset values of reserved register bits */
+	snd_soc_cache_write(codec, STA32X_CONFC,
+			    codec->hw_read(codec, STA32X_CONFC));
+	snd_soc_cache_write(codec, STA32X_CONFE,
+			    codec->hw_read(codec, STA32X_CONFE));
+	snd_soc_cache_write(codec, STA32X_CONFF,
+			    codec->hw_read(codec, STA32X_CONFF));
+	snd_soc_cache_write(codec, STA32X_MMUTE,
+			    codec->hw_read(codec, STA32X_MMUTE));
+	snd_soc_cache_write(codec, STA32X_AUTO1,
+			    codec->hw_read(codec, STA32X_AUTO1));
+	snd_soc_cache_write(codec, STA32X_AUTO3,
+			    codec->hw_read(codec, STA32X_AUTO3));
+	snd_soc_cache_write(codec, STA32X_C3CFG,
+			    codec->hw_read(codec, STA32X_C3CFG));
+
 	/* FIXME enable thermal warning adjustment and recovery  */
 	snd_soc_update_bits(codec, STA32X_CONFA,
 			    STA32X_CONFA_TWAB | STA32X_CONFA_TWRB, 0);