summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functions-so-SOC_DOUBLE_R_RANGE_TLV-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functions-so-SOC_DOUBLE_R_RANGE_TLV-.patch')
-rw-r--r--target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functions-so-SOC_DOUBLE_R_RANGE_TLV-.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functions-so-SOC_DOUBLE_R_RANGE_TLV-.patch b/target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functions-so-SOC_DOUBLE_R_RANGE_TLV-.patch
new file mode 100644
index 0000000000..2b49c73658
--- /dev/null
+++ b/target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functions-so-SOC_DOUBLE_R_RANGE_TLV-.patch
@@ -0,0 +1,78 @@
+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
+