Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Oder Chiou and committed by
Mark Brown
5220f7fb 16ab6e18

+75 -6
+75 -6
sound/soc/codecs/rt5677.c
··· 1227 1227 } 1228 1228 EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src); 1229 1229 1230 + static 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 1299 /* Digital Mixer */ 1231 1300 static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = { 1232 1301 SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER, ··· 3153 3084 }; 3154 3085 3155 3086 static const struct snd_soc_dapm_route rt5677_dapm_routes[] = { 3156 - { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", can_use_asrc }, 3157 - { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", can_use_asrc }, 3158 - { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", can_use_asrc }, 3159 - { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", can_use_asrc }, 3160 - { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", can_use_asrc }, 3161 - { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", can_use_asrc }, 3087 + { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", rt5677_dmic_use_asrc }, 3088 + { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", rt5677_dmic_use_asrc }, 3089 + { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", rt5677_dmic_use_asrc }, 3090 + { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", rt5677_dmic_use_asrc }, 3091 + { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", rt5677_dmic_use_asrc }, 3092 + { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", rt5677_dmic_use_asrc }, 3162 3093 { "I2S1", NULL, "I2S1 ASRC", can_use_asrc}, 3163 3094 { "I2S2", NULL, "I2S2 ASRC", can_use_asrc}, 3164 3095 { "I2S3", NULL, "I2S3 ASRC", can_use_asrc},