(struct soc_mixer_control *)kcontrol->private_value;
struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
unsigned int read_l, read_r, gain_l_val, gain_r_val;
- unsigned int i, adc_vol_flag = 0;
+ unsigned int i, adc_vol_flag = 0, changed = 0;
+ unsigned int lvalue, rvalue;
if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
strstr(ucontrol->id.name, "FU0F Capture Volume"))
adc_vol_flag = 1;
+ regmap_read(rt711->mbq_regmap, mc->reg, &lvalue);
+ regmap_read(rt711->mbq_regmap, mc->rreg, &rvalue);
+
/* control value to 2's complement value */
/* L Channel */
gain_l_val = ucontrol->value.integer.value[0];
gain_r_val &= 0xffff;
}
+ if (lvalue != gain_l_val || rvalue != gain_r_val)
+ changed = 1;
+ else
+ return 0;
+
for (i = 0; i < 3; i++) { /* retry 3 times at most */
/* Lch*/
regmap_write(rt711->mbq_regmap, mc->reg, gain_l_val);
break;
}
- return i == 3 ? -EIO : 0;
+ return i == 3 ? -EIO : changed;
}
static int rt711_sdca_set_gain_get(struct snd_kcontrol *kcontrol,