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;
}
/*
/* 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 = {