diff options
| author | Takashi Iwai <tiwai@suse.de> | 2013-09-02 09:06:45 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2013-09-02 09:06:45 -0400 |
| commit | c8ead4154af3d43635f63a708a2f369c7cce09e7 (patch) | |
| tree | 42a96351bbee7996826d1126a85351e42a22dd87 | |
| parent | 18e391862cceaf43ddb8eb5cca05e1a83abdebaa (diff) | |
| parent | 5df498a27ab385294fdb7cad19c623d4da94a780 (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.
| -rw-r--r-- | include/sound/soc.h | 8 | ||||
| -rw-r--r-- | sound/soc/codecs/rt5640.c | 217 | ||||
| -rw-r--r-- | sound/soc/codecs/rt5640.h | 12 | ||||
| -rw-r--r-- | sound/soc/codecs/ssm2602.c | 3 | ||||
| -rw-r--r-- | sound/soc/fsl/Makefile | 2 | ||||
| -rw-r--r-- | sound/soc/fsl/fsl_spdif.c | 12 | ||||
| -rw-r--r-- | sound/soc/mxs/mxs-sgtl5000.c | 2 | ||||
| -rw-r--r-- | sound/soc/soc-dapm.c | 2 | ||||
| -rw-r--r-- | sound/soc/soc-pcm.c | 10 |
9 files changed, 202 insertions, 66 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index 8e2ad52078b6..d22cb0a06feb 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
| @@ -697,7 +697,6 @@ struct snd_soc_codec { | |||
| 697 | unsigned int probed:1; /* Codec has been probed */ | 697 | unsigned int probed:1; /* Codec has been probed */ |
| 698 | unsigned int ac97_registered:1; /* Codec has been AC97 registered */ | 698 | unsigned int ac97_registered:1; /* Codec has been AC97 registered */ |
| 699 | unsigned int ac97_created:1; /* Codec has been created by SoC */ | 699 | unsigned int ac97_created:1; /* Codec has been created by SoC */ |
| 700 | unsigned int sysfs_registered:1; /* codec has been sysfs registered */ | ||
| 701 | unsigned int cache_init:1; /* codec cache has been initialized */ | 700 | unsigned int cache_init:1; /* codec cache has been initialized */ |
| 702 | unsigned int using_regmap:1; /* using regmap access */ | 701 | unsigned int using_regmap:1; /* using regmap access */ |
| 703 | u32 cache_only; /* Suppress writes to hardware */ | 702 | u32 cache_only; /* Suppress writes to hardware */ |
| @@ -705,7 +704,6 @@ struct snd_soc_codec { | |||
| 705 | 704 | ||
| 706 | /* codec IO */ | 705 | /* codec IO */ |
| 707 | void *control_data; /* codec control (i2c/3wire) data */ | 706 | void *control_data; /* codec control (i2c/3wire) data */ |
| 708 | enum snd_soc_control_type control_type; | ||
| 709 | hw_write_t hw_write; | 707 | hw_write_t hw_write; |
| 710 | unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int); | 708 | unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int); |
| 711 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); | 709 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); |
| @@ -724,7 +722,6 @@ struct snd_soc_codec { | |||
| 724 | #ifdef CONFIG_DEBUG_FS | 722 | #ifdef CONFIG_DEBUG_FS |
| 725 | struct dentry *debugfs_codec_root; | 723 | struct dentry *debugfs_codec_root; |
| 726 | struct dentry *debugfs_reg; | 724 | struct dentry *debugfs_reg; |
| 727 | struct dentry *debugfs_dapm; | ||
| 728 | #endif | 725 | #endif |
| 729 | }; | 726 | }; |
| 730 | 727 | ||
| @@ -849,7 +846,6 @@ struct snd_soc_platform { | |||
| 849 | 846 | ||
| 850 | #ifdef CONFIG_DEBUG_FS | 847 | #ifdef CONFIG_DEBUG_FS |
| 851 | struct dentry *debugfs_platform_root; | 848 | struct dentry *debugfs_platform_root; |
| 852 | struct dentry *debugfs_dapm; | ||
| 853 | #endif | 849 | #endif |
| 854 | }; | 850 | }; |
| 855 | 851 | ||
| @@ -934,6 +930,10 @@ struct snd_soc_dai_link { | |||
| 934 | /* machine stream operations */ | 930 | /* machine stream operations */ |
| 935 | const struct snd_soc_ops *ops; | 931 | const struct snd_soc_ops *ops; |
| 936 | const struct snd_soc_compr_ops *compr_ops; | 932 | const struct snd_soc_compr_ops *compr_ops; |
| 933 | |||
| 934 | /* For unidirectional dai links */ | ||
| 935 | bool playback_only; | ||
| 936 | bool capture_only; | ||
| 937 | }; | 937 | }; |
| 938 | 938 | ||
| 939 | struct snd_soc_codec_conf { | 939 | struct snd_soc_codec_conf { |
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 | ||
| 51 | static struct reg_default init_list[] = { | 51 | static 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 | ||
| 385 | static const struct snd_kcontrol_new rt5640_snd_controls[] = { | 383 | static 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 | ||
| 734 | static 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 | |||
| 738 | static 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 | |||
| 742 | static 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 | |||
| 746 | static 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 */ |
| 741 | static const char * const rt5640_stereo_adc1_src[] = { | 751 | static 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( | |||
| 868 | static const struct snd_kcontrol_new rt5640_sdi_mux = | 878 | static 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 | ||
| 871 | static 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 | |||
| 898 | static int rt5640_set_dmic1_event(struct snd_soc_dapm_widget *w, | 881 | static 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 | ||
| 929 | void 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 | |||
| 955 | static 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 | |||
| 980 | static 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 | |||
| 1004 | static 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 | |||
| 1020 | static 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 | |||
| 946 | static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = { | 1040 | static 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 | ||
| 562 | static int ssm2602_resume(struct snd_soc_codec *codec) | 562 | static 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 | |||
| 45 | snd-soc-wm1133-ev1-objs := wm1133-ev1.o | 45 | snd-soc-wm1133-ev1-objs := wm1133-ev1.o |
| 46 | snd-soc-imx-sgtl5000-objs := imx-sgtl5000.o | 46 | snd-soc-imx-sgtl5000-objs := imx-sgtl5000.o |
| 47 | snd-soc-imx-wm8962-objs := imx-wm8962.o | 47 | snd-soc-imx-wm8962-objs := imx-wm8962.o |
| 48 | snd-soc-imx-spdif-objs :=imx-spdif.o | 48 | snd-soc-imx-spdif-objs := imx-spdif.o |
| 49 | snd-soc-imx-mc13783-objs := imx-mc13783.o | 49 | snd-soc-imx-mc13783-objs := imx-mc13783.o |
| 50 | 50 | ||
| 51 | obj-$(CONFIG_SND_SOC_EUKREA_TLV320) += snd-soc-eukrea-tlv320.o | 51 | obj-$(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 | ||
| 414 | int fsl_spdif_startup(struct snd_pcm_substream *substream, | 414 | static 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 | ||
| 549 | struct snd_soc_dai_ops fsl_spdif_dai_ops = { | 549 | static 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 | ||
| 922 | struct snd_soc_dai_driver fsl_spdif_dai = { | 922 | static 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)", |
