SOC_DAPM_SINGLE("Switch", CS35L32_PWRCTL2, 7, 1, 1); static const struct snd_kcontrol_new vpmon_ctl = SOC_DAPM_SINGLE("Switch", CS35L32_PWRCTL2, 5, 1, 1); static const struct snd_kcontrol_new cs35l32_snd_controls[] = { SOC_SINGLE_TLV("Speaker Volume", CS35L32_CLASSD_CTL, 3, 0x04, 1, classd_ctl_tlv), SOC_SINGLE("Zero Cross Switch", CS35L32_CLASSD_CTL, 2, 1, 0), SOC_SINGLE("Gain Manager Switch", CS35L32_AUDIO_LED_MNGR, 3, 1, 0), }; static const struct snd_soc_dapm_widget cs35l32_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("BOOST", CS35L32_PWRCTL1, 2, 1, NULL, 0), SND_SOC_DAPM_OUT_DRV("Speaker", CS35L32_PWRCTL1, 7, 1, NULL, 0), SND_SOC_DAPM_AIF_OUT("SDOUT", NULL, 0, CS35L32_PWRCTL2, 3, 1), SND_SOC_DAPM_INPUT("VP"), SND_SOC_DAPM_INPUT("ISENSE"), SND_SOC_DAPM_INPUT("VSENSE"), SND_SOC_DAPM_SWITCH("VMON ADC", CS35L32_PWRCTL2, 7, 1, &vmon_ctl), SND_SOC_DAPM_SWITCH("IMON ADC", CS35L32_PWRCTL2, 6, 1, &imon_ctl), SND_SOC_DAPM_SWITCH("VPMON ADC", CS35L32_PWRCTL2, 5, 1, &vpmon_ctl), }; static const struct snd_soc_dapm_route cs35l32_audio_map[] = { {"Speaker", NULL, "BOOST"},
static const struct snd_kcontrol_new out = SOC_DAPM_ENUM_EXT("ANA", ana_enum, tse850_get_ana, tse850_put_ana); static const struct snd_soc_dapm_widget tse850_dapm_widgets[] = { SND_SOC_DAPM_LINE("OUT1", NULL), SND_SOC_DAPM_LINE("OUT2", NULL), SND_SOC_DAPM_LINE("IN1", NULL), SND_SOC_DAPM_LINE("IN2", NULL), SND_SOC_DAPM_INPUT("DAC"), SND_SOC_DAPM_AIF_IN("AIFINL", "Playback", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_AIF_IN("AIFINR", "Playback", 1, SND_SOC_NOPM, 0, 0), SOC_MIXER_ARRAY("MIX", SND_SOC_NOPM, 0, 0, mix), SND_SOC_DAPM_MUX("MUX1", SND_SOC_NOPM, 0, 0, &mux1), SND_SOC_DAPM_MUX("MUX2", SND_SOC_NOPM, 0, 0, &mux2), SND_SOC_DAPM_OUT_DRV("OUT", SND_SOC_NOPM, 0, 0, &out, 1), }; /* * These connections are not entirely correct, since both IN1 and IN2 * are always fed to MIX (if the "IN switch" is set so), i.e. without * regard to the loop1 and loop2 relays that according to this only * control MUX1 and MUX2 but in fact also control how the input signals * are routed. * But, 1) I don't know how to do it right, and 2) it doesn't seem to * matter in practice since nothing is powered in those sections anyway. */ static const struct snd_soc_dapm_route tse850_intercon[] = { { "OUT1", NULL, "MUX1" }, { "OUT2", NULL, "MUX2" },
dev_err(dai->codec->dev, "%s: ERROR: DAC reset control not defined !\n", __func__); dac->rst = NULL; return -EFAULT; } /* Put the DAC into reset */ reset_control_assert(dac->rst); return 0; } static const struct snd_soc_dapm_widget stih416_sas_dapm_widgets[] = { SND_SOC_DAPM_PGA("DAC bandgap", STIH416_AUDIO_DAC_CTRL, STIH416_DAC_NOT_PNDBG_MASK, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("DAC standby ana", STIH416_AUDIO_DAC_CTRL, STIH416_DAC_ANA_NOT_PWR, 0, NULL, 0), SND_SOC_DAPM_DAC("DAC standby", "dac_p", STIH416_AUDIO_DAC_CTRL, STIH416_DAC_NOT_STANDBY, 0), SND_SOC_DAPM_OUTPUT("DAC Output"), }; static const struct snd_soc_dapm_widget stih407_sas_dapm_widgets[] = { SND_SOC_DAPM_OUT_DRV("DAC standby ana", STIH407_AUDIO_DAC_CTRL, STIH407_DAC_STANDBY_ANA, 1, NULL, 0), SND_SOC_DAPM_DAC("DAC standby", "dac_p", STIH407_AUDIO_DAC_CTRL, STIH407_DAC_STANDBY, 1), SND_SOC_DAPM_OUTPUT("DAC Output"), }; static const struct snd_soc_dapm_route stih416_sas_route[] = { {"DAC Output", NULL, "DAC bandgap"},
SND_SOC_DAPM_MUX("Lineout2 Left in", SND_SOC_NOPM, 0, 0, &lol2_mux_controls), SND_SOC_DAPM_MUX("Lineout1 Right in", SND_SOC_NOPM, 0, 0, &lor1_mux_controls), SND_SOC_DAPM_MUX("Lineout2 Right in", SND_SOC_NOPM, 0, 0, &lor2_mux_controls), SND_SOC_DAPM_MIXER("HPINL Mixer", SND_SOC_NOPM, 0, 0, &pmu3_dapm_hpin_mixer_l_controls[0], ARRAY_SIZE(pmu3_dapm_hpin_mixer_l_controls)), SND_SOC_DAPM_MIXER("HPINR Mixer", SND_SOC_NOPM, 0, 0, &pmu3_dapm_hpin_mixer_r_controls[0], ARRAY_SIZE(pmu3_dapm_hpin_mixer_r_controls)), SND_SOC_DAPM_OUT_DRV("LINEOUT1 Left driver", PMU3_BLOCK_ENABLE_1, 11, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("LINEOUT2 Left driver", PMU3_BLOCK_ENABLE_1, 10, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("LINEOUT1 Right driver", PMU3_BLOCK_ENABLE_1, 9, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("LINEOUT2 Right driver", PMU3_BLOCK_ENABLE_1, 8, 0, NULL, 0), SND_SOC_DAPM_PGA_E("Headphone Amplifier", PMU3_BLOCK_ENABLE_2, 13, 0, NULL, 0, pmu3_hp_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_PGA("RXV", SND_SOC_NOPM, 8, 0, NULL, 0), }; static const struct snd_soc_dapm_route pmu3_intercon[] = { /* Inputs */ {"PGAIN LEFT Pos", "Switch", "LINEINLP"}, {"PGAIN LEFT Neg", "AINL1", "LINEINLN1"}, {"PGAIN LEFT Neg", "AINL2", "LINEINLN2"},
SND_SOC_DAPM_MUX("Analog Right Capture Route", SND_SOC_NOPM, 0, 0, &amic2_control), SND_SOC_DAPM_MUX("Sidetone Audio Playback", SND_SOC_NOPM, 0, 0, &st_audio_control), SND_SOC_DAPM_MUX("Sidetone Voice Playback", SND_SOC_NOPM, 0, 0, &st_voice_control), /* AIF */ SND_SOC_DAPM_AIF_IN("INTF1_SDI", NULL, 0, ISABELLE_INTF_EN_REG, 7, 0), SND_SOC_DAPM_AIF_IN("INTF2_SDI", NULL, 0, ISABELLE_INTF_EN_REG, 6, 0), SND_SOC_DAPM_AIF_OUT("INTF1_SDO", NULL, 0, ISABELLE_INTF_EN_REG, 5, 0), SND_SOC_DAPM_AIF_OUT("INTF2_SDO", NULL, 0, ISABELLE_INTF_EN_REG, 4, 0), SND_SOC_DAPM_OUT_DRV("ULATX1", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("ULATX2", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("ULVTX1", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("ULVTX2", SND_SOC_NOPM, 0, 0, NULL, 0), /* Analog Capture PGAs */ SND_SOC_DAPM_PGA("MicAmp1", ISABELLE_AMIC_CFG_REG, 5, 0, NULL, 0), SND_SOC_DAPM_PGA("MicAmp2", ISABELLE_AMIC_CFG_REG, 4, 0, NULL, 0), /* Auxiliary FM PGAs */ SND_SOC_DAPM_PGA("APGA1", ISABELLE_APGA_CFG_REG, 7, 0, NULL, 0), SND_SOC_DAPM_PGA("APGA2", ISABELLE_APGA_CFG_REG, 6, 0, NULL, 0), /* ADCs */ SND_SOC_DAPM_ADC("ADC1", "Left Front Capture", ISABELLE_AMIC_CFG_REG, 7, 0),
return 0; } static const struct snd_soc_dapm_widget wm9081_dapm_widgets[] = { SND_SOC_DAPM_INPUT("IN1"), SND_SOC_DAPM_INPUT("IN2"), SND_SOC_DAPM_DAC("DAC", NULL, WM9081_POWER_MANAGEMENT, 0, 0), SND_SOC_DAPM_MIXER_NAMED_CTL("Mixer", SND_SOC_NOPM, 0, 0, mixer, ARRAY_SIZE(mixer)), SND_SOC_DAPM_PGA("LINEOUT PGA", WM9081_POWER_MANAGEMENT, 4, 0, NULL, 0), SND_SOC_DAPM_PGA("Speaker PGA", WM9081_POWER_MANAGEMENT, 2, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("Speaker", WM9081_POWER_MANAGEMENT, 1, 0, NULL, 0), SND_SOC_DAPM_OUTPUT("LINEOUT"), SND_SOC_DAPM_OUTPUT("SPKN"), SND_SOC_DAPM_OUTPUT("SPKP"), SND_SOC_DAPM_SUPPLY("CLK_SYS", WM9081_CLOCK_CONTROL_3, 0, 0, clk_sys_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SUPPLY("CLK_DSP", WM9081_CLOCK_CONTROL_3, 1, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("TOCLK", WM9081_CLOCK_CONTROL_3, 2, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("TSENSE", WM9081_POWER_MANAGEMENT, 7, 0, NULL, 0), }; static const struct snd_soc_dapm_route wm9081_audio_paths[] = { { "DAC", NULL, "CLK_SYS" },
enable_and_reset_codec(sirf_audio_codec->regmap, PRIMA2_CODEC_ENABLE_BITS, PRIMA2_CODEC_RESET_BITS); break; case SND_SOC_DAPM_POST_PMD: regmap_update_bits(sirf_audio_codec->regmap, AUDIO_IC_CODEC_CTRL1, PRIMA2_CODEC_ENABLE_BITS, 0); break; default: break; } return 0; } static const struct snd_soc_dapm_widget atlas6_output_driver_dapm_widgets[] = { SND_SOC_DAPM_OUT_DRV("HP Left Driver", AUDIO_IC_CODEC_CTRL1, 25, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("HP Right Driver", AUDIO_IC_CODEC_CTRL1, 26, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("Speaker Driver", AUDIO_IC_CODEC_CTRL1, 27, 0, NULL, 0), }; static const struct snd_soc_dapm_widget prima2_output_driver_dapm_widgets[] = { SND_SOC_DAPM_OUT_DRV("HP Left Driver", AUDIO_IC_CODEC_CTRL1, 23, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("HP Right Driver", AUDIO_IC_CODEC_CTRL1, 24, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("Speaker Driver", AUDIO_IC_CODEC_CTRL1, 25, 0, NULL, 0), };
SND_SOC_DAPM_OUT_DRV_E("Headphone PGA", SND_SOC_NOPM, 0, 0, NULL, 0, hp_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_MIXER("Earpiece Mixer", SND_SOC_NOPM, 0, 0, earpiece_mixer, ARRAY_SIZE(earpiece_mixer)), SND_SOC_DAPM_PGA_E("Earpiece Driver", WM8993_POWER_MANAGEMENT_1, 11, 0, NULL, 0, earpiece_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_MIXER("SPKL Boost", SND_SOC_NOPM, 0, 0, left_speaker_boost, ARRAY_SIZE(left_speaker_boost)), SND_SOC_DAPM_MIXER("SPKR Boost", SND_SOC_NOPM, 0, 0, right_speaker_boost, ARRAY_SIZE(right_speaker_boost)), SND_SOC_DAPM_SUPPLY("TSHUT", WM8993_POWER_MANAGEMENT_2, 14, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("SPKL Driver", WM8993_POWER_MANAGEMENT_1, 12, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("SPKR Driver", WM8993_POWER_MANAGEMENT_1, 13, 0, NULL, 0), SND_SOC_DAPM_MIXER("LINEOUT1 Mixer", SND_SOC_NOPM, 0, 0, line1_mix, ARRAY_SIZE(line1_mix)), SND_SOC_DAPM_MIXER("LINEOUT2 Mixer", SND_SOC_NOPM, 0, 0, line2_mix, ARRAY_SIZE(line2_mix)), SND_SOC_DAPM_MIXER("LINEOUT1N Mixer", SND_SOC_NOPM, 0, 0, line1n_mix, ARRAY_SIZE(line1n_mix)), SND_SOC_DAPM_MIXER("LINEOUT1P Mixer", SND_SOC_NOPM, 0, 0, line1p_mix, ARRAY_SIZE(line1p_mix)), SND_SOC_DAPM_MIXER("LINEOUT2N Mixer", SND_SOC_NOPM, 0, 0, line2n_mix, ARRAY_SIZE(line2n_mix)), SND_SOC_DAPM_MIXER("LINEOUT2P Mixer", SND_SOC_NOPM, 0, 0,
/*ADC capture stream*/ SND_SOC_DAPM_ADC("Left ADC", "HIFI Capture", PMU4_BLOCK_ENABLE, PMU4_ADCL_EN, 0), SND_SOC_DAPM_ADC("Right ADC", "HIFI Capture", PMU4_BLOCK_ENABLE, PMU4_ADCR_EN, 0), /*Output*/ SND_SOC_DAPM_OUTPUT("Lineout left N"), SND_SOC_DAPM_OUTPUT("Lineout left P"), SND_SOC_DAPM_OUTPUT("Lineout right N"), SND_SOC_DAPM_OUTPUT("Lineout right P"), /*DAC playback stream*/ SND_SOC_DAPM_DAC("Left DAC", "HIFI Playback", PMU4_BLOCK_ENABLE, PMU4_DACL_EN, 0), SND_SOC_DAPM_DAC("Right DAC", "HIFI Playback", PMU4_BLOCK_ENABLE, PMU4_DACR_EN, 0), /*DRV output*/ SND_SOC_DAPM_OUT_DRV("LOLP_OUT_EN", PMU4_BLOCK_ENABLE, PMU4_LOLP_EN, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("LOLN_OUT_EN", PMU4_BLOCK_ENABLE, PMU4_LOLN_EN, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("LORP_OUT_EN", PMU4_BLOCK_ENABLE, PMU4_LORP_EN, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("LORN_OUT_EN", PMU4_BLOCK_ENABLE, PMU4_LORN_EN, 0, NULL, 0), /*MUX output source select*/ SND_SOC_DAPM_MUX("Lineout left P switch", SND_SOC_NOPM, 0, 0, &line_out_lp_mux), SND_SOC_DAPM_MUX("Lineout left N switch", SND_SOC_NOPM, 0, 0, &line_out_ln_mux), SND_SOC_DAPM_MUX("Lineout right P switch", SND_SOC_NOPM, 0, 0, &line_out_rp_mux), SND_SOC_DAPM_MUX("Lineout right N switch", SND_SOC_NOPM,
SND_SOC_DAPM_SUPPLY("DACL_BIASGEN", MT6351_AUDDEC_ANA_CON0, RG_AUD_DAC_PWL_UP_VA32_BIT, 0, NULL, 0), SND_SOC_DAPM_DAC("DACR", NULL, MT6351_AUDDEC_ANA_CON0, RG_AUDDACRPWRUP_VAUDP32_BIT, 0), SND_SOC_DAPM_SUPPLY("DACR_BIASGEN", MT6351_AUDDEC_ANA_CON0, RG_AUD_DAC_PWR_UP_VA32_BIT, 0, NULL, 0), /* LOL */ SND_SOC_DAPM_MUX("LOL Mux", SND_SOC_NOPM, 0, 0, &lo_in_mux_control), SND_SOC_DAPM_SUPPLY("LO Stability Enh", MT6351_AUDDEC_ANA_CON3, RG_LOOUTPUTSTBENH_VAUDP32_BIT, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("LOL Bias Gen", MT6351_AUDDEC_ANA_CON6, RG_ABIDEC_RSVD0_VAUDP32_LOL_BIT, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("LOL Buffer", MT6351_AUDDEC_ANA_CON3, RG_AUDLOLPWRUP_VAUDP32_BIT, 0, NULL, 0), /* Headphone */ SND_SOC_DAPM_MUX("HPL Mux", SND_SOC_NOPM, 0, 0, &hpl_in_mux_control), SND_SOC_DAPM_MUX("HPR Mux", SND_SOC_NOPM, 0, 0, &hpr_in_mux_control), SND_SOC_DAPM_OUT_DRV_E("HPL Power", MT6351_AUDDEC_ANA_CON0, RG_AUDHPLPWRUP_VAUDP32_BIT, 0, NULL, 0, mt_hp_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_OUT_DRV_E("HPR Power", MT6351_AUDDEC_ANA_CON0, RG_AUDHPRPWRUP_VAUDP32_BIT, 0, NULL, 0, mt_hp_event, SND_SOC_DAPM_PRE_PMU |