All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Molton <ian@mnementh.co.uk>
To: Mark Brown <broonie@sirena.org.uk>
Cc: Takashi Iwai <tiwai@suse.de>,
	ALSA development <alsa-devel@alsa-project.org>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>
Subject: Re: [Pull request] Support for wm9705 codec and two machines that use it.
Date: Fri, 16 Jan 2009 15:46:19 +0000	[thread overview]
Message-ID: <4970ABCB.5050300@mnementh.co.uk> (raw)
In-Reply-To: <20090116143135.GG7554@sirena.org.uk>


Hi,

Mark, the changes requested are implemented below. There are two 
patchsets, one for wm9705 and one for the other codec issues I found.

also available at:

git://git.mnementh.co.uk/linux-2.6-im.git asoc-pu


 From 8e89f1f1a94bc697d1ce1c07ab8426d372b0d6fe Mon Sep 17 00:00:00 2001
From: Ian Molton <ian@mnementh.co.uk>
Date: Fri, 16 Jan 2009 15:37:22 +0000
Subject: [PATCH] ASoC: codec: wm9705 misc cleanup

This patch fixes an off-by-one error in the wm9705 reg_cache 
implementation and
replaces a kzalloc/copy with kmemdup().

Signed-off-by: Ian Molton <ian@mnementh.co.uk>
---
  sound/soc/codecs/wm9705.c |   11 ++++-------
  1 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c
index c6b7dc2..cb26b6a 100644
--- a/sound/soc/codecs/wm9705.c
+++ b/sound/soc/codecs/wm9705.c
@@ -221,7 +221,7 @@ static unsigned int ac97_read(struct snd_soc_codec 
*codec, unsigned int reg)
  	default:
  		reg = reg >> 1;

-		if (reg > (ARRAY_SIZE(wm9705_reg)))
+		if (reg >= (ARRAY_SIZE(wm9705_reg)))
  			return -EIO;

  		return cache[reg];
@@ -235,7 +235,7 @@ static int ac97_write(struct snd_soc_codec *codec, 
unsigned int reg,

  	soc_ac97_ops.write(codec->ac97, reg, val);
  	reg = reg >> 1;
-	if (reg <= (ARRAY_SIZE(wm9705_reg)))
+	if (reg < (ARRAY_SIZE(wm9705_reg)))
  		cache[reg] = val;

  	return 0;
@@ -327,15 +327,12 @@ static int wm9705_soc_probe(struct platform_device 
*pdev)
  	codec = socdev->codec;
  	mutex_init(&codec->mutex);

-	codec->reg_cache =
-		kzalloc(sizeof(u16) * ARRAY_SIZE(wm9705_reg), GFP_KERNEL);
+	codec->reg_cache = kmemdup(wm9705_reg, sizeof(wm9705_reg), GFP_KERNEL);
  	if (codec->reg_cache == NULL) {
  		ret = -ENOMEM;
  		goto cache_err;
  	}
-	memcpy(codec->reg_cache, wm9705_reg,
-		sizeof(u16) * ARRAY_SIZE(wm9705_reg));
-	codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm9705_reg);
+	codec->reg_cache_size = sizeof(wm9705_reg);
  	codec->reg_cache_step = 2;

  	codec->name = "WM9705";
-- 
1.5.6.5

 From 7ff27c9c1f7a7b7c86d3138060b1b406ad5dd6af Mon Sep 17 00:00:00 2001
From: Ian Molton <ian@mnementh.co.uk>
Date: Fri, 16 Jan 2009 15:03:19 +0000
Subject: [PATCH] ASoC: fixes to caching implementations

This patch takes fixes a number of bugs in the caching code used by
several ASoC codec drivers. Mostly off-by-one fixes.

Signed-off-by: Ian Molton <ian@mnementh.co.uk>
---
  sound/soc/codecs/ac97.c    |    2 --
  sound/soc/codecs/ad1980.c  |    4 ++--
  sound/soc/codecs/twl4030.c |    3 +++
  sound/soc/codecs/wm8580.c  |    4 ++--
  sound/soc/codecs/wm8728.c  |    4 ++--
  sound/soc/codecs/wm8753.c  |    4 ++--
  sound/soc/codecs/wm8990.c  |    4 ++--
  sound/soc/codecs/wm9712.c  |    4 ++--
  sound/soc/codecs/wm9713.c  |    4 ++--
  9 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c
index fb53e65..89d4127 100644
--- a/sound/soc/codecs/ac97.c
+++ b/sound/soc/codecs/ac97.c
@@ -123,7 +123,6 @@ bus_err:
  	snd_soc_free_pcms(socdev);

  err:
