[alsa-devel] [PATCH 04/14] ASoC: Allow codecs to override register display

Jon Smirl jonsmirl at gmail.com
Fri Aug 1 03:41:48 CEST 2008


Mark, I see this patch is already in your tree. I have rewritten it a
little differently to ensure that too many results can't be returned.
This is in my system and tested. I had a bug too so I know the
limiting it to pagesize code works.

Signed-off-by: Jon Smirl <jonsmirl at gmail.com>
---

 include/sound/soc.h  |    1 +
 sound/soc/soc-core.c |   19 +++++++++++++------
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/include/sound/soc.h b/include/sound/soc.h
index 1890d87..b95c0c2 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -410,6 +410,7 @@ struct snd_soc_codec {
 	void *control_data; /* codec control (i2c/3wire) data */
 	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
 	int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
+	int (*display_register)(struct snd_soc_codec *, char *, unsigned
int, unsigned int);
 	hw_write_t hw_write;
 	hw_read_t hw_read;
 	void *reg_cache;
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 83f1190..55f7559 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -961,7 +961,7 @@ static ssize_t codec_reg_show(struct device *dev,
 {
 	struct snd_soc_device *devdata = dev_get_drvdata(dev);
 	struct snd_soc_codec *codec = devdata->codec;
-	int i, step = 1, count = 0;
+	int i, step = 1, count;

 	if (!codec->reg_cache_size)
 		return 0;
@@ -969,11 +969,18 @@ static ssize_t codec_reg_show(struct device *dev,
 	if (codec->reg_cache_step)
 		step = codec->reg_cache_step;

-	count += sprintf(buf, "%s registers\n", codec->name);
-	for (i = 0; i < codec->reg_cache_size; i += step)
-		count += sprintf(buf + count, "%2x: %4x\n", i,
-			codec->read(codec, i));
-
+	count = sprintf(buf, "%s registers\n", codec->name);
+	for (i = 0; i < codec->reg_cache_size; i += step) {
+		if (codec->display_register)
+			count += codec->display_register(codec,
+							 buf + count, PAGE_SIZE - count, i);
+		else {
+			count += snprintf(buf + count, PAGE_SIZE - count, "%2x: ", i);
+			count += snprintf(buf + count, PAGE_SIZE - count, "%4x",
+					 codec->read(codec, i));
+			count += snprintf(buf + count, PAGE_SIZE - count, "\n");
+		}
+	}
 	return count;
 }
 static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);


-- 
Jon Smirl
jonsmirl at gmail.com


More information about the Alsa-devel mailing list