OSDN Git Service

ASoC: mediatek: mt6358: save PGA for mixer control
authorTzung-Bi Shih <tzungbi@google.com>
Tue, 7 May 2019 10:12:20 +0000 (18:12 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 8 May 2019 08:12:48 +0000 (17:12 +0900)
mt6358_amic_disable() resets PGA to 0.

Save the gain settings from mixer control and restore them when using
the microphone.

Signed-off-by: Tzung-Bi Shih <tzungbi@google.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/mt6358.c

index 44edbda..50b3fc5 100644 (file)
@@ -450,6 +450,15 @@ static int mt6358_put_volsw(struct snd_kcontrol *kcontrol,
                priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTR] =
                        (reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK;
                break;
+       case MT6358_AUDENC_ANA_CON0:
+       case MT6358_AUDENC_ANA_CON1:
+               regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON0, &reg);
+               priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1] =
+                       (reg >> RG_AUDPREAMPLGAIN_SFT) & RG_AUDPREAMPLGAIN_MASK;
+               regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON1, &reg);
+               priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2] =
+                       (reg >> RG_AUDPREAMPRGAIN_SFT) & RG_AUDPREAMPRGAIN_MASK;
+               break;
        }
 
        return ret;
@@ -470,10 +479,10 @@ static const struct snd_kcontrol_new mt6358_snd_controls[] = {
                           MT6358_ZCD_CON3, 0, 0x12, 1,
                           snd_soc_get_volsw, mt6358_put_volsw, playback_tlv),
        /* ul pga gain */
-       SOC_DOUBLE_R_TLV("PGA Volume",
-                        MT6358_AUDENC_ANA_CON0, MT6358_AUDENC_ANA_CON1,
-                        8, 4, 0,
-                        pga_tlv),
+       SOC_DOUBLE_R_EXT_TLV("PGA Volume",
+                            MT6358_AUDENC_ANA_CON0, MT6358_AUDENC_ANA_CON1,
+                            8, 4, 0,
+                            snd_soc_get_volsw, mt6358_put_volsw, pga_tlv),
 };
 
 /* MUX */
@@ -1750,6 +1759,21 @@ static void mt6358_dmic_disable(struct mt6358_priv *priv)
        regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0000);
 }
 
+static void mt6358_restore_pga(struct mt6358_priv *priv)
+{
+       unsigned int gain_l, gain_r;
+
+       gain_l = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1];
+       gain_r = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2];
+
+       regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
+                          RG_AUDPREAMPLGAIN_MASK_SFT,
+                          gain_l << RG_AUDPREAMPLGAIN_SFT);
+       regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
+                          RG_AUDPREAMPRGAIN_MASK_SFT,
+                          gain_r << RG_AUDPREAMPRGAIN_SFT);
+}
+
 static int mt_mic_type_event(struct snd_soc_dapm_widget *w,
                             struct snd_kcontrol *kcontrol,
                             int event)
@@ -1774,6 +1798,7 @@ static int mt_mic_type_event(struct snd_soc_dapm_widget *w,
                        mt6358_amic_enable(priv);
                        break;
                }
+               mt6358_restore_pga(priv);
 
                break;
        case SND_SOC_DAPM_POST_PMD: