|
@@ -2327,7 +2327,8 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
|
|
* @kcontrol: mixer control
|
|
* @kcontrol: mixer control
|
|
* @ucontrol: control element information
|
|
* @ucontrol: control element information
|
|
*
|
|
*
|
|
- * Callback to set the value of a single mixer control.
|
|
|
|
|
|
+ * Callback to set the value of a single mixer control, or a double mixer
|
|
|
|
+ * control that spans 2 registers.
|
|
*
|
|
*
|
|
* Returns 0 for success.
|
|
* Returns 0 for success.
|
|
*/
|
|
*/
|
|
@@ -2338,73 +2339,44 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
|
|
(struct soc_mixer_control *)kcontrol->private_value;
|
|
(struct soc_mixer_control *)kcontrol->private_value;
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
unsigned int reg = mc->reg;
|
|
unsigned int reg = mc->reg;
|
|
|
|
+ unsigned int reg2 = mc->rreg;
|
|
unsigned int shift = mc->shift;
|
|
unsigned int shift = mc->shift;
|
|
unsigned int rshift = mc->rshift;
|
|
unsigned int rshift = mc->rshift;
|
|
int max = mc->max;
|
|
int max = mc->max;
|
|
unsigned int mask = (1 << fls(max)) - 1;
|
|
unsigned int mask = (1 << fls(max)) - 1;
|
|
unsigned int invert = mc->invert;
|
|
unsigned int invert = mc->invert;
|
|
- unsigned int val, val2, val_mask;
|
|
|
|
|
|
+ int err;
|
|
|
|
+ bool type_2r = 0;
|
|
|
|
+ unsigned int val2 = 0;
|
|
|
|
+ unsigned int val, val_mask;
|
|
|
|
|
|
val = (ucontrol->value.integer.value[0] & mask);
|
|
val = (ucontrol->value.integer.value[0] & mask);
|
|
if (invert)
|
|
if (invert)
|
|
val = max - val;
|
|
val = max - val;
|
|
val_mask = mask << shift;
|
|
val_mask = mask << shift;
|
|
val = val << shift;
|
|
val = val << shift;
|
|
- if (shift != rshift) {
|
|
|
|
|
|
+ if (snd_soc_volsw_is_stereo(mc)) {
|
|
val2 = (ucontrol->value.integer.value[1] & mask);
|
|
val2 = (ucontrol->value.integer.value[1] & mask);
|
|
if (invert)
|
|
if (invert)
|
|
val2 = max - val2;
|
|
val2 = max - val2;
|
|
- val_mask |= mask << rshift;
|
|
|
|
- val |= val2 << rshift;
|
|
|
|
- }
|
|
|
|
- return snd_soc_update_bits_locked(codec, reg, val_mask, val);
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * snd_soc_put_volsw_2r - double mixer set callback
|
|
|
|
- * @kcontrol: mixer control
|
|
|
|
- * @ucontrol: control element information
|
|
|
|
- *
|
|
|
|
- * Callback to set the value of a double mixer control that spans 2 registers.
|
|
|
|
- *
|
|
|
|
- * Returns 0 for success.
|
|
|
|
- */
|
|
|
|
-int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
|
|
|
|
- struct snd_ctl_elem_value *ucontrol)
|
|
|
|
-{
|
|
|
|
- struct soc_mixer_control *mc =
|
|
|
|
- (struct soc_mixer_control *)kcontrol->private_value;
|
|
|
|
- struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
|
- unsigned int reg = mc->reg;
|
|
|
|
- unsigned int reg2 = mc->rreg;
|
|
|
|
- unsigned int shift = mc->shift;
|
|
|
|
- int max = mc->max;
|
|
|
|
- unsigned int mask = (1 << fls(max)) - 1;
|
|
|
|
- unsigned int invert = mc->invert;
|
|
|
|
- int err;
|
|
|
|
- unsigned int val, val2, val_mask;
|
|
|
|
-
|
|
|
|
- val_mask = mask << shift;
|
|
|
|
- val = (ucontrol->value.integer.value[0] & mask);
|
|
|
|
- val2 = (ucontrol->value.integer.value[1] & mask);
|
|
|
|
-
|
|
|
|
- if (invert) {
|
|
|
|
- val = max - val;
|
|
|
|
- val2 = max - val2;
|
|
|
|
|
|
+ if (reg == reg2) {
|
|
|
|
+ val_mask |= mask << rshift;
|
|
|
|
+ val |= val2 << rshift;
|
|
|
|
+ } else {
|
|
|
|
+ val2 = val2 << shift;
|
|
|
|
+ type_2r = 1;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-
|
|
|
|
- val = val << shift;
|
|
|
|
- val2 = val2 << shift;
|
|
|
|
-
|
|
|
|
err = snd_soc_update_bits_locked(codec, reg, val_mask, val);
|
|
err = snd_soc_update_bits_locked(codec, reg, val_mask, val);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
- err = snd_soc_update_bits_locked(codec, reg2, val_mask, val2);
|
|
|
|
|
|
+ if (type_2r)
|
|
|
|
+ err = snd_soc_update_bits_locked(codec, reg2, val_mask, val2);
|
|
|
|
+
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r);
|
|
|
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
|
|
|
|
|
|
/**
|
|
/**
|
|
* snd_soc_info_volsw_s8 - signed mixer info callback
|
|
* snd_soc_info_volsw_s8 - signed mixer info callback
|