summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.10/0186-Fix-volsw_range-functions-so-SOC_DOUBLE_R_RANGE_TLV-.patch
blob: 2b49c7365888507d9769d78916f8a03566c85993 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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