[alsa-devel] [PATCH 4/6] ASoC: ad1980: make usage of register cache optional

Mark Brown broonie at opensource.wolfsonmicro.com
Fri Aug 27 20:20:28 CEST 2010


On Tue, Aug 24, 2010 at 03:09:42PM +0200, Uwe Kleine-K??nig wrote:
> 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>

Once more please remember to CC maintainers on patches.

The commit message here could've done with a description of what the
actual change you've implemented to bypass the register cache here is.
What you've done is to add an ifdef AC97_USE_CACHE which cuts out the
cache parts of the I/O functions and the register defaults.  You've also
introduced a number of unrelated changes which add logging to the I/O
functions.

It strikes me that this is a fairly invasive way of implementing this
functionality and that it's probably at the wrong level - it'd seem
better to do this by supporting volatility and then marking all the
registers as volatile, and that doing this with a debugfs setting in the
core (or the soc-cache code anyway) would be even better.  This would
fall fairly naturally out of factoring the AC97 register I/O into
soc-cache.

> ---
>  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
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

-- 
"You grabbed my hand and we fell into it, like a daydream - or a fever."


More information about the Alsa-devel mailing list