aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/cs4270.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c
index 43d50a4d8089..5d601ad6da70 100644
--- a/sound/soc/codecs/cs4270.c
+++ b/sound/soc/codecs/cs4270.c
@@ -294,19 +294,24 @@ static unsigned int cs4270_read_reg_cache(struct snd_soc_codec *codec,
static int cs4270_i2c_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int value)
{
+ u8 *cache = codec->reg_cache;
+
if ((reg < CS4270_FIRSTREG) || (reg > CS4270_LASTREG))
return -EIO;
- if (i2c_smbus_write_byte_data(codec->control_data, reg, value) == 0) {
+ /* Only perform an I2C operation if the new value is different */
+ if (cache[reg - CS4270_FIRSTREG] != value) {
+ struct i2c_client *client = codec->control_data;
+ if (i2c_smbus_write_byte_data(client, reg, value)) {
+ printk(KERN_ERR "cs4270: I2C write failed\n");
+ return -EIO;
+ }
+
/* We've written to the hardware, so update the cache */
- u8 *cache = codec->reg_cache;
cache[reg - CS4270_FIRSTREG] = value;
- return 0;
- } else {
- printk(KERN_ERR "cs4270: I2C write of register %u failed\n",
- reg);
- return -EIO;
}
+
+ return 0;
}
/*
@@ -521,7 +526,7 @@ static int cs4270_i2c_detach(struct i2c_client *client)
/* A list of non-DAPM controls that the CS4270 supports */
static const struct snd_kcontrol_new cs4270_snd_controls[] = {
SOC_DOUBLE_R("Master Playback Volume",
- CS4270_VOLA, CS4270_VOLB, 0, 0xFF, 0)
+ CS4270_VOLA, CS4270_VOLB, 0, 0xFF, 1)
};
static struct i2c_driver cs4270_i2c_driver = {