You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.5 KiB
78 lines
2.5 KiB
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
|
|
|
|
|