aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2013-09-02 09:06:45 -0400
committerTakashi Iwai <tiwai@suse.de>2013-09-02 09:06:45 -0400
commitc8ead4154af3d43635f63a708a2f369c7cce09e7 (patch)
tree42a96351bbee7996826d1126a85351e42a22dd87 /sound
parent18e391862cceaf43ddb8eb5cca05e1a83abdebaa (diff)
parent5df498a27ab385294fdb7cad19c623d4da94a780 (diff)
Merge tag 'asoc-v3.12-3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-next
ASoC: Final updates for v3.12 A few final updates for v3.12 - some cleanups, a bug fix for ssm2602, pop removal for rt5640 and fixes for the reporting of unidirectional links in the MXS SGTL5000 driver.
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/rt5640.c217
-rw-r--r--sound/soc/codecs/rt5640.h12
-rw-r--r--sound/soc/codecs/ssm2602.c3
-rw-r--r--sound/soc/fsl/Makefile2
-rw-r--r--sound/soc/fsl/fsl_spdif.c12
-rw-r--r--sound/soc/mxs/mxs-sgtl5000.c2
-rw-r--r--sound/soc/soc-dapm.c2
-rw-r--r--sound/soc/soc-pcm.c10
8 files changed, 198 insertions, 62 deletions
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c
index 4db7314baabc..c26a8f814b18 100644
--- a/sound/soc/codecs/rt5640.c
+++ b/sound/soc/codecs/rt5640.c
@@ -50,8 +50,6 @@ static const struct regmap_range_cfg rt5640_ranges[] = {
50 50
51static struct reg_default init_list[] = { 51static struct reg_default init_list[] = {
52 {RT5640_PR_BASE + 0x3d, 0x3600}, 52 {RT5640_PR_BASE + 0x3d, 0x3600},
53 {RT5640_PR_BASE + 0x1c, 0x0D21},
54 {RT5640_PR_BASE + 0x1b, 0x0000},
55 {RT5640_PR_BASE + 0x12, 0x0aa8}, 53 {RT5640_PR_BASE + 0x12, 0x0aa8},
56 {RT5640_PR_BASE + 0x14, 0x0aaa}, 54 {RT5640_PR_BASE + 0x14, 0x0aaa},
57 {RT5640_PR_BASE + 0x20, 0x6110}, 55 {RT5640_PR_BASE + 0x20, 0x6110},
@@ -384,15 +382,11 @@ static const SOC_ENUM_SINGLE_DECL(
384 382
385static const struct snd_kcontrol_new rt5640_snd_controls[] = { 383static const struct snd_kcontrol_new rt5640_snd_controls[] = {
386 /* Speaker Output Volume */ 384 /* Speaker Output Volume */
387 SOC_DOUBLE("Speaker Playback Switch", RT5640_SPK_VOL,
388 RT5640_L_MUTE_SFT, RT5640_R_MUTE_SFT, 1, 1),
389 SOC_DOUBLE("Speaker Channel Switch", RT5640_SPK_VOL, 385 SOC_DOUBLE("Speaker Channel Switch", RT5640_SPK_VOL,
390 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1), 386 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
391 SOC_DOUBLE_TLV("Speaker Playback Volume", RT5640_SPK_VOL, 387 SOC_DOUBLE_TLV("Speaker Playback Volume", RT5640_SPK_VOL,
392 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv), 388 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv),
393 /* Headphone Output Volume */ 389 /* Headphone Output Volume */
394 SOC_DOUBLE("HP Playback Switch", RT5640_HP_VOL,
395 RT5640_L_MUTE_SFT, RT5640_R_MUTE_SFT, 1, 1),
396 SOC_DOUBLE("HP Channel Switch", RT5640_HP_VOL, 390 SOC_DOUBLE("HP Channel Switch", RT5640_HP_VOL,
397 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1), 391 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
398 SOC_DOUBLE_TLV("HP Playback Volume", RT5640_HP_VOL, 392 SOC_DOUBLE_TLV("HP Playback Volume", RT5640_HP_VOL,
@@ -737,6 +731,22 @@ static const struct snd_kcontrol_new rt5640_mono_mix[] = {
737 RT5640_M_BST1_MM_SFT, 1, 1), 731 RT5640_M_BST1_MM_SFT, 1, 1),
738}; 732};
739 733
734static const struct snd_kcontrol_new spk_l_enable_control =
735 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL,
736 RT5640_L_MUTE_SFT, 1, 1);
737
738static const struct snd_kcontrol_new spk_r_enable_control =
739 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL,
740 RT5640_R_MUTE_SFT, 1, 1);
741
742static const struct snd_kcontrol_new hp_l_enable_control =
743 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_HP_VOL,
744 RT5640_L_MUTE_SFT, 1, 1);
745
746static const struct snd_kcontrol_new hp_r_enable_control =
747 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_HP_VOL,
748 RT5640_R_MUTE_SFT, 1, 1);
749
740/* Stereo ADC source */ 750/* Stereo ADC source */
741static const char * const rt5640_stereo_adc1_src[] = { 751static const char * const rt5640_stereo_adc1_src[] = {
742 "DIG MIX", "ADC" 752 "DIG MIX", "ADC"
@@ -868,33 +878,6 @@ static const SOC_ENUM_SINGLE_DECL(
868static const struct snd_kcontrol_new rt5640_sdi_mux = 878static const struct snd_kcontrol_new rt5640_sdi_mux =
869 SOC_DAPM_ENUM("SDI select", rt5640_sdi_sel_enum); 879 SOC_DAPM_ENUM("SDI select", rt5640_sdi_sel_enum);
870 880
871static int spk_event(struct snd_soc_dapm_widget *w,
872 struct snd_kcontrol *kcontrol, int event)
873{
874 struct snd_soc_codec *codec = w->codec;
875 struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
876
877 switch (event) {
878 case SND_SOC_DAPM_POST_PMU:
879 regmap_update_bits(rt5640->regmap, RT5640_PWR_DIG1,
880 0x0001, 0x0001);
881 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + 0x1c,
882 0xf000, 0xf000);
883 break;
884
885 case SND_SOC_DAPM_PRE_PMD:
886 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + 0x1c,
887 0xf000, 0x0000);
888 regmap_update_bits(rt5640->regmap, RT5640_PWR_DIG1,
889 0x0001, 0x0000);
890 break;
891
892 default:
893 return 0;
894 }
895 return 0;
896}
897
898static int rt5640_set_dmic1_event(struct snd_soc_dapm_widget *w, 881static int rt5640_set_dmic1_event(struct snd_soc_dapm_widget *w,
899 struct snd_kcontrol *kcontrol, int event) 882 struct snd_kcontrol *kcontrol, int event)
900{ 883{
@@ -943,6 +926,117 @@ static int rt5640_set_dmic2_event(struct snd_soc_dapm_widget *w,
943 return 0; 926 return 0;
944} 927}
945 928
929void hp_amp_power_on(struct snd_soc_codec *codec)
930{
931 struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
932
933 /* depop parameters */
934 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
935 RT5640_CHPUMP_INT_REG1, 0x0700, 0x0200);
936 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
937 RT5640_DEPOP_MASK, RT5640_DEPOP_MAN);
938 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
939 RT5640_HP_CP_MASK | RT5640_HP_SG_MASK | RT5640_HP_CB_MASK,
940 RT5640_HP_CP_PU | RT5640_HP_SG_DIS | RT5640_HP_CB_PU);
941 regmap_write(rt5640->regmap, RT5640_PR_BASE + RT5640_HP_DCC_INT1,
942 0x9f00);
943 /* headphone amp power on */
944 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
945 RT5640_PWR_FV1 | RT5640_PWR_FV2, 0);
946 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
947 RT5640_PWR_HA,
948 RT5640_PWR_HA);
949 usleep_range(10000, 15000);
950 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
951 RT5640_PWR_FV1 | RT5640_PWR_FV2 ,
952 RT5640_PWR_FV1 | RT5640_PWR_FV2);
953}
954
955static void rt5640_pmu_depop(struct snd_soc_codec *codec)
956{
957 struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
958
959 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
960 RT5640_DEPOP_MASK | RT5640_DIG_DP_MASK,
961 RT5640_DEPOP_AUTO | RT5640_DIG_DP_EN);
962 regmap_update_bits(rt5640->regmap, RT5640_CHARGE_PUMP,
963 RT5640_PM_HP_MASK, RT5640_PM_HP_HV);
964
965 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M3,
966 RT5640_CP_FQ1_MASK | RT5640_CP_FQ2_MASK | RT5640_CP_FQ3_MASK,
967 (RT5640_CP_FQ_192_KHZ << RT5640_CP_FQ1_SFT) |
968 (RT5640_CP_FQ_12_KHZ << RT5640_CP_FQ2_SFT) |
969 (RT5640_CP_FQ_192_KHZ << RT5640_CP_FQ3_SFT));
970
971 regmap_write(rt5640->regmap, RT5640_PR_BASE +
972 RT5640_MAMP_INT_REG2, 0x1c00);
973 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
974 RT5640_HP_CP_MASK | RT5640_HP_SG_MASK,
975 RT5640_HP_CP_PD | RT5640_HP_SG_EN);
976 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
977 RT5640_CHPUMP_INT_REG1, 0x0700, 0x0400);
978}
979
980static int rt5640_hp_event(struct snd_soc_dapm_widget *w,
981 struct snd_kcontrol *kcontrol, int event)
982{
983 struct snd_soc_codec *codec = w->codec;
984 struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
985
986 switch (event) {
987 case SND_SOC_DAPM_POST_PMU:
988 rt5640_pmu_depop(codec);
989 rt5640->hp_mute = 0;
990 break;
991
992 case SND_SOC_DAPM_PRE_PMD:
993 rt5640->hp_mute = 1;
994 usleep_range(70000, 75000);
995 break;
996
997 default:
998 return 0;
999 }
1000
1001 return 0;
1002}
1003
1004static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w,
1005 struct snd_kcontrol *kcontrol, int event)
1006{
1007 struct snd_soc_codec *codec = w->codec;
1008
1009 switch (event) {
1010 case SND_SOC_DAPM_POST_PMU:
1011 hp_amp_power_on(codec);
1012 break;
1013 default:
1014 return 0;
1015 }
1016
1017 return 0;
1018}
1019
1020static int rt5640_hp_post_event(struct snd_soc_dapm_widget *w,
1021 struct snd_kcontrol *kcontrol, int event)
1022{
1023 struct snd_soc_codec *codec = w->codec;
1024 struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
1025
1026 switch (event) {
1027 case SND_SOC_DAPM_POST_PMU:
1028 if (!rt5640->hp_mute)
1029 usleep_range(80000, 85000);
1030
1031 break;
1032
1033 default:
1034 return 0;
1035 }
1036
1037 return 0;
1038}
1039
946static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = { 1040static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
947 SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2, 1041 SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2,
948 RT5640_PWR_PLL_BIT, 0, NULL, 0), 1042 RT5640_PWR_PLL_BIT, 0, NULL, 0),
@@ -1132,15 +1226,28 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
1132 rt5640_mono_mix, ARRAY_SIZE(rt5640_mono_mix)), 1226 rt5640_mono_mix, ARRAY_SIZE(rt5640_mono_mix)),
1133 SND_SOC_DAPM_SUPPLY("Improve MONO Amp Drv", RT5640_PWR_ANLG1, 1227 SND_SOC_DAPM_SUPPLY("Improve MONO Amp Drv", RT5640_PWR_ANLG1,
1134 RT5640_PWR_MA_BIT, 0, NULL, 0), 1228 RT5640_PWR_MA_BIT, 0, NULL, 0),
1135 SND_SOC_DAPM_SUPPLY("Improve HP Amp Drv", RT5640_PWR_ANLG1, 1229 SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
1136 SND_SOC_NOPM, 0, NULL, 0), 1230 0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
1137 SND_SOC_DAPM_PGA("HP L Amp", RT5640_PWR_ANLG1, 1231 SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
1232 rt5640_hp_event,
1233 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1234 SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1,
1138 RT5640_PWR_HP_L_BIT, 0, NULL, 0), 1235 RT5640_PWR_HP_L_BIT, 0, NULL, 0),
1139 SND_SOC_DAPM_PGA("HP R Amp", RT5640_PWR_ANLG1, 1236 SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1,
1140 RT5640_PWR_HP_R_BIT, 0, NULL, 0), 1237 RT5640_PWR_HP_R_BIT, 0, NULL, 0),
1141 SND_SOC_DAPM_SUPPLY("Improve SPK Amp Drv", RT5640_PWR_DIG1, 1238 SND_SOC_DAPM_SUPPLY("Improve SPK Amp Drv", RT5640_PWR_DIG1,
1142 SND_SOC_NOPM, 0, spk_event, 1239 RT5640_PWR_CLS_D_BIT, 0, NULL, 0),
1143 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 1240
1241 /* Output Switch */
1242 SND_SOC_DAPM_SWITCH("Speaker L Playback", SND_SOC_NOPM, 0, 0,
1243 &spk_l_enable_control),
1244 SND_SOC_DAPM_SWITCH("Speaker R Playback", SND_SOC_NOPM, 0, 0,
1245 &spk_r_enable_control),
1246 SND_SOC_DAPM_SWITCH("HP L Playback", SND_SOC_NOPM, 0, 0,
1247 &hp_l_enable_control),
1248 SND_SOC_DAPM_SWITCH("HP R Playback", SND_SOC_NOPM, 0, 0,
1249 &hp_r_enable_control),
1250 SND_SOC_DAPM_POST("HP Post", rt5640_hp_post_event),
1144 /* Output Lines */ 1251 /* Output Lines */
1145 SND_SOC_DAPM_OUTPUT("SPOLP"), 1252 SND_SOC_DAPM_OUTPUT("SPOLP"),
1146 SND_SOC_DAPM_OUTPUT("SPOLN"), 1253 SND_SOC_DAPM_OUTPUT("SPOLN"),
@@ -1381,9 +1488,11 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1381 {"HPO MIX L", "HPO MIX DAC2 Switch", "DAC L2"}, 1488 {"HPO MIX L", "HPO MIX DAC2 Switch", "DAC L2"},
1382 {"HPO MIX L", "HPO MIX DAC1 Switch", "DAC L1"}, 1489 {"HPO MIX L", "HPO MIX DAC1 Switch", "DAC L1"},
1383 {"HPO MIX L", "HPO MIX HPVOL Switch", "HPOVOL L"}, 1490 {"HPO MIX L", "HPO MIX HPVOL Switch", "HPOVOL L"},
1491 {"HPO MIX L", NULL, "HP L Amp"},
1384 {"HPO MIX R", "HPO MIX DAC2 Switch", "DAC R2"}, 1492 {"HPO MIX R", "HPO MIX DAC2 Switch", "DAC R2"},
1385 {"HPO MIX R", "HPO MIX DAC1 Switch", "DAC R1"}, 1493 {"HPO MIX R", "HPO MIX DAC1 Switch", "DAC R1"},
1386 {"HPO MIX R", "HPO MIX HPVOL Switch", "HPOVOL R"}, 1494 {"HPO MIX R", "HPO MIX HPVOL Switch", "HPOVOL R"},
1495 {"HPO MIX R", NULL, "HP R Amp"},
1387 1496
1388 {"LOUT MIX", "DAC L1 Switch", "DAC L1"}, 1497 {"LOUT MIX", "DAC L1 Switch", "DAC L1"},
1389 {"LOUT MIX", "DAC R1 Switch", "DAC R1"}, 1498 {"LOUT MIX", "DAC R1 Switch", "DAC R1"},
@@ -1396,13 +1505,15 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1396 {"Mono MIX", "OUTVOL L Switch", "OUTVOL L"}, 1505 {"Mono MIX", "OUTVOL L Switch", "OUTVOL L"},
1397 {"Mono MIX", "BST1 Switch", "BST1"}, 1506 {"Mono MIX", "BST1 Switch", "BST1"},
1398 1507
1399 {"HP L Amp", NULL, "HPO MIX L"}, 1508 {"HP Amp", NULL, "HPO MIX L"},
1400 {"HP R Amp", NULL, "HPO MIX R"}, 1509 {"HP Amp", NULL, "HPO MIX R"},
1401 1510
1402 {"SPOLP", NULL, "SPOL MIX"}, 1511 {"Speaker L Playback", "Switch", "SPOL MIX"},
1403 {"SPOLN", NULL, "SPOL MIX"}, 1512 {"Speaker R Playback", "Switch", "SPOR MIX"},
1404 {"SPORP", NULL, "SPOR MIX"}, 1513 {"SPOLP", NULL, "Speaker L Playback"},
1405 {"SPORN", NULL, "SPOR MIX"}, 1514 {"SPOLN", NULL, "Speaker L Playback"},
1515 {"SPORP", NULL, "Speaker R Playback"},
1516 {"SPORN", NULL, "Speaker R Playback"},
1406 1517
1407 {"SPOLP", NULL, "Improve SPK Amp Drv"}, 1518 {"SPOLP", NULL, "Improve SPK Amp Drv"},
1408 {"SPOLN", NULL, "Improve SPK Amp Drv"}, 1519 {"SPOLN", NULL, "Improve SPK Amp Drv"},
@@ -1412,8 +1523,10 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1412 {"HPOL", NULL, "Improve HP Amp Drv"}, 1523 {"HPOL", NULL, "Improve HP Amp Drv"},
1413 {"HPOR", NULL, "Improve HP Amp Drv"}, 1524 {"HPOR", NULL, "Improve HP Amp Drv"},
1414 1525
1415 {"HPOL", NULL, "HP L Amp"}, 1526 {"HP L Playback", "Switch", "HP Amp"},
1416 {"HPOR", NULL, "HP R Amp"}, 1527 {"HP R Playback", "Switch", "HP Amp"},
1528 {"HPOL", NULL, "HP L Playback"},
1529 {"HPOR", NULL, "HP R Playback"},
1417 {"LOUTL", NULL, "LOUT MIX"}, 1530 {"LOUTL", NULL, "LOUT MIX"},
1418 {"LOUTR", NULL, "LOUT MIX"}, 1531 {"LOUTR", NULL, "LOUT MIX"},
1419 {"MONOP", NULL, "Mono MIX"}, 1532 {"MONOP", NULL, "Mono MIX"},
@@ -1792,17 +1905,13 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec,
1792 RT5640_PWR_BG | RT5640_PWR_VREF2, 1905 RT5640_PWR_BG | RT5640_PWR_VREF2,
1793 RT5640_PWR_VREF1 | RT5640_PWR_MB | 1906 RT5640_PWR_VREF1 | RT5640_PWR_MB |
1794 RT5640_PWR_BG | RT5640_PWR_VREF2); 1907 RT5640_PWR_BG | RT5640_PWR_VREF2);
1795 mdelay(10); 1908 usleep_range(10000, 15000);
1796 snd_soc_update_bits(codec, RT5640_PWR_ANLG1, 1909 snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
1797 RT5640_PWR_FV1 | RT5640_PWR_FV2, 1910 RT5640_PWR_FV1 | RT5640_PWR_FV2,
1798 RT5640_PWR_FV1 | RT5640_PWR_FV2); 1911 RT5640_PWR_FV1 | RT5640_PWR_FV2);
1799 regcache_sync(rt5640->regmap); 1912 regcache_sync(rt5640->regmap);
1800 snd_soc_update_bits(codec, RT5640_DUMMY1, 1913 snd_soc_update_bits(codec, RT5640_DUMMY1,
1801 0x0301, 0x0301); 1914 0x0301, 0x0301);
1802 snd_soc_update_bits(codec, RT5640_DEPOP_M1,
1803 0x001d, 0x0019);
1804 snd_soc_update_bits(codec, RT5640_DEPOP_M2,
1805 0x2000, 0x2000);
1806 snd_soc_update_bits(codec, RT5640_MICBIAS, 1915 snd_soc_update_bits(codec, RT5640_MICBIAS,
1807 0x0030, 0x0030); 1916 0x0030, 0x0030);
1808 } 1917 }
@@ -1846,8 +1955,6 @@ static int rt5640_probe(struct snd_soc_codec *codec)
1846 rt5640_set_bias_level(codec, SND_SOC_BIAS_OFF); 1955 rt5640_set_bias_level(codec, SND_SOC_BIAS_OFF);
1847 1956
1848 snd_soc_update_bits(codec, RT5640_DUMMY1, 0x0301, 0x0301); 1957 snd_soc_update_bits(codec, RT5640_DUMMY1, 0x0301, 0x0301);
1849 snd_soc_update_bits(codec, RT5640_DEPOP_M1, 0x001d, 0x0019);
1850 snd_soc_update_bits(codec, RT5640_DEPOP_M2, 0x2000, 0x2000);
1851 snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030); 1958 snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030);
1852 snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00); 1959 snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00);
1853 1960
@@ -2069,6 +2176,8 @@ static int rt5640_i2c_probe(struct i2c_client *i2c,
2069 regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4, 2176 regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4,
2070 RT5640_IN_DF2, RT5640_IN_DF2); 2177 RT5640_IN_DF2, RT5640_IN_DF2);
2071 2178
2179 rt5640->hp_mute = 1;
2180
2072 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640, 2181 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640,
2073 rt5640_dai, ARRAY_SIZE(rt5640_dai)); 2182 rt5640_dai, ARRAY_SIZE(rt5640_dai));
2074 if (ret < 0) 2183 if (ret < 0)
diff --git a/sound/soc/codecs/rt5640.h b/sound/soc/codecs/rt5640.h
index c48286d7118f..5e8df25a13f3 100644
--- a/sound/soc/codecs/rt5640.h
+++ b/sound/soc/codecs/rt5640.h
@@ -145,6 +145,8 @@
145 145
146 146
147/* Index of Codec Private Register definition */ 147/* Index of Codec Private Register definition */
148#define RT5640_CHPUMP_INT_REG1 0x24
149#define RT5640_MAMP_INT_REG2 0x37
148#define RT5640_3D_SPK 0x63 150#define RT5640_3D_SPK 0x63
149#define RT5640_WND_1 0x6c 151#define RT5640_WND_1 0x6c
150#define RT5640_WND_2 0x6d 152#define RT5640_WND_2 0x6d
@@ -153,6 +155,7 @@
153#define RT5640_WND_5 0x70 155#define RT5640_WND_5 0x70
154#define RT5640_WND_8 0x73 156#define RT5640_WND_8 0x73
155#define RT5640_DIP_SPK_INF 0x75 157#define RT5640_DIP_SPK_INF 0x75
158#define RT5640_HP_DCC_INT1 0x77
156#define RT5640_EQ_BW_LOP 0xa0 159#define RT5640_EQ_BW_LOP 0xa0
157#define RT5640_EQ_GN_LOP 0xa1 160#define RT5640_EQ_GN_LOP 0xa1
158#define RT5640_EQ_FC_BP1 0xa2 161#define RT5640_EQ_FC_BP1 0xa2
@@ -1201,6 +1204,14 @@
1201#define RT5640_CP_FQ2_SFT 4 1204#define RT5640_CP_FQ2_SFT 4
1202#define RT5640_CP_FQ3_MASK (0x7) 1205#define RT5640_CP_FQ3_MASK (0x7)
1203#define RT5640_CP_FQ3_SFT 0 1206#define RT5640_CP_FQ3_SFT 0
1207#define RT5640_CP_FQ_1_5_KHZ 0
1208#define RT5640_CP_FQ_3_KHZ 1
1209#define RT5640_CP_FQ_6_KHZ 2
1210#define RT5640_CP_FQ_12_KHZ 3
1211#define RT5640_CP_FQ_24_KHZ 4
1212#define RT5640_CP_FQ_48_KHZ 5
1213#define RT5640_CP_FQ_96_KHZ 6
1214#define RT5640_CP_FQ_192_KHZ 7
1204 1215
1205/* HPOUT charge pump (0x91) */ 1216/* HPOUT charge pump (0x91) */
1206#define RT5640_OSW_L_MASK (0x1 << 11) 1217#define RT5640_OSW_L_MASK (0x1 << 11)
@@ -2087,6 +2098,7 @@ struct rt5640_priv {
2087 int pll_out; 2098 int pll_out;
2088 2099
2089 int dmic_en; 2100 int dmic_en;
2101 bool hp_mute;
2090}; 2102};
2091 2103
2092#endif 2104#endif
diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
index f8d30e5f6371..492644e67ace 100644
--- a/sound/soc/codecs/ssm2602.c
+++ b/sound/soc/codecs/ssm2602.c
@@ -561,8 +561,9 @@ static int ssm2602_suspend(struct snd_soc_codec *codec)
561 561
562static int ssm2602_resume(struct snd_soc_codec *codec) 562static int ssm2602_resume(struct snd_soc_codec *codec)
563{ 563{
564 snd_soc_cache_sync(codec); 564 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
565 565
566 regcache_sync(ssm2602->regmap);
566 ssm2602_set_bias_level(codec, SND_SOC_BIAS_STANDBY); 567 ssm2602_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
567 568
568 return 0; 569 return 0;
diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile
index e2aaff717f8a..8db705b0fdf9 100644
--- a/sound/soc/fsl/Makefile
+++ b/sound/soc/fsl/Makefile
@@ -45,7 +45,7 @@ snd-soc-mx27vis-aic32x4-objs := mx27vis-aic32x4.o
45snd-soc-wm1133-ev1-objs := wm1133-ev1.o 45snd-soc-wm1133-ev1-objs := wm1133-ev1.o
46snd-soc-imx-sgtl5000-objs := imx-sgtl5000.o 46snd-soc-imx-sgtl5000-objs := imx-sgtl5000.o
47snd-soc-imx-wm8962-objs := imx-wm8962.o 47snd-soc-imx-wm8962-objs := imx-wm8962.o
48snd-soc-imx-spdif-objs :=imx-spdif.o 48snd-soc-imx-spdif-objs := imx-spdif.o
49snd-soc-imx-mc13783-objs := imx-mc13783.o 49snd-soc-imx-mc13783-objs := imx-mc13783.o
50 50
51obj-$(CONFIG_SND_SOC_EUKREA_TLV320) += snd-soc-eukrea-tlv320.o 51obj-$(CONFIG_SND_SOC_EUKREA_TLV320) += snd-soc-eukrea-tlv320.o
diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c
index e93dc0dfb0d9..3920c3e849ce 100644
--- a/sound/soc/fsl/fsl_spdif.c
+++ b/sound/soc/fsl/fsl_spdif.c
@@ -411,8 +411,8 @@ static int spdif_set_sample_rate(struct snd_pcm_substream *substream,
411 return 0; 411 return 0;
412} 412}
413 413
414int fsl_spdif_startup(struct snd_pcm_substream *substream, 414static int fsl_spdif_startup(struct snd_pcm_substream *substream,
415 struct snd_soc_dai *cpu_dai) 415 struct snd_soc_dai *cpu_dai)
416{ 416{
417 struct snd_soc_pcm_runtime *rtd = substream->private_data; 417 struct snd_soc_pcm_runtime *rtd = substream->private_data;
418 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(rtd->cpu_dai); 418 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(rtd->cpu_dai);
@@ -546,7 +546,7 @@ static int fsl_spdif_trigger(struct snd_pcm_substream *substream,
546 return 0; 546 return 0;
547} 547}
548 548
549struct snd_soc_dai_ops fsl_spdif_dai_ops = { 549static struct snd_soc_dai_ops fsl_spdif_dai_ops = {
550 .startup = fsl_spdif_startup, 550 .startup = fsl_spdif_startup,
551 .hw_params = fsl_spdif_hw_params, 551 .hw_params = fsl_spdif_hw_params,
552 .trigger = fsl_spdif_trigger, 552 .trigger = fsl_spdif_trigger,
@@ -919,7 +919,7 @@ static int fsl_spdif_dai_probe(struct snd_soc_dai *dai)
919 return 0; 919 return 0;
920} 920}
921 921
922struct snd_soc_dai_driver fsl_spdif_dai = { 922static struct snd_soc_dai_driver fsl_spdif_dai = {
923 .probe = &fsl_spdif_dai_probe, 923 .probe = &fsl_spdif_dai_probe,
924 .playback = { 924 .playback = {
925 .channels_min = 2, 925 .channels_min = 2,
@@ -1071,9 +1071,9 @@ static int fsl_spdif_probe_txclk(struct fsl_spdif_priv *spdif_priv,
1071 break; 1071 break;
1072 } 1072 }
1073 1073
1074 dev_dbg(&pdev->dev, "use rxtx%d as tx clock source for %dHz sample rate", 1074 dev_dbg(&pdev->dev, "use rxtx%d as tx clock source for %dHz sample rate\n",
1075 spdif_priv->txclk_src[index], rate[index]); 1075 spdif_priv->txclk_src[index], rate[index]);
1076 dev_dbg(&pdev->dev, "use divisor %d for %dHz sample rate", 1076 dev_dbg(&pdev->dev, "use divisor %d for %dHz sample rate\n",
1077 spdif_priv->txclk_div[index], rate[index]); 1077 spdif_priv->txclk_div[index], rate[index]);
1078 1078
1079 return 0; 1079 return 0;
diff --git a/sound/soc/mxs/mxs-sgtl5000.c b/sound/soc/mxs/mxs-sgtl5000.c
index ce084eb10c49..4bb273786ff3 100644
--- a/sound/soc/mxs/mxs-sgtl5000.c
+++ b/sound/soc/mxs/mxs-sgtl5000.c
@@ -105,11 +105,13 @@ static struct snd_soc_dai_link mxs_sgtl5000_dai[] = {
105 .stream_name = "HiFi Playback", 105 .stream_name = "HiFi Playback",
106 .codec_dai_name = "sgtl5000", 106 .codec_dai_name = "sgtl5000",
107 .ops = &mxs_sgtl5000_hifi_ops, 107 .ops = &mxs_sgtl5000_hifi_ops,
108 .playback_only = true,
108 }, { 109 }, {
109 .name = "HiFi Rx", 110 .name = "HiFi Rx",
110 .stream_name = "HiFi Capture", 111 .stream_name = "HiFi Capture",
111 .codec_dai_name = "sgtl5000", 112 .codec_dai_name = "sgtl5000",
112 .ops = &mxs_sgtl5000_hifi_ops, 113 .ops = &mxs_sgtl5000_hifi_ops,
114 .capture_only = true,
113 }, 115 },
114}; 116};
115 117
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 548b1c9e875e..c17c14c394df 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -229,6 +229,8 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
229 template.id = snd_soc_dapm_kcontrol; 229 template.id = snd_soc_dapm_kcontrol;
230 template.name = kcontrol->id.name; 230 template.name = kcontrol->id.name;
231 231
232 data->value = template.on_val;
233
232 data->widget = snd_soc_dapm_new_control(widget->dapm, 234 data->widget = snd_soc_dapm_new_control(widget->dapm,
233 &template); 235 &template);
234 if (!data->widget) { 236 if (!data->widget) {
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index fb70fbe26862..330c9a6b5cb5 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -2020,6 +2020,16 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
2020 capture = 1; 2020 capture = 1;
2021 } 2021 }
2022 2022
2023 if (rtd->dai_link->playback_only) {
2024 playback = 1;
2025 capture = 0;
2026 }
2027
2028 if (rtd->dai_link->capture_only) {
2029 playback = 0;
2030 capture = 1;
2031 }
2032
2023 /* create the PCM */ 2033 /* create the PCM */
2024 if (rtd->dai_link->no_pcm) { 2034 if (rtd->dai_link->no_pcm) {
2025 snprintf(new_name, sizeof(new_name), "(%s)", 2035 snprintf(new_name, sizeof(new_name), "(%s)",