-	kfree(socdev->codec->reg_cache);
  	kfree(socdev->codec);
  	socdev->codec = NULL;
  	return ret;
@@ -138,7 +137,6 @@ static int ac97_soc_remove(struct platform_device *pdev)
  		return 0;

  	snd_soc_free_pcms(socdev);
-	kfree(socdev->codec->reg_cache);
  	kfree(socdev->codec);

  	return 0;
diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c
index c3c5d0e..faf3587 100644
--- a/sound/soc/codecs/ad1980.c
+++ b/sound/soc/codecs/ad1980.c
@@ -109,7 +109,7 @@ static unsigned int ac97_read(struct snd_soc_codec 
*codec,
  	default:
  		reg = reg >> 1;

-		if (reg >= (ARRAY_SIZE(ad1980_reg)))
+		if (reg >= ARRAY_SIZE(ad1980_reg))
  			return -EINVAL;

  		return cache[reg];
@@ -123,7 +123,7 @@ static int ac97_write(struct snd_soc_codec *codec, 
unsigned int reg,

  	soc_ac97_ops.write(codec->ac97, reg, val);
  	reg = reg >> 1;
-	if (reg < (ARRAY_SIZE(ad1980_reg)))
+	if (reg < ARRAY_SIZE(ad1980_reg))
  		cache[reg] = val;

  	return 0;
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
index ddc9f37..f530c1e 100644
--- a/sound/soc/codecs/twl4030.c
+++ b/sound/soc/codecs/twl4030.c
@@ -125,6 +125,9 @@ static inline unsigned int 
twl4030_read_reg_cache(struct snd_soc_codec *codec,
  {
  	u8 *cache = codec->reg_cache;

+	if (reg >= TWL4030_CACHEREGNUM)
+		return -EIO;
+
  	return cache[reg];
  }

diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c
index 9b75a37..3faf0e7 100644
--- a/sound/soc/codecs/wm8580.c
+++ b/sound/soc/codecs/wm8580.c
@@ -200,7 +200,7 @@ static inline unsigned int 
wm8580_read_reg_cache(struct snd_soc_codec *codec,
  	unsigned int reg)
  {
  	u16 *cache = codec->reg_cache;
-	BUG_ON(reg > ARRAY_SIZE(wm8580_reg));
+	BUG_ON(reg >= ARRAY_SIZE(wm8580_reg));
  	return cache[reg];
  }

@@ -223,7 +223,7 @@ static int wm8580_write(struct snd_soc_codec *codec, 
unsigned int reg,
  {
  	u8 data[2];

-	BUG_ON(reg > ARRAY_SIZE(wm8580_reg));
+	BUG_ON(reg >= ARRAY_SIZE(wm8580_reg));

  	/* Registers are 9 bits wide */
  	value &= 0x1ff;
diff --git a/sound/soc/codecs/wm8728.c b/sound/soc/codecs/wm8728.c
index defa310..f90dc52 100644
--- a/sound/soc/codecs/wm8728.c
+++ b/sound/soc/codecs/wm8728.c
@@ -47,7 +47,7 @@ static inline unsigned int 
wm8728_read_reg_cache(struct snd_soc_codec *codec,
  	unsigned int reg)
  {
  	u16 *cache = codec->reg_cache;
-	BUG_ON(reg > ARRAY_SIZE(wm8728_reg_defaults));
+	BUG_ON(reg >= ARRAY_SIZE(wm8728_reg_defaults));
  	return cache[reg];
  }

@@ -55,7 +55,7 @@ static inline void wm8728_write_reg_cache(struct 
snd_soc_codec *codec,
  	u16 reg, unsigned int value)
  {
  	u16 *cache = codec->reg_cache;
-	BUG_ON(reg > ARRAY_SIZE(wm8728_reg_defaults));
+	BUG_ON(reg >= ARRAY_SIZE(wm8728_reg_defaults));
  	cache[reg] = value;
  }

diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c
index 7283178..5a1c1fc 100644
--- a/sound/soc/codecs/wm8753.c
+++ b/sound/soc/codecs/wm8753.c
@@ -97,7 +97,7 @@ static inline unsigned int 
wm8753_read_reg_cache(struct snd_soc_codec *codec,
  	unsigned int reg)
  {
  	u16 *cache = codec->reg_cache;
-	if (reg < 1 || reg > (ARRAY_SIZE(wm8753_reg) + 1))
+	if (reg < 1 || reg >= (ARRAY_SIZE(wm8753_reg) + 1))
  		return -1;
  	return cache[reg - 1];
  }
@@ -109,7 +109,7 @@ static inline void wm8753_write_reg_cache(struct 
snd_soc_codec *codec,
  	unsigned int reg, unsigned int value)
  {
  	u16 *cache = codec->reg_cache;
-	if (reg < 1 || reg > 0x3f)
+	if (reg < 1 || reg >= (ARRAY_SIZE(wm8753_reg) + 1))
  		return;
  	cache[reg - 1] = value;
  }
diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c
index 6b27786..f93c095 100644
--- a/sound/soc/codecs/wm8990.c
+++ b/sound/soc/codecs/wm8990.c
@@ -116,7 +116,7 @@ static inline unsigned int 
wm8990_read_reg_cache(struct snd_soc_codec *codec,
  	unsigned int reg)
  {
  	u16 *cache = codec->reg_cache;
-	BUG_ON(reg > (ARRAY_SIZE(wm8990_reg)) - 1);
+	BUG_ON(reg >= ARRAY_SIZE(wm8990_reg));
  	return cache[reg];
  }

@@ -129,7 +129,7 @@ static inline void wm8990_write_reg_cache(struct 
snd_soc_codec *codec,
  	u16 *cache = codec->reg_cache;

  	/* Reset register and reserved registers are uncached */
-	if (reg == 0 || reg > ARRAY_SIZE(wm8990_reg) - 1)
+	if (reg == 0 || reg >= ARRAY_SIZE(wm8990_reg))
  		return;

  	cache[reg] = value;
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c
index 1b0ace0..4dc90d6 100644
--- a/sound/soc/codecs/wm9712.c
+++ b/sound/soc/codecs/wm9712.c
@@ -452,7 +452,7 @@ static unsigned int ac97_read(struct snd_soc_codec 
*codec,
  	else {
  		reg = reg >> 1;

-		if (reg > (ARRAY_SIZE(wm9712_reg)))
+		if (reg >= (ARRAY_SIZE(wm9712_reg)))
  			return -EIO;

  		return cache[reg];
@@ -466,7 +466,7 @@ static int ac97_write(struct snd_soc_codec *codec, 
unsigned int reg,

  	soc_ac97_ops.write(codec->ac97, reg, val);
  	reg = reg >> 1;
-	if (reg <= (ARRAY_SIZE(wm9712_reg)))
+	if (reg < (ARRAY_SIZE(wm9712_reg)))
  		cache[reg] = val;

  	return 0;
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c
index a456226..d8ddca9 100644
--- a/sound/soc/codecs/wm9713.c
+++ b/sound/soc/codecs/wm9713.c
@@ -621,7 +621,7 @@ static unsigned int ac97_read(struct snd_soc_codec 
*codec,
  	else {
  		reg = reg >> 1;

-		if (reg > (ARRAY_SIZE(wm9713_reg)))
+		if (reg >= (ARRAY_SIZE(wm9713_reg)))
  			return -EIO;

  		return cache[reg];
@@ -635,7 +635,7 @@ static int ac97_write(struct snd_soc_codec *codec, 
unsigned int reg,
  	if (reg < 0x7c)
  		soc_ac97_ops.write(codec->ac97, reg, val);
  	reg = reg >> 1;
-	if (reg <= (ARRAY_SIZE(wm9713_reg)))
+	if (reg < (ARRAY_SIZE(wm9713_reg)))
  		cache[reg] = val;

  	return 0;
-- 
1.5.6.5

  parent reply	other threads:[~2009-01-16 15:45 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-15  1:13 [Pull request] Support for wm9705 codec and two machines that use it Ian Molton
2009-01-15  1:16 ` Ian Molton
2009-01-15  7:06 ` Takashi Iwai
2009-01-15 10:06   ` Ian Molton
2009-01-15 10:10     ` Russell King - ARM Linux
2009-01-15 10:47       ` Ian Molton
2009-01-15 17:20     ` Mark Brown
2009-01-15 22:16       ` Ian Molton
2009-01-15 22:22         ` Mark Brown
2009-01-15 23:58           ` Ian Molton
2009-01-16 11:21             ` Mark Brown
2009-01-16 11:03     ` Takashi Iwai
2009-01-16 11:34       ` Ian Molton
2009-01-16 11:54         ` Mark Brown
2009-01-16 13:39           ` Ian Molton
2009-01-16 14:31             ` Mark Brown
2009-01-16 15:00               ` Ian Molton
2009-01-16 16:00                 ` Mark Brown
2009-01-16 15:46               ` Ian Molton [this message]
2009-01-16 16:16                 ` Mark Brown
2009-01-17 17:58                 ` Mark Brown
2009-01-17 18:47                   ` Ian Molton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4970ABCB.5050300@mnementh.co.uk \
    --to=ian@mnementh.co.uk \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@sirena.org.uk \
    --cc=linux@arm.linux.org.uk \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.