aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/tpa6130a2.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/sound/soc/codecs/tpa6130a2.c b/sound/soc/codecs/tpa6130a2.c
index 0cf3e3862e7b..fa4fa33a51aa 100644
--- a/sound/soc/codecs/tpa6130a2.c
+++ b/sound/soc/codecs/tpa6130a2.c
@@ -176,7 +176,7 @@ exit:
176 return ret; 176 return ret;
177} 177}
178 178
179static int tpa6130a2_get_reg(struct snd_kcontrol *kcontrol, 179static int tpa6130a2_get_volsw(struct snd_kcontrol *kcontrol,
180 struct snd_ctl_elem_value *ucontrol) 180 struct snd_ctl_elem_value *ucontrol)
181{ 181{
182 struct soc_mixer_control *mc = 182 struct soc_mixer_control *mc =
@@ -184,7 +184,8 @@ static int tpa6130a2_get_reg(struct snd_kcontrol *kcontrol,
184 struct tpa6130a2_data *data; 184 struct tpa6130a2_data *data;
185 unsigned int reg = mc->reg; 185 unsigned int reg = mc->reg;
186 unsigned int shift = mc->shift; 186 unsigned int shift = mc->shift;
187 unsigned int mask = mc->max; 187 int max = mc->max;
188 unsigned int mask = (1 << fls(max)) - 1;
188 unsigned int invert = mc->invert; 189 unsigned int invert = mc->invert;
189 190
190 BUG_ON(tpa6130a2_client == NULL); 191 BUG_ON(tpa6130a2_client == NULL);
@@ -197,13 +198,13 @@ static int tpa6130a2_get_reg(struct snd_kcontrol *kcontrol,
197 198
198 if (invert) 199 if (invert)
199 ucontrol->value.integer.value[0] = 200 ucontrol->value.integer.value[0] =
200 mask - ucontrol->value.integer.value[0]; 201 max - ucontrol->value.integer.value[0];
201 202
202 mutex_unlock(&data->mutex); 203 mutex_unlock(&data->mutex);
203 return 0; 204 return 0;
204} 205}
205 206
206static int tpa6130a2_set_reg(struct snd_kcontrol *kcontrol, 207static int tpa6130a2_put_volsw(struct snd_kcontrol *kcontrol,
207 struct snd_ctl_elem_value *ucontrol) 208 struct snd_ctl_elem_value *ucontrol)
208{ 209{
209 struct soc_mixer_control *mc = 210 struct soc_mixer_control *mc =
@@ -211,7 +212,8 @@ static int tpa6130a2_set_reg(struct snd_kcontrol *kcontrol,
211 struct tpa6130a2_data *data; 212 struct tpa6130a2_data *data;
212 unsigned int reg = mc->reg; 213 unsigned int reg = mc->reg;
213 unsigned int shift = mc->shift; 214 unsigned int shift = mc->shift;
214 unsigned int mask = mc->max; 215 int max = mc->max;
216 unsigned int mask = (1 << fls(max)) - 1;
215 unsigned int invert = mc->invert; 217 unsigned int invert = mc->invert;
216 unsigned int val = (ucontrol->value.integer.value[0] & mask); 218 unsigned int val = (ucontrol->value.integer.value[0] & mask);
217 unsigned int val_reg; 219 unsigned int val_reg;
@@ -220,7 +222,7 @@ static int tpa6130a2_set_reg(struct snd_kcontrol *kcontrol,
220 data = i2c_get_clientdata(tpa6130a2_client); 222 data = i2c_get_clientdata(tpa6130a2_client);
221 223
222 if (invert) 224 if (invert)
223 val = mask - val; 225 val = max - val;
224 226
225 mutex_lock(&data->mutex); 227 mutex_lock(&data->mutex);
226 228
@@ -260,7 +262,7 @@ static const unsigned int tpa6130_tlv[] = {
260static const struct snd_kcontrol_new tpa6130a2_controls[] = { 262static const struct snd_kcontrol_new tpa6130a2_controls[] = {
261 SOC_SINGLE_EXT_TLV("TPA6130A2 Headphone Playback Volume", 263 SOC_SINGLE_EXT_TLV("TPA6130A2 Headphone Playback Volume",
262 TPA6130A2_REG_VOL_MUTE, 0, 0x3f, 0, 264 TPA6130A2_REG_VOL_MUTE, 0, 0x3f, 0,
263 tpa6130a2_get_reg, tpa6130a2_set_reg, 265 tpa6130a2_get_volsw, tpa6130a2_put_volsw,
264 tpa6130_tlv), 266 tpa6130_tlv),
265}; 267};
266 268
@@ -274,7 +276,7 @@ static const unsigned int tpa6140_tlv[] = {
274static const struct snd_kcontrol_new tpa6140a2_controls[] = { 276static const struct snd_kcontrol_new tpa6140a2_controls[] = {
275 SOC_SINGLE_EXT_TLV("TPA6140A2 Headphone Playback Volume", 277 SOC_SINGLE_EXT_TLV("TPA6140A2 Headphone Playback Volume",
276 TPA6130A2_REG_VOL_MUTE, 1, 0x1f, 0, 278 TPA6130A2_REG_VOL_MUTE, 1, 0x1f, 0,
277 tpa6130a2_get_reg, tpa6130a2_set_reg, 279 tpa6130a2_get_volsw, tpa6130a2_put_volsw,
278 tpa6140_tlv), 280 tpa6140_tlv),
279}; 281};
280 282