You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openwrt/target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functi...

79 lines
2.5 KiB
Diff

From 4c91cfe1cfa38f4e17e96cd7d78ac2a4fa86d5c9 Mon Sep 17 00:00:00 2001
From: Howard Mitchell <hm@hmbedded.co.uk>
Date: Fri, 28 Mar 2014 16:27:57 +0000
Subject: [PATCH 186/196] Fix volsw_range functions so SOC_DOUBLE_R_RANGE_TLV
works.
This is so that the correct rabge of values as specified
with the SOC_DOUBLE_R_RANGE_TLV macro are sent to the
hardware for both the normal and invert cases.
---
sound/soc/soc-core.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index d18272c..be302e1 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -2925,8 +2925,8 @@ int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol,
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1;
- uinfo->value.integer.min = 0;
- uinfo->value.integer.max = platform_max - min;
+ uinfo->value.integer.min = min;
+ uinfo->value.integer.max = platform_max;
return 0;
}
@@ -2957,9 +2957,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] + min) & mask);
+ else
+ val = (ucontrol->value.integer.value[0] & mask);
val_mask = mask << shift;
val = val << shift;
@@ -2968,9 +2969,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] + min) & mask);
+ else
+ val = (ucontrol->value.integer.value[1] & mask);
val_mask = mask << shift;
val = val << shift;
@@ -3008,18 +3010,14 @@ int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
(snd_soc_read(codec, reg) >> shift) & mask;
if (invert)
ucontrol->value.integer.value[0] =
- max - ucontrol->value.integer.value[0];
- ucontrol->value.integer.value[0] =
- ucontrol->value.integer.value[0] - min;
+ max - ucontrol->value.integer.value[0] + min;
if (snd_soc_volsw_is_stereo(mc)) {
ucontrol->value.integer.value[1] =
(snd_soc_read(codec, rreg) >> shift) & mask;
if (invert)
ucontrol->value.integer.value[1] =
- max - ucontrol->value.integer.value[1];
- ucontrol->value.integer.value[1] =
- ucontrol->value.integer.value[1] - min;
+ max - ucontrol->value.integer.value[1] + min;
}
return 0;
--
1.9.1