diff options
author | Oder Chiou <oder_chiou@realtek.com> | 2014-12-22 21:27:55 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-12-24 07:16:19 -0500 |
commit | 5a8c7c2628f8d12e9bca6ab24f6718fc57728991 (patch) | |
tree | cce85ee7fc902b2ea2753aa6f150b52957ae4924 | |
parent | 6800b5ba154df5666f123b7d78161e1a9e6ad8ef (diff) |
ASoC: rt5677: Add the ASRC support
Add the ASRC support
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 | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c index a15e39dd8e17..66abfa3bbb95 100644 --- a/sound/soc/codecs/rt5677.c +++ b/sound/soc/codecs/rt5677.c | |||
@@ -921,6 +921,97 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, | |||
921 | return 0; | 921 | return 0; |
922 | } | 922 | } |
923 | 923 | ||
924 | static int is_using_asrc(struct snd_soc_dapm_widget *source, | ||
925 | struct snd_soc_dapm_widget *sink) | ||
926 | { | ||
927 | unsigned int reg, shift, val; | ||
928 | |||
929 | if (source->reg == RT5677_ASRC_1) { | ||
930 | switch (source->shift) { | ||
931 | case 12: | ||
932 | reg = RT5677_ASRC_4; | ||
933 | shift = 0; | ||
934 | break; | ||
935 | case 13: | ||
936 | reg = RT5677_ASRC_4; | ||
937 | shift = 4; | ||
938 | break; | ||
939 | case 14: | ||
940 | reg = RT5677_ASRC_4; | ||
941 | shift = 8; | ||
942 | break; | ||
943 | case 15: | ||
944 | reg = RT5677_ASRC_4; | ||
945 | shift = 12; | ||
946 | break; | ||
947 | default: | ||
948 | return 0; | ||
949 | } | ||
950 | } else { | ||
951 | switch (source->shift) { | ||
952 | case 0: | ||
953 | reg = RT5677_ASRC_6; | ||
954 | shift = 8; | ||
955 | break; | ||
956 | case 1: | ||
957 | reg = RT5677_ASRC_6; | ||
958 | shift = 12; | ||
959 | break; | ||
960 | case 2: | ||
961 | reg = RT5677_ASRC_5; | ||
962 | shift = 0; | ||
963 | break; | ||
964 | case 3: | ||
965 | reg = RT5677_ASRC_5; | ||
966 | shift = 4; | ||
967 | break; | ||
968 | case 4: | ||
969 | reg = RT5677_ASRC_5; | ||
970 | shift = 8; | ||
971 | break; | ||
972 | case 5: | ||
973 | reg = RT5677_ASRC_5; | ||
974 | shift = 12; | ||
975 | break; | ||
976 | case 12: | ||
977 | reg = RT5677_ASRC_3; | ||
978 | shift = 0; | ||
979 | break; | ||
980 | case 13: | ||
981 | reg = RT5677_ASRC_3; | ||
982 | shift = 4; | ||
983 | break; | ||
984 | case 14: | ||
985 | reg = RT5677_ASRC_3; | ||
986 | shift = 12; | ||
987 | break; | ||
988 | default: | ||
989 | return 0; | ||
990 | } | ||
991 | } | ||
992 | |||
993 | val = (snd_soc_read(source->codec, reg) >> shift) & 0xf; | ||
994 | switch (val) { | ||
995 | case 1 ... 6: | ||
996 | return 1; | ||
997 | default: | ||
998 | return 0; | ||
999 | } | ||
1000 | |||
1001 | } | ||
1002 | |||
1003 | static int can_use_asrc(struct snd_soc_dapm_widget *source, | ||
1004 | struct snd_soc_dapm_widget *sink) | ||
1005 | { | ||
1006 | struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); | ||
1007 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); | ||
1008 | |||
1009 | if (rt5677->sysclk > rt5677->lrck[RT5677_AIF1] * 384) | ||
1010 | return 1; | ||
1011 | |||
1012 | return 0; | ||
1013 | } | ||
1014 | |||
924 | /* Digital Mixer */ | 1015 | /* Digital Mixer */ |
925 | static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = { | 1016 | static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = { |
926 | SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER, | 1017 | SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER, |
@@ -2215,6 +2306,45 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = { | |||
2215 | SND_SOC_DAPM_SUPPLY("PLL2", RT5677_PWR_ANLG2, RT5677_PWR_PLL2_BIT, | 2306 | SND_SOC_DAPM_SUPPLY("PLL2", RT5677_PWR_ANLG2, RT5677_PWR_PLL2_BIT, |
2216 | 0, rt5677_set_pll2_event, SND_SOC_DAPM_POST_PMU), | 2307 | 0, rt5677_set_pll2_event, SND_SOC_DAPM_POST_PMU), |
2217 | 2308 | ||
2309 | /* ASRC */ | ||
2310 | SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5677_ASRC_1, 0, 0, NULL, 0), | ||
2311 | SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5677_ASRC_1, 1, 0, NULL, 0), | ||
2312 | SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5677_ASRC_1, 2, 0, NULL, 0), | ||
2313 | SND_SOC_DAPM_SUPPLY_S("I2S4 ASRC", 1, RT5677_ASRC_1, 3, 0, NULL, 0), | ||
2314 | SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5677_ASRC_2, 14, 0, NULL, 0), | ||
2315 | SND_SOC_DAPM_SUPPLY_S("DAC MONO2 L ASRC", 1, RT5677_ASRC_2, 13, 0, NULL, | ||
2316 | 0), | ||
2317 | SND_SOC_DAPM_SUPPLY_S("DAC MONO2 R ASRC", 1, RT5677_ASRC_2, 12, 0, NULL, | ||
2318 | 0), | ||
2319 | SND_SOC_DAPM_SUPPLY_S("DAC MONO3 L ASRC", 1, RT5677_ASRC_1, 15, 0, NULL, | ||
2320 | 0), | ||
2321 | SND_SOC_DAPM_SUPPLY_S("DAC MONO3 R ASRC", 1, RT5677_ASRC_1, 14, 0, NULL, | ||
2322 | 0), | ||
2323 | SND_SOC_DAPM_SUPPLY_S("DAC MONO4 L ASRC", 1, RT5677_ASRC_1, 13, 0, NULL, | ||
2324 | 0), | ||
2325 | SND_SOC_DAPM_SUPPLY_S("DAC MONO4 R ASRC", 1, RT5677_ASRC_1, 12, 0, NULL, | ||
2326 | 0), | ||
2327 | SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5677_ASRC_2, 11, 0, NULL, | ||
2328 | 0), | ||
2329 | SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5677_ASRC_2, 10, 0, NULL, | ||
2330 | 0), | ||
2331 | SND_SOC_DAPM_SUPPLY_S("DMIC STO3 ASRC", 1, RT5677_ASRC_2, 9, 0, NULL, | ||
2332 | 0), | ||
2333 | SND_SOC_DAPM_SUPPLY_S("DMIC STO4 ASRC", 1, RT5677_ASRC_2, 8, 0, NULL, | ||
2334 | 0), | ||
2335 | SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5677_ASRC_2, 7, 0, NULL, | ||
2336 | 0), | ||
2337 | SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5677_ASRC_2, 6, 0, NULL, | ||
2338 | 0), | ||
2339 | SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5677_ASRC_2, 5, 0, NULL, 0), | ||
2340 | SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5677_ASRC_2, 4, 0, NULL, 0), | ||
2341 | SND_SOC_DAPM_SUPPLY_S("ADC STO3 ASRC", 1, RT5677_ASRC_2, 3, 0, NULL, 0), | ||
2342 | SND_SOC_DAPM_SUPPLY_S("ADC STO4 ASRC", 1, RT5677_ASRC_2, 2, 0, NULL, 0), | ||
2343 | SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5677_ASRC_2, 1, 0, NULL, | ||
2344 | 0), | ||
2345 | SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5677_ASRC_2, 0, 0, NULL, | ||
2346 | 0), | ||
2347 | |||
2218 | /* Input Side */ | 2348 | /* Input Side */ |
2219 | /* micbias */ | 2349 | /* micbias */ |
2220 | SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT, | 2350 | SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT, |
@@ -2729,6 +2859,31 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = { | |||
2729 | }; | 2859 | }; |
2730 | 2860 | ||
2731 | static const struct snd_soc_dapm_route rt5677_dapm_routes[] = { | 2861 | static const struct snd_soc_dapm_route rt5677_dapm_routes[] = { |
2862 | { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", can_use_asrc }, | ||
2863 | { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", can_use_asrc }, | ||
2864 | { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", can_use_asrc }, | ||
2865 | { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", can_use_asrc }, | ||
2866 | { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", can_use_asrc }, | ||
2867 | { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", can_use_asrc }, | ||
2868 | { "I2S1", NULL, "I2S1 ASRC", can_use_asrc}, | ||
2869 | { "I2S2", NULL, "I2S2 ASRC", can_use_asrc}, | ||
2870 | { "I2S3", NULL, "I2S3 ASRC", can_use_asrc}, | ||
2871 | { "I2S4", NULL, "I2S4 ASRC", can_use_asrc}, | ||
2872 | |||
2873 | { "dac stereo1 filter", NULL, "DAC STO ASRC", is_using_asrc }, | ||
2874 | { "dac mono2 left filter", NULL, "DAC MONO2 L ASRC", is_using_asrc }, | ||
2875 | { "dac mono2 right filter", NULL, "DAC MONO2 R ASRC", is_using_asrc }, | ||
2876 | { "dac mono3 left filter", NULL, "DAC MONO3 L ASRC", is_using_asrc }, | ||
2877 | { "dac mono3 right filter", NULL, "DAC MONO3 R ASRC", is_using_asrc }, | ||
2878 | { "dac mono4 left filter", NULL, "DAC MONO4 L ASRC", is_using_asrc }, | ||
2879 | { "dac mono4 right filter", NULL, "DAC MONO4 R ASRC", is_using_asrc }, | ||
2880 | { "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc }, | ||
2881 | { "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc }, | ||
2882 | { "adc stereo3 filter", NULL, "ADC STO3 ASRC", is_using_asrc }, | ||
2883 | { "adc stereo4 filter", NULL, "ADC STO4 ASRC", is_using_asrc }, | ||
2884 | { "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc }, | ||
2885 | { "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc }, | ||
2886 | |||
2732 | { "DMIC1", NULL, "DMIC L1" }, | 2887 | { "DMIC1", NULL, "DMIC L1" }, |
2733 | { "DMIC1", NULL, "DMIC R1" }, | 2888 | { "DMIC1", NULL, "DMIC R1" }, |
2734 | { "DMIC2", NULL, "DMIC L2" }, | 2889 | { "DMIC2", NULL, "DMIC L2" }, |