bool swapdacs; }; /* 0dB min, 1dB steps */ static DECLARE_TLV_DB_SCALE(tlv_step_1, 0, 100, 0); /* 0dB min, 0.5dB steps */ static DECLARE_TLV_DB_SCALE(tlv_step_0_5, 0, 50, 0); static const struct snd_kcontrol_new aic32x4_snd_controls[] = { SOC_DOUBLE_R_TLV("PCM Playback Volume", AIC32X4_LDACVOL, AIC32X4_RDACVOL, 0, 0x30, 0, tlv_step_0_5), SOC_DOUBLE_R_TLV("HP Driver Gain Volume", AIC32X4_HPLGAIN, AIC32X4_HPRGAIN, 0, 0x1D, 0, tlv_step_1), SOC_DOUBLE_R_TLV("LO Driver Gain Volume", AIC32X4_LOLGAIN, AIC32X4_LORGAIN, 0, 0x1D, 0, tlv_step_1), SOC_DOUBLE_R("HP DAC Playback Switch", AIC32X4_HPLGAIN, AIC32X4_HPRGAIN, 6, 0x01, 1), SOC_DOUBLE_R("LO DAC Playback Switch", AIC32X4_LOLGAIN, AIC32X4_LORGAIN, 6, 0x01, 1), SOC_DOUBLE_R("Mic PGA Switch", AIC32X4_LMICPGAVOL, AIC32X4_RMICPGAVOL, 7, 0x01, 1), SOC_SINGLE("ADCFGA Left Mute Switch", AIC32X4_ADCFGA, 7, 1, 0), SOC_SINGLE("ADCFGA Right Mute Switch", AIC32X4_ADCFGA, 3, 1, 0), SOC_DOUBLE_R_TLV("ADC Level Volume", AIC32X4_LADCVOL, AIC32X4_RADCVOL, 0, 0x28, 0, tlv_step_0_5), SOC_DOUBLE_R_TLV("PGA Level Volume", AIC32X4_LMICPGAVOL, AIC32X4_RMICPGAVOL, 0, 0x5f, 0, tlv_step_0_5), SOC_SINGLE("Auto-mute Switch", AIC32X4_DACMUTE, 4, 7, 0),
val = val | 0x1; jzcodec_write(codec, ICODEC_1_LOW, val); mdelay(1); val = jzcodec_read_reg_cache(codec, ICODEC_1_LOW); val = val & ~0x1; jzcodec_write(codec, ICODEC_1_LOW, val); mdelay(1); return 0; } static const struct snd_kcontrol_new jzcodec_snd_controls[] = { //SOC_DOUBLE_R("Master Playback Volume", 1, 1, 0, 3, 0), SOC_DOUBLE_R("Master Playback Volume", ICODEC_2_LOW, ICODEC_2_LOW, 0, 3, 0), //SOC_DOUBLE_R("MICBG", ICODEC_2_LOW, ICODEC_2_LOW, 4, 3, 0), //SOC_DOUBLE_R("Line", 2, 2, 0, 31, 0), SOC_DOUBLE_R("Line", ICODEC_2_HIGH, ICODEC_2_HIGH, 0, 31, 0), }; /* add non dapm controls */ static int jzcodec_add_controls(struct snd_soc_codec *codec) { int err, i; for (i = 0; i < ARRAY_SIZE(jzcodec_snd_controls); i++) { if ((err = snd_ctl_add(codec->card, snd_soc_cnew(&jzcodec_snd_controls[i], codec, NULL))) < 0) return err; }
max9867_filter_text); static SOC_ENUM_SINGLE_DECL(max9867_spkmode, MAX9867_MODECONFIG, 0, max9867_spmode); static SOC_ENUM_SINGLE_DECL(max9867_sidetone, MAX9867_DACGAIN, 6, max9867_sidetone_text); static DECLARE_TLV_DB_SCALE(max9860_capture_tlv, -600, 200, 0); static DECLARE_TLV_DB_SCALE(max9860_mic_tlv, 2000, 100, 1); static DECLARE_TLV_DB_SCALE(max9860_adc_left_tlv, -1200, 100, 1); static DECLARE_TLV_DB_SCALE(max9860_adc_right_tlv, -1200, 100, 1); static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(max98088_micboost_tlv, 0, 1, TLV_DB_SCALE_ITEM(0, 2000, 0), 2, 2, TLV_DB_SCALE_ITEM(3000, 0, 0), ); static const struct snd_kcontrol_new max9867_snd_controls[] = { SOC_DOUBLE_R("Master Playback Volume", MAX9867_LEFTVOL, MAX9867_RIGHTVOL, 0, 63, 1), SOC_DOUBLE_R_TLV("Capture Volume", MAX9867_LEFTMICGAIN, MAX9867_RIGHTMICGAIN, 0, 15, 1, max9860_capture_tlv), SOC_DOUBLE_R_TLV("Mic Volume", MAX9867_LEFTMICGAIN, MAX9867_RIGHTMICGAIN, 0, 31, 1, max9860_mic_tlv), SOC_DOUBLE_R_TLV("Mic Boost Volume", MAX9867_LEFTMICGAIN, MAX9867_RIGHTMICGAIN, 5, 3, 0, max98088_micboost_tlv), SOC_ENUM("Digital Sidetone Src", max9867_sidetone), SOC_SINGLE("Sidetone Volume", MAX9867_DACGAIN, 0, 31, 1), SOC_SINGLE("DAC Volume", MAX9867_DACLEVEL, 4, 3, 0), SOC_SINGLE("DAC Attenuation", MAX9867_DACLEVEL, 0, 15, 1), SOC_SINGLE_TLV("ADC Left Volume", MAX9867_ADCLEVEL, 4, 15, 1, max9860_adc_left_tlv), SOC_SINGLE_TLV("ADC Right Volume", MAX9867_ADCLEVEL, 0, 15, 1, max9860_adc_right_tlv),
static const struct soc_enum alc_atk = SOC_ENUM_SINGLE(WM8737_ALC3, 0, 11, alc_atk_text); static const char *alc_dcy_text[] = { "33.6ms", "67.2ms", "134.4ms", "268.8ms", "537.6ms", "1.075s", "2.15s", "4.3s", "8.6s", "17.2s", "34.41s" }; static const struct soc_enum alc_dcy = SOC_ENUM_SINGLE(WM8737_ALC3, 4, 11, alc_dcy_text); static const struct snd_kcontrol_new wm8737_snd_controls[] = { SOC_DOUBLE_R_TLV("Mic Boost Volume", WM8737_AUDIO_PATH_L, WM8737_AUDIO_PATH_R, 6, 3, 0, micboost_tlv), SOC_DOUBLE_R("Mic Boost Switch", WM8737_AUDIO_PATH_L, WM8737_AUDIO_PATH_R, 4, 1, 0), SOC_DOUBLE("Mic ZC Switch", WM8737_AUDIO_PATH_L, WM8737_AUDIO_PATH_R, 3, 1, 0), SOC_DOUBLE_R_TLV("Capture Volume", WM8737_LEFT_PGA_VOLUME, WM8737_RIGHT_PGA_VOLUME, 0, 255, 0, pga_tlv), SOC_DOUBLE("Capture ZC Switch", WM8737_AUDIO_PATH_L, WM8737_AUDIO_PATH_R, 2, 1, 0), SOC_DOUBLE("INPUT1 DC Bias Switch", WM8737_MISC_BIAS_CONTROL, 0, 1, 1, 0), SOC_ENUM("Mic PGA Bias", micbias_enum), SOC_SINGLE("ADC Low Power Switch", WM8737_ADC_CONTROL, 2, 1, 0), SOC_SINGLE("High Pass Filter Switch", WM8737_ADC_CONTROL, 0, 1, 1), SOC_DOUBLE("Polarity Invert Switch", WM8737_ADC_CONTROL, 5, 6, 1, 0),
static const DECLARE_TLV_DB_SCALE(sidetone_tlv, -3600, 300, 0); static unsigned int boost_tlv[] = { TLV_DB_RANGE_HEAD(4), 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0), 1, 1, TLV_DB_SCALE_ITEM(13, 0, 0), 2, 2, TLV_DB_SCALE_ITEM(20, 0, 0), 3, 3, TLV_DB_SCALE_ITEM(29, 0, 0), }; static const DECLARE_TLV_DB_SCALE(pga_tlv, -2325, 75, 0); static const struct snd_kcontrol_new wm8961_snd_controls[] = { SOC_DOUBLE_R_TLV("Headphone Volume", WM8961_LOUT1_VOLUME, WM8961_ROUT1_VOLUME, 0, 127, 0, out_tlv), SOC_DOUBLE_TLV("Headphone Secondary Volume", WM8961_ANALOGUE_HP_2, 6, 3, 7, 0, hp_sec_tlv), SOC_DOUBLE_R("Headphone ZC Switch", WM8961_LOUT1_VOLUME, WM8961_ROUT1_VOLUME, 7, 1, 0), SOC_DOUBLE_R_TLV("Speaker Volume", WM8961_LOUT2_VOLUME, WM8961_ROUT2_VOLUME, 0, 127, 0, out_tlv), SOC_DOUBLE_R("Speaker ZC Switch", WM8961_LOUT2_VOLUME, WM8961_ROUT2_VOLUME, 7, 1, 0), SOC_SINGLE("Speaker AC Gain", WM8961_CLASS_D_CONTROL_2, 0, 7, 0), SOC_SINGLE("DAC x128 OSR Switch", WM8961_ADC_DAC_CONTROL_2, 0, 1, 0), SOC_ENUM("DAC Deemphasis", dac_deemph), SOC_SINGLE("DAC Soft Mute Switch", WM8961_ADC_DAC_CONTROL_2, 3, 1, 0), SOC_DOUBLE_R_TLV("Sidetone Volume", WM8961_DSP_SIDETONE_0, WM8961_DSP_SIDETONE_1, 4, 12, 0, sidetone_tlv), SOC_SINGLE("ADC High Pass Filter Switch", WM8961_ADC_DAC_CONTROL_1, 0, 1, 0),
SOC_SINGLE_TLV("Right Output Mixer IN1L Volume", WM8993_OUTPUT_MIXER4, 3, 7, 1, outmix_tlv), SOC_SINGLE_TLV("Right Output Mixer IN1R Volume", WM8993_OUTPUT_MIXER4, 0, 7, 1, outmix_tlv), SOC_SINGLE_TLV("Right Output Mixer IN2RP Volume", WM8993_OUTPUT_MIXER4, 9, 7, 1, outmix_tlv), SOC_SINGLE_TLV("Right Output Mixer Left Input Volume", WM8993_OUTPUT_MIXER6, 3, 7, 1, outmix_tlv), SOC_SINGLE_TLV("Right Output Mixer Right Input Volume", WM8993_OUTPUT_MIXER6, 6, 7, 1, outmix_tlv), SOC_SINGLE_TLV("Right Output Mixer DAC Volume", WM8993_OUTPUT_MIXER6, 9, 7, 1, outmix_tlv), SOC_DOUBLE_R_TLV("Output Volume", WM8993_LEFT_OPGA_VOLUME, WM8993_RIGHT_OPGA_VOLUME, 0, 63, 0, outpga_tlv), SOC_DOUBLE_R("Output Switch", WM8993_LEFT_OPGA_VOLUME, WM8993_RIGHT_OPGA_VOLUME, 6, 1, 0), SOC_DOUBLE_R("Output ZC Switch", WM8993_LEFT_OPGA_VOLUME, WM8993_RIGHT_OPGA_VOLUME, 7, 1, 0), SOC_SINGLE("Earpiece Switch", WM8993_HPOUT2_VOLUME, 5, 1, 1), SOC_SINGLE_TLV("Earpiece Volume", WM8993_HPOUT2_VOLUME, 4, 1, 1, earpiece_tlv), SOC_SINGLE_TLV("SPKL Input Volume", WM8993_SPKMIXL_ATTENUATION, 5, 1, 1, wm_hubs_spkmix_tlv), SOC_SINGLE_TLV("SPKL IN1LP Volume", WM8993_SPKMIXL_ATTENUATION, 4, 1, 1, wm_hubs_spkmix_tlv), SOC_SINGLE_TLV("SPKL Output Volume", WM8993_SPKMIXL_ATTENUATION, 3, 1, 1, wm_hubs_spkmix_tlv), SOC_SINGLE_TLV("SPKR Input Volume", WM8993_SPKMIXR_ATTENUATION, 5, 1, 1, wm_hubs_spkmix_tlv),
SOC_SINGLE_TLV("Noise Generator Volume", ARIZONA_COMFORT_NOISE_GENERATOR, ARIZONA_NOISE_GEN_GAIN_SHIFT, 0x16, 0, noise_tlv), ARIZONA_MIXER_CONTROLS("HPOUT1L", ARIZONA_OUT1LMIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("HPOUT1R", ARIZONA_OUT1RMIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EPOUT", ARIZONA_OUT3LMIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("SPKOUT", ARIZONA_OUT4LMIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("SPKDAT1L", ARIZONA_OUT5LMIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("SPKDAT1R", ARIZONA_OUT5RMIX_INPUT_1_SOURCE), SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L, ARIZONA_OUT4_OSR_SHIFT, 1, 0), SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L, ARIZONA_OUT5_OSR_SHIFT, 1, 0), SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), SOC_SINGLE("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L, ARIZONA_DAC_DIGITAL_VOLUME_5R, ARIZONA_OUT5L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, ARIZONA_OUT3L_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_SINGLE_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L, ARIZONA_OUT4L_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
SOC_DOUBLE_TLV("Digital Sidetone Volume", WM8903_DAC_DIGITAL_0, 4, 8, 12, 0, digital_sidetone_tlv), /* DAC */ SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8903_DAC_DIGITAL_VOLUME_LEFT, WM8903_DAC_DIGITAL_VOLUME_RIGHT, 1, 120, 0, digital_tlv), SOC_ENUM("DAC Soft Mute Rate", soft_mute), SOC_ENUM("DAC Mute Mode", mute_mode), SOC_SINGLE("DAC Mono Switch", WM8903_DAC_DIGITAL_1, 12, 1, 0), SOC_ENUM("DAC De-emphasis", dac_deemphasis), SOC_ENUM("DAC Companding Mode", dac_companding), SOC_SINGLE("DAC Companding Switch", WM8903_AUDIO_INTERFACE_0, 1, 1, 0), /* Headphones */ SOC_DOUBLE_R("Headphone Switch", WM8903_ANALOGUE_OUT1_LEFT, WM8903_ANALOGUE_OUT1_RIGHT, 8, 1, 1), SOC_DOUBLE_R("Headphone ZC Switch", WM8903_ANALOGUE_OUT1_LEFT, WM8903_ANALOGUE_OUT1_RIGHT, 6, 1, 0), SOC_DOUBLE_R_TLV("Headphone Volume", WM8903_ANALOGUE_OUT1_LEFT, WM8903_ANALOGUE_OUT1_RIGHT, 0, 63, 0, out_tlv), /* Line out */ SOC_DOUBLE_R("Line Out Switch", WM8903_ANALOGUE_OUT2_LEFT, WM8903_ANALOGUE_OUT2_RIGHT, 8, 1, 1), SOC_DOUBLE_R("Line Out ZC Switch", WM8903_ANALOGUE_OUT2_LEFT, WM8903_ANALOGUE_OUT2_RIGHT, 6, 1, 0),
static const struct snd_kcontrol_new wm8770_snd_controls[] = { /* global DAC playback controls */ SOC_SINGLE_TLV("DAC Playback Volume", WM8770_MSDIGVOL, 0, 255, 0, dac_dig_tlv), SOC_SINGLE("DAC Playback Switch", WM8770_DACMUTE, 4, 1, 1), SOC_SINGLE("DAC Playback ZC Switch", WM8770_DACCTRL1, 0, 1, 0), /* global VOUT playback controls */ SOC_SINGLE_TLV("VOUT Playback Volume", WM8770_MSALGVOL, 0, 127, 0, dac_alg_tlv), SOC_SINGLE("VOUT Playback ZC Switch", WM8770_MSALGVOL, 7, 1, 0), /* VOUT1/2/3/4 specific controls */ SOC_DOUBLE_R_TLV("VOUT1 Playback Volume", WM8770_VOUT1LVOL, WM8770_VOUT1RVOL, 0, 127, 0, dac_alg_tlv), SOC_DOUBLE_R("VOUT1 Playback ZC Switch", WM8770_VOUT1LVOL, WM8770_VOUT1RVOL, 7, 1, 0), SOC_DOUBLE_R_TLV("VOUT2 Playback Volume", WM8770_VOUT2LVOL, WM8770_VOUT2RVOL, 0, 127, 0, dac_alg_tlv), SOC_DOUBLE_R("VOUT2 Playback ZC Switch", WM8770_VOUT2LVOL, WM8770_VOUT2RVOL, 7, 1, 0), SOC_DOUBLE_R_TLV("VOUT3 Playback Volume", WM8770_VOUT3LVOL, WM8770_VOUT3RVOL, 0, 127, 0, dac_alg_tlv), SOC_DOUBLE_R("VOUT3 Playback ZC Switch", WM8770_VOUT3LVOL, WM8770_VOUT3RVOL, 7, 1, 0), SOC_DOUBLE_R_TLV("VOUT4 Playback Volume", WM8770_VOUT4LVOL, WM8770_VOUT4RVOL, 0, 127, 0, dac_alg_tlv), SOC_DOUBLE_R("VOUT4 Playback ZC Switch", WM8770_VOUT4LVOL, WM8770_VOUT4RVOL, 7, 1, 0), /* DAC1/2/3/4 specific controls */ SOC_DOUBLE_R_TLV("DAC1 Playback Volume", WM8770_DAC1LVOL,
SOC_ENUM("ALC Capture Function", alc_func), SOC_SINGLE("ALC Capture ZC Switch", WM8988_ALC2, 7, 1, 0), SOC_SINGLE("ALC Capture Hold Time", WM8988_ALC2, 0, 15, 0), SOC_SINGLE("ALC Capture Decay Time", WM8988_ALC3, 4, 15, 0), SOC_SINGLE("ALC Capture Attack Time", WM8988_ALC3, 0, 15, 0), SOC_SINGLE("ALC Capture NG Threshold", WM8988_NGATE, 3, 31, 0), SOC_ENUM("ALC Capture NG Type", ng_type), SOC_SINGLE("ALC Capture NG Switch", WM8988_NGATE, 0, 1, 0), SOC_SINGLE("ZC Timeout Switch", WM8988_ADCTL1, 0, 1, 0), SOC_DOUBLE_R_TLV("Capture Digital Volume", WM8988_LADC, WM8988_RADC, 0, 255, 0, adc_tlv), SOC_DOUBLE_R_TLV("Capture Volume", WM8988_LINVOL, WM8988_RINVOL, 0, 63, 0, pga_tlv), SOC_DOUBLE_R("Capture ZC Switch", WM8988_LINVOL, WM8988_RINVOL, 6, 1, 0), SOC_DOUBLE_R("Capture Switch", WM8988_LINVOL, WM8988_RINVOL, 7, 1, 1), SOC_ENUM("Playback De-emphasis", deemph), SOC_ENUM("Capture Polarity", adcpol), SOC_SINGLE("Playback 6dB Attenuate", WM8988_ADCDAC, 7, 1, 0), SOC_SINGLE("Capture 6dB Attenuate", WM8988_ADCDAC, 8, 1, 0), SOC_DOUBLE_R_TLV("PCM Volume", WM8988_LDAC, WM8988_RDAC, 0, 255, 0, dac_tlv), SOC_SINGLE_TLV("Left Mixer Left Bypass Volume", WM8988_LOUTM1, 4, 7, 1, bypass_tlv), SOC_SINGLE_TLV("Left Mixer Right Bypass Volume", WM8988_LOUTM2, 4, 7, 1, bypass_tlv), SOC_SINGLE_TLV("Right Mixer Left Bypass Volume", WM8988_ROUTM1, 4, 7, 1,
static struct snd_soc_codec *ad1938_codec; struct snd_soc_codec_device soc_codec_dev_ad1938; static int ad1938_register(struct ad1938_priv *ad1938); static void ad1938_unregister(struct ad1938_priv *ad1938); /* * AD1938 volume/mute/de-emphasis etc. controls */ static const char *ad1938_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"}; static const struct soc_enum ad1938_deemp_enum = SOC_ENUM_SINGLE(AD1938_DAC_CTRL2, 1, 4, ad1938_deemp); static const struct snd_kcontrol_new ad1938_snd_controls[] = { /* DAC volume control */ SOC_DOUBLE_R("DAC1 Volume", AD1938_DAC_L1_VOL, AD1938_DAC_R1_VOL, 0, 0xFF, 1), SOC_DOUBLE_R("DAC2 Volume", AD1938_DAC_L2_VOL, AD1938_DAC_R2_VOL, 0, 0xFF, 1), SOC_DOUBLE_R("DAC3 Volume", AD1938_DAC_L3_VOL, AD1938_DAC_R3_VOL, 0, 0xFF, 1), SOC_DOUBLE_R("DAC4 Volume", AD1938_DAC_L4_VOL, AD1938_DAC_R4_VOL, 0, 0xFF, 1), /* ADC switch control */ SOC_DOUBLE("ADC1 Switch", AD1938_ADC_CTRL0, AD1938_ADCL1_MUTE, AD1938_ADCR1_MUTE, 1, 1), SOC_DOUBLE("ADC2 Switch", AD1938_ADC_CTRL0, AD1938_ADCL2_MUTE, AD1938_ADCR2_MUTE, 1, 1), /* DAC switch control */ SOC_DOUBLE("DAC1 Switch", AD1938_DAC_CHNL_MUTE, AD1938_DACL1_MUTE,
static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1); static const DECLARE_TLV_DB_SCALE(adc_tlv, -10350, 50, 1); static const struct snd_kcontrol_new wm8776_snd_controls[] = { SOC_DOUBLE_R_TLV("Headphone Playback Volume", WM8776_HPLVOL, WM8776_HPRVOL, 0, 127, 0, hp_tlv), SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8776_DACLVOL, WM8776_DACRVOL, 0, 255, 0, dac_tlv), SOC_SINGLE("Digital Playback ZC Switch", WM8776_DACCTRL1, 0, 1, 0), SOC_SINGLE("Deemphasis Switch", WM8776_DACCTRL2, 0, 1, 0), SOC_DOUBLE_R_TLV("Capture Volume", WM8776_ADCLVOL, WM8776_ADCRVOL, 0, 255, 0, adc_tlv), SOC_DOUBLE("Capture Switch", WM8776_ADCMUX, 7, 6, 1, 1), SOC_DOUBLE_R("Capture ZC Switch", WM8776_ADCLVOL, WM8776_ADCRVOL, 8, 1, 0), SOC_SINGLE("Capture HPF Switch", WM8776_ADCIFCTRL, 8, 1, 1), }; static const struct snd_kcontrol_new inmix_controls[] = { SOC_DAPM_SINGLE("AIN1 Switch", WM8776_ADCMUX, 0, 1, 0), SOC_DAPM_SINGLE("AIN2 Switch", WM8776_ADCMUX, 1, 1, 0), SOC_DAPM_SINGLE("AIN3 Switch", WM8776_ADCMUX, 2, 1, 0), SOC_DAPM_SINGLE("AIN4 Switch", WM8776_ADCMUX, 3, 1, 0), SOC_DAPM_SINGLE("AIN5 Switch", WM8776_ADCMUX, 4, 1, 0), }; static const struct snd_kcontrol_new outmix_controls[] = { SOC_DAPM_SINGLE("DAC Switch", WM8776_OUTMUX, 0, 1, 0), SOC_DAPM_SINGLE("AUX Switch", WM8776_OUTMUX, 1, 1, 0), SOC_DAPM_SINGLE("Bypass Switch", WM8776_OUTMUX, 2, 1, 0),
SOC_SINGLE("IN2 High Performance Switch", ARIZONA_IN2L_CONTROL, ARIZONA_IN2_OSR_SHIFT, 1, 0), SOC_SINGLE("IN3 High Performance Switch", ARIZONA_IN3L_CONTROL, ARIZONA_IN3_OSR_SHIFT, 1, 0), SOC_DOUBLE_R_RANGE_TLV("IN1 Volume", ARIZONA_IN1L_CONTROL, ARIZONA_IN1R_CONTROL, ARIZONA_IN1L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), SOC_DOUBLE_R_RANGE_TLV("IN2 Volume", ARIZONA_IN2L_CONTROL, ARIZONA_IN2R_CONTROL, ARIZONA_IN2L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), SOC_DOUBLE_R_RANGE_TLV("IN3 Volume", ARIZONA_IN3L_CONTROL, ARIZONA_IN3R_CONTROL, ARIZONA_IN3L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), SOC_DOUBLE_R("IN1 Digital Switch", ARIZONA_ADC_DIGITAL_VOLUME_1L, ARIZONA_ADC_DIGITAL_VOLUME_1R, ARIZONA_IN1L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R("IN2 Digital Switch", ARIZONA_ADC_DIGITAL_VOLUME_2L, ARIZONA_ADC_DIGITAL_VOLUME_2R, ARIZONA_IN2L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R("IN3 Digital Switch", ARIZONA_ADC_DIGITAL_VOLUME_3L, ARIZONA_ADC_DIGITAL_VOLUME_3R, ARIZONA_IN3L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R_TLV("IN1 Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L, ARIZONA_ADC_DIGITAL_VOLUME_1R, ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_DOUBLE_R_TLV("IN2 Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L, ARIZONA_ADC_DIGITAL_VOLUME_2R, ARIZONA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_DOUBLE_R_TLV("IN3 Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_3L, ARIZONA_ADC_DIGITAL_VOLUME_3R, ARIZONA_IN3L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
SOC_SINGLE("ALC Capture Min Gain", WM8978_ALC_CONTROL_1, 0, 7, 0), SOC_SINGLE("ALC Capture Max Gain", WM8978_ALC_CONTROL_1, 3, 7, 0), SOC_SINGLE("ALC Capture Hold", WM8978_ALC_CONTROL_2, 4, 10, 0), SOC_SINGLE("ALC Capture Target", WM8978_ALC_CONTROL_2, 0, 15, 0), SOC_ENUM("ALC Capture Mode", alc3), SOC_SINGLE("ALC Capture Decay", WM8978_ALC_CONTROL_3, 4, 10, 0), SOC_SINGLE("ALC Capture Attack", WM8978_ALC_CONTROL_3, 0, 10, 0), SOC_SINGLE("ALC Capture Noise Gate Switch", WM8978_NOISE_GATE, 3, 1, 0), SOC_SINGLE("ALC Capture Noise Gate Threshold", WM8978_NOISE_GATE, 0, 7, 0), SOC_DOUBLE_R("Capture PGA ZC Switch", WM8978_LEFT_INP_PGA_CONTROL, WM8978_RIGHT_INP_PGA_CONTROL, 7, 1, 0), SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8978_LOUT1_HP_CONTROL, WM8978_ROUT1_HP_CONTROL, 7, 1, 0), SOC_DOUBLE_R_TLV("Headphone Playback Volume", WM8978_LOUT1_HP_CONTROL, WM8978_ROUT1_HP_CONTROL, 0, 63, 0, spk_tlv), SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8978_LOUT2_SPK_CONTROL, WM8978_ROUT2_SPK_CONTROL, 7, 1, 0), SOC_DOUBLE_R_TLV("Speaker Playback Volume",
SOC_SINGLE_TLV("IN2L Boost Volume", WM8900_REG_INBOOSTMIX1, 0, 3, 0, in_boost_tlv), SOC_SINGLE_TLV("IN3L Boost Volume", WM8900_REG_INBOOSTMIX1, 4, 3, 0, in_boost_tlv), SOC_SINGLE_TLV("IN2R Boost Volume", WM8900_REG_INBOOSTMIX2, 0, 3, 0, in_boost_tlv), SOC_SINGLE_TLV("IN3R Boost Volume", WM8900_REG_INBOOSTMIX2, 4, 3, 0, in_boost_tlv), SOC_SINGLE_TLV("Left AUX Boost Volume", WM8900_REG_AUXBOOST, 4, 3, 0, in_boost_tlv), SOC_SINGLE_TLV("Right AUX Boost Volume", WM8900_REG_AUXBOOST, 0, 3, 0, in_boost_tlv), SOC_DOUBLE_R_TLV("LINEOUT1 Volume", WM8900_REG_LOUT1CTL, WM8900_REG_ROUT1CTL, 0, 63, 0, out_pga_tlv), SOC_DOUBLE_R("LINEOUT1 Switch", WM8900_REG_LOUT1CTL, WM8900_REG_ROUT1CTL, 6, 1, 1), SOC_DOUBLE_R("LINEOUT1 ZC Switch", WM8900_REG_LOUT1CTL, WM8900_REG_ROUT1CTL, 7, 1, 0), SOC_DOUBLE_R_TLV("LINEOUT2 Volume", WM8900_REG_LOUT2CTL, WM8900_REG_ROUT2CTL, 0, 63, 0, out_pga_tlv), SOC_DOUBLE_R("LINEOUT2 Switch", WM8900_REG_LOUT2CTL, WM8900_REG_ROUT2CTL, 6, 1, 1), SOC_DOUBLE_R("LINEOUT2 ZC Switch", WM8900_REG_LOUT2CTL, WM8900_REG_ROUT2CTL, 7, 1, 0), SOC_SINGLE("LINEOUT2 LP -12dB", WM8900_REG_LOUTMIXCTL1, 0, 1, 1), };
S5M8751_DA_VOLR_MASK, 0, out_dac_tlv), SOC_SINGLE("Right Lineout mute control", S5M8751_AMP_MUTE, S5M8751_AMP_MUTE_RLINE_SHIFT, 1, 1), SOC_SINGLE("Left Lineout mute control", S5M8751_AMP_MUTE, S5M8751_AMP_MUTE_LLINE_SHIFT, 1, 1), SOC_SINGLE("Right Headphone mute control", S5M8751_AMP_MUTE, S5M8751_AMP_MUTE_RHP_SHIFT, 1, 1), SOC_SINGLE("Left Headphone mute control", S5M8751_AMP_MUTE, S5M8751_AMP_MUTE_LHP_SHIFT, 1, 1), SOC_SINGLE("Speaker PGA mute", S5M8751_AMP_MUTE, S5M8751_AMP_MUTE_SPK_S2D_SHIFT, 1, 1), SOC_DOUBLE_R("HeadPhone Volume", S5M8751_HP_VOL1, S5M8751_HP_VOL2, 0, 0x7f, 1), SOC_DOUBLE_R("Line-In Gain", S5M8751_DA_LGAIN, S5M8751_DA_RGAIN, 0, 0x7f, 1), SOC_DOUBLE_R("DAC Volume", S5M8751_DA_VOLL, S5M8751_DA_VOLR, 0, 0xff, 1), SOC_SINGLE("Capless mode", S5M8751_AMP_EN, 4, 1, 0), SOC_SINGLE("Speaker Slope", S5M8751_SPK_SLOPE, 0, 0xf, 1), SOC_SINGLE("DAC Mute", S5M8751_DA_DIG2, 7, 1, 0), SOC_SINGLE("Mute Dither", S5M8751_DA_DIG2, 6, 1, 0), SOC_SINGLE("Dither Level", S5M8751_DA_DIG2, 3, 7, 0), SOC_SINGLE("Soft Limit", S5M8751_DA_LIM1, 7, 1, 0), SOC_SINGLE("Limit Thrsh", S5M8751_DA_LIM1, 0, 0x7f, 1), SOC_SINGLE("Attack", S5M8751_DA_LIM2, 4, 0xf, 0), SOC_SINGLE("Release", S5M8751_DA_LIM2, 0, 0xf, 0), };
SOC_SINGLE_TLV("ALC Capture Min Volume", WM8985_ALC_CONTROL_1, 0, 7, 0, alc_min_tlv), SOC_SINGLE_TLV("ALC Capture Target Volume", WM8985_ALC_CONTROL_2, 0, 15, 0, alc_tar_tlv), SOC_SINGLE("ALC Capture Attack", WM8985_ALC_CONTROL_3, 0, 10, 0), SOC_SINGLE("ALC Capture Hold", WM8985_ALC_CONTROL_2, 4, 10, 0), SOC_SINGLE("ALC Capture Decay", WM8985_ALC_CONTROL_3, 4, 10, 0), SOC_ENUM("ALC Mode", alc_mode), SOC_SINGLE("ALC Capture NG Switch", WM8985_NOISE_GATE, 3, 1, 0), SOC_SINGLE("ALC Capture NG Threshold", WM8985_NOISE_GATE, 0, 7, 1), SOC_DOUBLE_R_TLV("Capture Volume", WM8985_LEFT_ADC_DIGITAL_VOL, WM8985_RIGHT_ADC_DIGITAL_VOL, 0, 255, 0, adc_tlv), SOC_DOUBLE_R("Capture PGA ZC Switch", WM8985_LEFT_INP_PGA_GAIN_CTRL, WM8985_RIGHT_INP_PGA_GAIN_CTRL, 7, 1, 0), SOC_DOUBLE_R_TLV("Capture PGA Volume", WM8985_LEFT_INP_PGA_GAIN_CTRL, WM8985_RIGHT_INP_PGA_GAIN_CTRL, 0, 63, 0, pga_vol_tlv), SOC_DOUBLE_R_TLV("Capture PGA Boost Volume", WM8985_LEFT_ADC_BOOST_CTRL, WM8985_RIGHT_ADC_BOOST_CTRL, 8, 1, 0, pga_boost_tlv), SOC_DOUBLE("ADC Inversion Switch", WM8985_ADC_CONTROL, 0, 1, 1, 0), SOC_SINGLE("ADC 128x Oversampling Switch", WM8985_ADC_CONTROL, 8, 1, 0), SOC_DOUBLE_R_TLV("Playback Volume", WM8985_LEFT_DAC_DIGITAL_VOL, WM8985_RIGHT_DAC_DIGITAL_VOL, 0, 255, 0, dac_tlv), SOC_SINGLE("DAC Playback Limiter Switch", WM8985_DAC_LIMITER_1, 8, 1, 0), SOC_SINGLE("DAC Playback Limiter Decay", WM8985_DAC_LIMITER_1, 4, 10, 0),
static const struct snd_kcontrol_new ear_amp_ctl = SOC_DAPM_SINGLE("Switch", CS42L73_PWRCTL3, 3, 1, 1); static const struct snd_kcontrol_new cs42l73_snd_controls[] = { SOC_DOUBLE_R_SX_TLV("Headphone Analog Playback Volume", CS42L73_HPAAVOL, CS42L73_HPBAVOL, 0, 0x41, 0x4B, hpaloa_tlv), SOC_DOUBLE_R_SX_TLV("LineOut Analog Playback Volume", CS42L73_LOAAVOL, CS42L73_LOBAVOL, 0, 0x41, 0x4B, hpaloa_tlv), SOC_DOUBLE_R_SX_TLV("Input PGA Analog Volume", CS42L73_MICAPREPGAAVOL, CS42L73_MICBPREPGABVOL, 0, 0x34, 0x24, micpga_tlv), SOC_DOUBLE_R("MIC Preamp Switch", CS42L73_MICAPREPGAAVOL, CS42L73_MICBPREPGABVOL, 6, 1, 1), SOC_DOUBLE_R_SX_TLV("Input Path Digital Volume", CS42L73_IPADVOL, CS42L73_IPBDVOL, 0, 0xA0, 0x6C, ipd_tlv), SOC_DOUBLE_R_SX_TLV("HL Digital Playback Volume", CS42L73_HLADVOL, CS42L73_HLBDVOL, 0, 0x34, 0xE4, hl_tlv), SOC_SINGLE_TLV("ADC A Boost Volume", CS42L73_ADCIPC, 2, 0x01, 1, adc_boost_tlv), SOC_SINGLE_TLV("ADC B Boost Volume", CS42L73_ADCIPC, 6, 0x01, 1, adc_boost_tlv), SOC_SINGLE_SX_TLV("Speakerphone Digital Volume",
} mutex_unlock(&codec->mutex); return ret; } static const DECLARE_TLV_DB_SCALE(in_tlv, -3450, 150, 0); static const DECLARE_TLV_DB_SCALE(sidetone_tlv, -1500, 300, 0); static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1); static const DECLARE_TLV_DB_SCALE(mic_tlv, 0, 2000, 0); static const struct snd_kcontrol_new wm8731_snd_controls[] = { SOC_DOUBLE_R_TLV("Master Playback Volume", WM8731_LOUT1V, WM8731_ROUT1V, 0, 127, 0, out_tlv), SOC_DOUBLE_R("Master Playback ZC Switch", WM8731_LOUT1V, WM8731_ROUT1V, 7, 1, 0), SOC_DOUBLE_R_TLV("Capture Volume", WM8731_LINVOL, WM8731_RINVOL, 0, 31, 0, in_tlv), SOC_DOUBLE_R("Line Capture Switch", WM8731_LINVOL, WM8731_RINVOL, 7, 1, 1), SOC_SINGLE_TLV("Mic Boost Volume", WM8731_APANA, 0, 1, 0, mic_tlv), SOC_SINGLE("Mic Capture Switch", WM8731_APANA, 1, 1, 1), SOC_SINGLE_TLV("Sidetone Playback Volume", WM8731_APANA, 6, 3, 1, sidetone_tlv), SOC_SINGLE("ADC High Pass Filter Switch", WM8731_APDIGI, 0, 1, 1), SOC_SINGLE("Store DC Offset Switch", WM8731_APDIGI, 4, 1, 0), SOC_SINGLE_BOOL_EXT("Playback Deemphasis Switch", 0,
struct ad1836_priv { enum snd_soc_control_type control_type; void *control_data; }; /* * AD1836 volume/mute/de-emphasis etc. controls */ static const char *ad1836_deemp[] = {"None", "44.1kHz", "32kHz", "48kHz"}; static const struct soc_enum ad1836_deemp_enum = SOC_ENUM_SINGLE(AD1836_DAC_CTRL1, 8, 4, ad1836_deemp); static const struct snd_kcontrol_new ad1836_snd_controls[] = { /* DAC volume control */ SOC_DOUBLE_R("DAC1 Volume", AD1836_DAC_L1_VOL, AD1836_DAC_R1_VOL, 0, 0x3FF, 0), SOC_DOUBLE_R("DAC2 Volume", AD1836_DAC_L2_VOL, AD1836_DAC_R2_VOL, 0, 0x3FF, 0), SOC_DOUBLE_R("DAC3 Volume", AD1836_DAC_L3_VOL, AD1836_DAC_R3_VOL, 0, 0x3FF, 0), /* ADC switch control */ SOC_DOUBLE("ADC1 Switch", AD1836_ADC_CTRL2, AD1836_ADCL1_MUTE, AD1836_ADCR1_MUTE, 1, 1), SOC_DOUBLE("ADC2 Switch", AD1836_ADC_CTRL2, AD1836_ADCL2_MUTE, AD1836_ADCR2_MUTE, 1, 1), /* DAC switch control */ SOC_DOUBLE("DAC1 Switch", AD1836_DAC_CTRL2, AD1836_DACL1_MUTE, AD1836_DACR1_MUTE, 1, 1), SOC_DOUBLE("DAC2 Switch", AD1836_DAC_CTRL2, AD1836_DACL2_MUTE,
*/ static const struct snd_kcontrol_new aic31xx_snd_controls[] = { SOC_DOUBLE_R_S_TLV("DAC Playback Volume", AIC31XX_LDACVOL, AIC31XX_RDACVOL, 0, -127, 48, 7, 0, dac_vol_tlv), SOC_SINGLE_TLV("ADC Fine Capture Volume", AIC31XX_ADCFGA, 4, 4, 1, adc_fgain_tlv), SOC_SINGLE("ADC Capture Switch", AIC31XX_ADCFGA, 7, 1, 1), SOC_DOUBLE_R_S_TLV("ADC Capture Volume", AIC31XX_ADCVOL, AIC31XX_ADCVOL, 0, -24, 40, 6, 0, adc_cgain_tlv), SOC_SINGLE_TLV("Mic PGA Capture Volume", AIC31XX_MICPGA, 0, 119, 0, mic_pga_tlv), SOC_DOUBLE_R("HP Driver Playback Switch", AIC31XX_HPLGAIN, AIC31XX_HPRGAIN, 2, 1, 0), SOC_DOUBLE_R_TLV("HP Driver Playback Volume", AIC31XX_HPLGAIN, AIC31XX_HPRGAIN, 3, 0x09, 0, hp_drv_tlv), SOC_DOUBLE_R_TLV("HP Analog Playback Volume", AIC31XX_LANALOGHPL, AIC31XX_RANALOGHPR, 0, 0x7F, 1, hp_vol_tlv), }; static const struct snd_kcontrol_new aic311x_snd_controls[] = { SOC_DOUBLE_R("Speaker Driver Playback Switch", AIC31XX_SPLGAIN, AIC31XX_SPRGAIN, 2, 1, 0), SOC_DOUBLE_R_TLV("Speaker Driver Playback Volume", AIC31XX_SPLGAIN, AIC31XX_SPRGAIN, 3, 3, 0, class_D_drv_tlv), SOC_DOUBLE_R_TLV("Speaker Analog Playback Volume", AIC31XX_LANALOGSPL, AIC31XX_RANALOGSPR, 0, 0x7F, 1, sp_vol_tlv),
SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0), SOC_DOUBLE_R_TLV("MIC Gain Volume", CS42L52_MICA_CTL, CS42L52_MICB_CTL, 0, 0x10, 0, mic_tlv), SOC_ENUM("MIC Bias Level", mic_bias_level_enum), SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L52_ADCA_VOL, CS42L52_ADCB_VOL, 7, 0x80, 0xA0, ipd_tlv), SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL, 6, 0x7f, 0x19, ipd_tlv), SOC_DOUBLE("ADC Switch", CS42L52_ADC_MISC_CTL, 0, 1, 1, 0), SOC_DOUBLE_R("ADC Mixer Switch", CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL, 7, 1, 1), SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L52_PGAA_CTL, CS42L52_PGAB_CTL, 0, 0x28, 0x30, pga_tlv), SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 0, 0x7f, 0x19, mix_tlv), SOC_DOUBLE_R("PCM Mixer Switch", CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1), SOC_ENUM("Beep Config", beep_config_enum), SOC_ENUM("Beep Pitch", beep_pitch_enum), SOC_ENUM("Beep on Time", beep_ontime_enum), SOC_ENUM("Beep off Time", beep_offtime_enum), SOC_SINGLE_SX_TLV("Beep Volume", CS42L52_BEEP_VOL,
SOC_SINGLE("MIXOUTR Switch", WM9090_OUTPUT_MIXER4, 8, 1, 1), SOC_SINGLE_TLV("MIXOUTR IN1A Volume", WM9090_OUTPUT_MIXER4, 6, 3, 1, mix_tlv), SOC_SINGLE_TLV("MIXOUTR IN2A Volume", WM9090_OUTPUT_MIXER4, 2, 3, 1, mix_tlv), SOC_SINGLE("SPKMIX Switch", WM9090_SPKMIXL_ATTENUATION, 8, 1, 1), SOC_SINGLE_TLV("SPKMIX IN1A Volume", WM9090_SPKMIXL_ATTENUATION, 6, 3, 1, mix_tlv), SOC_SINGLE_TLV("SPKMIX IN2A Volume", WM9090_SPKMIXL_ATTENUATION, 2, 3, 1, mix_tlv), SOC_DOUBLE_R_TLV("Headphone Volume", WM9090_LEFT_OUTPUT_VOLUME, WM9090_RIGHT_OUTPUT_VOLUME, 0, 63, 0, out_tlv), SOC_DOUBLE_R("Headphone Switch", WM9090_LEFT_OUTPUT_VOLUME, WM9090_RIGHT_OUTPUT_VOLUME, 6, 1, 1), SOC_DOUBLE_R("Headphone ZC Switch", WM9090_LEFT_OUTPUT_VOLUME, WM9090_RIGHT_OUTPUT_VOLUME, 7, 1, 0), SOC_SINGLE_TLV("Speaker Volume", WM9090_SPEAKER_VOLUME_LEFT, 0, 63, 0, out_tlv), SOC_SINGLE("Speaker Switch", WM9090_SPEAKER_VOLUME_LEFT, 6, 1, 1), SOC_SINGLE("Speaker ZC Switch", WM9090_SPEAKER_VOLUME_LEFT, 7, 1, 0), SOC_SINGLE_TLV("Speaker Boost Volume", WM9090_CLASSD3, 3, 7, 0, spkboost_tlv), }; static const struct snd_kcontrol_new wm9090_in1_se_controls[] = { SOC_SINGLE_TLV("IN1B Volume", WM9090_IN1_LINE_INPUT_B_VOLUME, 0, 6, 0, in_tlv), SOC_SINGLE("IN1B Switch", WM9090_IN1_LINE_INPUT_B_VOLUME, 7, 1, 1), SOC_SINGLE("IN1B ZC Switch", WM9090_IN1_LINE_INPUT_B_VOLUME, 6, 1, 0),
snd_soc_update_bits(codec, WM8904_ADC_TEST_0, WM8904_ADC_128_OSR_TST_MODE | WM8904_ADC_BIASX1P5, val); return ret; } static const struct snd_kcontrol_new wm8904_adc_snd_controls[] = { SOC_DOUBLE_R_TLV("Digital Capture Volume", WM8904_ADC_DIGITAL_VOLUME_LEFT, WM8904_ADC_DIGITAL_VOLUME_RIGHT, 1, 119, 0, digital_tlv), SOC_ENUM("Left Caputure Mode", lin_mode), SOC_ENUM("Right Capture Mode", rin_mode), /* No TLV since it depends on mode */ SOC_DOUBLE_R("Capture Volume", WM8904_ANALOGUE_LEFT_INPUT_0, WM8904_ANALOGUE_RIGHT_INPUT_0, 0, 31, 0), SOC_DOUBLE_R("Capture Switch", WM8904_ANALOGUE_LEFT_INPUT_0, WM8904_ANALOGUE_RIGHT_INPUT_0, 7, 1, 1), SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0), SOC_ENUM("High Pass Filter Mode", hpf_mode), SOC_SINGLE_EXT("ADC 128x OSR Switch", WM8904_ANALOGUE_ADC_0, 0, 1, 0, snd_soc_get_volsw, wm8904_adc_osr_put), }; static const char *drc_path_text[] = { "ADC", "DAC" }; static SOC_ENUM_SINGLE_DECL(drc_path, WM8904_DRC_0, 14, drc_path_text);
SOC_ENUM_SINGLE(ACS42200_PWRM2, 3, 3, acs42200_speakermode), SOC_ENUM_SINGLE(ACS42200_PWRM1, 0, 1, acs42200_micbias), SOC_ENUM_SINGLE(ACS42200_INSELL, 4, 3, acs42200_micboost), SOC_ENUM_SINGLE(ACS42200_INSELR, 4, 3, acs42200_micboost), }; static const DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 50, 1); static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 50, 1); static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0); static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1); static const DECLARE_TLV_DB_SCALE(in_tlv, -1725, 75, 0); static const struct snd_kcontrol_new acs42200_snd_controls[] = { SOC_DOUBLE_R_TLV("Capture Volume", ACS42200_INVOLL, ACS42200_INVOLR, 0, 63, 0, in_tlv), SOC_DOUBLE_R("Capture Volume ZC Switch", ACS42200_INVOLL, ACS42200_INVOLR, 6, 1, 0), SOC_DOUBLE_R("Capture Switch", ACS42200_INVOLL, ACS42200_INVOLR, 7, 1, 0), SOC_DOUBLE_R_TLV("Playback Volume", ACS42200_DACVOLL, ACS42200_DACVOLR, 0, 255, 0, dac_tlv), SOC_DOUBLE_R_TLV("Headphone Playback Volume", ACS42200_HPVOLL, ACS42200_HPVOLR, 0, 127, 0, out_tlv), SOC_SINGLE("Headphone Playback ZC Switch", ACS42200_CTL, 0, 1, 0), SOC_DOUBLE_R_TLV("Speaker Playback Volume", ACS42200_SPKVOLL, ACS42200_SPKVOLR, 0, 127, 0, out_tlv), SOC_ENUM("Speaker Playback Off Switch", acs42200_enum[6]), SOC_SINGLE("Speaker DC Volume", WM8960_CLASSD3, 3, 5, 0),
SOC_ENUM_SINGLE(WM8960_DACCTL2, 5, 4, wm8960_polarity), SOC_ENUM_SINGLE(WM8960_3D, 6, 2, wm8960_3d_upper_cutoff), SOC_ENUM_SINGLE(WM8960_3D, 5, 2, wm8960_3d_lower_cutoff), SOC_ENUM_SINGLE(WM8960_ALC1, 7, 4, wm8960_alcfunc), SOC_ENUM_SINGLE(WM8960_ALC3, 8, 2, wm8960_alcmode), }; static const DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 50, 0); static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 50, 1); static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0); static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1); static const struct snd_kcontrol_new wm8960_snd_controls[] = { SOC_DOUBLE_R_TLV("Capture Volume", WM8960_LINVOL, WM8960_RINVOL, 0, 63, 0, adc_tlv), SOC_DOUBLE_R("Capture Volume ZC Switch", WM8960_LINVOL, WM8960_RINVOL, 6, 1, 0), SOC_DOUBLE_R("Capture Switch", WM8960_LINVOL, WM8960_RINVOL, 7, 1, 0), SOC_DOUBLE_R_TLV("Playback Volume", WM8960_LDAC, WM8960_RDAC, 0, 255, 0, dac_tlv), SOC_DOUBLE_R_TLV("Headphone Playback Volume", WM8960_LOUT1, WM8960_ROUT1, 0, 127, 0, out_tlv), SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8960_LOUT1, WM8960_ROUT1, 7, 1, 0), SOC_DOUBLE_R_TLV("Speaker Playback Volume", WM8960_LOUT2, WM8960_ROUT2, 0, 127, 0, out_tlv), SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8960_LOUT2, WM8960_ROUT2, 7, 1, 0),
0, 0x7F, 1, cs4271_dac_tlv), SOC_SINGLE("Digital Loopback Switch", CS4271_MODE2, 4, 1, 0), SOC_SINGLE("Soft Ramp Switch", CS4271_DACVOL, 5, 1, 0), SOC_SINGLE("Zero Cross Switch", CS4271_DACVOL, 4, 1, 0), SOC_SINGLE_BOOL_EXT("De-emphasis Switch", 0, cs4271_get_deemph, cs4271_put_deemph), SOC_SINGLE("Auto-Mute Switch", CS4271_DACCTL, 7, 1, 0), SOC_SINGLE("Slow Roll Off Filter Switch", CS4271_DACCTL, 6, 1, 0), SOC_SINGLE("Soft Volume Ramp-Up Switch", CS4271_DACCTL, 3, 1, 0), SOC_SINGLE("Soft Ramp-Down Switch", CS4271_DACCTL, 2, 1, 0), SOC_SINGLE("Left Channel Inversion Switch", CS4271_DACCTL, 1, 1, 0), SOC_SINGLE("Right Channel Inversion Switch", CS4271_DACCTL, 0, 1, 0), SOC_DOUBLE("Master Capture Switch", CS4271_ADCCTL, 3, 2, 1, 1), SOC_SINGLE("Dither 16-Bit Data Switch", CS4271_ADCCTL, 5, 1, 0), SOC_DOUBLE("High Pass Filter Switch", CS4271_ADCCTL, 1, 0, 1, 1), SOC_DOUBLE_R("Master Playback Switch", CS4271_VOLA, CS4271_VOLB, 7, 1, 1), }; static struct snd_soc_dai_ops cs4271_dai_ops = { .hw_params = cs4271_hw_params, .set_sysclk = cs4271_set_dai_sysclk, .set_fmt = cs4271_set_dai_fmt, .digital_mute = cs4271_digital_mute, }; static struct snd_soc_dai_driver cs4271_dai = { .name = "cs4271-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, .channels_max = 2,
SOC_ENUM_SINGLE(WM8971_TREBLE, 6, 2, wm8971_treble), SOC_ENUM_SINGLE(WM8971_ALC1, 7, 4, wm8971_alc_func), SOC_ENUM_SINGLE(WM8971_NGATE, 1, 2, wm8971_ng_type), /* 4 */ SOC_ENUM_SINGLE(WM8971_ADCDAC, 1, 4, wm8971_deemp), SOC_ENUM_SINGLE(WM8971_ADCTL1, 4, 4, wm8971_mono_mux), SOC_ENUM_SINGLE(WM8971_ADCTL1, 1, 2, wm8971_dac_phase), SOC_ENUM_SINGLE(WM8971_LOUTM1, 0, 5, wm8971_lline_mux), /* 8 */ SOC_ENUM_SINGLE(WM8971_ROUTM1, 0, 5, wm8971_rline_mux), SOC_ENUM_SINGLE(WM8971_LADCIN, 6, 4, wm8971_lpga_sel), SOC_ENUM_SINGLE(WM8971_RADCIN, 6, 4, wm8971_rpga_sel), SOC_ENUM_SINGLE(WM8971_ADCDAC, 5, 4, wm8971_adcpol), /* 12 */ SOC_ENUM_SINGLE(WM8971_ADCIN, 6, 4, wm8971_mono_mux), }; static const struct snd_kcontrol_new wm8971_snd_controls[] = { SOC_DOUBLE_R("Capture Volume", WM8971_LINVOL, WM8971_RINVOL, 0, 63, 0), SOC_DOUBLE_R("Capture ZC Switch", WM8971_LINVOL, WM8971_RINVOL, 6, 1, 0), SOC_DOUBLE_R("Capture Switch", WM8971_LINVOL, WM8971_RINVOL, 7, 1, 1), SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8971_LOUT1V, WM8971_ROUT1V, 7, 1, 0), SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8971_LOUT2V, WM8971_ROUT2V, 7, 1, 0), SOC_SINGLE("Mono Playback ZC Switch", WM8971_MOUTV, 7, 1, 0), SOC_DOUBLE_R("PCM Volume", WM8971_LDAC, WM8971_RDAC, 0, 255, 0), SOC_DOUBLE_R("Bypass Left Playback Volume", WM8971_LOUTM1, WM8971_LOUTM2, 4, 7, 1), SOC_DOUBLE_R("Bypass Right Playback Volume", WM8971_ROUTM1,
struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); int left = !ucontrol->value.integer.value[0]; int right = !ucontrol->value.integer.value[1]; cs4270->manual_mute = (left ? CS4270_MUTE_DAC_A : 0) | (right ? CS4270_MUTE_DAC_B : 0); return snd_soc_put_volsw(kcontrol, ucontrol); } /* A list of non-DAPM controls that the CS4270 supports */ static const struct snd_kcontrol_new cs4270_snd_controls[] = { SOC_DOUBLE_R("Master Playback Volume", CS4270_VOLA, CS4270_VOLB, 0, 0xFF, 1), SOC_SINGLE("Digital Sidetone Switch", CS4270_FORMAT, 5, 1, 0), SOC_SINGLE("Soft Ramp Switch", CS4270_TRANS, 6, 1, 0), SOC_SINGLE("Zero Cross Switch", CS4270_TRANS, 5, 1, 0), SOC_SINGLE("De-emphasis filter", CS4270_TRANS, 0, 1, 0), SOC_SINGLE("Popguard Switch", CS4270_MODE, 0, 1, 1), SOC_SINGLE("Auto-Mute Switch", CS4270_MUTE, 5, 1, 0), SOC_DOUBLE("Master Capture Switch", CS4270_MUTE, 3, 4, 1, 1), SOC_DOUBLE_EXT("Master Playback Switch", CS4270_MUTE, 0, 1, 1, 1, snd_soc_get_volsw, cs4270_soc_put_mute), }; static const struct snd_soc_dai_ops cs4270_dai_ops = { .hw_params = cs4270_hw_params, .set_sysclk = cs4270_set_dai_sysclk, .set_fmt = cs4270_set_dai_fmt,
case WM8711_RESET: return true; default: return false; } } #define wm8711_reset(c) snd_soc_write(c, WM8711_RESET, 0) static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1); static const struct snd_kcontrol_new wm8711_snd_controls[] = { SOC_DOUBLE_R_TLV("Master Playback Volume", WM8711_LOUT1V, WM8711_ROUT1V, 0, 127, 0, out_tlv), SOC_DOUBLE_R("Master Playback ZC Switch", WM8711_LOUT1V, WM8711_ROUT1V, 7, 1, 0), }; /* Output Mixer */ static const struct snd_kcontrol_new wm8711_output_mixer_controls[] = { SOC_DAPM_SINGLE("Line Bypass Switch", WM8711_APANA, 3, 1, 0), SOC_DAPM_SINGLE("HiFi Playback Switch", WM8711_APANA, 4, 1, 0), }; static const struct snd_soc_dapm_widget wm8711_dapm_widgets[] = { SND_SOC_DAPM_MIXER("Output Mixer", WM8711_PWR, 4, 1, &wm8711_output_mixer_controls[0], ARRAY_SIZE(wm8711_output_mixer_controls)), SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8711_PWR, 3, 1), SND_SOC_DAPM_OUTPUT("LOUT"),