[alsa-devel] [PATCH 6/6] ASoC: ad1980: verify writes

Uwe Kleine-König u.kleine-koenig at pengutronix.de
Tue Aug 24 15:09:44 CEST 2010


Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
---
 sound/soc/codecs/ad1980.c |   41 ++++++++++++++++++++++++++++++-----------
 1 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c
index a3e78d4..2851ca1 100644
--- a/sound/soc/codecs/ad1980.c
+++ b/sound/soc/codecs/ad1980.c
@@ -34,6 +34,8 @@
 #include "ad1980.h"
 
 #define AC97_USE_CACHE 1
+#define AC97_VERIFY_WRITE 0
+
 #if AC97_USE_CACHE
 /*
  * AD1980 register cache
@@ -100,13 +102,8 @@ SOC_ENUM("Capture Source", ad1980_cap_src),
 SOC_SINGLE("Mic Boost Switch", AC97_MIC, 6, 1, 0),
 };
 
-static unsigned int ac97_read(struct snd_soc_codec *codec,
-	unsigned int reg)
+static int ac97_reg_cacheable(unsigned int reg)
 {
-	u16 *cache = codec->reg_cache;
-	int ret;
-
-#if AC97_USE_CACHE
 	switch (reg) {
 	case AC97_RESET:
 	case AC97_INT_PAGING:
@@ -114,18 +111,30 @@ static unsigned int ac97_read(struct snd_soc_codec *codec,
 	case AC97_EXTENDED_STATUS:
 	case AC97_VENDOR_ID1:
 	case AC97_VENDOR_ID2:
-#endif
-		ret = soc_ac97_ops.read(codec->ac97, reg);
-#if AC97_USE_CACHE
+		return 0;
 	default:
-		reg = reg >> 1;
+		return 1;
+	}
+}
+
+static unsigned int ac97_read(struct snd_soc_codec *codec,
+	unsigned int reg)
+{
+	int ret;
+
+#if AC97_USE_CACHE
+	if (ac97_reg_cacheable(reg)) {
+		u16 *cache = codec->reg_cache;
+
+		reg >>= 1;
 
 		if (reg >= ARRAY_SIZE(ad1980_reg))
 			ret = -EINVAL;
 		else
 			ret = cache[reg];
-	}
+	} else
 #endif
+		ret = soc_ac97_ops.read(codec->ac97, reg);
 
 	pr_debug("%s: reg=0x%02x, val=0x%04x\n", __func__, reg, ret);
 
@@ -146,6 +155,16 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
 		cache[reg] = val;
 	}
 #endif
+
+#if AC97_VERIFY_WRITE
+	if (ac97_reg_cacheable(reg)) {
+		unsigned int valread = soc_ac97_ops.read(codec->ac97, reg);
+		if (valread != val)
+			pr_err("%s: reg=0x%02x, val=0x%04x, readback=0x%04x\n",
+					__func__, reg, val, valread);
+	}
+#endif
+
 	return 0;
 }
 
-- 
1.7.1



More information about the Alsa-devel mailing list