SND_SOC_DAPM_MUX("Out 4 Mux", SND_SOC_NOPM, 0, 0, &wm9713_out4_mux_controls), SND_SOC_DAPM_MUX("DAC Inv Mux 1", SND_SOC_NOPM, 0, 0, &wm9713_dac_inv1_mux_controls), SND_SOC_DAPM_MUX("DAC Inv Mux 2", SND_SOC_NOPM, 0, 0, &wm9713_dac_inv2_mux_controls), SND_SOC_DAPM_MUX("Left Capture Source", SND_SOC_NOPM, 0, 0, &wm9713_rec_srcl_mux_controls), SND_SOC_DAPM_MUX("Right Capture Source", SND_SOC_NOPM, 0, 0, &wm9713_rec_srcr_mux_controls), SND_SOC_DAPM_MUX("Mic A Source", SND_SOC_NOPM, 0, 0, &wm9713_mic_sel_mux_controls), SND_SOC_DAPM_MUX("Mic B Source", SND_SOC_NOPM, 0, 0, &wm9713_micb_sel_mux_controls), SND_SOC_DAPM_MIXER_E("Left HP Mixer", AC97_EXTENDED_MID, 3, 1, &wm9713_hpl_mixer_controls[0], ARRAY_SIZE(wm9713_hpl_mixer_controls), mixer_event, SND_SOC_DAPM_POST_REG), SND_SOC_DAPM_MIXER_E("Right HP Mixer", AC97_EXTENDED_MID, 2, 1, &wm9713_hpr_mixer_controls[0], ARRAY_SIZE(wm9713_hpr_mixer_controls), mixer_event, SND_SOC_DAPM_POST_REG), SND_SOC_DAPM_MIXER("Mono Mixer", AC97_EXTENDED_MID, 0, 1, &wm9713_mono_mixer_controls[0], ARRAY_SIZE(wm9713_mono_mixer_controls)), SND_SOC_DAPM_MIXER("Speaker Mixer", AC97_EXTENDED_MID, 1, 1, &wm9713_speaker_mixer_controls[0], ARRAY_SIZE(wm9713_speaker_mixer_controls)), SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", AC97_EXTENDED_MID, 7, 1), SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", AC97_EXTENDED_MID, 6, 1), SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("HP Mixer", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("Line Mixer", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("Capture Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MIXER("LIN34 PGA", WM8400_POWER_MANAGEMENT_2, WM8400_LIN34_ENA_SHIFT, 0, &wm8400_dapm_lin34_pga_controls[0], ARRAY_SIZE(wm8400_dapm_lin34_pga_controls)), SND_SOC_DAPM_MIXER("RIN12 PGA", WM8400_POWER_MANAGEMENT_2, WM8400_RIN12_ENA_SHIFT, 0, &wm8400_dapm_rin12_pga_controls[0], ARRAY_SIZE(wm8400_dapm_rin12_pga_controls)), SND_SOC_DAPM_MIXER("RIN34 PGA", WM8400_POWER_MANAGEMENT_2, WM8400_RIN34_ENA_SHIFT, 0, &wm8400_dapm_rin34_pga_controls[0], ARRAY_SIZE(wm8400_dapm_rin34_pga_controls)), /* INMIXL */ SND_SOC_DAPM_MIXER_E("INMIXL", WM8400_INTDRIVBITS, WM8400_INMIXL_PWR, 0, &wm8400_dapm_inmixl_controls[0], ARRAY_SIZE(wm8400_dapm_inmixl_controls), inmixer_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), /* AINLMUX */ SND_SOC_DAPM_MUX_E("AILNMUX", WM8400_INTDRIVBITS, WM8400_AINLMUX_PWR, 0, &wm8400_dapm_ainlmux_controls, inmixer_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), /* INMIXR */ SND_SOC_DAPM_MIXER_E("INMIXR", WM8400_INTDRIVBITS, WM8400_INMIXR_PWR, 0, &wm8400_dapm_inmixr_controls[0], ARRAY_SIZE(wm8400_dapm_inmixr_controls), inmixer_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), /* AINRMUX */ SND_SOC_DAPM_MUX_E("AIRNMUX", WM8400_INTDRIVBITS, WM8400_AINRMUX_PWR, 0,
AK4671_MIXING_POWER_MANAGEMENT1, 5, 0, NULL, 0), SND_SOC_DAPM_PGA("LIN4 Mixing Circuit", AK4671_MIXING_POWER_MANAGEMENT1, 6, 0, NULL, 0), SND_SOC_DAPM_PGA("RIN4 Mixing Circuit", AK4671_MIXING_POWER_MANAGEMENT1, 7, 0, NULL, 0), /* Output Mixers */ SND_SOC_DAPM_MIXER("LOUT1 Mixer", AK4671_LOUT1_POWER_MANAGERMENT, 0, 0, &ak4671_lout1_mixer_controls[0], ARRAY_SIZE(ak4671_lout1_mixer_controls)), SND_SOC_DAPM_MIXER("ROUT1 Mixer", AK4671_LOUT1_POWER_MANAGERMENT, 1, 0, &ak4671_rout1_mixer_controls[0], ARRAY_SIZE(ak4671_rout1_mixer_controls)), SND_SOC_DAPM_MIXER_E("LOUT2 Mixer", AK4671_LOUT2_POWER_MANAGERMENT, 0, 0, &ak4671_lout2_mixer_controls[0], ARRAY_SIZE(ak4671_lout2_mixer_controls), ak4671_out2_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_MIXER_E("ROUT2 Mixer", AK4671_LOUT2_POWER_MANAGERMENT, 1, 0, &ak4671_rout2_mixer_controls[0], ARRAY_SIZE(ak4671_rout2_mixer_controls), ak4671_out2_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_MIXER("LOUT3 Mixer", AK4671_LOUT3_POWER_MANAGERMENT, 0, 0, &ak4671_lout3_mixer_controls[0], ARRAY_SIZE(ak4671_lout3_mixer_controls)), SND_SOC_DAPM_MIXER("ROUT3 Mixer", AK4671_LOUT3_POWER_MANAGERMENT, 1, 0, &ak4671_rout3_mixer_controls[0], ARRAY_SIZE(ak4671_rout3_mixer_controls)), /* Input MUXs */
ARRAY_SIZE(wm8400_dapm_inmixr_controls)), /* AINRMUX */ SND_SOC_DAPM_MUX("AIRNMUX", SND_SOC_NOPM, 0, 0, &wm8400_dapm_ainrmux_controls), /* Output Side */ /* DACs */ SND_SOC_DAPM_DAC("Left DAC", "Left Playback", WM8400_POWER_MANAGEMENT_3, WM8400_DACL_ENA_SHIFT, 0), SND_SOC_DAPM_DAC("Right DAC", "Right Playback", WM8400_POWER_MANAGEMENT_3, WM8400_DACR_ENA_SHIFT, 0), /* LOMIX */ SND_SOC_DAPM_MIXER_E("LOMIX", WM8400_POWER_MANAGEMENT_3, WM8400_LOMIX_ENA_SHIFT, 0, &wm8400_dapm_lomix_controls[0], ARRAY_SIZE(wm8400_dapm_lomix_controls), outmixer_event, SND_SOC_DAPM_PRE_REG), /* LONMIX */ SND_SOC_DAPM_MIXER("LONMIX", WM8400_POWER_MANAGEMENT_3, WM8400_LON_ENA_SHIFT, 0, &wm8400_dapm_lonmix_controls[0], ARRAY_SIZE(wm8400_dapm_lonmix_controls)), /* LOPMIX */ SND_SOC_DAPM_MIXER("LOPMIX", WM8400_POWER_MANAGEMENT_3, WM8400_LOP_ENA_SHIFT, 0, &wm8400_dapm_lopmix_controls[0], ARRAY_SIZE(wm8400_dapm_lopmix_controls)), /* OUT3MIX */ SND_SOC_DAPM_MIXER("OUT3MIX", WM8400_POWER_MANAGEMENT_1, WM8400_OUT3_ENA_SHIFT,
static int fighter_hac_power_amp_on(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { int ret; struct pm_gpio param = { .direction = PM_GPIO_DIR_OUT, .output_buffer = PM_GPIO_OUT_BUF_CMOS, .output_value = 1, .pull = PM_GPIO_PULL_NO, .vin_sel = PM_GPIO_VIN_S4, .out_strength = PM_GPIO_STRENGTH_MED, .function = PM_GPIO_FUNC_NORMAL, }; pr_info("%s %d\n", __func__, event); switch (event) { case SND_SOC_DAPM_PRE_PMU: ret = gpio_request(HAC_PAMP_GPIO, "AUDIO_HAC_AMP"); if (ret) { pr_err("%s: Error requesting GPIO %d\n", __func__, HAC_PAMP_GPIO); return ret; } ret = pm8xxx_gpio_config(HAC_PAMP_GPIO, ¶m); if (ret) pr_err("%s: Failed to configure Top Spk Ampl" " gpio %u\n", __func__, HAC_PAMP_GPIO); else { pr_debug("%s: enable hac amp gpio\n", __func__); gpio_direction_output(HAC_PAMP_GPIO, 1); } break; case SND_SOC_DAPM_POST_PMD: gpio_direction_output(HAC_PAMP_GPIO, 0); gpio_free(HAC_PAMP_GPIO); pr_debug("%s: sleeping 4 ms after turning off external" " HAC Ampl\n", __func__); usleep_range(4000, 4000); break; } return 0; } static const struct snd_kcontrol_new hacamp_switch_controls = SOC_DAPM_SINGLE("Switch", 0, 0, 1, 0); static const struct snd_kcontrol_new spkamp_switch_controls = SOC_DAPM_SINGLE("Switch", 0, 0, 1, 0); static const struct snd_soc_dapm_widget fighter_dapm_widgets[] = { SND_SOC_DAPM_MIXER("Lineout Mixer", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER_E("SPK AMP EN", SND_SOC_NOPM, 0, 0, &spkamp_switch_controls, 1, fighter_spk_power_amp_on, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_MIXER_E("HAC AMP EN", SND_SOC_NOPM, 0, 0, &hacamp_switch_controls, 1, fighter_hac_power_amp_on, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; static const struct snd_soc_dapm_widget msm8960_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, msm8960_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SPK("Ext Spk Bottom Pos", NULL), SND_SOC_DAPM_SPK("Ext Spk Bottom Neg", NULL), SND_SOC_DAPM_SPK("Ext USB AMP Pos", msm8960_spkramp_event), SND_SOC_DAPM_SPK("Ext USB AMP Neg", msm8960_spkramp_event), SND_SOC_DAPM_MIC("Handset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Back Mic", NULL), SND_SOC_DAPM_MIC("Digital Mic1", NULL), SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL), SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL), SND_SOC_DAPM_MIC("Digital Mic1", NULL), SND_SOC_DAPM_MIC("Digital Mic2", NULL), SND_SOC_DAPM_MIC("Digital Mic3", NULL), SND_SOC_DAPM_MIC("Digital Mic4", NULL), SND_SOC_DAPM_MIC("Digital Mic5", NULL), SND_SOC_DAPM_MIC("Digital Mic6", NULL), }; static const struct snd_soc_dapm_route tabla_1_x_audio_map[] = { /* Speaker/HAC path */ {"Lineout Mixer", NULL, "LINEOUT2"}, {"Lineout Mixer", NULL, "LINEOUT1"}, /* USB Audio path */ {"Ext USB AMP Pos", NULL, "LINEOUT3"}, {"Ext USB AMP Neg", NULL, "LINEOUT4"}, }; static const struct snd_soc_dapm_route tabla_2_x_audio_map[] = { /* Speaker/HAC path */ {"Lineout Mixer", NULL, "LINEOUT3"}, {"Lineout Mixer", NULL, "LINEOUT1"}, /* USB Audio path */ {"Ext USB AMP Pos", NULL, "LINEOUT2"}, {"Ext USB AMP Neg", NULL, "LINEOUT4"}, }; static const struct snd_soc_dapm_route common_audio_map[] = { {"RX_BIAS", NULL, "MCLK"}, {"LDO_H", NULL, "MCLK"}, /* Speaker path */ {"Ext Spk Bottom Pos", NULL, "SPK AMP EN"}, {"Ext Spk Bottom Neg", NULL, "SPK AMP EN"}, {"SPK AMP EN", "Switch", "Lineout Mixer"}, /* HAC path */ {"Ext Spk Bottom Pos", NULL, "HAC AMP EN"}, {"Ext Spk Bottom Neg", NULL, "HAC AMP EN"}, {"HAC AMP EN", "Switch", "Lineout Mixer"}, /* Microphone path */ {"AMIC1", NULL, "MIC BIAS1 External"}, {"MIC BIAS1 External", NULL, "Handset Mic"}, {"AMIC2", NULL, "MIC BIAS2 External"}, {"MIC BIAS2 External", NULL, "Headset Mic"}, {"AMIC3", NULL, "MIC BIAS3 External"}, {"MIC BIAS3 External", NULL, "Back Mic"}, {"HEADPHONE", NULL, "LDO_H"}, /** * The digital Mic routes are setup considering * fluid as default device. */ /** * Digital Mic1. Front Bottom left Digital Mic on Fluid and MTP. * Digital Mic GM5 on CDP mainboard. * Conncted to DMIC2 Input on Tabla codec. */ {"DMIC2", NULL, "MIC BIAS1 External"}, {"MIC BIAS1 External", NULL, "Digital Mic1"}, /** * Digital Mic2. Front Bottom right Digital Mic on Fluid and MTP. * Digital Mic GM6 on CDP mainboard. * Conncted to DMIC1 Input on Tabla codec. */ {"DMIC1", NULL, "MIC BIAS1 External"}, {"MIC BIAS1 External", NULL, "Digital Mic2"}, /** * Digital Mic3. Back Bottom Digital Mic on Fluid. * Digital Mic GM1 on CDP mainboard. * Conncted to DMIC4 Input on Tabla codec. */ {"DMIC4", NULL, "MIC BIAS3 External"}, {"MIC BIAS3 External", NULL, "Digital Mic3"}, /** * Digital Mic4. Back top Digital Mic on Fluid. * Digital Mic GM2 on CDP mainboard. * Conncted to DMIC3 Input on Tabla codec. */ {"DMIC3", NULL, "MIC BIAS3 External"}, {"MIC BIAS3 External", NULL, "Digital Mic4"}, /** * Digital Mic5. Front top Digital Mic on Fluid. * Digital Mic GM3 on CDP mainboard. * Conncted to DMIC5 Input on Tabla codec. */ {"DMIC5", NULL, "MIC BIAS4 External"}, {"MIC BIAS4 External", NULL, "Digital Mic5"}, }; static const char *spk_function[] = {"Off", "On"}; static const char *slim0_rx_ch_text[] = {"One", "Two"}; static const char *slim0_tx_ch_text[] = {"One", "Two", "Three", "Four"}; static const struct soc_enum msm8960_enum[] = { SOC_ENUM_SINGLE_EXT(2, spk_function), SOC_ENUM_SINGLE_EXT(2, slim0_rx_ch_text), SOC_ENUM_SINGLE_EXT(4, slim0_tx_ch_text), }; static const char *btsco_rate_text[] = {"8000", "16000"}; static const struct soc_enum msm8960_btsco_enum[] = { SOC_ENUM_SINGLE_EXT(2, btsco_rate_text), }; static int msm8960_slim_0_rx_ch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { pr_debug("%s: msm8960_slim_0_rx_ch = %d\n", __func__, msm8960_slim_0_rx_ch); ucontrol->value.integer.value[0] = msm8960_slim_0_rx_ch - 1; return 0; }
SND_SOC_DAPM_AIF_IN("I2S RX2", NULL, 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_AIF_IN("I2S RX3", NULL, 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_OUTPUT("PDM_RX1"), SND_SOC_DAPM_OUTPUT("PDM_RX2"), SND_SOC_DAPM_OUTPUT("PDM_RX3"), SND_SOC_DAPM_INPUT("LPASS_PDM_TX"), SND_SOC_DAPM_MIXER("RX1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("RX2 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER("RX3 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0), /* Interpolator */ SND_SOC_DAPM_MIXER_E("RX1 INT", LPASS_CDC_CLK_RX_B1_CTL, 0, 0, NULL, 0, msm8916_wcd_digital_enable_interpolator, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_MIXER_E("RX2 INT", LPASS_CDC_CLK_RX_B1_CTL, 1, 0, NULL, 0, msm8916_wcd_digital_enable_interpolator, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_MIXER_E("RX3 INT", LPASS_CDC_CLK_RX_B1_CTL, 2, 0, NULL, 0, msm8916_wcd_digital_enable_interpolator, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_MUX("RX1 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx_mix1_inp1_mux), SND_SOC_DAPM_MUX("RX1 MIX1 INP2", SND_SOC_NOPM, 0, 0, &rx_mix1_inp2_mux), SND_SOC_DAPM_MUX("RX1 MIX1 INP3", SND_SOC_NOPM, 0, 0, &rx_mix1_inp3_mux), SND_SOC_DAPM_MUX("RX2 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx2_mix1_inp1_mux),
/* Outputs */ SND_SOC_DAPM_OUTPUT("HPOUTL"), SND_SOC_DAPM_OUTPUT("HPOUTR"), SND_SOC_DAPM_OUTPUT("LINEOUT"), SND_SOC_DAPM_PGA("HPL Out", PW_MGMT2, 5, 0, NULL, 0), SND_SOC_DAPM_PGA("HPR Out", PW_MGMT2, 4, 0, NULL, 0), SND_SOC_DAPM_SWITCH("Headphone Enable", SND_SOC_NOPM, 0, 0, &ak4642_headphone_control), SND_SOC_DAPM_PGA("DACH", MD_CTL4, 0, 0, NULL, 0), SND_SOC_DAPM_MIXER_E("LINEOUT Mixer", PW_MGMT1, 3, 0, &ak4642_lout_mixer_controls[0], ARRAY_SIZE(ak4642_lout_mixer_controls), ak4642_lout_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), /* DAC */ SND_SOC_DAPM_DAC("DAC", NULL, PW_MGMT1, 2, 0), }; static const struct snd_soc_dapm_route ak4642_intercon[] = { /* Outputs */ {"HPOUTL", NULL, "HPL Out"}, {"HPOUTR", NULL, "HPR Out"}, {"LINEOUT", NULL, "LINEOUT Mixer"}, {"HPL Out", NULL, "Headphone Enable"},