aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOder Chiou <oder_chiou@realtek.com>2015-05-08 01:24:02 -0400
committerMark Brown <broonie@kernel.org>2015-05-08 12:59:18 -0400
commit5220f7fb4954d8ca612ea77fb9bee6801c43d031 (patch)
tree3eac8bdd5120934af9cc15525273f2eef9154613
parent16ab6e18c60927e5a9e756c384a1ed7bd9f40871 (diff)
ASoC: rt5677: Add DMIC ASRC detect function
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>
-rw-r--r--sound/soc/codecs/rt5677.c81
1 files changed, 75 insertions, 6 deletions
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c
index 331e638b28f4..c73105e75c1a 100644
--- a/sound/soc/codecs/rt5677.c
+++ b/sound/soc/codecs/rt5677.c
@@ -1227,6 +1227,75 @@ int rt5677_sel_asrc_clk_src(struct snd_soc_codec *codec,
1227} 1227}
1228EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src); 1228EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src);
1229 1229
1230static int rt5677_dmic_use_asrc(struct snd_soc_dapm_widget *source,
1231 struct snd_soc_dapm_widget *sink)
1232{
1233 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
1234 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
1235 unsigned int asrc_setting;
1236
1237 switch (source->shift) {
1238 case 11:
1239 regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
1240 asrc_setting = (asrc_setting & RT5677_AD_STO1_CLK_SEL_MASK) >>
1241 RT5677_AD_STO1_CLK_SEL_SFT;
1242 if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
1243 asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
1244 return 1;
1245 break;
1246
1247 case 10:
1248 regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
1249 asrc_setting = (asrc_setting & RT5677_AD_STO2_CLK_SEL_MASK) >>
1250 RT5677_AD_STO2_CLK_SEL_SFT;
1251 if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
1252 asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
1253 return 1;
1254 break;
1255
1256 case 9:
1257 regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
1258 asrc_setting = (asrc_setting & RT5677_AD_STO3_CLK_SEL_MASK) >>
1259 RT5677_AD_STO3_CLK_SEL_SFT;
1260 if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
1261 asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
1262 return 1;
1263 break;
1264
1265 case 8:
1266 regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
1267 asrc_setting = (asrc_setting & RT5677_AD_STO4_CLK_SEL_MASK) >>
1268 RT5677_AD_STO4_CLK_SEL_SFT;
1269 if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
1270 asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
1271 return 1;
1272 break;
1273
1274 case 7:
1275 regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
1276 asrc_setting = (asrc_setting & RT5677_AD_MONOL_CLK_SEL_MASK) >>
1277 RT5677_AD_MONOL_CLK_SEL_SFT;
1278 if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
1279 asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
1280 return 1;
1281 break;
1282
1283 case 6:
1284 regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
1285 asrc_setting = (asrc_setting & RT5677_AD_MONOR_CLK_SEL_MASK) >>
1286 RT5677_AD_MONOR_CLK_SEL_SFT;
1287 if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
1288 asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
1289 return 1;
1290 break;
1291
1292 default:
1293 break;
1294 }
1295
1296 return 0;
1297}
1298
1230/* Digital Mixer */ 1299/* Digital Mixer */
1231static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = { 1300static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = {
1232 SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER, 1301 SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,
@@ -3084,12 +3153,12 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
3084}; 3153};
3085 3154
3086static const struct snd_soc_dapm_route rt5677_dapm_routes[] = { 3155static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
3087 { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", can_use_asrc }, 3156 { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", rt5677_dmic_use_asrc },
3088 { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", can_use_asrc }, 3157 { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", rt5677_dmic_use_asrc },
3089 { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", can_use_asrc }, 3158 { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", rt5677_dmic_use_asrc },
3090 { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", can_use_asrc }, 3159 { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", rt5677_dmic_use_asrc },
3091 { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", can_use_asrc }, 3160 { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", rt5677_dmic_use_asrc },
3092 { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", can_use_asrc }, 3161 { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", rt5677_dmic_use_asrc },
3093 { "I2S1", NULL, "I2S1 ASRC", can_use_asrc}, 3162 { "I2S1", NULL, "I2S1 ASRC", can_use_asrc},
3094 { "I2S2", NULL, "I2S2 ASRC", can_use_asrc}, 3163 { "I2S2", NULL, "I2S2 ASRC", can_use_asrc},
3095 { "I2S3", NULL, "I2S3 ASRC", can_use_asrc}, 3164 { "I2S3", NULL, "I2S3 ASRC", can_use_asrc},