On 8/1/08, Mark Brown <broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote: > On Fri, Aug 01, 2008 at 11:42:28AM +0200, Takashi Iwai wrote: > > Jon Smirl wrote: > > > > 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. > > > Mark's patch was already applied. Could you re-generated your change > > based on that? > > > In general it's easiest if ASoC patches are generated against Takashi's > master branch - that's where ASoC gets merged and usually the diff > between the two trees is very small. > This is against Takashi's tree. I handled PAGE_LIMIT differently, instead of breaking from the loop I just let the loop finished and told snprintf it had zero bytes. Allow external display_register()'s to skip sparse registers. Signed-off-by: Jon Smirl <jonsmirl@xxxxxxxxx> --- include/sound/soc.h | 3 +-- sound/soc/soc-core.c | 33 ++++++++++----------------------- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/include/sound/soc.h b/include/sound/soc.h index a1e0357..1f4a9a2 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -416,8 +416,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 *, - size_t, 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 1563cee..fcc613c 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,31 +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); + count = sprintf(buf, "%s registers\n", codec->name); for (i = 0; i < codec->reg_cache_size; i += step) { - count += sprintf(buf + count, "%2x: ", i); - if (count >= PAGE_SIZE - 1) - break; - if (codec->display_register) - count += codec->display_register(codec, buf + count, - PAGE_SIZE - count, i); - else - count += snprintf(buf + count, PAGE_SIZE - count, - "%4x", codec->read(codec, i)); - - if (count >= PAGE_SIZE - 1) - break; - - count += snprintf(buf + count, PAGE_SIZE - count, "\n"); - if (count >= PAGE_SIZE - 1) - break; + 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"); + } } - - /* Truncate count; min() would cause a warning */ - if (count >= PAGE_SIZE) - count = PAGE_SIZE - 1; - return count; } static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL); -- Jon Smirl jonsmirl@xxxxxxxxx _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel