From: Federico Amedeo Izzo <[email protected]>

When the aw88261 speaker volume is set to 0, it becomes very quiet but
still audible. This causes echo during phone calls on motorola-dubai, as
the bottom speaker output is getting picked up by the bottom microphone.

Expose the aw88261 hardware mute functionality as a Playback Switch
control. The new control can be used in a UCM profile to disable the
bottom speaker during phone calls and greatly reduce the echo.

Signed-off-by: Federico Amedeo Izzo <[email protected]>
---
 sound/soc/codecs/aw88261.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/sound/soc/codecs/aw88261.c b/sound/soc/codecs/aw88261.c
index 8671069f4c18..7303dc9eb4e0 100644
--- a/sound/soc/codecs/aw88261.c
+++ b/sound/soc/codecs/aw88261.c
@@ -1014,6 +1014,33 @@ static int aw88261_volume_set(struct snd_kcontrol 
*kcontrol,
        return 0;
 }
 
+static int aw88261_mute_get(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
+       struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
+
+       ucontrol->value.integer.value[0] = !aw88261->mute_st;
+       return 0;
+}
+
+static int aw88261_mute_put(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
+       struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
+       bool mute = !ucontrol->value.integer.value[0];
+
+       if (aw88261->mute_st == mute)
+               return 0;
+
+       aw88261->mute_st = mute;
+       if (aw88261->aw_pa->status == AW88261_DEV_PW_ON)
+               aw88261_dev_mute(aw88261->aw_pa, mute);
+
+       return 1;
+}
+
 /*
  * The field contains 4 bits in units of 6dB + 6 bits in units of 0.125dB
  * which is too precise for TLV (!) so we have to multiply the scale by 2.
@@ -1026,6 +1053,8 @@ static const struct snd_kcontrol_new aw88261_controls[] = 
{
        SOC_SINGLE_EXT_TLV("PCM Playback Volume", AW88261_SYSCTRL2_REG,
                6, AW88261_CTL_MAX_VOL, 1,
                aw88261_volume_get, aw88261_volume_set, volume_tlv),
+       SOC_SINGLE_EXT("Playback Switch", 0, 0, 1, 0,
+               aw88261_mute_get, aw88261_mute_put),
        AW88261_PROFILE_EXT("Profile Set", aw88261_profile_info,
                aw88261_profile_get, aw88261_profile_set),
 };

---
base-commit: becb95e45ef0dda9ffb35156d909d3da7a2789c3
change-id: 20261010-aw88261-hardware-mute-9721d911bbaa

Best regards,
--  
Federico Amedeo Izzo <[email protected]>



Reply via email to