COEFF_RAM_COEFF_COUNT); if (ret < 0) goto exit; tscs42xx->coeff_ram_synced = true; } ret = 0; exit: mutex_unlock(&tscs42xx->coeff_ram_lock); return ret; } static const struct snd_soc_dapm_widget tscs42xx_dapm_widgets[] = { /* Vref */ SND_SOC_DAPM_SUPPLY_S("Vref", 1, R_PWRM2, FB_PWRM2_VREF, 0, dapm_vref_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD), /* PLL */ SND_SOC_DAPM_SUPPLY("PLL", SND_SOC_NOPM, 0, 0, pll_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), /* Headphone */ SND_SOC_DAPM_DAC_E("DAC L", "HiFi Playback", R_PWRM2, FB_PWRM2_HPL, 0, dac_event, SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_DAC_E("DAC R", "HiFi Playback", R_PWRM2, FB_PWRM2_HPR, 0, dac_event, SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_OUTPUT("Headphone L"), SND_SOC_DAPM_OUTPUT("Headphone R"), /* Speaker */ SND_SOC_DAPM_DAC_E("ClassD L", "HiFi Playback",
RT5616_PWR_IN2_R_BIT, 0, NULL, 0), /* HPO/LOUT/Mono Mixer */ SND_SOC_DAPM_MIXER("HPO MIX", SND_SOC_NOPM, 0, 0, rt5616_hpo_mix, ARRAY_SIZE(rt5616_hpo_mix)), SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0, rt5616_lout_mix, ARRAY_SIZE(rt5616_lout_mix)), SND_SOC_DAPM_PGA_S("HP amp", 1, SND_SOC_NOPM, 0, 0, rt5616_hp_event, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0, rt5616_lout_event, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, SND_SOC_NOPM, 0, 0, rt5616_charge_pump_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), /* Output Lines */ SND_SOC_DAPM_OUTPUT("HPOL"), SND_SOC_DAPM_OUTPUT("HPOR"), SND_SOC_DAPM_OUTPUT("LOUTL"), SND_SOC_DAPM_OUTPUT("LOUTR"), }; static const struct snd_soc_dapm_route rt5616_dapm_routes[] = { {"IN1P", NULL, "LDO"}, {"IN2P", NULL, "LDO"}, {"IN1P", NULL, "MIC1"}, {"IN2P", NULL, "MIC2"},
SND_SOC_DAPM_MIXER("Right Input Mixer", ADAU1761_REC_MIXER_RIGHT0, 0, 0, NULL, 0), SOC_MIXER_ARRAY("Left Playback Mixer", ADAU1761_PLAY_MIXER_LEFT0, 0, 0, adau1761_left_mixer_controls), SOC_MIXER_ARRAY("Right Playback Mixer", ADAU1761_PLAY_MIXER_RIGHT0, 0, 0, adau1761_right_mixer_controls), SOC_MIXER_ARRAY("Left LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_LEFT, 0, 0, adau1761_left_lr_mixer_controls), SOC_MIXER_ARRAY("Right LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_RIGHT, 0, 0, adau1761_right_lr_mixer_controls), SND_SOC_DAPM_SUPPLY("Headphone", ADAU1761_PLAY_HP_LEFT_VOL, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY_S("SYSCLK", 2, SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_POST("Dejitter fixup", adau1761_dejitter_fixup), SND_SOC_DAPM_INPUT("LAUX"), SND_SOC_DAPM_INPUT("RAUX"), SND_SOC_DAPM_INPUT("LINP"), SND_SOC_DAPM_INPUT("LINN"), SND_SOC_DAPM_INPUT("RINP"), SND_SOC_DAPM_INPUT("RINN"), SND_SOC_DAPM_OUTPUT("LOUT"), SND_SOC_DAPM_OUTPUT("ROUT"), SND_SOC_DAPM_OUTPUT("LHP"), SND_SOC_DAPM_OUTPUT("RHP"), };
static const char * const adau17x1_mono_stereo_text[] = { "Stereo", "Mono Left Channel (L+R)", "Mono Right Channel (L+R)", "Mono (L+R)", }; static SOC_ENUM_SINGLE_DECL(adau17x1_dac_mode_enum, ADAU17X1_DAC_CONTROL0, 6, adau17x1_mono_stereo_text); static const struct snd_kcontrol_new adau17x1_dac_mode_mux = SOC_DAPM_ENUM("DAC Mono-Stereo-Mode", adau17x1_dac_mode_enum); static const struct snd_soc_dapm_widget adau17x1_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY_S("PLL", 3, SND_SOC_NOPM, 0, 0, adau17x1_pll_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SUPPLY("AIFCLK", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("MICBIAS", ADAU17X1_MICBIAS, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("Left Playback Enable", ADAU17X1_PLAY_POWER_MGMT, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("Right Playback Enable", ADAU17X1_PLAY_POWER_MGMT, 1, 0, NULL, 0), SND_SOC_DAPM_MUX("Left DAC Mode Mux", SND_SOC_NOPM, 0, 0, &adau17x1_dac_mode_mux), SND_SOC_DAPM_MUX("Right DAC Mode Mux", SND_SOC_NOPM, 0, 0, &adau17x1_dac_mode_mux),
msm8916_wcd_digital_enable_dmic, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0, msm8916_wcd_digital_enable_dmic, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SUPPLY("DMIC_CLK", LPASS_CDC_CLK_DMIC_B1_CTL, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("RX_I2S_CLK", LPASS_CDC_CLK_RX_I2S_CTL, 4, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("TX_I2S_CLK", LPASS_CDC_CLK_TX_I2S_CTL, 4, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("PDM_CLK", LPASS_CDC_CLK_PDM_CTL, 0, 0, NULL, 0), /* Connectivity Clock */ SND_SOC_DAPM_SUPPLY_S("CDC_CONN", -2, LPASS_CDC_CLK_OTHR_CTL, 2, 0, NULL, 0), }; static int msm8916_wcd_digital_get_clks(struct platform_device *pdev, struct msm8916_wcd_digital_priv *priv) { struct device *dev = &pdev->dev; priv->ahbclk = devm_clk_get(dev, "ahbix-clk"); if (IS_ERR(priv->ahbclk)) { dev_err(dev, "failed to get ahbix clk\n"); return PTR_ERR(priv->ahbclk); } priv->mclk = devm_clk_get(dev, "mclk");
case SND_SOC_DAPM_POST_PMU: dev_dbg(codec->dev, "%s(): PMU\n", __func__); rt5670_dsp_snd_effect(codec); break; default: return 0; } return 0; } static const struct snd_soc_dapm_widget rt5670_dsp_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY_S("Voice DSP", 1, SND_SOC_NOPM, 0, 0, rt5670_dsp_event, SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_PGA("DSP Downstream", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_PGA("DSP Upstream", SND_SOC_NOPM, 0, 0, NULL, 0), }; static const struct snd_soc_dapm_route rt5670_dsp_dapm_routes[] = { {"DSP Downstream", NULL, "Voice DSP"}, {"DSP Downstream", NULL, "RxDP Mux"}, {"DSP Upstream", NULL, "Voice DSP"}, {"DSP Upstream", NULL, "8CH TDM Data"}, {"DSP DL Mux", "DSP", "DSP Downstream"}, {"DSP UL Mux", "DSP", "DSP Upstream"}, };
return 0; } static const struct snd_kcontrol_new controls[] = { SOC_DAPM_PIN_SWITCH("WM1250 Input"), SOC_DAPM_PIN_SWITCH("WM1250 Output"), }; static struct snd_soc_dapm_widget widgets[] = { SND_SOC_DAPM_HP("Headphone", NULL), SND_SOC_DAPM_MIC("AMIC", NULL), SND_SOC_DAPM_MIC("DMIC", NULL), SND_SOC_DAPM_SUPPLY_S("Baseband Clock", -1, SND_SOC_NOPM, 0, 0, bbclk_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; static struct snd_soc_dapm_route audio_paths[] = { { "Headphone", NULL, "HPOUT1L" }, { "Headphone", NULL, "HPOUT1R" }, { "AMIC", NULL, "MICBIAS1" }, /* Default for AMICBIAS jumper */ { "IN1LN", NULL, "AMIC" }, { "DMIC", NULL, "MICBIAS2" }, /* Default for DMICBIAS jumper */ { "DMIC1DAT", NULL, "DMIC" }, { "DMIC2DAT", NULL, "DMIC" }, { "AIF2CLK", NULL, "Baseband Clock" },
SGEN_C_MUTE_SW_CTL_BIT, 1, mt_sgen_event, SND_SOC_DAPM_PRE_PMU), SND_SOC_DAPM_SUPPLY("SGEN DL SRC", MT6351_AFE_DL_SRC2_CON0_L, RG_DL_2_SRC_ON_TMP_CTL_PRE_BIT, 0, NULL, 0), SND_SOC_DAPM_INPUT("SGEN DL"), /* Uplinks */ SND_SOC_DAPM_AIF_OUT_E("AIF1TX", "AIF1 Capture", 0, MT6351_AFE_UL_SRC_CON0_L, UL_SRC_ON_TMP_CTL, 0, mt_aif_out_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_SUPPLY_S("VUSB33_LDO", SUPPLY_SUBSEQ_ENABLE, MT6351_LDO_VUSB33_CON0, RG_VUSB33_EN, 0, NULL, 0), SND_SOC_DAPM_SUPPLY_S("VUSB33_LDO_CTRL", SUPPLY_SUBSEQ_SETTING, MT6351_LDO_VUSB33_CON0, RG_VUSB33_ON_CTRL, 1, NULL, 0), SND_SOC_DAPM_SUPPLY_S("VA18_LDO", SUPPLY_SUBSEQ_ENABLE, MT6351_LDO_VA18_CON0, RG_VA18_EN, 0, NULL, 0), SND_SOC_DAPM_SUPPLY_S("VA18_LDO_CTRL", SUPPLY_SUBSEQ_SETTING, MT6351_LDO_VA18_CON0, RG_VA18_ON_CTRL, 1, NULL, 0), SND_SOC_DAPM_SUPPLY_S("ADC CLKGEN", SUPPLY_SUBSEQ_ENABLE, MT6351_AUDENC_ANA_CON3, RG_AUDADCCLKRSTB, 0, mt_adc_clkgen_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
mtk_i2s3_ch1_mix, ARRAY_SIZE(mtk_i2s3_ch1_mix)), SND_SOC_DAPM_MIXER("I2S3_CH2", SND_SOC_NOPM, 0, 0, mtk_i2s3_ch2_mix, ARRAY_SIZE(mtk_i2s3_ch2_mix)), SND_SOC_DAPM_MIXER("I2S5_CH1", SND_SOC_NOPM, 0, 0, mtk_i2s5_ch1_mix, ARRAY_SIZE(mtk_i2s5_ch1_mix)), SND_SOC_DAPM_MIXER("I2S5_CH2", SND_SOC_NOPM, 0, 0, mtk_i2s5_ch2_mix, ARRAY_SIZE(mtk_i2s5_ch2_mix)), /* i2s en*/ SND_SOC_DAPM_SUPPLY_S("I2S0_EN", SUPPLY_SEQ_I2S_EN, AFE_I2S_CON, I2S_EN_SFT, 0, NULL, 0), SND_SOC_DAPM_SUPPLY_S("I2S1_EN", SUPPLY_SEQ_I2S_EN, AFE_I2S_CON1, I2S_EN_SFT, 0, NULL, 0), SND_SOC_DAPM_SUPPLY_S("I2S2_EN", SUPPLY_SEQ_I2S_EN, AFE_I2S_CON2, I2S_EN_SFT, 0, NULL, 0), SND_SOC_DAPM_SUPPLY_S("I2S3_EN", SUPPLY_SEQ_I2S_EN, AFE_I2S_CON3, I2S_EN_SFT, 0, NULL, 0), SND_SOC_DAPM_SUPPLY_S("I2S5_EN", SUPPLY_SEQ_I2S_EN, AFE_I2S_CON4, I2S5_EN_SFT, 0, NULL, 0), /* i2s hd en */ SND_SOC_DAPM_SUPPLY_S(I2S0_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,