[alsa-devel] [PATCH 4/6] ASoC: ad1980: make usage of register cache optional
Uwe Kleine-König
u.kleine-koenig at pengutronix.de
Tue Aug 24 15:09:42 CEST 2010
I'm hunting some problems where reading and writing to the codec doesn't
work. In this case caching is in the way.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
---
sound/soc/codecs/ad1980.c | 36 +++++++++++++++++++++++++++++-------
1 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c
index 82267e5..864e65d 100644
--- a/sound/soc/codecs/ad1980.c
+++ b/sound/soc/codecs/ad1980.c
@@ -33,6 +33,8 @@
#include "ad1980.h"
+#define AC97_USE_CACHE 1
+#if AC97_USE_CACHE
/*
* AD1980 register cache
*/
@@ -54,6 +56,7 @@ static const u16 ad1980_reg[] = {
0x0000, 0x0000, 0x1001, 0x0000, /* 70 - 76 */
0x0000, 0x0000, 0x4144, 0x5370 /* 78 - 7e */
};
+#endif
static const char *ad1980_rec_sel[] = {"Mic", "CD", "NC", "AUX", "Line",
"Stereo Mix", "Mono Mix", "Phone"};
@@ -101,7 +104,9 @@ static unsigned int ac97_read(struct snd_soc_codec *codec,
unsigned int reg)
{
u16 *cache = codec->reg_cache;
+ int ret;
+#if AC97_USE_CACHE
switch (reg) {
case AC97_RESET:
case AC97_INT_PAGING:
@@ -109,27 +114,38 @@ static unsigned int ac97_read(struct snd_soc_codec *codec,
case AC97_EXTENDED_STATUS:
case AC97_VENDOR_ID1:
case AC97_VENDOR_ID2:
- return soc_ac97_ops.read(codec->ac97, reg);
+#endif
+ ret = soc_ac97_ops.read(codec->ac97, reg);
+#if AC97_USE_CACHE
default:
reg = reg >> 1;
if (reg >= ARRAY_SIZE(ad1980_reg))
- return -EINVAL;
-
- return cache[reg];
+ ret = -EINVAL;
+ else
+ ret = cache[reg];
}
+#endif
+
+ pr_debug("%s: reg=0x%02x, val=0x%04x\n", __func__, reg, ret);
+
+ return ret;
}
static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int val)
{
- u16 *cache = codec->reg_cache;
+ pr_debug("%s: reg=0x%02x, val=0x%04x\n", __func__, reg, val);
soc_ac97_ops.write(codec->ac97, reg, val);
+
+#if AC97_USE_CACHE
reg = reg >> 1;
- if (reg < ARRAY_SIZE(ad1980_reg))
+ if (reg < ARRAY_SIZE(ad1980_reg)) {
+ u16 *cache = codec->reg_cache;
cache[reg] = val;
-
+ }
+#endif
return 0;
}
@@ -204,6 +220,7 @@ static int ad1980_soc_probe(struct platform_device *pdev)
codec = socdev->card->codec;
mutex_init(&codec->mutex);
+#if AC97_USE_CACHE
codec->reg_cache =
kzalloc(sizeof(u16) * ARRAY_SIZE(ad1980_reg), GFP_KERNEL);
if (codec->reg_cache == NULL) {
@@ -214,6 +231,7 @@ static int ad1980_soc_probe(struct platform_device *pdev)
ARRAY_SIZE(ad1980_reg));
codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(ad1980_reg);
codec->reg_cache_step = 2;
+#endif
codec->name = "AD1980";
codec->owner = THIS_MODULE;
codec->dai = &ad1980_dai;
@@ -279,9 +297,11 @@ pcm_err:
snd_soc_free_ac97_codec(codec);
codec_err:
+#if AC97_USE_CACHE
kfree(codec->reg_cache);
cache_err:
+#endif
kfree(socdev->card->codec);
socdev->card->codec = NULL;
return ret;
@@ -298,7 +318,9 @@ static int ad1980_soc_remove(struct platform_device *pdev)
snd_soc_dapm_free(socdev);
snd_soc_free_pcms(socdev);
snd_soc_free_ac97_codec(codec);
+#if AC97_USE_CACHE
kfree(codec->reg_cache);
+#endif
kfree(codec);
return 0;
}
--
1.7.1
More information about the Alsa-devel
mailing list