Commit e555317c authored by Daniel Mack's avatar Daniel Mack Committed by Mark Brown

ASoC: fix ak4104 register array access

Don't touch the variable 'reg' to construct the value for the actual SPI
transport. This variable is again used to access the driver's register
cache, and so random memory is overwritten.
Compute the value in-place instead.
Signed-off-by: default avatarDaniel Mack <daniel@caiaq.de>
Acked-by: default avatarLiam Girdwood <lrg@slimlogic.co.uk>
Cc: stable@kernel.org
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent bb1c0478
...@@ -90,12 +90,10 @@ static int ak4104_spi_write(struct snd_soc_codec *codec, unsigned int reg, ...@@ -90,12 +90,10 @@ static int ak4104_spi_write(struct snd_soc_codec *codec, unsigned int reg,
if (reg >= codec->reg_cache_size) if (reg >= codec->reg_cache_size)
return -EINVAL; return -EINVAL;
reg &= AK4104_REG_MASK;
reg |= AK4104_WRITE;
/* only write to the hardware if value has changed */ /* only write to the hardware if value has changed */
if (cache[reg] != value) { if (cache[reg] != value) {
u8 tmp[2] = { reg, value }; u8 tmp[2] = { (reg & AK4104_REG_MASK) | AK4104_WRITE, value };
if (spi_write(spi, tmp, sizeof(tmp))) { if (spi_write(spi, tmp, sizeof(tmp))) {
dev_err(&spi->dev, "SPI write failed\n"); dev_err(&spi->dev, "SPI write failed\n");
return -EIO; return -EIO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment