diff options
| author | Oder Chiou <oder_chiou@realtek.com> | 2015-05-08 01:24:02 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2015-05-08 12:59:18 -0400 |
| commit | 5220f7fb4954d8ca612ea77fb9bee6801c43d031 (patch) | |
| tree | 3eac8bdd5120934af9cc15525273f2eef9154613 | |
| parent | 16ab6e18c60927e5a9e756c384a1ed7bd9f40871 (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.c | 81 |
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 | } |
| 1228 | EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src); | 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 | /* Digital Mixer */ | 1299 | /* Digital Mixer */ |
| 1231 | static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = { | 1300 | static 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 | ||
| 3086 | static const struct snd_soc_dapm_route rt5677_dapm_routes[] = { | 3155 | static 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}, |
