ASoC: rt5677: Add DMIC ASRC detect function
authorOder Chiou <oder_chiou@realtek.com>
Fri, 8 May 2015 05:24:02 +0000 (13:24 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 8 May 2015 16:59:18 +0000 (17:59 +0100)
The patch adds DMIC ASRC detect function to dominate whether the DMIC ASRC
enable or not.

Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5677.c

index 331e638b28f4f330f49ddd6d72d38fcc236827b4..c73105e75c1aa61916d15f18acd06a1a2425050f 100644 (file)
@@ -1227,6 +1227,75 @@ int rt5677_sel_asrc_clk_src(struct snd_soc_codec *codec,
 }
 EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src);
 
+static int rt5677_dmic_use_asrc(struct snd_soc_dapm_widget *source,
+                        struct snd_soc_dapm_widget *sink)
+{
+       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
+       struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
+       unsigned int asrc_setting;
+
+       switch (source->shift) {
+       case 11:
+               regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
+               asrc_setting = (asrc_setting & RT5677_AD_STO1_CLK_SEL_MASK) >>
+                               RT5677_AD_STO1_CLK_SEL_SFT;
+               if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
+                       asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
+                       return 1;
+               break;
+
+       case 10:
+               regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
+               asrc_setting = (asrc_setting & RT5677_AD_STO2_CLK_SEL_MASK) >>
+                               RT5677_AD_STO2_CLK_SEL_SFT;
+               if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
+                       asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
+                       return 1;
+               break;
+
+       case 9:
+               regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
+               asrc_setting = (asrc_setting & RT5677_AD_STO3_CLK_SEL_MASK) >>
+                               RT5677_AD_STO3_CLK_SEL_SFT;
+               if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
+                       asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
+                       return 1;
+               break;
+
+       case 8:
+               regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
+               asrc_setting = (asrc_setting & RT5677_AD_STO4_CLK_SEL_MASK) >>
+                       RT5677_AD_STO4_CLK_SEL_SFT;
+               if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
+                       asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
+                       return 1;
+               break;
+
+       case 7:
+               regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
+               asrc_setting = (asrc_setting & RT5677_AD_MONOL_CLK_SEL_MASK) >>
+                       RT5677_AD_MONOL_CLK_SEL_SFT;
+               if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
+                       asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
+                       return 1;
+               break;
+
+       case 6:
+               regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
+               asrc_setting = (asrc_setting & RT5677_AD_MONOR_CLK_SEL_MASK) >>
+                       RT5677_AD_MONOR_CLK_SEL_SFT;
+               if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
+                       asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
+                       return 1;
+               break;
+
+       default:
+               break;
+       }
+
+       return 0;
+}
+
 /* Digital Mixer */
 static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = {
        SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,
@@ -3084,12 +3153,12 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
 };
 
 static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
-       { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", can_use_asrc },
-       { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", can_use_asrc },
-       { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", can_use_asrc },
-       { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", can_use_asrc },
-       { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", can_use_asrc },
-       { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", can_use_asrc },
+       { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", rt5677_dmic_use_asrc },
+       { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", rt5677_dmic_use_asrc },
+       { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", rt5677_dmic_use_asrc },
+       { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", rt5677_dmic_use_asrc },
+       { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", rt5677_dmic_use_asrc },
+       { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", rt5677_dmic_use_asrc },
        { "I2S1", NULL, "I2S1 ASRC", can_use_asrc},
        { "I2S2", NULL, "I2S2 ASRC", can_use_asrc},
        { "I2S3", NULL, "I2S3 ASRC", can_use_asrc},