ASoC: Simplify format_register_str() without stack usages
Instead of allocating two string buffers on stack and copying them back, manipulate directly the target string buffer. This simplifies the code well. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
9e4980896c
commit
d6b6c2ca6a
|
@ -92,30 +92,21 @@ static int format_register_str(struct snd_soc_codec *codec,
|
|||
int wordsize = min_bytes_needed(codec->driver->reg_cache_size) * 2;
|
||||
int regsize = codec->driver->reg_word_size * 2;
|
||||
int ret;
|
||||
char tmpbuf[len + 1];
|
||||
char regbuf[regsize + 1];
|
||||
|
||||
/* since tmpbuf is allocated on the stack, warn the callers if they
|
||||
* try to abuse this function */
|
||||
WARN_ON(len > 63);
|
||||
|
||||
/* +2 for ': ' and + 1 for '\n' */
|
||||
if (wordsize + regsize + 2 + 1 != len)
|
||||
return -EINVAL;
|
||||
|
||||
sprintf(buf, "%.*x: ", wordsize, reg);
|
||||
buf += wordsize + 2;
|
||||
|
||||
ret = snd_soc_read(codec, reg);
|
||||
if (ret < 0) {
|
||||
memset(regbuf, 'X', regsize);
|
||||
regbuf[regsize] = '\0';
|
||||
} else {
|
||||
snprintf(regbuf, regsize + 1, "%.*x", regsize, ret);
|
||||
}
|
||||
|
||||
/* prepare the buffer */
|
||||
snprintf(tmpbuf, len + 1, "%.*x: %s\n", wordsize, reg, regbuf);
|
||||
/* copy it back to the caller without the '\0' */
|
||||
memcpy(buf, tmpbuf, len);
|
||||
|
||||
if (ret < 0)
|
||||
memset(buf, 'X', regsize);
|
||||
else
|
||||
sprintf(buf, "%.*x", regsize, ret);
|
||||
buf[regsize] = '\n';
|
||||
/* no NUL-termination needed */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue