ASoC: core: Fix volsw_range funcs so SOC_DOUBLE_R_RANGE_TLV works.
This fixes a bug when using the SOC_DOUBLE_R_RANGE_TLV macro in the invert mode. In the non-invert case, e.g. SOC_DOUBLE_R_RANGE_TLV("<name>", <reg_l>, <reg_r>, 0, 40, 255, 0, <tlv>) the range sent to the hardware is 40..255, but in the invert case: SOC_DOUBLE_R_RANGE_TLV("<name>", <reg_l>, <reg_r>, 0, 40, 255, 1, <tlv>) the range 215..0 was being sent to the hardware. This commit corrects this to 255..40 so it is consistent with the non-invert case. Signed-off-by: Howard Mitchell <hm@hmbedded.co.uk> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
8c8f2f6fc1
commit
5c7c343a11
|
@ -3019,9 +3019,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
|
|||
unsigned int val, val_mask;
|
||||
int ret;
|
||||
|
||||
val = ((ucontrol->value.integer.value[0] + min) & mask);
|
||||
if (invert)
|
||||
val = max - val;
|
||||
val = (max - ucontrol->value.integer.value[0]) & mask;
|
||||
else
|
||||
val = ((ucontrol->value.integer.value[0] + min) & mask);
|
||||
val_mask = mask << shift;
|
||||
val = val << shift;
|
||||
|
||||
|
@ -3030,9 +3031,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
|
|||
return ret;
|
||||
|
||||
if (snd_soc_volsw_is_stereo(mc)) {
|
||||
val = ((ucontrol->value.integer.value[1] + min) & mask);
|
||||
if (invert)
|
||||
val = max - val;
|
||||
val = (max - ucontrol->value.integer.value[1]) & mask;
|
||||
else
|
||||
val = ((ucontrol->value.integer.value[1] + min) & mask);
|
||||
val_mask = mask << shift;
|
||||
val = val << shift;
|
||||
|
||||
|
@ -3077,6 +3079,7 @@ int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
|
|||
if (invert)
|
||||
ucontrol->value.integer.value[0] =
|
||||
max - ucontrol->value.integer.value[0];
|
||||
else
|
||||
ucontrol->value.integer.value[0] =
|
||||
ucontrol->value.integer.value[0] - min;
|
||||
|
||||
|
@ -3089,6 +3092,7 @@ int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
|
|||
if (invert)
|
||||
ucontrol->value.integer.value[1] =
|
||||
max - ucontrol->value.integer.value[1];
|
||||
else
|
||||
ucontrol->value.integer.value[1] =
|
||||
ucontrol->value.integer.value[1] - min;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue