summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTzung-Bi Shih <tzungbi@google.com>2019-05-07 06:12:20 -0400
committerMark Brown <broonie@kernel.org>2019-05-08 04:12:48 -0400
commitec0574a6ce31f2d6640bb8a5edf98973356dd3b4 (patch)
tree2ac00cb84c250f86a03119873c4994753041f181 /sound
parentbbb56537a3279f7221e253afc29e834a3d99662f (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.c33
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, &reg);
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, &reg);
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
1762static 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
1753static int mt_mic_type_event(struct snd_soc_dapm_widget *w, 1777static 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: