|
@@ -2281,7 +2281,8 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
|
|
|
* @kcontrol: mixer control
|
|
|
* @ucontrol: control element information
|
|
|
*
|
|
|
- * Callback to get the value of a single mixer control.
|
|
|
+ * Callback to get the value of a single mixer control, or a double mixer
|
|
|
+ * control that spans 2 registers.
|
|
|
*
|
|
|
* Returns 0 for success.
|
|
|
*/
|
|
@@ -2292,6 +2293,7 @@ int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
|
|
(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;
|
|
|
unsigned int rshift = mc->rshift;
|
|
|
int max = mc->max;
|
|
@@ -2300,13 +2302,18 @@ int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
ucontrol->value.integer.value[0] =
|
|
|
(snd_soc_read(codec, reg) >> shift) & mask;
|
|
|
- if (shift != rshift)
|
|
|
- ucontrol->value.integer.value[1] =
|
|
|
- (snd_soc_read(codec, reg) >> rshift) & mask;
|
|
|
- if (invert) {
|
|
|
+ if (invert)
|
|
|
ucontrol->value.integer.value[0] =
|
|
|
max - ucontrol->value.integer.value[0];
|
|
|
- if (shift != rshift)
|
|
|
+
|
|
|
+ if (snd_soc_volsw_is_stereo(mc)) {
|
|
|
+ if (reg == reg2)
|
|
|
+ ucontrol->value.integer.value[1] =
|
|
|
+ (snd_soc_read(codec, reg) >> rshift) & mask;
|
|
|
+ else
|
|
|
+ ucontrol->value.integer.value[1] =
|
|
|
+ (snd_soc_read(codec, reg2) >> shift) & mask;
|
|
|
+ if (invert)
|
|
|
ucontrol->value.integer.value[1] =
|
|
|
max - ucontrol->value.integer.value[1];
|
|
|
}
|
|
@@ -2354,43 +2361,6 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
|
|
|
|
|
|
-/**
|
|
|
- * snd_soc_get_volsw_2r - double mixer get callback
|
|
|
- * @kcontrol: mixer control
|
|
|
- * @ucontrol: control element information
|
|
|
- *
|
|
|
- * Callback to get the value of a double mixer control that spans 2 registers.
|
|
|
- *
|
|
|
- * Returns 0 for success.
|
|
|
- */
|
|
|
-int snd_soc_get_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;
|
|
|
-
|
|
|
- ucontrol->value.integer.value[0] =
|
|
|
- (snd_soc_read(codec, reg) >> shift) & mask;
|
|
|
- ucontrol->value.integer.value[1] =
|
|
|
- (snd_soc_read(codec, reg2) >> shift) & mask;
|
|
|
- if (invert) {
|
|
|
- ucontrol->value.integer.value[0] =
|
|
|
- max - ucontrol->value.integer.value[0];
|
|
|
- ucontrol->value.integer.value[1] =
|
|
|
- max - ucontrol->value.integer.value[1];
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r);
|
|
|
-
|
|
|
/**
|
|
|
* snd_soc_put_volsw_2r - double mixer set callback
|
|
|
* @kcontrol: mixer control
|