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: Daniel Mack <daniel@caiaq.de> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Cc: stable@kernel.org Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Родитель
bb1c04784d
Коммит
e555317c08
|
@ -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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче