]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/soc/codecs/rt298.c
Merge remote-tracking branch 'asoc/topic/rt298' into asoc-next
[karo-tx-linux.git] / sound / soc / codecs / rt298.c
index a1aaffc2086272afa932d8137522c383f4ac1377..f80cfe4d2ef2f050e1b3d43103fcadc789144ce1 100644 (file)
@@ -276,6 +276,8 @@ static int rt298_jack_detect(struct rt298_priv *rt298, bool *hp, bool *mic)
                } else {
                        *mic = false;
                        regmap_write(rt298->regmap, RT298_SET_MIC1, 0x20);
+                       regmap_update_bits(rt298->regmap,
+                               RT298_CBJ_CTRL1, 0x0400, 0x0000);
                }
        } else {
                regmap_read(rt298->regmap, RT298_GET_HP_SENSE, &buf);
@@ -482,6 +484,26 @@ static int rt298_adc_event(struct snd_soc_dapm_widget *w,
                snd_soc_update_bits(codec,
                        VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0),
                        0x7080, 0x7000);
+                /* If MCLK doesn't exist, reset AD filter */
+               if (!(snd_soc_read(codec, RT298_VAD_CTRL) & 0x200)) {
+                       pr_info("NO MCLK\n");
+                       switch (nid) {
+                       case RT298_ADC_IN1:
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x2, 0x2);
+                               mdelay(10);
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x2, 0x0);
+                               break;
+                       case RT298_ADC_IN2:
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x4, 0x4);
+                               mdelay(10);
+                               snd_soc_update_bits(codec,
+                                       RT298_D_FILTER_CTRL, 0x4, 0x0);
+                               break;
+                       }
+               }
                break;
        case SND_SOC_DAPM_PRE_PMD:
                snd_soc_update_bits(codec,
@@ -520,30 +542,12 @@ static int rt298_mic1_event(struct snd_soc_dapm_widget *w,
        return 0;
 }
 
-static int rt298_vref_event(struct snd_soc_dapm_widget *w,
-                            struct snd_kcontrol *kcontrol, int event)
-{
-       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
-
-       switch (event) {
-       case SND_SOC_DAPM_PRE_PMU:
-               snd_soc_update_bits(codec,
-                       RT298_CBJ_CTRL1, 0x0400, 0x0000);
-               mdelay(50);
-               break;
-       default:
-               return 0;
-       }
-
-       return 0;
-}
-
 static const struct snd_soc_dapm_widget rt298_dapm_widgets[] = {
 
        SND_SOC_DAPM_SUPPLY_S("HV", 1, RT298_POWER_CTRL1,
                12, 1, NULL, 0),
        SND_SOC_DAPM_SUPPLY("VREF", RT298_POWER_CTRL1,
-               0, 1, rt298_vref_event, SND_SOC_DAPM_PRE_PMU),
+               0, 1, NULL, 0),
        SND_SOC_DAPM_SUPPLY_S("BG_MBIAS", 1, RT298_POWER_CTRL2,
                1, 0, NULL, 0),
        SND_SOC_DAPM_SUPPLY_S("LDO1", 1, RT298_POWER_CTRL2,
@@ -934,18 +938,9 @@ static int rt298_set_bias_level(struct snd_soc_codec *codec,
                }
                break;
 
-       case SND_SOC_BIAS_ON:
-               mdelay(30);
-               snd_soc_update_bits(codec,
-                       RT298_CBJ_CTRL1, 0x0400, 0x0400);
-
-               break;
-
        case SND_SOC_BIAS_STANDBY:
                snd_soc_write(codec,
                        RT298_SET_AUDIO_POWER, AC_PWRST_D3);
-               snd_soc_update_bits(codec,
-                       RT298_CBJ_CTRL1, 0x0400, 0x0000);
                break;
 
        default: