diff options
author | Tzung-Bi Shih <tzungbi@google.com> | 2019-05-07 06:12:20 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2019-05-08 04:12:48 -0400 |
commit | ec0574a6ce31f2d6640bb8a5edf98973356dd3b4 (patch) | |
tree | 2ac00cb84c250f86a03119873c4994753041f181 /sound | |
parent | bbb56537a3279f7221e253afc29e834a3d99662f (diff) |
ASoC: mediatek: mt6358: save PGA for mixer control
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>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/mt6358.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/sound/soc/codecs/mt6358.c b/sound/soc/codecs/mt6358.c index 44edbda8afcc..50b3fc5457ea 100644 --- a/sound/soc/codecs/mt6358.c +++ b/sound/soc/codecs/mt6358.c | |||
@@ -450,6 +450,15 @@ static int mt6358_put_volsw(struct snd_kcontrol *kcontrol, | |||
450 | priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTR] = | 450 | priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTR] = |
451 | (reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK; | 451 | (reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK; |
452 | break; | 452 | break; |
453 | case MT6358_AUDENC_ANA_CON0: | ||
454 | case MT6358_AUDENC_ANA_CON1: | ||
455 | regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON0, ®); | ||
456 | priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1] = | ||
457 | (reg >> RG_AUDPREAMPLGAIN_SFT) & RG_AUDPREAMPLGAIN_MASK; | ||
458 | regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON1, ®); | ||
459 | priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2] = | ||
460 | (reg >> RG_AUDPREAMPRGAIN_SFT) & RG_AUDPREAMPRGAIN_MASK; | ||
461 | break; | ||
453 | } | 462 | } |
454 | 463 | ||
455 | return ret; | 464 | return ret; |
@@ -470,10 +479,10 @@ static const struct snd_kcontrol_new mt6358_snd_controls[] = { | |||
470 | MT6358_ZCD_CON3, 0, 0x12, 1, | 479 | MT6358_ZCD_CON3, 0, 0x12, 1, |
471 | snd_soc_get_volsw, mt6358_put_volsw, playback_tlv), | 480 | snd_soc_get_volsw, mt6358_put_volsw, playback_tlv), |
472 | /* ul pga gain */ | 481 | /* ul pga gain */ |
473 | SOC_DOUBLE_R_TLV("PGA Volume", | 482 | SOC_DOUBLE_R_EXT_TLV("PGA Volume", |
474 | MT6358_AUDENC_ANA_CON0, MT6358_AUDENC_ANA_CON1, | 483 | MT6358_AUDENC_ANA_CON0, MT6358_AUDENC_ANA_CON1, |
475 | 8, 4, 0, | 484 | 8, 4, 0, |
476 | pga_tlv), | 485 | snd_soc_get_volsw, mt6358_put_volsw, pga_tlv), |
477 | }; | 486 | }; |
478 | 487 | ||
479 | /* MUX */ | 488 | /* MUX */ |
@@ -1750,6 +1759,21 @@ static void mt6358_dmic_disable(struct mt6358_priv *priv) | |||
1750 | regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0000); | 1759 | regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0000); |
1751 | } | 1760 | } |
1752 | 1761 | ||
1762 | static void mt6358_restore_pga(struct mt6358_priv *priv) | ||
1763 | { | ||
1764 | unsigned int gain_l, gain_r; | ||
1765 | |||
1766 | gain_l = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1]; | ||
1767 | gain_r = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2]; | ||
1768 | |||
1769 | regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0, | ||
1770 | RG_AUDPREAMPLGAIN_MASK_SFT, | ||
1771 | gain_l << RG_AUDPREAMPLGAIN_SFT); | ||
1772 | regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1, | ||
1773 | RG_AUDPREAMPRGAIN_MASK_SFT, | ||
1774 | gain_r << RG_AUDPREAMPRGAIN_SFT); | ||
1775 | } | ||
1776 | |||
1753 | static int mt_mic_type_event(struct snd_soc_dapm_widget *w, | 1777 | static int mt_mic_type_event(struct snd_soc_dapm_widget *w, |
1754 | struct snd_kcontrol *kcontrol, | 1778 | struct snd_kcontrol *kcontrol, |
1755 | int event) | 1779 | int event) |
@@ -1774,6 +1798,7 @@ static int mt_mic_type_event(struct snd_soc_dapm_widget *w, | |||
1774 | mt6358_amic_enable(priv); | 1798 | mt6358_amic_enable(priv); |
1775 | break; | 1799 | break; |
1776 | } | 1800 | } |
1801 | mt6358_restore_pga(priv); | ||
1777 | 1802 | ||
1778 | break; | 1803 | break; |
1779 | case SND_SOC_DAPM_POST_PMD: | 1804 | case SND_SOC_DAPM_POST_PMD: |