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

ASoC: wcd9335: add capture dapm widgets

This patch adds required dapm widgets for capture path.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Reviewed-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Srinivas Kandagatla and committed by
Mark Brown
6ccc25f6 35446148

+1447 -1
+1447 -1
sound/soc/codecs/wcd9335.c
··· 60 60 #define WCD9335_NUM_INTERPOLATORS 9 61 61 #define WCD9335_RX_START 16 62 62 #define WCD9335_SLIM_CH_START 128 63 + #define WCD9335_MAX_MICBIAS 4 64 + #define WCD9335_MAX_VALID_ADC_MUX 13 65 + #define WCD9335_INVALID_ADC_MUX 9 66 + 67 + #define TX_HPF_CUT_OFF_FREQ_MASK 0x60 68 + #define CF_MIN_3DB_4HZ 0x0 69 + #define CF_MIN_3DB_75HZ 0x1 70 + #define CF_MIN_3DB_150HZ 0x2 71 + #define WCD9335_DMIC_CLK_DIV_2 0x0 72 + #define WCD9335_DMIC_CLK_DIV_3 0x1 73 + #define WCD9335_DMIC_CLK_DIV_4 0x2 74 + #define WCD9335_DMIC_CLK_DIV_6 0x3 75 + #define WCD9335_DMIC_CLK_DIV_8 0x4 76 + #define WCD9335_DMIC_CLK_DIV_16 0x5 77 + #define WCD9335_DMIC_CLK_DRIVE_DEFAULT 0x02 78 + #define WCD9335_AMIC_PWR_LEVEL_LP 0 79 + #define WCD9335_AMIC_PWR_LEVEL_DEFAULT 1 80 + #define WCD9335_AMIC_PWR_LEVEL_HP 2 81 + #define WCD9335_AMIC_PWR_LVL_MASK 0x60 82 + #define WCD9335_AMIC_PWR_LVL_SHIFT 0x5 83 + 84 + #define WCD9335_DEC_PWR_LVL_MASK 0x06 85 + #define WCD9335_DEC_PWR_LVL_LP 0x02 86 + #define WCD9335_DEC_PWR_LVL_HP 0x04 87 + #define WCD9335_DEC_PWR_LVL_DF 0x00 88 + 89 + #define TX_HPF_CUT_OFF_FREQ_MASK 0x60 90 + #define CF_MIN_3DB_4HZ 0x0 91 + #define CF_MIN_3DB_75HZ 0x1 92 + #define CF_MIN_3DB_150HZ 0x2 63 93 64 94 #define WCD9335_SLIM_RX_CH(p) \ 65 95 {.port = p + WCD9335_RX_START, .shift = p,} 96 + 97 + #define WCD9335_SLIM_TX_CH(p) \ 98 + {.port = p, .shift = p,} 66 99 67 100 /* vout step value */ 68 101 #define WCD9335_CALCULATE_VOUT_D(req_mv) (((req_mv - 650) * 10) / 25) ··· 115 82 WCD9335_RX11, 116 83 WCD9335_RX12, 117 84 WCD9335_RX_MAX, 85 + }; 86 + 87 + enum { 88 + WCD9335_TX0 = 0, 89 + WCD9335_TX1, 90 + WCD9335_TX2, 91 + WCD9335_TX3, 92 + WCD9335_TX4, 93 + WCD9335_TX5, 94 + WCD9335_TX6, 95 + WCD9335_TX7, 96 + WCD9335_TX8, 97 + WCD9335_TX9, 98 + WCD9335_TX10, 99 + WCD9335_TX11, 100 + WCD9335_TX12, 101 + WCD9335_TX13, 102 + WCD9335_TX14, 103 + WCD9335_TX15, 104 + WCD9335_TX_MAX, 118 105 }; 119 106 120 107 enum { ··· 218 165 WCD_CLK_MCLK, 219 166 }; 220 167 168 + enum { 169 + MIC_BIAS_1 = 1, 170 + MIC_BIAS_2, 171 + MIC_BIAS_3, 172 + MIC_BIAS_4 173 + }; 174 + 175 + enum { 176 + MICB_PULLUP_ENABLE, 177 + MICB_PULLUP_DISABLE, 178 + MICB_ENABLE, 179 + MICB_DISABLE, 180 + }; 181 + 221 182 struct wcd9335_slim_ch { 222 183 u32 ch_num; 223 184 u16 port; ··· 259 192 struct regmap_irq_chip_data *irq_data; 260 193 261 194 struct wcd9335_slim_ch rx_chs[WCD9335_RX_MAX]; 195 + struct wcd9335_slim_ch tx_chs[WCD9335_TX_MAX]; 262 196 u32 num_rx_port; 197 + u32 num_tx_port; 263 198 264 199 int sido_input_src; 265 200 enum wcd9335_sido_voltage sido_voltage; ··· 286 217 struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY]; 287 218 288 219 unsigned int rx_port_value; 220 + unsigned int tx_port_value; 289 221 int hph_l_gain; 290 222 int hph_r_gain; 291 223 u32 rx_bias_count; 292 224 225 + /*TX*/ 226 + int micb_ref[WCD9335_MAX_MICBIAS]; 227 + int pullup_ref[WCD9335_MAX_MICBIAS]; 228 + 229 + int dmic_0_1_clk_cnt; 230 + int dmic_2_3_clk_cnt; 231 + int dmic_4_5_clk_cnt; 232 + int dmic_sample_rate; 233 + int mad_dmic_sample_rate; 234 + 235 + int native_clk_users; 293 236 }; 294 237 295 238 struct wcd9335_irq { 296 239 int irq; 297 240 irqreturn_t (*handler)(int irq, void *data); 298 241 char *name; 242 + }; 243 + 244 + static const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = { 245 + WCD9335_SLIM_TX_CH(0), 246 + WCD9335_SLIM_TX_CH(1), 247 + WCD9335_SLIM_TX_CH(2), 248 + WCD9335_SLIM_TX_CH(3), 249 + WCD9335_SLIM_TX_CH(4), 250 + WCD9335_SLIM_TX_CH(5), 251 + WCD9335_SLIM_TX_CH(6), 252 + WCD9335_SLIM_TX_CH(7), 253 + WCD9335_SLIM_TX_CH(8), 254 + WCD9335_SLIM_TX_CH(9), 255 + WCD9335_SLIM_TX_CH(10), 256 + WCD9335_SLIM_TX_CH(11), 257 + WCD9335_SLIM_TX_CH(12), 258 + WCD9335_SLIM_TX_CH(13), 259 + WCD9335_SLIM_TX_CH(14), 260 + WCD9335_SLIM_TX_CH(15), 299 261 }; 300 262 301 263 static const struct wcd9335_slim_ch wcd9335_rx_chs[WCD9335_RX_MAX] = { ··· 507 407 508 408 static const char *const slim_rx_mux_text[] = { 509 409 "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB", 410 + }; 411 + 412 + static const char * const adc_mux_text[] = { 413 + "DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2" 414 + }; 415 + 416 + static const char * const dmic_mux_text[] = { 417 + "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5", 418 + "SMIC0", "SMIC1", "SMIC2", "SMIC3" 419 + }; 420 + 421 + static const char * const dmic_mux_alt_text[] = { 422 + "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5", 423 + }; 424 + 425 + static const char * const amic_mux_text[] = { 426 + "ZERO", "ADC1", "ADC2", "ADC3", "ADC4", "ADC5", "ADC6" 427 + }; 428 + 429 + static const char * const sb_tx0_mux_text[] = { 430 + "ZERO", "RX_MIX_TX0", "DEC0", "DEC0_192" 431 + }; 432 + 433 + static const char * const sb_tx1_mux_text[] = { 434 + "ZERO", "RX_MIX_TX1", "DEC1", "DEC1_192" 435 + }; 436 + 437 + static const char * const sb_tx2_mux_text[] = { 438 + "ZERO", "RX_MIX_TX2", "DEC2", "DEC2_192" 439 + }; 440 + 441 + static const char * const sb_tx3_mux_text[] = { 442 + "ZERO", "RX_MIX_TX3", "DEC3", "DEC3_192" 443 + }; 444 + 445 + static const char * const sb_tx4_mux_text[] = { 446 + "ZERO", "RX_MIX_TX4", "DEC4", "DEC4_192" 447 + }; 448 + 449 + static const char * const sb_tx5_mux_text[] = { 450 + "ZERO", "RX_MIX_TX5", "DEC5", "DEC5_192" 451 + }; 452 + 453 + static const char * const sb_tx6_mux_text[] = { 454 + "ZERO", "RX_MIX_TX6", "DEC6", "DEC6_192" 455 + }; 456 + 457 + static const char * const sb_tx7_mux_text[] = { 458 + "ZERO", "RX_MIX_TX7", "DEC7", "DEC7_192" 459 + }; 460 + 461 + static const char * const sb_tx8_mux_text[] = { 462 + "ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192" 510 463 }; 511 464 512 465 static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); ··· 850 697 SOC_ENUM_SINGLE(WCD9335_CDC_RX8_RX_PATH_CTL, 5, 2, 851 698 rx_int8_interp_mux_text); 852 699 700 + static const struct soc_enum tx_adc_mux0_chain_enum = 701 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0, 4, 702 + adc_mux_text); 703 + 704 + static const struct soc_enum tx_adc_mux1_chain_enum = 705 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0, 4, 706 + adc_mux_text); 707 + 708 + static const struct soc_enum tx_adc_mux2_chain_enum = 709 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0, 4, 710 + adc_mux_text); 711 + 712 + static const struct soc_enum tx_adc_mux3_chain_enum = 713 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0, 4, 714 + adc_mux_text); 715 + 716 + static const struct soc_enum tx_adc_mux4_chain_enum = 717 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 6, 4, 718 + adc_mux_text); 719 + 720 + static const struct soc_enum tx_adc_mux5_chain_enum = 721 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 6, 4, 722 + adc_mux_text); 723 + 724 + static const struct soc_enum tx_adc_mux6_chain_enum = 725 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 6, 4, 726 + adc_mux_text); 727 + 728 + static const struct soc_enum tx_adc_mux7_chain_enum = 729 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 6, 4, 730 + adc_mux_text); 731 + 732 + static const struct soc_enum tx_adc_mux8_chain_enum = 733 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 6, 4, 734 + adc_mux_text); 735 + 736 + static const struct soc_enum tx_dmic_mux0_enum = 737 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 3, 11, 738 + dmic_mux_text); 739 + 740 + static const struct soc_enum tx_dmic_mux1_enum = 741 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 3, 11, 742 + dmic_mux_text); 743 + 744 + static const struct soc_enum tx_dmic_mux2_enum = 745 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 3, 11, 746 + dmic_mux_text); 747 + 748 + static const struct soc_enum tx_dmic_mux3_enum = 749 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 3, 11, 750 + dmic_mux_text); 751 + 752 + static const struct soc_enum tx_dmic_mux4_enum = 753 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 3, 7, 754 + dmic_mux_alt_text); 755 + 756 + static const struct soc_enum tx_dmic_mux5_enum = 757 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 3, 7, 758 + dmic_mux_alt_text); 759 + 760 + static const struct soc_enum tx_dmic_mux6_enum = 761 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 3, 7, 762 + dmic_mux_alt_text); 763 + 764 + static const struct soc_enum tx_dmic_mux7_enum = 765 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 3, 7, 766 + dmic_mux_alt_text); 767 + 768 + static const struct soc_enum tx_dmic_mux8_enum = 769 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 3, 7, 770 + dmic_mux_alt_text); 771 + 772 + static const struct soc_enum tx_amic_mux0_enum = 773 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, 7, 774 + amic_mux_text); 775 + 776 + static const struct soc_enum tx_amic_mux1_enum = 777 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, 7, 778 + amic_mux_text); 779 + 780 + static const struct soc_enum tx_amic_mux2_enum = 781 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, 7, 782 + amic_mux_text); 783 + 784 + static const struct soc_enum tx_amic_mux3_enum = 785 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0, 7, 786 + amic_mux_text); 787 + 788 + static const struct soc_enum tx_amic_mux4_enum = 789 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0, 7, 790 + amic_mux_text); 791 + 792 + static const struct soc_enum tx_amic_mux5_enum = 793 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0, 7, 794 + amic_mux_text); 795 + 796 + static const struct soc_enum tx_amic_mux6_enum = 797 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0, 7, 798 + amic_mux_text); 799 + 800 + static const struct soc_enum tx_amic_mux7_enum = 801 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0, 7, 802 + amic_mux_text); 803 + 804 + static const struct soc_enum tx_amic_mux8_enum = 805 + SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0, 7, 806 + amic_mux_text); 807 + 808 + static const struct soc_enum sb_tx0_mux_enum = 809 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 0, 4, 810 + sb_tx0_mux_text); 811 + 812 + static const struct soc_enum sb_tx1_mux_enum = 813 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 2, 4, 814 + sb_tx1_mux_text); 815 + 816 + static const struct soc_enum sb_tx2_mux_enum = 817 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 4, 4, 818 + sb_tx2_mux_text); 819 + 820 + static const struct soc_enum sb_tx3_mux_enum = 821 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 6, 4, 822 + sb_tx3_mux_text); 823 + 824 + static const struct soc_enum sb_tx4_mux_enum = 825 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 0, 4, 826 + sb_tx4_mux_text); 827 + 828 + static const struct soc_enum sb_tx5_mux_enum = 829 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 2, 4, 830 + sb_tx5_mux_text); 831 + 832 + static const struct soc_enum sb_tx6_mux_enum = 833 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 4, 4, 834 + sb_tx6_mux_text); 835 + 836 + static const struct soc_enum sb_tx7_mux_enum = 837 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 6, 4, 838 + sb_tx7_mux_text); 839 + 840 + static const struct soc_enum sb_tx8_mux_enum = 841 + SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2, 0, 4, 842 + sb_tx8_mux_text); 843 + 853 844 static const struct snd_kcontrol_new rx_int0_2_mux = 854 845 SOC_DAPM_ENUM("RX INT0_2 MUX Mux", rx_int0_2_mux_chain_enum); 855 846 ··· 1129 832 static const struct snd_kcontrol_new rx_int8_interp_mux = 1130 833 SOC_DAPM_ENUM("RX INT8 INTERP Mux", rx_int8_interp_mux_enum); 1131 834 835 + static const struct snd_kcontrol_new tx_dmic_mux0 = 836 + SOC_DAPM_ENUM("DMIC MUX0 Mux", tx_dmic_mux0_enum); 837 + 838 + static const struct snd_kcontrol_new tx_dmic_mux1 = 839 + SOC_DAPM_ENUM("DMIC MUX1 Mux", tx_dmic_mux1_enum); 840 + 841 + static const struct snd_kcontrol_new tx_dmic_mux2 = 842 + SOC_DAPM_ENUM("DMIC MUX2 Mux", tx_dmic_mux2_enum); 843 + 844 + static const struct snd_kcontrol_new tx_dmic_mux3 = 845 + SOC_DAPM_ENUM("DMIC MUX3 Mux", tx_dmic_mux3_enum); 846 + 847 + static const struct snd_kcontrol_new tx_dmic_mux4 = 848 + SOC_DAPM_ENUM("DMIC MUX4 Mux", tx_dmic_mux4_enum); 849 + 850 + static const struct snd_kcontrol_new tx_dmic_mux5 = 851 + SOC_DAPM_ENUM("DMIC MUX5 Mux", tx_dmic_mux5_enum); 852 + 853 + static const struct snd_kcontrol_new tx_dmic_mux6 = 854 + SOC_DAPM_ENUM("DMIC MUX6 Mux", tx_dmic_mux6_enum); 855 + 856 + static const struct snd_kcontrol_new tx_dmic_mux7 = 857 + SOC_DAPM_ENUM("DMIC MUX7 Mux", tx_dmic_mux7_enum); 858 + 859 + static const struct snd_kcontrol_new tx_dmic_mux8 = 860 + SOC_DAPM_ENUM("DMIC MUX8 Mux", tx_dmic_mux8_enum); 861 + 862 + static const struct snd_kcontrol_new tx_amic_mux0 = 863 + SOC_DAPM_ENUM("AMIC MUX0 Mux", tx_amic_mux0_enum); 864 + 865 + static const struct snd_kcontrol_new tx_amic_mux1 = 866 + SOC_DAPM_ENUM("AMIC MUX1 Mux", tx_amic_mux1_enum); 867 + 868 + static const struct snd_kcontrol_new tx_amic_mux2 = 869 + SOC_DAPM_ENUM("AMIC MUX2 Mux", tx_amic_mux2_enum); 870 + 871 + static const struct snd_kcontrol_new tx_amic_mux3 = 872 + SOC_DAPM_ENUM("AMIC MUX3 Mux", tx_amic_mux3_enum); 873 + 874 + static const struct snd_kcontrol_new tx_amic_mux4 = 875 + SOC_DAPM_ENUM("AMIC MUX4 Mux", tx_amic_mux4_enum); 876 + 877 + static const struct snd_kcontrol_new tx_amic_mux5 = 878 + SOC_DAPM_ENUM("AMIC MUX5 Mux", tx_amic_mux5_enum); 879 + 880 + static const struct snd_kcontrol_new tx_amic_mux6 = 881 + SOC_DAPM_ENUM("AMIC MUX6 Mux", tx_amic_mux6_enum); 882 + 883 + static const struct snd_kcontrol_new tx_amic_mux7 = 884 + SOC_DAPM_ENUM("AMIC MUX7 Mux", tx_amic_mux7_enum); 885 + 886 + static const struct snd_kcontrol_new tx_amic_mux8 = 887 + SOC_DAPM_ENUM("AMIC MUX8 Mux", tx_amic_mux8_enum); 888 + 889 + static const struct snd_kcontrol_new sb_tx0_mux = 890 + SOC_DAPM_ENUM("SLIM TX0 MUX Mux", sb_tx0_mux_enum); 891 + 892 + static const struct snd_kcontrol_new sb_tx1_mux = 893 + SOC_DAPM_ENUM("SLIM TX1 MUX Mux", sb_tx1_mux_enum); 894 + 895 + static const struct snd_kcontrol_new sb_tx2_mux = 896 + SOC_DAPM_ENUM("SLIM TX2 MUX Mux", sb_tx2_mux_enum); 897 + 898 + static const struct snd_kcontrol_new sb_tx3_mux = 899 + SOC_DAPM_ENUM("SLIM TX3 MUX Mux", sb_tx3_mux_enum); 900 + 901 + static const struct snd_kcontrol_new sb_tx4_mux = 902 + SOC_DAPM_ENUM("SLIM TX4 MUX Mux", sb_tx4_mux_enum); 903 + 904 + static const struct snd_kcontrol_new sb_tx5_mux = 905 + SOC_DAPM_ENUM("SLIM TX5 MUX Mux", sb_tx5_mux_enum); 906 + 907 + static const struct snd_kcontrol_new sb_tx6_mux = 908 + SOC_DAPM_ENUM("SLIM TX6 MUX Mux", sb_tx6_mux_enum); 909 + 910 + static const struct snd_kcontrol_new sb_tx7_mux = 911 + SOC_DAPM_ENUM("SLIM TX7 MUX Mux", sb_tx7_mux_enum); 912 + 913 + static const struct snd_kcontrol_new sb_tx8_mux = 914 + SOC_DAPM_ENUM("SLIM TX8 MUX Mux", sb_tx8_mux_enum); 915 + 1132 916 static int slim_rx_mux_get(struct snd_kcontrol *kc, 1133 917 struct snd_ctl_elem_value *ucontrol) 1134 918 { ··· 1265 887 return -EINVAL; 1266 888 } 1267 889 890 + static int slim_tx_mixer_get(struct snd_kcontrol *kc, 891 + struct snd_ctl_elem_value *ucontrol) 892 + { 893 + 894 + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc); 895 + struct wcd9335_codec *wcd = dev_get_drvdata(dapm->dev); 896 + 897 + ucontrol->value.integer.value[0] = wcd->tx_port_value; 898 + 899 + return 0; 900 + } 901 + 902 + static int slim_tx_mixer_put(struct snd_kcontrol *kc, 903 + struct snd_ctl_elem_value *ucontrol) 904 + { 905 + 906 + struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kc); 907 + struct wcd9335_codec *wcd = dev_get_drvdata(widget->dapm->dev); 908 + struct snd_soc_dapm_update *update = NULL; 909 + struct soc_mixer_control *mixer = 910 + (struct soc_mixer_control *)kc->private_value; 911 + int enable = ucontrol->value.integer.value[0]; 912 + int dai_id = widget->shift; 913 + int port_id = mixer->shift; 914 + 915 + switch (dai_id) { 916 + case AIF1_CAP: 917 + case AIF2_CAP: 918 + case AIF3_CAP: 919 + /* only add to the list if value not set */ 920 + if (enable && !(wcd->tx_port_value & BIT(port_id))) { 921 + wcd->tx_port_value |= BIT(port_id); 922 + list_add_tail(&wcd->tx_chs[port_id].list, 923 + &wcd->dai[dai_id].slim_ch_list); 924 + } else if (!enable && (wcd->tx_port_value & BIT(port_id))) { 925 + wcd->tx_port_value &= ~BIT(port_id); 926 + list_del_init(&wcd->tx_chs[port_id].list); 927 + } 928 + break; 929 + default: 930 + dev_err(wcd->dev, "Unknown AIF %d\n", dai_id); 931 + return -EINVAL; 932 + } 933 + 934 + snd_soc_dapm_mixer_update_power(widget->dapm, kc, enable, update); 935 + 936 + return 0; 937 + } 938 + 1268 939 static const struct snd_kcontrol_new slim_rx_mux[WCD9335_RX_MAX] = { 1269 940 SOC_DAPM_ENUM_EXT("SLIM RX0 Mux", slim_rx_mux_enum, 1270 941 slim_rx_mux_get, slim_rx_mux_put), ··· 1332 905 SOC_DAPM_ENUM_EXT("SLIM RX7 Mux", slim_rx_mux_enum, 1333 906 slim_rx_mux_get, slim_rx_mux_put), 1334 907 }; 908 + 909 + static const struct snd_kcontrol_new aif1_cap_mixer[] = { 910 + SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0, 911 + slim_tx_mixer_get, slim_tx_mixer_put), 912 + SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0, 913 + slim_tx_mixer_get, slim_tx_mixer_put), 914 + SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0, 915 + slim_tx_mixer_get, slim_tx_mixer_put), 916 + SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0, 917 + slim_tx_mixer_get, slim_tx_mixer_put), 918 + SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0, 919 + slim_tx_mixer_get, slim_tx_mixer_put), 920 + SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0, 921 + slim_tx_mixer_get, slim_tx_mixer_put), 922 + SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0, 923 + slim_tx_mixer_get, slim_tx_mixer_put), 924 + SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0, 925 + slim_tx_mixer_get, slim_tx_mixer_put), 926 + SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0, 927 + slim_tx_mixer_get, slim_tx_mixer_put), 928 + SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9335_TX9, 1, 0, 929 + slim_tx_mixer_get, slim_tx_mixer_put), 930 + SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9335_TX10, 1, 0, 931 + slim_tx_mixer_get, slim_tx_mixer_put), 932 + SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9335_TX11, 1, 0, 933 + slim_tx_mixer_get, slim_tx_mixer_put), 934 + SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9335_TX13, 1, 0, 935 + slim_tx_mixer_get, slim_tx_mixer_put), 936 + }; 937 + 938 + static const struct snd_kcontrol_new aif2_cap_mixer[] = { 939 + SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0, 940 + slim_tx_mixer_get, slim_tx_mixer_put), 941 + SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0, 942 + slim_tx_mixer_get, slim_tx_mixer_put), 943 + SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0, 944 + slim_tx_mixer_get, slim_tx_mixer_put), 945 + SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0, 946 + slim_tx_mixer_get, slim_tx_mixer_put), 947 + SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0, 948 + slim_tx_mixer_get, slim_tx_mixer_put), 949 + SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0, 950 + slim_tx_mixer_get, slim_tx_mixer_put), 951 + SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0, 952 + slim_tx_mixer_get, slim_tx_mixer_put), 953 + SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0, 954 + slim_tx_mixer_get, slim_tx_mixer_put), 955 + SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0, 956 + slim_tx_mixer_get, slim_tx_mixer_put), 957 + SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9335_TX9, 1, 0, 958 + slim_tx_mixer_get, slim_tx_mixer_put), 959 + SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9335_TX10, 1, 0, 960 + slim_tx_mixer_get, slim_tx_mixer_put), 961 + SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9335_TX11, 1, 0, 962 + slim_tx_mixer_get, slim_tx_mixer_put), 963 + SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9335_TX13, 1, 0, 964 + slim_tx_mixer_get, slim_tx_mixer_put), 965 + }; 966 + 967 + static const struct snd_kcontrol_new aif3_cap_mixer[] = { 968 + SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0, 969 + slim_tx_mixer_get, slim_tx_mixer_put), 970 + SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0, 971 + slim_tx_mixer_get, slim_tx_mixer_put), 972 + SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0, 973 + slim_tx_mixer_get, slim_tx_mixer_put), 974 + SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0, 975 + slim_tx_mixer_get, slim_tx_mixer_put), 976 + SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0, 977 + slim_tx_mixer_get, slim_tx_mixer_put), 978 + SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0, 979 + slim_tx_mixer_get, slim_tx_mixer_put), 980 + SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0, 981 + slim_tx_mixer_get, slim_tx_mixer_put), 982 + SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0, 983 + slim_tx_mixer_get, slim_tx_mixer_put), 984 + SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0, 985 + slim_tx_mixer_get, slim_tx_mixer_put), 986 + }; 987 + 988 + static int wcd9335_put_dec_enum(struct snd_kcontrol *kc, 989 + struct snd_ctl_elem_value *ucontrol) 990 + { 991 + struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc); 992 + struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); 993 + struct soc_enum *e = (struct soc_enum *)kc->private_value; 994 + unsigned int val, reg, sel; 995 + 996 + val = ucontrol->value.enumerated.item[0]; 997 + 998 + switch (e->reg) { 999 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1: 1000 + reg = WCD9335_CDC_TX0_TX_PATH_CFG0; 1001 + break; 1002 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1: 1003 + reg = WCD9335_CDC_TX1_TX_PATH_CFG0; 1004 + break; 1005 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1: 1006 + reg = WCD9335_CDC_TX2_TX_PATH_CFG0; 1007 + break; 1008 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1: 1009 + reg = WCD9335_CDC_TX3_TX_PATH_CFG0; 1010 + break; 1011 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0: 1012 + reg = WCD9335_CDC_TX4_TX_PATH_CFG0; 1013 + break; 1014 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0: 1015 + reg = WCD9335_CDC_TX5_TX_PATH_CFG0; 1016 + break; 1017 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0: 1018 + reg = WCD9335_CDC_TX6_TX_PATH_CFG0; 1019 + break; 1020 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0: 1021 + reg = WCD9335_CDC_TX7_TX_PATH_CFG0; 1022 + break; 1023 + case WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0: 1024 + reg = WCD9335_CDC_TX8_TX_PATH_CFG0; 1025 + break; 1026 + default: 1027 + return -EINVAL; 1028 + } 1029 + 1030 + /* AMIC: 0, DMIC: 1 */ 1031 + sel = val ? WCD9335_CDC_TX_ADC_AMIC_SEL : WCD9335_CDC_TX_ADC_DMIC_SEL; 1032 + snd_soc_component_update_bits(component, reg, 1033 + WCD9335_CDC_TX_ADC_AMIC_DMIC_SEL_MASK, 1034 + sel); 1035 + 1036 + return snd_soc_dapm_put_enum_double(kc, ucontrol); 1037 + } 1335 1038 1336 1039 static int wcd9335_int_dem_inp_mux_put(struct snd_kcontrol *kc, 1337 1040 struct snd_ctl_elem_value *ucontrol) ··· 1504 947 SOC_DAPM_ENUM_EXT("RX INT2 DEM MUX Mux", rx_int2_dem_inp_mux_enum, 1505 948 snd_soc_dapm_get_enum_double, 1506 949 wcd9335_int_dem_inp_mux_put); 950 + 951 + static const struct snd_kcontrol_new tx_adc_mux0 = 952 + SOC_DAPM_ENUM_EXT("ADC MUX0 Mux", tx_adc_mux0_chain_enum, 953 + snd_soc_dapm_get_enum_double, 954 + wcd9335_put_dec_enum); 955 + 956 + static const struct snd_kcontrol_new tx_adc_mux1 = 957 + SOC_DAPM_ENUM_EXT("ADC MUX1 Mux", tx_adc_mux1_chain_enum, 958 + snd_soc_dapm_get_enum_double, 959 + wcd9335_put_dec_enum); 960 + 961 + static const struct snd_kcontrol_new tx_adc_mux2 = 962 + SOC_DAPM_ENUM_EXT("ADC MUX2 Mux", tx_adc_mux2_chain_enum, 963 + snd_soc_dapm_get_enum_double, 964 + wcd9335_put_dec_enum); 965 + 966 + static const struct snd_kcontrol_new tx_adc_mux3 = 967 + SOC_DAPM_ENUM_EXT("ADC MUX3 Mux", tx_adc_mux3_chain_enum, 968 + snd_soc_dapm_get_enum_double, 969 + wcd9335_put_dec_enum); 970 + 971 + static const struct snd_kcontrol_new tx_adc_mux4 = 972 + SOC_DAPM_ENUM_EXT("ADC MUX4 Mux", tx_adc_mux4_chain_enum, 973 + snd_soc_dapm_get_enum_double, 974 + wcd9335_put_dec_enum); 975 + 976 + static const struct snd_kcontrol_new tx_adc_mux5 = 977 + SOC_DAPM_ENUM_EXT("ADC MUX5 Mux", tx_adc_mux5_chain_enum, 978 + snd_soc_dapm_get_enum_double, 979 + wcd9335_put_dec_enum); 980 + 981 + static const struct snd_kcontrol_new tx_adc_mux6 = 982 + SOC_DAPM_ENUM_EXT("ADC MUX6 Mux", tx_adc_mux6_chain_enum, 983 + snd_soc_dapm_get_enum_double, 984 + wcd9335_put_dec_enum); 985 + 986 + static const struct snd_kcontrol_new tx_adc_mux7 = 987 + SOC_DAPM_ENUM_EXT("ADC MUX7 Mux", tx_adc_mux7_chain_enum, 988 + snd_soc_dapm_get_enum_double, 989 + wcd9335_put_dec_enum); 990 + 991 + static const struct snd_kcontrol_new tx_adc_mux8 = 992 + SOC_DAPM_ENUM_EXT("ADC MUX8 Mux", tx_adc_mux8_chain_enum, 993 + snd_soc_dapm_get_enum_double, 994 + wcd9335_put_dec_enum); 1507 995 1508 996 static int wcd9335_set_mix_interpolator_rate(struct snd_soc_dai *dai, 1509 997 int rate_val, ··· 1692 1090 WCD9335_SLIM_WATER_MARK_VAL); 1693 1091 if (ret < 0) 1694 1092 goto err; 1093 + } else { 1094 + ret = regmap_write(wcd->if_regmap, 1095 + WCD9335_SLIM_PGD_TX_PORT_MULTI_CHNL_0(ch->port), 1096 + payload & 0x00FF); 1097 + if (ret < 0) 1098 + goto err; 1099 + 1100 + /* ports 8,9 */ 1101 + ret = regmap_write(wcd->if_regmap, 1102 + WCD9335_SLIM_PGD_TX_PORT_MULTI_CHNL_1(ch->port), 1103 + (payload & 0xFF00)>>8); 1104 + if (ret < 0) 1105 + goto err; 1106 + 1107 + /* configure the slave port for water mark and enable*/ 1108 + ret = regmap_write(wcd->if_regmap, 1109 + WCD9335_SLIM_PGD_TX_PORT_CFG(ch->port), 1110 + WCD9335_SLIM_WATER_MARK_VAL); 1111 + 1112 + if (ret < 0) 1113 + goto err; 1695 1114 } 1696 1115 } 1697 1116 ··· 1728 1105 return ret; 1729 1106 } 1730 1107 1108 + static int wcd9335_set_decimator_rate(struct snd_soc_dai *dai, 1109 + u8 rate_val, u32 rate) 1110 + { 1111 + struct snd_soc_component *comp = dai->component; 1112 + struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp); 1113 + u8 shift = 0, shift_val = 0, tx_mux_sel; 1114 + struct wcd9335_slim_ch *ch; 1115 + int tx_port, tx_port_reg; 1116 + int decimator = -1; 1117 + 1118 + list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) { 1119 + tx_port = ch->port; 1120 + if ((tx_port == 12) || (tx_port >= 14)) { 1121 + dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n", 1122 + tx_port, dai->id); 1123 + return -EINVAL; 1124 + } 1125 + /* Find the SB TX MUX input - which decimator is connected */ 1126 + if (tx_port < 4) { 1127 + tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0; 1128 + shift = (tx_port << 1); 1129 + shift_val = 0x03; 1130 + } else if ((tx_port >= 4) && (tx_port < 8)) { 1131 + tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1; 1132 + shift = ((tx_port - 4) << 1); 1133 + shift_val = 0x03; 1134 + } else if ((tx_port >= 8) && (tx_port < 11)) { 1135 + tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2; 1136 + shift = ((tx_port - 8) << 1); 1137 + shift_val = 0x03; 1138 + } else if (tx_port == 11) { 1139 + tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3; 1140 + shift = 0; 1141 + shift_val = 0x0F; 1142 + } else if (tx_port == 13) { 1143 + tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3; 1144 + shift = 4; 1145 + shift_val = 0x03; 1146 + } else { 1147 + return -EINVAL; 1148 + } 1149 + 1150 + tx_mux_sel = snd_soc_component_read32(comp, tx_port_reg) & 1151 + (shift_val << shift); 1152 + 1153 + tx_mux_sel = tx_mux_sel >> shift; 1154 + if (tx_port <= 8) { 1155 + if ((tx_mux_sel == 0x2) || (tx_mux_sel == 0x3)) 1156 + decimator = tx_port; 1157 + } else if (tx_port <= 10) { 1158 + if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) 1159 + decimator = ((tx_port == 9) ? 7 : 6); 1160 + } else if (tx_port == 11) { 1161 + if ((tx_mux_sel >= 1) && (tx_mux_sel < 7)) 1162 + decimator = tx_mux_sel - 1; 1163 + } else if (tx_port == 13) { 1164 + if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2)) 1165 + decimator = 5; 1166 + } 1167 + 1168 + if (decimator >= 0) { 1169 + snd_soc_component_update_bits(comp, 1170 + WCD9335_CDC_TX_PATH_CTL(decimator), 1171 + WCD9335_CDC_TX_PATH_CTL_PCM_RATE_MASK, 1172 + rate_val); 1173 + } else if ((tx_port <= 8) && (tx_mux_sel == 0x01)) { 1174 + /* Check if the TX Mux input is RX MIX TXn */ 1175 + dev_err(wcd->dev, "RX_MIX_TX%u going to SLIM TX%u\n", 1176 + tx_port, tx_port); 1177 + } else { 1178 + dev_err(wcd->dev, "ERROR: Invalid decimator: %d\n", 1179 + decimator); 1180 + return -EINVAL; 1181 + } 1182 + } 1183 + 1184 + return 0; 1185 + } 1186 + 1731 1187 static int wcd9335_hw_params(struct snd_pcm_substream *substream, 1732 1188 struct snd_pcm_hw_params *params, 1733 1189 struct snd_soc_dai *dai) 1734 1190 { 1735 1191 struct wcd9335_codec *wcd; 1736 - int ret; 1192 + int ret, tx_fs_rate = 0; 1737 1193 1738 1194 wcd = snd_soc_component_get_drvdata(dai->component); 1739 1195 ··· 1833 1131 __func__, params_width(params)); 1834 1132 return -EINVAL; 1835 1133 } 1134 + break; 1135 + 1136 + case SNDRV_PCM_STREAM_CAPTURE: 1137 + switch (params_rate(params)) { 1138 + case 8000: 1139 + tx_fs_rate = 0; 1140 + break; 1141 + case 16000: 1142 + tx_fs_rate = 1; 1143 + break; 1144 + case 32000: 1145 + tx_fs_rate = 3; 1146 + break; 1147 + case 48000: 1148 + tx_fs_rate = 4; 1149 + break; 1150 + case 96000: 1151 + tx_fs_rate = 5; 1152 + break; 1153 + case 192000: 1154 + tx_fs_rate = 6; 1155 + break; 1156 + case 384000: 1157 + tx_fs_rate = 7; 1158 + break; 1159 + default: 1160 + dev_err(wcd->dev, "%s: Invalid TX sample rate: %d\n", 1161 + __func__, params_rate(params)); 1162 + return -EINVAL; 1163 + 1164 + }; 1165 + 1166 + ret = wcd9335_set_decimator_rate(dai, tx_fs_rate, 1167 + params_rate(params)); 1168 + if (ret < 0) { 1169 + dev_err(wcd->dev, "Cannot set TX Decimator rate\n"); 1170 + return ret; 1171 + } 1172 + switch (params_width(params)) { 1173 + case 16 ... 32: 1174 + wcd->dai[dai->id].sconfig.bps = params_width(params); 1175 + break; 1176 + default: 1177 + dev_err(wcd->dev, "%s: Invalid format 0x%x\n", 1178 + __func__, params_width(params)); 1179 + return -EINVAL; 1180 + }; 1836 1181 break; 1837 1182 default: 1838 1183 dev_err(wcd->dev, "Invalid stream type %d\n", ··· 1948 1199 } 1949 1200 } 1950 1201 1202 + if (wcd->tx_chs) { 1203 + wcd->num_tx_port = tx_num; 1204 + for (i = 0; i < tx_num; i++) { 1205 + wcd->tx_chs[i].ch_num = tx_slot[i]; 1206 + INIT_LIST_HEAD(&wcd->tx_chs[i].list); 1207 + } 1208 + } 1209 + 1951 1210 return 0; 1952 1211 } 1953 1212 ··· 1984 1227 rx_slot[i++] = ch->ch_num; 1985 1228 1986 1229 *rx_num = i; 1230 + break; 1231 + case AIF1_CAP: 1232 + case AIF2_CAP: 1233 + case AIF3_CAP: 1234 + if (!tx_slot || !tx_num) { 1235 + dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n", 1236 + tx_slot, tx_num); 1237 + return -EINVAL; 1238 + } 1239 + list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) 1240 + tx_slot[i++] = ch->ch_num; 1241 + 1242 + *tx_num = i; 1987 1243 break; 1988 1244 default: 1989 1245 dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id); ··· 2317 1547 SOC_ENUM("TX7 HPF cut off", cf_dec7_enum), 2318 1548 SOC_ENUM("TX8 HPF cut off", cf_dec8_enum), 2319 1549 }; 1550 + 1551 + static int wcd9335_micbias_control(struct snd_soc_component *component, 1552 + int micb_num, int req, bool is_dapm) 1553 + { 1554 + struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(component); 1555 + int micb_index = micb_num - 1; 1556 + u16 micb_reg; 1557 + 1558 + if ((micb_index < 0) || (micb_index > WCD9335_MAX_MICBIAS - 1)) { 1559 + dev_err(wcd->dev, "Invalid micbias index, micb_ind:%d\n", 1560 + micb_index); 1561 + return -EINVAL; 1562 + } 1563 + 1564 + switch (micb_num) { 1565 + case MIC_BIAS_1: 1566 + micb_reg = WCD9335_ANA_MICB1; 1567 + break; 1568 + case MIC_BIAS_2: 1569 + micb_reg = WCD9335_ANA_MICB2; 1570 + break; 1571 + case MIC_BIAS_3: 1572 + micb_reg = WCD9335_ANA_MICB3; 1573 + break; 1574 + case MIC_BIAS_4: 1575 + micb_reg = WCD9335_ANA_MICB4; 1576 + break; 1577 + default: 1578 + dev_err(component->dev, "%s: Invalid micbias number: %d\n", 1579 + __func__, micb_num); 1580 + return -EINVAL; 1581 + } 1582 + 1583 + switch (req) { 1584 + case MICB_PULLUP_ENABLE: 1585 + wcd->pullup_ref[micb_index]++; 1586 + if ((wcd->pullup_ref[micb_index] == 1) && 1587 + (wcd->micb_ref[micb_index] == 0)) 1588 + snd_soc_component_update_bits(component, micb_reg, 1589 + 0xC0, 0x80); 1590 + break; 1591 + case MICB_PULLUP_DISABLE: 1592 + wcd->pullup_ref[micb_index]--; 1593 + if ((wcd->pullup_ref[micb_index] == 0) && 1594 + (wcd->micb_ref[micb_index] == 0)) 1595 + snd_soc_component_update_bits(component, micb_reg, 1596 + 0xC0, 0x00); 1597 + break; 1598 + case MICB_ENABLE: 1599 + wcd->micb_ref[micb_index]++; 1600 + if (wcd->micb_ref[micb_index] == 1) 1601 + snd_soc_component_update_bits(component, micb_reg, 1602 + 0xC0, 0x40); 1603 + break; 1604 + case MICB_DISABLE: 1605 + wcd->micb_ref[micb_index]--; 1606 + if ((wcd->micb_ref[micb_index] == 0) && 1607 + (wcd->pullup_ref[micb_index] > 0)) 1608 + snd_soc_component_update_bits(component, micb_reg, 1609 + 0xC0, 0x80); 1610 + else if ((wcd->micb_ref[micb_index] == 0) && 1611 + (wcd->pullup_ref[micb_index] == 0)) { 1612 + snd_soc_component_update_bits(component, micb_reg, 1613 + 0xC0, 0x00); 1614 + } 1615 + break; 1616 + }; 1617 + 1618 + return 0; 1619 + } 1620 + 1621 + static int __wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget *w, 1622 + int event) 1623 + { 1624 + struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); 1625 + int micb_num; 1626 + 1627 + if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1"))) 1628 + micb_num = MIC_BIAS_1; 1629 + else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2"))) 1630 + micb_num = MIC_BIAS_2; 1631 + else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3"))) 1632 + micb_num = MIC_BIAS_3; 1633 + else if (strnstr(w->name, "MIC BIAS4", sizeof("MIC BIAS4"))) 1634 + micb_num = MIC_BIAS_4; 1635 + else 1636 + return -EINVAL; 1637 + 1638 + switch (event) { 1639 + case SND_SOC_DAPM_PRE_PMU: 1640 + /* 1641 + * MIC BIAS can also be requested by MBHC, 1642 + * so use ref count to handle micbias pullup 1643 + * and enable requests 1644 + */ 1645 + wcd9335_micbias_control(comp, micb_num, MICB_ENABLE, true); 1646 + break; 1647 + case SND_SOC_DAPM_POST_PMU: 1648 + /* wait for cnp time */ 1649 + usleep_range(1000, 1100); 1650 + break; 1651 + case SND_SOC_DAPM_POST_PMD: 1652 + wcd9335_micbias_control(comp, micb_num, MICB_DISABLE, true); 1653 + break; 1654 + }; 1655 + 1656 + return 0; 1657 + } 1658 + 1659 + static int wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget *w, 1660 + struct snd_kcontrol *kc, int event) 1661 + { 1662 + return __wcd9335_codec_enable_micbias(w, event); 1663 + } 1664 + 1665 + static void wcd9335_codec_set_tx_hold(struct snd_soc_component *comp, 1666 + u16 amic_reg, bool set) 1667 + { 1668 + u8 mask = 0x20; 1669 + u8 val; 1670 + 1671 + if (amic_reg == WCD9335_ANA_AMIC1 || amic_reg == WCD9335_ANA_AMIC3 || 1672 + amic_reg == WCD9335_ANA_AMIC5) 1673 + mask = 0x40; 1674 + 1675 + val = set ? mask : 0x00; 1676 + 1677 + switch (amic_reg) { 1678 + case WCD9335_ANA_AMIC1: 1679 + case WCD9335_ANA_AMIC2: 1680 + snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC2, mask, 1681 + val); 1682 + break; 1683 + case WCD9335_ANA_AMIC3: 1684 + case WCD9335_ANA_AMIC4: 1685 + snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC4, mask, 1686 + val); 1687 + break; 1688 + case WCD9335_ANA_AMIC5: 1689 + case WCD9335_ANA_AMIC6: 1690 + snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC6, mask, 1691 + val); 1692 + break; 1693 + default: 1694 + dev_err(comp->dev, "%s: invalid amic: %d\n", 1695 + __func__, amic_reg); 1696 + break; 1697 + } 1698 + } 1699 + 1700 + static int wcd9335_codec_enable_adc(struct snd_soc_dapm_widget *w, 1701 + struct snd_kcontrol *kc, int event) 1702 + { 1703 + struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); 1704 + 1705 + switch (event) { 1706 + case SND_SOC_DAPM_PRE_PMU: 1707 + wcd9335_codec_set_tx_hold(comp, w->reg, true); 1708 + break; 1709 + default: 1710 + break; 1711 + } 1712 + 1713 + return 0; 1714 + } 1715 + 1716 + static int wcd9335_codec_find_amic_input(struct snd_soc_component *comp, 1717 + int adc_mux_n) 1718 + { 1719 + int mux_sel, reg, mreg; 1720 + 1721 + if (adc_mux_n < 0 || adc_mux_n > WCD9335_MAX_VALID_ADC_MUX || 1722 + adc_mux_n == WCD9335_INVALID_ADC_MUX) 1723 + return 0; 1724 + 1725 + /* Check whether adc mux input is AMIC or DMIC */ 1726 + if (adc_mux_n < 4) { 1727 + reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + 2 * adc_mux_n; 1728 + mreg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + 2 * adc_mux_n; 1729 + mux_sel = snd_soc_component_read32(comp, reg) & 0x3; 1730 + } else { 1731 + reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + adc_mux_n - 4; 1732 + mreg = reg; 1733 + mux_sel = snd_soc_component_read32(comp, reg) >> 6; 1734 + } 1735 + 1736 + if (mux_sel != WCD9335_CDC_TX_INP_MUX_SEL_AMIC) 1737 + return 0; 1738 + 1739 + return snd_soc_component_read32(comp, mreg) & 0x07; 1740 + } 1741 + 1742 + static u16 wcd9335_codec_get_amic_pwlvl_reg(struct snd_soc_component *comp, 1743 + int amic) 1744 + { 1745 + u16 pwr_level_reg = 0; 1746 + 1747 + switch (amic) { 1748 + case 1: 1749 + case 2: 1750 + pwr_level_reg = WCD9335_ANA_AMIC1; 1751 + break; 1752 + 1753 + case 3: 1754 + case 4: 1755 + pwr_level_reg = WCD9335_ANA_AMIC3; 1756 + break; 1757 + 1758 + case 5: 1759 + case 6: 1760 + pwr_level_reg = WCD9335_ANA_AMIC5; 1761 + break; 1762 + default: 1763 + dev_err(comp->dev, "invalid amic: %d\n", amic); 1764 + break; 1765 + } 1766 + 1767 + return pwr_level_reg; 1768 + } 1769 + 1770 + static int wcd9335_codec_enable_dec(struct snd_soc_dapm_widget *w, 1771 + struct snd_kcontrol *kc, int event) 1772 + { 1773 + struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); 1774 + unsigned int decimator; 1775 + char *dec_adc_mux_name = NULL; 1776 + char *widget_name = NULL; 1777 + char *wname; 1778 + int ret = 0, amic_n; 1779 + u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg; 1780 + u16 tx_gain_ctl_reg; 1781 + char *dec; 1782 + u8 hpf_coff_freq; 1783 + 1784 + widget_name = kstrndup(w->name, 15, GFP_KERNEL); 1785 + if (!widget_name) 1786 + return -ENOMEM; 1787 + 1788 + wname = widget_name; 1789 + dec_adc_mux_name = strsep(&widget_name, " "); 1790 + if (!dec_adc_mux_name) { 1791 + dev_err(comp->dev, "%s: Invalid decimator = %s\n", 1792 + __func__, w->name); 1793 + ret = -EINVAL; 1794 + goto out; 1795 + } 1796 + dec_adc_mux_name = widget_name; 1797 + 1798 + dec = strpbrk(dec_adc_mux_name, "012345678"); 1799 + if (!dec) { 1800 + dev_err(comp->dev, "%s: decimator index not found\n", 1801 + __func__); 1802 + ret = -EINVAL; 1803 + goto out; 1804 + } 1805 + 1806 + ret = kstrtouint(dec, 10, &decimator); 1807 + if (ret < 0) { 1808 + dev_err(comp->dev, "%s: Invalid decimator = %s\n", 1809 + __func__, wname); 1810 + ret = -EINVAL; 1811 + goto out; 1812 + } 1813 + 1814 + tx_vol_ctl_reg = WCD9335_CDC_TX0_TX_PATH_CTL + 16 * decimator; 1815 + hpf_gate_reg = WCD9335_CDC_TX0_TX_PATH_SEC2 + 16 * decimator; 1816 + dec_cfg_reg = WCD9335_CDC_TX0_TX_PATH_CFG0 + 16 * decimator; 1817 + tx_gain_ctl_reg = WCD9335_CDC_TX0_TX_VOL_CTL + 16 * decimator; 1818 + 1819 + switch (event) { 1820 + case SND_SOC_DAPM_PRE_PMU: 1821 + amic_n = wcd9335_codec_find_amic_input(comp, decimator); 1822 + if (amic_n) 1823 + pwr_level_reg = wcd9335_codec_get_amic_pwlvl_reg(comp, 1824 + amic_n); 1825 + 1826 + if (pwr_level_reg) { 1827 + switch ((snd_soc_component_read32(comp, pwr_level_reg) & 1828 + WCD9335_AMIC_PWR_LVL_MASK) >> 1829 + WCD9335_AMIC_PWR_LVL_SHIFT) { 1830 + case WCD9335_AMIC_PWR_LEVEL_LP: 1831 + snd_soc_component_update_bits(comp, dec_cfg_reg, 1832 + WCD9335_DEC_PWR_LVL_MASK, 1833 + WCD9335_DEC_PWR_LVL_LP); 1834 + break; 1835 + 1836 + case WCD9335_AMIC_PWR_LEVEL_HP: 1837 + snd_soc_component_update_bits(comp, dec_cfg_reg, 1838 + WCD9335_DEC_PWR_LVL_MASK, 1839 + WCD9335_DEC_PWR_LVL_HP); 1840 + break; 1841 + case WCD9335_AMIC_PWR_LEVEL_DEFAULT: 1842 + default: 1843 + snd_soc_component_update_bits(comp, dec_cfg_reg, 1844 + WCD9335_DEC_PWR_LVL_MASK, 1845 + WCD9335_DEC_PWR_LVL_DF); 1846 + break; 1847 + } 1848 + } 1849 + hpf_coff_freq = (snd_soc_component_read32(comp, dec_cfg_reg) & 1850 + TX_HPF_CUT_OFF_FREQ_MASK) >> 5; 1851 + 1852 + if (hpf_coff_freq != CF_MIN_3DB_150HZ) 1853 + snd_soc_component_update_bits(comp, dec_cfg_reg, 1854 + TX_HPF_CUT_OFF_FREQ_MASK, 1855 + CF_MIN_3DB_150HZ << 5); 1856 + /* Enable TX PGA Mute */ 1857 + snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 1858 + 0x10, 0x10); 1859 + /* Enable APC */ 1860 + snd_soc_component_update_bits(comp, dec_cfg_reg, 0x08, 0x08); 1861 + break; 1862 + case SND_SOC_DAPM_POST_PMU: 1863 + snd_soc_component_update_bits(comp, hpf_gate_reg, 0x01, 0x00); 1864 + 1865 + if (decimator == 0) { 1866 + snd_soc_component_write(comp, 1867 + WCD9335_MBHC_ZDET_RAMP_CTL, 0x83); 1868 + snd_soc_component_write(comp, 1869 + WCD9335_MBHC_ZDET_RAMP_CTL, 0xA3); 1870 + snd_soc_component_write(comp, 1871 + WCD9335_MBHC_ZDET_RAMP_CTL, 0x83); 1872 + snd_soc_component_write(comp, 1873 + WCD9335_MBHC_ZDET_RAMP_CTL, 0x03); 1874 + } 1875 + 1876 + snd_soc_component_update_bits(comp, hpf_gate_reg, 1877 + 0x01, 0x01); 1878 + snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 1879 + 0x10, 0x00); 1880 + snd_soc_component_write(comp, tx_gain_ctl_reg, 1881 + snd_soc_component_read32(comp, tx_gain_ctl_reg)); 1882 + break; 1883 + case SND_SOC_DAPM_PRE_PMD: 1884 + hpf_coff_freq = (snd_soc_component_read32(comp, dec_cfg_reg) & 1885 + TX_HPF_CUT_OFF_FREQ_MASK) >> 5; 1886 + snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 0x10, 0x10); 1887 + snd_soc_component_update_bits(comp, dec_cfg_reg, 0x08, 0x00); 1888 + if (hpf_coff_freq != CF_MIN_3DB_150HZ) { 1889 + snd_soc_component_update_bits(comp, dec_cfg_reg, 1890 + TX_HPF_CUT_OFF_FREQ_MASK, 1891 + hpf_coff_freq << 5); 1892 + } 1893 + break; 1894 + case SND_SOC_DAPM_POST_PMD: 1895 + snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 0x10, 0x00); 1896 + break; 1897 + }; 1898 + out: 1899 + kfree(wname); 1900 + return ret; 1901 + } 1902 + 1903 + static u8 wcd9335_get_dmic_clk_val(struct snd_soc_component *component, 1904 + u32 mclk_rate, u32 dmic_clk_rate) 1905 + { 1906 + u32 div_factor; 1907 + u8 dmic_ctl_val; 1908 + 1909 + dev_err(component->dev, 1910 + "%s: mclk_rate = %d, dmic_sample_rate = %d\n", 1911 + __func__, mclk_rate, dmic_clk_rate); 1912 + 1913 + /* Default value to return in case of error */ 1914 + if (mclk_rate == WCD9335_MCLK_CLK_9P6MHZ) 1915 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2; 1916 + else 1917 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3; 1918 + 1919 + if (dmic_clk_rate == 0) { 1920 + dev_err(component->dev, 1921 + "%s: dmic_sample_rate cannot be 0\n", 1922 + __func__); 1923 + goto done; 1924 + } 1925 + 1926 + div_factor = mclk_rate / dmic_clk_rate; 1927 + switch (div_factor) { 1928 + case 2: 1929 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2; 1930 + break; 1931 + case 3: 1932 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3; 1933 + break; 1934 + case 4: 1935 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_4; 1936 + break; 1937 + case 6: 1938 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_6; 1939 + break; 1940 + case 8: 1941 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_8; 1942 + break; 1943 + case 16: 1944 + dmic_ctl_val = WCD9335_DMIC_CLK_DIV_16; 1945 + break; 1946 + default: 1947 + dev_err(component->dev, 1948 + "%s: Invalid div_factor %u, clk_rate(%u), dmic_rate(%u)\n", 1949 + __func__, div_factor, mclk_rate, dmic_clk_rate); 1950 + break; 1951 + } 1952 + 1953 + done: 1954 + return dmic_ctl_val; 1955 + } 1956 + 1957 + static int wcd9335_codec_enable_dmic(struct snd_soc_dapm_widget *w, 1958 + struct snd_kcontrol *kc, int event) 1959 + { 1960 + struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); 1961 + struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp); 1962 + u8 dmic_clk_en = 0x01; 1963 + u16 dmic_clk_reg; 1964 + s32 *dmic_clk_cnt; 1965 + u8 dmic_rate_val, dmic_rate_shift = 1; 1966 + unsigned int dmic; 1967 + int ret; 1968 + char *wname; 1969 + 1970 + wname = strpbrk(w->name, "012345"); 1971 + if (!wname) { 1972 + dev_err(comp->dev, "%s: widget not found\n", __func__); 1973 + return -EINVAL; 1974 + } 1975 + 1976 + ret = kstrtouint(wname, 10, &dmic); 1977 + if (ret < 0) { 1978 + dev_err(comp->dev, "%s: Invalid DMIC line on the codec\n", 1979 + __func__); 1980 + return -EINVAL; 1981 + } 1982 + 1983 + switch (dmic) { 1984 + case 0: 1985 + case 1: 1986 + dmic_clk_cnt = &(wcd->dmic_0_1_clk_cnt); 1987 + dmic_clk_reg = WCD9335_CPE_SS_DMIC0_CTL; 1988 + break; 1989 + case 2: 1990 + case 3: 1991 + dmic_clk_cnt = &(wcd->dmic_2_3_clk_cnt); 1992 + dmic_clk_reg = WCD9335_CPE_SS_DMIC1_CTL; 1993 + break; 1994 + case 4: 1995 + case 5: 1996 + dmic_clk_cnt = &(wcd->dmic_4_5_clk_cnt); 1997 + dmic_clk_reg = WCD9335_CPE_SS_DMIC2_CTL; 1998 + break; 1999 + default: 2000 + dev_err(comp->dev, "%s: Invalid DMIC Selection\n", 2001 + __func__); 2002 + return -EINVAL; 2003 + }; 2004 + 2005 + switch (event) { 2006 + case SND_SOC_DAPM_PRE_PMU: 2007 + dmic_rate_val = 2008 + wcd9335_get_dmic_clk_val(comp, 2009 + wcd->mclk_rate, 2010 + wcd->dmic_sample_rate); 2011 + 2012 + (*dmic_clk_cnt)++; 2013 + if (*dmic_clk_cnt == 1) { 2014 + snd_soc_component_update_bits(comp, dmic_clk_reg, 2015 + 0x07 << dmic_rate_shift, 2016 + dmic_rate_val << dmic_rate_shift); 2017 + snd_soc_component_update_bits(comp, dmic_clk_reg, 2018 + dmic_clk_en, dmic_clk_en); 2019 + } 2020 + 2021 + break; 2022 + case SND_SOC_DAPM_POST_PMD: 2023 + dmic_rate_val = 2024 + wcd9335_get_dmic_clk_val(comp, 2025 + wcd->mclk_rate, 2026 + wcd->mad_dmic_sample_rate); 2027 + (*dmic_clk_cnt)--; 2028 + if (*dmic_clk_cnt == 0) { 2029 + snd_soc_component_update_bits(comp, dmic_clk_reg, 2030 + dmic_clk_en, 0); 2031 + snd_soc_component_update_bits(comp, dmic_clk_reg, 2032 + 0x07 << dmic_rate_shift, 2033 + dmic_rate_val << dmic_rate_shift); 2034 + } 2035 + break; 2036 + }; 2037 + 2038 + return 0; 2039 + } 2320 2040 2321 2041 static void wcd9335_codec_enable_int_port(struct wcd_slim_codec_dai_data *dai, 2322 2042 struct snd_soc_component *component) ··· 4413 3153 wcd9335_codec_enable_mclk, SND_SOC_DAPM_PRE_PMU | 4414 3154 SND_SOC_DAPM_POST_PMD), 4415 3155 3156 + /* TX */ 3157 + SND_SOC_DAPM_INPUT("AMIC1"), 3158 + SND_SOC_DAPM_INPUT("AMIC2"), 3159 + SND_SOC_DAPM_INPUT("AMIC3"), 3160 + SND_SOC_DAPM_INPUT("AMIC4"), 3161 + SND_SOC_DAPM_INPUT("AMIC5"), 3162 + SND_SOC_DAPM_INPUT("AMIC6"), 3163 + 3164 + SND_SOC_DAPM_AIF_OUT_E("AIF1 CAP", "AIF1 Capture", 0, SND_SOC_NOPM, 3165 + AIF1_CAP, 0, wcd9335_codec_enable_slim, 3166 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 3167 + 3168 + SND_SOC_DAPM_AIF_OUT_E("AIF2 CAP", "AIF2 Capture", 0, SND_SOC_NOPM, 3169 + AIF2_CAP, 0, wcd9335_codec_enable_slim, 3170 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 3171 + 3172 + SND_SOC_DAPM_AIF_OUT_E("AIF3 CAP", "AIF3 Capture", 0, SND_SOC_NOPM, 3173 + AIF3_CAP, 0, wcd9335_codec_enable_slim, 3174 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 3175 + 3176 + SND_SOC_DAPM_SUPPLY("MIC BIAS1", SND_SOC_NOPM, 0, 0, 3177 + wcd9335_codec_enable_micbias, 3178 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3179 + SND_SOC_DAPM_POST_PMD), 3180 + SND_SOC_DAPM_SUPPLY("MIC BIAS2", SND_SOC_NOPM, 0, 0, 3181 + wcd9335_codec_enable_micbias, 3182 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3183 + SND_SOC_DAPM_POST_PMD), 3184 + SND_SOC_DAPM_SUPPLY("MIC BIAS3", SND_SOC_NOPM, 0, 0, 3185 + wcd9335_codec_enable_micbias, 3186 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3187 + SND_SOC_DAPM_POST_PMD), 3188 + SND_SOC_DAPM_SUPPLY("MIC BIAS4", SND_SOC_NOPM, 0, 0, 3189 + wcd9335_codec_enable_micbias, 3190 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3191 + SND_SOC_DAPM_POST_PMD), 3192 + 3193 + SND_SOC_DAPM_ADC_E("ADC1", NULL, WCD9335_ANA_AMIC1, 7, 0, 3194 + wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), 3195 + SND_SOC_DAPM_ADC_E("ADC2", NULL, WCD9335_ANA_AMIC2, 7, 0, 3196 + wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), 3197 + SND_SOC_DAPM_ADC_E("ADC3", NULL, WCD9335_ANA_AMIC3, 7, 0, 3198 + wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), 3199 + SND_SOC_DAPM_ADC_E("ADC4", NULL, WCD9335_ANA_AMIC4, 7, 0, 3200 + wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), 3201 + SND_SOC_DAPM_ADC_E("ADC5", NULL, WCD9335_ANA_AMIC5, 7, 0, 3202 + wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), 3203 + SND_SOC_DAPM_ADC_E("ADC6", NULL, WCD9335_ANA_AMIC6, 7, 0, 3204 + wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU), 3205 + 3206 + /* Digital Mic Inputs */ 3207 + SND_SOC_DAPM_ADC_E("DMIC0", NULL, SND_SOC_NOPM, 0, 0, 3208 + wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | 3209 + SND_SOC_DAPM_POST_PMD), 3210 + 3211 + SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, 3212 + wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | 3213 + SND_SOC_DAPM_POST_PMD), 3214 + 3215 + SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0, 3216 + wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | 3217 + SND_SOC_DAPM_POST_PMD), 3218 + 3219 + SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0, 3220 + wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | 3221 + SND_SOC_DAPM_POST_PMD), 3222 + 3223 + SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0, 3224 + wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | 3225 + SND_SOC_DAPM_POST_PMD), 3226 + 3227 + SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 0, 3228 + wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU | 3229 + SND_SOC_DAPM_POST_PMD), 3230 + 3231 + SND_SOC_DAPM_MUX("DMIC MUX0", SND_SOC_NOPM, 0, 0, 3232 + &tx_dmic_mux0), 3233 + SND_SOC_DAPM_MUX("DMIC MUX1", SND_SOC_NOPM, 0, 0, 3234 + &tx_dmic_mux1), 3235 + SND_SOC_DAPM_MUX("DMIC MUX2", SND_SOC_NOPM, 0, 0, 3236 + &tx_dmic_mux2), 3237 + SND_SOC_DAPM_MUX("DMIC MUX3", SND_SOC_NOPM, 0, 0, 3238 + &tx_dmic_mux3), 3239 + SND_SOC_DAPM_MUX("DMIC MUX4", SND_SOC_NOPM, 0, 0, 3240 + &tx_dmic_mux4), 3241 + SND_SOC_DAPM_MUX("DMIC MUX5", SND_SOC_NOPM, 0, 0, 3242 + &tx_dmic_mux5), 3243 + SND_SOC_DAPM_MUX("DMIC MUX6", SND_SOC_NOPM, 0, 0, 3244 + &tx_dmic_mux6), 3245 + SND_SOC_DAPM_MUX("DMIC MUX7", SND_SOC_NOPM, 0, 0, 3246 + &tx_dmic_mux7), 3247 + SND_SOC_DAPM_MUX("DMIC MUX8", SND_SOC_NOPM, 0, 0, 3248 + &tx_dmic_mux8), 3249 + 3250 + SND_SOC_DAPM_MUX("AMIC MUX0", SND_SOC_NOPM, 0, 0, 3251 + &tx_amic_mux0), 3252 + SND_SOC_DAPM_MUX("AMIC MUX1", SND_SOC_NOPM, 0, 0, 3253 + &tx_amic_mux1), 3254 + SND_SOC_DAPM_MUX("AMIC MUX2", SND_SOC_NOPM, 0, 0, 3255 + &tx_amic_mux2), 3256 + SND_SOC_DAPM_MUX("AMIC MUX3", SND_SOC_NOPM, 0, 0, 3257 + &tx_amic_mux3), 3258 + SND_SOC_DAPM_MUX("AMIC MUX4", SND_SOC_NOPM, 0, 0, 3259 + &tx_amic_mux4), 3260 + SND_SOC_DAPM_MUX("AMIC MUX5", SND_SOC_NOPM, 0, 0, 3261 + &tx_amic_mux5), 3262 + SND_SOC_DAPM_MUX("AMIC MUX6", SND_SOC_NOPM, 0, 0, 3263 + &tx_amic_mux6), 3264 + SND_SOC_DAPM_MUX("AMIC MUX7", SND_SOC_NOPM, 0, 0, 3265 + &tx_amic_mux7), 3266 + SND_SOC_DAPM_MUX("AMIC MUX8", SND_SOC_NOPM, 0, 0, 3267 + &tx_amic_mux8), 3268 + 3269 + SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0, 3270 + aif1_cap_mixer, ARRAY_SIZE(aif1_cap_mixer)), 3271 + 3272 + SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0, 3273 + aif2_cap_mixer, ARRAY_SIZE(aif2_cap_mixer)), 3274 + 3275 + SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0, 3276 + aif3_cap_mixer, ARRAY_SIZE(aif3_cap_mixer)), 3277 + 3278 + SND_SOC_DAPM_MUX("SLIM TX0 MUX", SND_SOC_NOPM, WCD9335_TX0, 0, 3279 + &sb_tx0_mux), 3280 + SND_SOC_DAPM_MUX("SLIM TX1 MUX", SND_SOC_NOPM, WCD9335_TX1, 0, 3281 + &sb_tx1_mux), 3282 + SND_SOC_DAPM_MUX("SLIM TX2 MUX", SND_SOC_NOPM, WCD9335_TX2, 0, 3283 + &sb_tx2_mux), 3284 + SND_SOC_DAPM_MUX("SLIM TX3 MUX", SND_SOC_NOPM, WCD9335_TX3, 0, 3285 + &sb_tx3_mux), 3286 + SND_SOC_DAPM_MUX("SLIM TX4 MUX", SND_SOC_NOPM, WCD9335_TX4, 0, 3287 + &sb_tx4_mux), 3288 + SND_SOC_DAPM_MUX("SLIM TX5 MUX", SND_SOC_NOPM, WCD9335_TX5, 0, 3289 + &sb_tx5_mux), 3290 + SND_SOC_DAPM_MUX("SLIM TX6 MUX", SND_SOC_NOPM, WCD9335_TX6, 0, 3291 + &sb_tx6_mux), 3292 + SND_SOC_DAPM_MUX("SLIM TX7 MUX", SND_SOC_NOPM, WCD9335_TX7, 0, 3293 + &sb_tx7_mux), 3294 + SND_SOC_DAPM_MUX("SLIM TX8 MUX", SND_SOC_NOPM, WCD9335_TX8, 0, 3295 + &sb_tx8_mux), 3296 + 3297 + SND_SOC_DAPM_MUX_E("ADC MUX0", WCD9335_CDC_TX0_TX_PATH_CTL, 5, 0, 3298 + &tx_adc_mux0, wcd9335_codec_enable_dec, 3299 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3300 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3301 + 3302 + SND_SOC_DAPM_MUX_E("ADC MUX1", WCD9335_CDC_TX1_TX_PATH_CTL, 5, 0, 3303 + &tx_adc_mux1, wcd9335_codec_enable_dec, 3304 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3305 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3306 + 3307 + SND_SOC_DAPM_MUX_E("ADC MUX2", WCD9335_CDC_TX2_TX_PATH_CTL, 5, 0, 3308 + &tx_adc_mux2, wcd9335_codec_enable_dec, 3309 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3310 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3311 + 3312 + SND_SOC_DAPM_MUX_E("ADC MUX3", WCD9335_CDC_TX3_TX_PATH_CTL, 5, 0, 3313 + &tx_adc_mux3, wcd9335_codec_enable_dec, 3314 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3315 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3316 + 3317 + SND_SOC_DAPM_MUX_E("ADC MUX4", WCD9335_CDC_TX4_TX_PATH_CTL, 5, 0, 3318 + &tx_adc_mux4, wcd9335_codec_enable_dec, 3319 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3320 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3321 + 3322 + SND_SOC_DAPM_MUX_E("ADC MUX5", WCD9335_CDC_TX5_TX_PATH_CTL, 5, 0, 3323 + &tx_adc_mux5, wcd9335_codec_enable_dec, 3324 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3325 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3326 + 3327 + SND_SOC_DAPM_MUX_E("ADC MUX6", WCD9335_CDC_TX6_TX_PATH_CTL, 5, 0, 3328 + &tx_adc_mux6, wcd9335_codec_enable_dec, 3329 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3330 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3331 + 3332 + SND_SOC_DAPM_MUX_E("ADC MUX7", WCD9335_CDC_TX7_TX_PATH_CTL, 5, 0, 3333 + &tx_adc_mux7, wcd9335_codec_enable_dec, 3334 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3335 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 3336 + 3337 + SND_SOC_DAPM_MUX_E("ADC MUX8", WCD9335_CDC_TX8_TX_PATH_CTL, 5, 0, 3338 + &tx_adc_mux8, wcd9335_codec_enable_dec, 3339 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3340 + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 4416 3341 }; 4417 3342 4418 3343 static void wcd9335_enable_sido_buck(struct snd_soc_component *component) ··· 4734 3289 struct device *dev = wcd->dev; 4735 3290 4736 3291 memcpy(wcd->rx_chs, wcd9335_rx_chs, sizeof(wcd9335_rx_chs)); 3292 + memcpy(wcd->tx_chs, wcd9335_tx_chs, sizeof(wcd9335_tx_chs)); 4737 3293 4738 3294 wcd->sido_input_src = SIDO_SOURCE_INTERNAL; 4739 3295 wcd->sido_voltage = SIDO_VOLTAGE_NOMINAL_MV;