static const char *max9877_osc_mode[] = { "1176KHz", "1100KHz", "700KHz", }; static const struct soc_enum max9877_enum[] = { SOC_ENUM_SINGLE(MAX9877_OUTPUT_MODE, 0, ARRAY_SIZE(max9877_out_mode), max9877_out_mode), SOC_ENUM_SINGLE(MAX9877_OUTPUT_MODE, MAX9877_OSC_OFFSET, ARRAY_SIZE(max9877_osc_mode), max9877_osc_mode), }; static const struct snd_kcontrol_new max9877_controls[] = { SOC_SINGLE_TLV("MAX9877 PGAINA Playback Volume", MAX9877_INPUT_MODE, 0, 2, 0, max9877_pgain_tlv), SOC_SINGLE_TLV("MAX9877 PGAINB Playback Volume", MAX9877_INPUT_MODE, 2, 2, 0, max9877_pgain_tlv), SOC_SINGLE_TLV("MAX9877 Amp Speaker Playback Volume", MAX9877_SPK_VOLUME, 0, 31, 0, max9877_output_tlv), SOC_DOUBLE_R_TLV("MAX9877 Amp HP Playback Volume", MAX9877_HPL_VOLUME, MAX9877_HPR_VOLUME, 0, 31, 0, max9877_output_tlv), SOC_SINGLE("MAX9877 INB Stereo Switch", MAX9877_INPUT_MODE, 4, 1, 1), SOC_SINGLE("MAX9877 INA Stereo Switch", MAX9877_INPUT_MODE, 5, 1, 1), SOC_SINGLE("MAX9877 Zero-crossing detection Switch", MAX9877_INPUT_MODE, 6, 1, 0), SOC_SINGLE("MAX9877 Bypass Mode Switch", MAX9877_OUTPUT_MODE, 6, 1, 0),
static const struct snd_kcontrol_new max98373_snd_controls[] = { SOC_SINGLE("Digital Vol Sel Switch", MAX98373_R203F_AMP_DSP_CFG, MAX98373_AMP_VOL_SEL_SHIFT, 1, 0), SOC_SINGLE("Volume Location Switch", MAX98373_R203F_AMP_DSP_CFG, MAX98373_AMP_VOL_SEL_SHIFT, 1, 0), SOC_SINGLE("Ramp Up Switch", MAX98373_R203F_AMP_DSP_CFG, MAX98373_AMP_DSP_CFG_RMP_UP_SHIFT, 1, 0), SOC_SINGLE("Ramp Down Switch", MAX98373_R203F_AMP_DSP_CFG, MAX98373_AMP_DSP_CFG_RMP_DN_SHIFT, 1, 0), SOC_SINGLE("CLK Monitor Switch", MAX98373_R20FE_DEVICE_AUTO_RESTART_CFG, MAX98373_CLOCK_MON_SHIFT, 1, 0), SOC_SINGLE("Dither Switch", MAX98373_R203F_AMP_DSP_CFG, MAX98373_AMP_DSP_CFG_DITH_SHIFT, 1, 0), SOC_SINGLE("DC Blocker Switch", MAX98373_R203F_AMP_DSP_CFG, MAX98373_AMP_DSP_CFG_DCBLK_SHIFT, 1, 0), SOC_SINGLE_TLV("Digital Volume", MAX98373_R203D_AMP_DIG_VOL_CTRL, 0, 0x7F, 0, max98373_digital_tlv), SOC_SINGLE_TLV("Speaker Volume", MAX98373_R203E_AMP_PATH_GAIN, MAX98373_SPK_DIGI_GAIN_SHIFT, 10, 0, max98373_spk_tlv), SOC_SINGLE_TLV("FS Max Volume", MAX98373_R203E_AMP_PATH_GAIN, MAX98373_FS_GAIN_MAX_SHIFT, 9, 0, max98373_spkgain_max_tlv), SOC_ENUM("Output Voltage", max98373_out_volt_enum), /* Dynamic Headroom Tracking */ SOC_SINGLE("DHT Switch", MAX98373_R20D4_DHT_EN, MAX98373_DHT_EN_SHIFT, 1, 0), SOC_SINGLE_TLV("DHT Min Volume", MAX98373_R20D1_DHT_CFG, MAX98373_DHT_SPK_GAIN_MIN_SHIFT, 9, 0, max98373_dht_spkgain_min_tlv), SOC_SINGLE_TLV("DHT Rot Pnt Volume", MAX98373_R20D1_DHT_CFG, MAX98373_DHT_ROT_PNT_SHIFT, 15, 0, max98373_dht_rotation_point_tlv), SOC_SINGLE_TLV("DHT Attack Step Volume", MAX98373_R20D2_DHT_ATTACK_CFG, MAX98373_DHT_ATTACK_STEP_SHIFT, 4, 0, max98373_dht_step_size_tlv), SOC_SINGLE_TLV("DHT Release Step Volume", MAX98373_R20D3_DHT_RELEASE_CFG,
static const struct snd_kcontrol_new wm8997_snd_controls[] = { SOC_SINGLE("IN1 High Performance Switch", ARIZONA_IN1L_CONTROL, ARIZONA_IN1_OSR_SHIFT, 1, 0), SOC_SINGLE("IN2 High Performance Switch", ARIZONA_IN2L_CONTROL, ARIZONA_IN2_OSR_SHIFT, 1, 0), SOC_SINGLE_RANGE_TLV("IN1L Volume", ARIZONA_IN1L_CONTROL, ARIZONA_IN1L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), SOC_SINGLE_RANGE_TLV("IN1R Volume", ARIZONA_IN1R_CONTROL, ARIZONA_IN1R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), SOC_SINGLE_RANGE_TLV("IN2L Volume", ARIZONA_IN2L_CONTROL, ARIZONA_IN2L_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), SOC_SINGLE_RANGE_TLV("IN2R Volume", ARIZONA_IN2R_CONTROL, ARIZONA_IN2R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv), SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L, ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R, ARIZONA_IN1R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_SINGLE_TLV("IN2L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L, ARIZONA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_SINGLE_TLV("IN2R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2R, ARIZONA_IN2R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp), SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp), ARIZONA_MIXER_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
{ "DAC1 Normal", "DAC1 Inverted" }, { "DAC2 Normal", "DAC2 Inverted" }, { "DAC3 Normal", "DAC3 Inverted" }, { "DAC4 Normal", "DAC4 Inverted" }, }; static const struct soc_enum dac_phase[] = { SOC_ENUM_DOUBLE(WM8770_DACPHASE, 0, 1, 2, dac_phase_text[0]), SOC_ENUM_DOUBLE(WM8770_DACPHASE, 2, 3, 2, dac_phase_text[1]), SOC_ENUM_DOUBLE(WM8770_DACPHASE, 4, 5, 2, dac_phase_text[2]), SOC_ENUM_DOUBLE(WM8770_DACPHASE, 6, 7, 2, dac_phase_text[3]), }; 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),
static SOC_ENUM_SINGLE_DECL(wm8991_right_adcmode_enum, WM8991_ADC_CTRL, WM8991_ADC_HPF_CUT_SHIFT, wm8991_adcmode); static const struct snd_kcontrol_new wm8991_snd_controls[] = { /* INMIXL */ SOC_SINGLE("LIN12 PGA Boost", WM8991_INPUT_MIXER3, WM8991_L12MNBST_BIT, 1, 0), SOC_SINGLE("LIN34 PGA Boost", WM8991_INPUT_MIXER3, WM8991_L34MNBST_BIT, 1, 0), /* INMIXR */ SOC_SINGLE("RIN12 PGA Boost", WM8991_INPUT_MIXER3, WM8991_R12MNBST_BIT, 1, 0), SOC_SINGLE("RIN34 PGA Boost", WM8991_INPUT_MIXER3, WM8991_R34MNBST_BIT, 1, 0), /* LOMIX */ SOC_SINGLE_TLV("LOMIX LIN3 Bypass Volume", WM8991_OUTPUT_MIXER3, WM8991_LLI3LOVOL_SHIFT, WM8991_LLI3LOVOL_MASK, 1, out_mix_tlv), SOC_SINGLE_TLV("LOMIX RIN12 PGA Bypass Volume", WM8991_OUTPUT_MIXER3, WM8991_LR12LOVOL_SHIFT, WM8991_LR12LOVOL_MASK, 1, out_mix_tlv), SOC_SINGLE_TLV("LOMIX LIN12 PGA Bypass Volume", WM8991_OUTPUT_MIXER3, WM8991_LL12LOVOL_SHIFT, WM8991_LL12LOVOL_MASK, 1, out_mix_tlv), SOC_SINGLE_TLV("LOMIX RIN3 Bypass Volume", WM8991_OUTPUT_MIXER5, WM8991_LRI3LOVOL_SHIFT, WM8991_LRI3LOVOL_MASK, 1, out_mix_tlv), SOC_SINGLE_TLV("LOMIX AINRMUX Bypass Volume", WM8991_OUTPUT_MIXER5, WM8991_LRBLOVOL_SHIFT, WM8991_LRBLOVOL_MASK, 1, out_mix_tlv), SOC_SINGLE_TLV("LOMIX AINLMUX Bypass Volume", WM8991_OUTPUT_MIXER5, WM8991_LRBLOVOL_SHIFT, WM8991_LRBLOVOL_MASK, 1, out_mix_tlv), /* ROMIX */ SOC_SINGLE_TLV("ROMIX RIN3 Bypass Volume", WM8991_OUTPUT_MIXER4, WM8991_RRI3ROVOL_SHIFT, WM8991_RRI3ROVOL_MASK, 1, out_mix_tlv), SOC_SINGLE_TLV("ROMIX LIN12 PGA Bypass Volume", WM8991_OUTPUT_MIXER4,
SOC_ENUM("Capture ADC Inversion", wm8350_enum[6]), SOC_WM8350_DOUBLE_R_TLV("Capture PCM Volume", WM8350_ADC_DIGITAL_VOLUME_L, WM8350_ADC_DIGITAL_VOLUME_R, 0, 255, 0, adc_pcm_tlv), SOC_DOUBLE_TLV("Capture Sidetone Volume", WM8350_ADC_DIVIDER, 8, 4, 15, 1, capture_sd_tlv), SOC_WM8350_DOUBLE_R_TLV("Capture Volume", WM8350_LEFT_INPUT_VOLUME, WM8350_RIGHT_INPUT_VOLUME, 2, 63, 0, pre_amp_tlv), SOC_DOUBLE_R("Capture ZC Switch", WM8350_LEFT_INPUT_VOLUME, WM8350_RIGHT_INPUT_VOLUME, 13, 1, 0), SOC_SINGLE_TLV("Left Input Left Sidetone Volume", WM8350_OUTPUT_LEFT_MIXER_VOLUME, 1, 7, 0, out_mix_tlv), SOC_SINGLE_TLV("Left Input Right Sidetone Volume", WM8350_OUTPUT_LEFT_MIXER_VOLUME, 5, 7, 0, out_mix_tlv), SOC_SINGLE_TLV("Left Input Bypass Volume", WM8350_OUTPUT_LEFT_MIXER_VOLUME, 9, 7, 0, out_mix_tlv), SOC_SINGLE_TLV("Right Input Left Sidetone Volume", WM8350_OUTPUT_RIGHT_MIXER_VOLUME, 1, 7, 0, out_mix_tlv), SOC_SINGLE_TLV("Right Input Right Sidetone Volume", WM8350_OUTPUT_RIGHT_MIXER_VOLUME, 5, 7, 0, out_mix_tlv), SOC_SINGLE_TLV("Right Input Bypass Volume", WM8350_OUTPUT_RIGHT_MIXER_VOLUME, 13, 7, 0, out_mix_tlv),
/* Class AB */ reg2 &= ~(WM9081_SPK_INV_MUTE | WM9081_OUT_SPK_CTRL); reg2 |= WM9081_SPK_MODE; } else { /* Class D */ reg2 |= WM9081_SPK_INV_MUTE | WM9081_OUT_SPK_CTRL; reg2 &= ~WM9081_SPK_MODE; } snd_soc_write(codec, WM9081_ANALOGUE_SPEAKER_2, reg2); return 0; } static const struct snd_kcontrol_new wm9081_snd_controls[] = { SOC_SINGLE_TLV("IN1 Volume", WM9081_ANALOGUE_MIXER, 1, 1, 1, in_tlv), SOC_SINGLE_TLV("IN2 Volume", WM9081_ANALOGUE_MIXER, 3, 1, 1, in_tlv), SOC_SINGLE_TLV("Playback Volume", WM9081_DAC_DIGITAL_1, 1, 96, 0, dac_tlv), SOC_SINGLE("LINEOUT Switch", WM9081_ANALOGUE_LINEOUT, 7, 1, 1), SOC_SINGLE("LINEOUT ZC Switch", WM9081_ANALOGUE_LINEOUT, 6, 1, 0), SOC_SINGLE_TLV("LINEOUT Volume", WM9081_ANALOGUE_LINEOUT, 0, 63, 0, out_tlv), SOC_SINGLE("DRC Switch", WM9081_DRC_1, 15, 1, 0), SOC_ENUM("DRC High Slope", drc_high), SOC_ENUM("DRC Low Slope", drc_low), SOC_SINGLE_TLV("DRC Input Volume", WM9081_DRC_4, 5, 60, 1, drc_in_tlv), SOC_SINGLE_TLV("DRC Output Volume", WM9081_DRC_4, 0, 30, 1, drc_out_tlv), SOC_SINGLE_TLV("DRC Minimum Volume", WM9081_DRC_2, 2, 3, 1, drc_min_tlv), SOC_SINGLE_TLV("DRC Maximum Volume", WM9081_DRC_2, 0, 3, 0, drc_max_tlv),
struct jz4740_codec { struct regmap *regmap; }; static const unsigned int jz4740_mic_tlv[] = { TLV_DB_RANGE_HEAD(2), 0, 2, TLV_DB_SCALE_ITEM(0, 600, 0), 3, 3, TLV_DB_SCALE_ITEM(2000, 0, 0), }; static const DECLARE_TLV_DB_SCALE(jz4740_out_tlv, 0, 200, 0); static const DECLARE_TLV_DB_SCALE(jz4740_in_tlv, -3450, 150, 0); static const struct snd_kcontrol_new jz4740_codec_controls[] = { SOC_SINGLE_TLV("Master Playback Volume", JZ4740_REG_CODEC_2, JZ4740_CODEC_2_HEADPHONE_VOLUME_OFFSET, 3, 0, jz4740_out_tlv), SOC_SINGLE_TLV("Master Capture Volume", JZ4740_REG_CODEC_2, JZ4740_CODEC_2_INPUT_VOLUME_OFFSET, 31, 0, jz4740_in_tlv), SOC_SINGLE("Master Playback Switch", JZ4740_REG_CODEC_1, JZ4740_CODEC_1_HEADPHONE_DISABLE_OFFSET, 1, 1), SOC_SINGLE_TLV("Mic Capture Volume", JZ4740_REG_CODEC_2, JZ4740_CODEC_2_MIC_BOOST_GAIN_OFFSET, 3, 0, jz4740_mic_tlv), }; static const struct snd_kcontrol_new jz4740_codec_output_controls[] = { SOC_DAPM_SINGLE("Bypass Switch", JZ4740_REG_CODEC_1, JZ4740_CODEC_1_SW1_ENABLE_OFFSET, 1, 0), SOC_DAPM_SINGLE("DAC Switch", JZ4740_REG_CODEC_1,
* LOUT3/ROUT3 output volume control: * from -6 to 3 dB in 3 dB steps */ static DECLARE_TLV_DB_SCALE(out3_tlv, -600, 300, 0); /* * Mic amp gain control: * from -15 to 30 dB in 3 dB steps * REVISIT: The actual min value(0x01) is -12 dB and the reg value 0x00 is not * available */ static DECLARE_TLV_DB_SCALE(mic_amp_tlv, -1500, 300, 0); static const struct snd_kcontrol_new ak4671_snd_controls[] = { /* Common playback gain controls */ SOC_SINGLE_TLV("Stereo Line Output1 Playback Volume", AK4671_OUTPUT_VOLUME_CONTROL, 0, 0x6, 0, out1_tlv), SOC_SINGLE_TLV("Headphone Output2 Playback Volume", AK4671_OUTPUT_VOLUME_CONTROL, 4, 0xd, 0, out2_tlv), SOC_SINGLE_TLV("Stereo Line Output3 Playback Volume", AK4671_LOUT3_POWER_MANAGERMENT, 6, 0x3, 0, out3_tlv), /* Common capture gain controls */ SOC_SINGLE_TLV("Mic Amp Left Capture Volume", AK4671_MIC_AMP_GAIN, 0, 0x15, 0, mic_amp_tlv), SOC_SINGLE_TLV("Mic Amp Right Capture Volume", AK4671_MIC_AMP_GAIN, 4, 0x15, 0, mic_amp_tlv), }; /* add non dapm controls */ static int ak4671_add_controls(struct snd_soc_codec *codec) {
}; static const DECLARE_TLV_DB_RANGE(max98371_gain_tlv, 0, 7, TLV_DB_SCALE_ITEM(0, 50, 0), 8, 10, TLV_DB_SCALE_ITEM(400, 100, 0) ); static const DECLARE_TLV_DB_RANGE(max98371_noload_gain_tlv, 0, 11, TLV_DB_SCALE_ITEM(950, 100, 0), ); static const DECLARE_TLV_DB_SCALE(digital_tlv, -6300, 50, 1); static const struct snd_kcontrol_new max98371_snd_controls[] = { SOC_SINGLE_TLV("Speaker Volume", MAX98371_GAIN, MAX98371_GAIN_SHIFT, (1<<MAX98371_GAIN_WIDTH)-1, 0, max98371_gain_tlv), SOC_SINGLE_TLV("Digital Volume", MAX98371_DIGITAL_GAIN, 0, (1<<MAX98371_DIGITAL_GAIN_WIDTH)-1, 1, digital_tlv), SOC_SINGLE_TLV("Speaker DHT Max Volume", MAX98371_GAIN, 0, (1<<MAX98371_DHT_MAX_WIDTH)-1, 0, max98371_dht_max_gain), SOC_SINGLE_TLV("Speaker DHT Min Volume", MAX98371_DHT_GAIN, 0, (1<<MAX98371_DHT_GAIN_WIDTH)-1, 0, max98371_dht_min_gain), SOC_SINGLE_TLV("Speaker DHT Rotation Volume", MAX98371_DHT_GAIN, 0, (1<<MAX98371_DHT_ROT_WIDTH)-1, 0, max98371_dht_rot_gain), SOC_SINGLE("DHT Attack Step", MAX98371_DHT, MAX98371_DHT_STEP, 3, 0), SOC_SINGLE("DHT Attack Rate", MAX98371_DHT, 0, 7, 0), SOC_ENUM("Monomix Select", max98371_monomix),
#define SINGLE_COEF(xname, index) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ .info = sta32x_coefficient_info, \ .get = sta32x_coefficient_get,\ .put = sta32x_coefficient_put, \ .private_value = index | (1 << 16) } #define BIQUAD_COEFS(xname, index) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ .info = sta32x_coefficient_info, \ .get = sta32x_coefficient_get,\ .put = sta32x_coefficient_put, \ .private_value = index | (5 << 16) } static const struct snd_kcontrol_new sta32x_snd_controls[] = { SOC_SINGLE_TLV("Master Volume", STA32X_MVOL, 0, 0xff, 1, mvol_tlv), SOC_SINGLE("Master Switch", STA32X_MMUTE, 0, 1, 1), SOC_SINGLE("Ch1 Switch", STA32X_MMUTE, 1, 1, 1), SOC_SINGLE("Ch2 Switch", STA32X_MMUTE, 2, 1, 1), SOC_SINGLE("Ch3 Switch", STA32X_MMUTE, 3, 1, 1), SOC_SINGLE_TLV("Ch1 Volume", STA32X_C1VOL, 0, 0xff, 1, chvol_tlv), SOC_SINGLE_TLV("Ch2 Volume", STA32X_C2VOL, 0, 0xff, 1, chvol_tlv), SOC_SINGLE_TLV("Ch3 Volume", STA32X_C3VOL, 0, 0xff, 1, chvol_tlv), SOC_SINGLE("De-emphasis Filter Switch", STA32X_CONFD, STA32X_CONFD_DEMP_SHIFT, 1, 0), SOC_ENUM("Compressor/Limiter Switch", sta32x_drc_ac_enum), SOC_SINGLE("Miami Mode Switch", STA32X_CONFD, STA32X_CONFD_MME_SHIFT, 1, 0), SOC_SINGLE("Zero Cross Switch", STA32X_CONFE, STA32X_CONFE_ZCE_SHIFT, 1, 0), SOC_SINGLE("Soft Ramp Switch", STA32X_CONFE, STA32X_CONFE_SVE_SHIFT, 1, 0), SOC_SINGLE("Auto-Mute Switch", STA32X_CONFF, STA32X_CONFF_IDE_SHIFT, 1, 0), SOC_ENUM("Automode EQ", sta32x_auto_eq_enum), SOC_ENUM("Automode GC", sta32x_auto_gc_enum),
SOC_ENUM_SINGLE(WM8900_REG_AUDIO2, 14, 2, lr_txt); static const char *sidetone_txt[] = { "Disabled", "Left ADC", "Right ADC" }; static const struct soc_enum dacl_sidetone = SOC_ENUM_SINGLE(WM8900_REG_SIDETONE, 2, 3, sidetone_txt); static const struct soc_enum dacr_sidetone = SOC_ENUM_SINGLE(WM8900_REG_SIDETONE, 0, 3, sidetone_txt); static const struct snd_kcontrol_new wm8900_snd_controls[] = { SOC_ENUM("Mic Bias Level", mic_bias_level), SOC_SINGLE_TLV("Left Input PGA Volume", WM8900_REG_LINVOL, 0, 31, 0, in_pga_tlv), SOC_SINGLE("Left Input PGA Switch", WM8900_REG_LINVOL, 6, 1, 1), SOC_SINGLE("Left Input PGA ZC Switch", WM8900_REG_LINVOL, 7, 1, 0), SOC_SINGLE_TLV("Right Input PGA Volume", WM8900_REG_RINVOL, 0, 31, 0, in_pga_tlv), SOC_SINGLE("Right Input PGA Switch", WM8900_REG_RINVOL, 6, 1, 1), SOC_SINGLE("Right Input PGA ZC Switch", WM8900_REG_RINVOL, 7, 1, 0), SOC_SINGLE("DAC Soft Mute Switch", WM8900_REG_DACCTRL, 6, 1, 1), SOC_ENUM("DAC Mute Rate", dac_mute_rate), SOC_SINGLE("DAC Mono Switch", WM8900_REG_DACCTRL, 9, 1, 0), SOC_ENUM("DAC Deemphasis", dac_deemphasis), SOC_SINGLE("DAC Sigma-Delta Modulator Clock Switch", WM8900_REG_DACCTRL, 12, 1, 0),
static const DECLARE_TLV_DB_SCALE(misc_tlv, -1500, 300, 0); static unsigned int mic_tlv[] = { TLV_DB_RANGE_HEAD(2), 0, 2, TLV_DB_SCALE_ITEM(1200, 600, 0), 3, 3, TLV_DB_SCALE_ITEM(3000, 0, 0), }; static const struct snd_kcontrol_new wm9713_snd_ac97_controls[] = { SOC_DOUBLE_TLV("Speaker Playback Volume", AC97_MASTER, 8, 0, 31, 1, out_tlv), SOC_DOUBLE("Speaker Playback Switch", AC97_MASTER, 15, 7, 1, 1), SOC_DOUBLE_TLV("Headphone Playback Volume", AC97_HEADPHONE, 8, 0, 31, 1, out_tlv), SOC_DOUBLE("Headphone Playback Switch", AC97_HEADPHONE, 15, 7, 1, 1), SOC_DOUBLE_TLV("Line In Volume", AC97_PC_BEEP, 8, 0, 31, 1, main_tlv), SOC_DOUBLE_TLV("PCM Playback Volume", AC97_PHONE, 8, 0, 31, 1, main_tlv), SOC_SINGLE_TLV("Mic 1 Volume", AC97_MIC, 8, 31, 1, main_tlv), SOC_SINGLE_TLV("Mic 2 Volume", AC97_MIC, 0, 31, 1, main_tlv), SOC_SINGLE_TLV("Mic 1 Preamp Volume", AC97_3D_CONTROL, 10, 3, 0, mic_tlv), SOC_SINGLE_TLV("Mic 2 Preamp Volume", AC97_3D_CONTROL, 12, 3, 0, mic_tlv), SOC_SINGLE("Mic Boost (+20dB) Switch", AC97_LINE, 5, 1, 0), SOC_SINGLE("Mic Headphone Mixer Volume", AC97_LINE, 0, 7, 1), SOC_SINGLE("Capture Switch", AC97_CD, 15, 1, 1), SOC_ENUM("Capture Volume Steps", wm9713_enum[5]), SOC_DOUBLE("Capture Volume", AC97_CD, 8, 0, 31, 0), SOC_SINGLE("Capture ZC Switch", AC97_CD, 7, 1, 0), SOC_SINGLE_TLV("Capture to Headphone Volume", AC97_VIDEO, 11, 7, 1, misc_tlv), SOC_SINGLE("Capture to Mono Boost (+20dB) Switch", AC97_VIDEO, 8, 1, 0), SOC_SINGLE("Capture ADC Boost (+20dB) Switch", AC97_VIDEO, 6, 1, 0),
SOC_DOUBLE_R_SX_TLV("Input PGA Analog Volume", CS42L73_MICAPREPGAAVOL, CS42L73_MICBPREPGABVOL, 5, 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", CS42L73_SPKDVOL, 0, 0x34, 0xE4, hl_tlv), SOC_SINGLE_SX_TLV("Ear Speaker Digital Volume", CS42L73_ESLDVOL, 0, 0x34, 0xE4, hl_tlv), SOC_DOUBLE_R("Headphone Analog Playback Switch", CS42L73_HPAAVOL, CS42L73_HPBAVOL, 7, 1, 1), SOC_DOUBLE_R("LineOut Analog Playback Switch", CS42L73_LOAAVOL, CS42L73_LOBAVOL, 7, 1, 1),
static const DECLARE_TLV_DB_SCALE(digital_tlv, -12750, 50, 1); static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); static const DECLARE_TLV_DB_SCALE(inpga_tlv, -1200, 75, 0); static const DECLARE_TLV_DB_SCALE(spk_tlv, -5700, 100, 0); static const struct snd_kcontrol_new wm8974_snd_controls[] = { SOC_SINGLE("Digital Loopback Switch", WM8974_COMP, 0, 1, 0), SOC_ENUM("DAC Companding", wm8974_enum[1]), SOC_ENUM("ADC Companding", wm8974_enum[0]), SOC_ENUM("Playback De-emphasis", wm8974_enum[2]), SOC_SINGLE("DAC Inversion Switch", WM8974_DAC, 0, 1, 0), SOC_SINGLE_TLV("PCM Volume", WM8974_DACVOL, 0, 255, 0, digital_tlv), SOC_SINGLE("High Pass Filter Switch", WM8974_ADC, 8, 1, 0), SOC_SINGLE("High Pass Cut Off", WM8974_ADC, 4, 7, 0), SOC_SINGLE("ADC Inversion Switch", WM8974_ADC, 0, 1, 0), SOC_SINGLE_TLV("Capture Volume", WM8974_ADCVOL, 0, 255, 0, digital_tlv), SOC_ENUM("Equaliser Function", wm8974_enum[3]), SOC_ENUM("EQ1 Cut Off", wm8974_enum[4]), SOC_SINGLE_TLV("EQ1 Volume", WM8974_EQ1, 0, 24, 1, eq_tlv), SOC_ENUM("Equaliser EQ2 Bandwidth", wm8974_enum[5]), SOC_ENUM("EQ2 Cut Off", wm8974_enum[6]), SOC_SINGLE_TLV("EQ2 Volume", WM8974_EQ2, 0, 24, 1, eq_tlv),
static const DECLARE_TLV_DB_SCALE(adc_fgain_tlv, 0, 10, 0); static const DECLARE_TLV_DB_SCALE(adc_cgain_tlv, -2000, 50, 0); static const DECLARE_TLV_DB_SCALE(mic_pga_tlv, 0, 50, 0); static const DECLARE_TLV_DB_SCALE(hp_drv_tlv, 0, 100, 0); static const DECLARE_TLV_DB_SCALE(class_D_drv_tlv, 600, 600, 0); static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -6350, 50, 0); static const DECLARE_TLV_DB_SCALE(sp_vol_tlv, -6350, 50, 0); /* * controls to be exported to the user space */ 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),
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, bypass_tlv), SOC_SINGLE_TLV("Right Mixer Right Bypass Volume", WM8988_ROUTM2, 4, 7, 1, bypass_tlv), SOC_DOUBLE_R("Output 1 Playback ZC Switch", WM8988_LOUT1V, WM8988_ROUT1V, 7, 1, 0), SOC_DOUBLE_R_TLV("Output 1 Playback Volume", WM8988_LOUT1V, WM8988_ROUT1V, 0, 127, 0, out_tlv), SOC_DOUBLE_R("Output 2 Playback ZC Switch", WM8988_LOUT2V, WM8988_ROUT2V, 7, 1, 0), SOC_DOUBLE_R_TLV("Output 2 Playback Volume", WM8988_LOUT2V, WM8988_ROUT2V,
SOC_DOUBLE_R_TLV("Capture Volume", SSM2602_LINVOL, SSM2602_RINVOL, 0, 45, 0, ssm260x_inpga_tlv), SOC_DOUBLE_R("Capture Switch", SSM2602_LINVOL, SSM2602_RINVOL, 7, 1, 1), SOC_SINGLE("ADC High Pass Filter Switch", SSM2602_APDIGI, 0, 1, 1), SOC_SINGLE("Store DC Offset Switch", SSM2602_APDIGI, 4, 1, 0), SOC_ENUM("Playback De-emphasis", ssm2602_enum[1]), }; static const struct snd_kcontrol_new ssm2602_snd_controls[] = { SOC_DOUBLE_R_TLV("Master Playback Volume", SSM2602_LOUT1V, SSM2602_ROUT1V, 0, 127, 0, ssm260x_outmix_tlv), SOC_DOUBLE_R("Master Playback ZC Switch", SSM2602_LOUT1V, SSM2602_ROUT1V, 7, 1, 0), SOC_SINGLE_TLV("Sidetone Playback Volume", SSM2602_APANA, 6, 3, 1, ssm260x_sidetone_tlv), SOC_SINGLE("Mic Boost (+20dB)", SSM2602_APANA, 0, 1, 0), SOC_SINGLE("Mic Boost2 (+20dB)", SSM2602_APANA, 8, 1, 0), SOC_SINGLE("Mic Switch", SSM2602_APANA, 1, 1, 1), }; /* Output Mixer */ static const struct snd_kcontrol_new ssm260x_output_mixer_controls[] = { SOC_DAPM_SINGLE("Line Bypass Switch", SSM2602_APANA, 3, 1, 0), SOC_DAPM_SINGLE("HiFi Playback Switch", SSM2602_APANA, 4, 1, 0), SOC_DAPM_SINGLE("Mic Sidetone Switch", SSM2602_APANA, 5, 1, 0), }; /* Input mux */ static const struct snd_kcontrol_new ssm2602_input_mux_controls =
ALC5632_SPK_OUT_VOL, 8, 0, 31, 1, hp_tlv), /* bit 15 mutes left, bit 7 right */ SOC_DOUBLE("Speaker Playback Switch", ALC5632_SPK_OUT_VOL, 15, 7, 1, 1), SOC_DOUBLE_TLV("Headphone Playback Volume", ALC5632_HP_OUT_VOL, 8, 0, 31, 1, hp_tlv), SOC_DOUBLE("Headphone Playback Switch", ALC5632_HP_OUT_VOL, 15, 7, 1, 1), }; static const struct snd_kcontrol_new alc5632_snd_controls[] = { SOC_DOUBLE_TLV("Auxout Playback Volume", ALC5632_AUX_OUT_VOL, 8, 0, 31, 1, hp_tlv), SOC_DOUBLE("Auxout Playback Switch", ALC5632_AUX_OUT_VOL, 15, 7, 1, 1), SOC_SINGLE_TLV("Voice DAC Playback Volume", ALC5632_VOICE_DAC_VOL, 0, 63, 0, vdac_tlv), SOC_SINGLE("Voice DAC Playback Switch", ALC5632_VOICE_DAC_VOL, 12, 1, 1), SOC_SINGLE_TLV("Phone Playback Volume", ALC5632_PHONE_IN_VOL, 8, 31, 1, vol_tlv), SOC_DOUBLE_TLV("LineIn Playback Volume", ALC5632_LINE_IN_VOL, 8, 0, 31, 1, vol_tlv), SOC_DOUBLE_TLV("Master Playback Volume", ALC5632_STEREO_DAC_IN_VOL, 8, 0, 63, 1, vdac_tlv), SOC_DOUBLE("Master Playback Switch", ALC5632_STEREO_DAC_IN_VOL, 15, 7, 1, 1), SOC_SINGLE_TLV("Mic1 Playback Volume", ALC5632_MIC_VOL, 8, 31, 1, vol_tlv), SOC_SINGLE_TLV("Mic2 Playback Volume", ALC5632_MIC_VOL, 0, 31, 1, vol_tlv), SOC_DOUBLE_TLV("Rec Capture Volume",
"Bass", "In Gain" }; static SOC_ENUM_SINGLE_DECL(soc_enum_sa_src, TDA7419_SA_CLK_AC_REG, TDA7419_SA_SOURCE, enum_sa_src); static const char * const enum_clk_src[] = { "Internal", "External" }; static SOC_ENUM_SINGLE_DECL(soc_enum_clk_src, TDA7419_SA_CLK_AC_REG, TDA7419_CLK_SOURCE, enum_clk_src); static const char * const enum_coupling_mode[] = { "DC Coupling (without HPF)", "AC Coupling after In Gain", "DC Coupling (with HPF)", "AC Coupling after Bass" }; static SOC_ENUM_SINGLE_DECL(soc_enum_coupling_mode, TDA7419_SA_CLK_AC_REG, TDA7419_COUPLING_MODE, enum_coupling_mode); /* ASoC Controls */ static struct snd_kcontrol_new tda7419_controls[] = { SOC_SINGLE_TLV("Main Source Capture Volume", TDA7419_MAIN_SRC_REG, TDA7419_MAIN_SRC_GAIN, 15, 0, tlv_src_gain), SOC_SINGLE("Main Source AutoZero Switch", TDA7419_MAIN_SRC_REG, TDA7419_MAIN_SRC_AUTOZERO, 1, 1), SOC_SINGLE_TLV("Loudness Playback Volume", TDA7419_LOUDNESS_REG, TDA7419_LOUDNESS_ATTEN, 15, 1, tlv_loudness_atten), SOC_ENUM("Loudness Center Frequency", soc_enum_loudness_center_freq), SOC_SINGLE("Loudness High Boost Switch", TDA7419_LOUDNESS_REG, TDA7419_LOUDNESS_BOOST, 1, 1), SOC_SINGLE("Loudness Soft Step Switch", TDA7419_LOUDNESS_REG, TDA7419_LOUDNESS_SOFT_STEP, 1, 1), SOC_SINGLE("Soft Mute Switch", TDA7419_MUTE_CLK_REG, TDA7419_SOFT_MUTE, 1, 1), SOC_ENUM("Mute Influence", soc_enum_mute_influence), SOC_ENUM("Soft Mute Time", soc_enum_soft_mute_time), SOC_ENUM("Soft Step Time", soc_enum_soft_step_time), SOC_SINGLE("Clock Fast Mode Switch", TDA7419_MUTE_CLK_REG, TDA7419_CLK_FAST_MODE, 1, 1),
case NAU8540_REG_ALC_GAIN_CH12 ... NAU8540_REG_ALC_STATUS: case NAU8540_REG_P2P_CH1 ... NAU8540_REG_PEAK_CH4: case NAU8540_REG_I2C_DEVICE_ID: case NAU8540_REG_RST: return true; default: return false; } } static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -12800, 3600); static const DECLARE_TLV_DB_MINMAX(fepga_gain_tlv, -100, 3600); static const struct snd_kcontrol_new nau8540_snd_controls[] = { SOC_SINGLE_TLV("Mic1 Volume", NAU8540_REG_DIGITAL_GAIN_CH1, 0, 0x520, 0, adc_vol_tlv), SOC_SINGLE_TLV("Mic2 Volume", NAU8540_REG_DIGITAL_GAIN_CH2, 0, 0x520, 0, adc_vol_tlv), SOC_SINGLE_TLV("Mic3 Volume", NAU8540_REG_DIGITAL_GAIN_CH3, 0, 0x520, 0, adc_vol_tlv), SOC_SINGLE_TLV("Mic4 Volume", NAU8540_REG_DIGITAL_GAIN_CH4, 0, 0x520, 0, adc_vol_tlv), SOC_SINGLE_TLV("Frontend PGA1 Volume", NAU8540_REG_FEPGA3, 0, 0x25, 0, fepga_gain_tlv), SOC_SINGLE_TLV("Frontend PGA2 Volume", NAU8540_REG_FEPGA3, 8, 0x25, 0, fepga_gain_tlv), SOC_SINGLE_TLV("Frontend PGA3 Volume", NAU8540_REG_FEPGA4, 0, 0x25, 0, fepga_gain_tlv), SOC_SINGLE_TLV("Frontend PGA4 Volume", NAU8540_REG_FEPGA4, 8, 0x25, 0, fepga_gain_tlv),
* LOUT3/ROUT3 output volume control: * from -6 to 3 dB in 3 dB steps */ static DECLARE_TLV_DB_SCALE(out3_tlv, -600, 300, 0); /* * Mic amp gain control: * from -15 to 30 dB in 3 dB steps * REVISIT: The actual min value(0x01) is -12 dB and the reg value 0x00 is not * available */ static DECLARE_TLV_DB_SCALE(mic_amp_tlv, -1500, 300, 0); static const struct snd_kcontrol_new ak4671_snd_controls[] = { /* Common playback gain controls */ SOC_SINGLE_TLV("Line Output1 Playback Volume", AK4671_OUTPUT_VOLUME_CONTROL, 0, 0x6, 0, out1_tlv), SOC_SINGLE_TLV("Headphone Output2 Playback Volume", AK4671_OUTPUT_VOLUME_CONTROL, 4, 0xd, 0, out2_tlv), SOC_SINGLE_TLV("Line Output3 Playback Volume", AK4671_LOUT3_POWER_MANAGERMENT, 6, 0x3, 0, out3_tlv), /* Common capture gain controls */ SOC_DOUBLE_TLV("Mic Amp Capture Volume", AK4671_MIC_AMP_GAIN, 0, 4, 0xf, 0, mic_amp_tlv), }; /* event handlers */ static int ak4671_out2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
/* Capture gains */ SOC_DOUBLE_TLV("Capture Preamplifier Volume", TWL6040_REG_MICGAIN, 6, 7, 1, 1, mic_preamp_tlv), SOC_DOUBLE_TLV("Capture Volume", TWL6040_REG_MICGAIN, 0, 3, 4, 0, mic_amp_tlv), /* AFM gains */ SOC_DOUBLE_TLV("Aux FM Volume", TWL6040_REG_LINEGAIN, 0, 4, 0xF, 0, afm_amp_tlv), /* Playback gains */ SOC_DOUBLE_TLV_TWL6040_HS("Headset Playback Volume", TWL6040_REG_HSGAIN, 0, 4, 0xF, 1, hs_tlv), SOC_DOUBLE_R_TLV_TWL6040_HF("Handsfree Playback Volume", TWL6040_REG_HFLGAIN, TWL6040_REG_HFRGAIN, 0, 0x1D, 1, hf_tlv), SOC_SINGLE_TLV("Earphone Playback Volume", TWL6040_REG_EARCTL, 1, 0xF, 1, ep_tlv), }; static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = { /* Inputs */ SND_SOC_DAPM_INPUT("MAINMIC"), SND_SOC_DAPM_INPUT("HSMIC"), SND_SOC_DAPM_INPUT("SUBMIC"), SND_SOC_DAPM_INPUT("AFML"), SND_SOC_DAPM_INPUT("AFMR"), /* Outputs */ SND_SOC_DAPM_OUTPUT("HSOL"), SND_SOC_DAPM_OUTPUT("HSOR"), SND_SOC_DAPM_OUTPUT("HFL"), SND_SOC_DAPM_OUTPUT("HFR"),
/* Only need to do this if the outputs are active */ if (snd_soc_read(codec, WM8993_POWER_MANAGEMENT_1) & (WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA)) snd_soc_update_bits(codec, WM8993_DC_SERVO_0, WM8993_DCS_TRIG_SINGLE_0 | WM8993_DCS_TRIG_SINGLE_1, WM8993_DCS_TRIG_SINGLE_0 | WM8993_DCS_TRIG_SINGLE_1); return ret; } static const struct snd_kcontrol_new analogue_snd_controls[] = { SOC_SINGLE_TLV("IN1L Volume", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 0, 31, 0, inpga_tlv), SOC_SINGLE("IN1L Switch", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 7, 1, 1), SOC_SINGLE("IN1L ZC Switch", WM8993_LEFT_LINE_INPUT_1_2_VOLUME, 6, 1, 0), SOC_SINGLE_TLV("IN1R Volume", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 0, 31, 0, inpga_tlv), SOC_SINGLE("IN1R Switch", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 7, 1, 1), SOC_SINGLE("IN1R ZC Switch", WM8993_RIGHT_LINE_INPUT_1_2_VOLUME, 6, 1, 0), SOC_SINGLE_TLV("IN2L Volume", WM8993_LEFT_LINE_INPUT_3_4_VOLUME, 0, 31, 0, inpga_tlv), SOC_SINGLE("IN2L Switch", WM8993_LEFT_LINE_INPUT_3_4_VOLUME, 7, 1, 1), SOC_SINGLE("IN2L ZC Switch", WM8993_LEFT_LINE_INPUT_3_4_VOLUME, 6, 1, 0), SOC_SINGLE_TLV("IN2R Volume", WM8993_RIGHT_LINE_INPUT_3_4_VOLUME, 0, 31, 0,
} } static DECLARE_TLV_DB_SCALE(classd_ctl_tlv, 900, 300, 0); static const struct snd_kcontrol_new imon_ctl = SOC_DAPM_SINGLE("Switch", CS35L32_PWRCTL2, 6, 1, 1); static const struct snd_kcontrol_new vmon_ctl = 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"),
4, 6, TLV_DB_SCALE_ITEM(600, 600, 0), }; static const unsigned int mix_tlv[] = { TLV_DB_RANGE_HEAD(4), 0, 2, TLV_DB_SCALE_ITEM(-1200, 300, 0), 3, 3, TLV_DB_SCALE_ITEM(0, 0, 0), }; static const DECLARE_TLV_DB_SCALE(out_tlv, -5700, 100, 0); static const unsigned int spkboost_tlv[] = { TLV_DB_RANGE_HEAD(7), 0, 6, TLV_DB_SCALE_ITEM(0, 150, 0), 7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0), }; static const struct snd_kcontrol_new wm9090_controls[] = { SOC_SINGLE_TLV("IN1A Volume", WM9090_IN1_LINE_INPUT_A_VOLUME, 0, 6, 0, in_tlv), SOC_SINGLE("IN1A Switch", WM9090_IN1_LINE_INPUT_A_VOLUME, 7, 1, 1), SOC_SINGLE("IN1A ZC Switch", WM9090_IN1_LINE_INPUT_A_VOLUME, 6, 1, 0), SOC_SINGLE_TLV("IN2A Volume", WM9090_IN2_LINE_INPUT_A_VOLUME, 0, 6, 0, in_tlv), SOC_SINGLE("IN2A Switch", WM9090_IN2_LINE_INPUT_A_VOLUME, 7, 1, 1), SOC_SINGLE("IN2A ZC Switch", WM9090_IN2_LINE_INPUT_A_VOLUME, 6, 1, 0), SOC_SINGLE("MIXOUTL Switch", WM9090_OUTPUT_MIXER3, 8, 1, 1), SOC_SINGLE_TLV("MIXOUTL IN1A Volume", WM9090_OUTPUT_MIXER3, 6, 3, 1, mix_tlv), SOC_SINGLE_TLV("MIXOUTL IN2A Volume", WM9090_OUTPUT_MIXER3, 2, 3, 1, mix_tlv), SOC_SINGLE("MIXOUTR Switch", WM9090_OUTPUT_MIXER4, 8, 1, 1),
SOC_ENUM_SINGLE(AC97_STAC_ANALOG_SPECIAL, 2, 2, stac9766_boost2); /* 0/20dB */ static const struct soc_enum stac9766_stereo_mic_enum = SOC_ENUM_SINGLE(AC97_STAC_STEREO_MIC, 2, 1, stac9766_stereo_mic); static const DECLARE_TLV_DB_LINEAR(master_tlv, -4600, 0); static const DECLARE_TLV_DB_LINEAR(record_tlv, 0, 2250); static const DECLARE_TLV_DB_LINEAR(beep_tlv, -4500, 0); static const DECLARE_TLV_DB_LINEAR(mix_tlv, -3450, 1200); static const struct snd_kcontrol_new stac9766_snd_ac97_controls[] = { SOC_DOUBLE_TLV("Speaker Volume", AC97_MASTER, 8, 0, 31, 1, master_tlv), SOC_SINGLE("Speaker Switch", AC97_MASTER, 15, 1, 1), SOC_DOUBLE_TLV("Headphone Volume", AC97_HEADPHONE, 8, 0, 31, 1, master_tlv), SOC_SINGLE("Headphone Switch", AC97_HEADPHONE, 15, 1, 1), SOC_SINGLE_TLV("Mono Out Volume", AC97_MASTER_MONO, 0, 31, 1, master_tlv), SOC_SINGLE("Mono Out Switch", AC97_MASTER_MONO, 15, 1, 1), SOC_DOUBLE_TLV("Record Volume", AC97_REC_GAIN, 8, 0, 15, 0, record_tlv), SOC_SINGLE("Record Switch", AC97_REC_GAIN, 15, 1, 1), SOC_SINGLE_TLV("Beep Volume", AC97_PC_BEEP, 1, 15, 1, beep_tlv), SOC_SINGLE("Beep Switch", AC97_PC_BEEP, 15, 1, 1), SOC_SINGLE("Beep Frequency", AC97_PC_BEEP, 5, 127, 1), SOC_SINGLE_TLV("Phone Volume", AC97_PHONE, 0, 31, 1, mix_tlv), SOC_SINGLE("Phone Switch", AC97_PHONE, 15, 1, 1), SOC_ENUM("Mic Boost1", stac9766_boost1_enum), SOC_ENUM("Mic Boost2", stac9766_boost2_enum), SOC_SINGLE_TLV("Mic Volume", AC97_MIC, 0, 31, 1, mix_tlv),
} static const struct snd_kcontrol_new es8328_snd_controls[] = { SOC_DOUBLE_R_TLV("Capture Digital Volume", ES8328_ADCCONTROL8, ES8328_ADCCONTROL9, 0, 0xc0, 1, dac_adc_tlv), SOC_SINGLE("Capture ZC Switch", ES8328_ADCCONTROL7, 6, 1, 0), SOC_SINGLE_BOOL_EXT("DAC Deemphasis Switch", 0, es8328_get_deemph, es8328_put_deemph), SOC_ENUM("Capture Polarity", adcpol), SOC_SINGLE_TLV("Left Mixer Left Bypass Volume", ES8328_DACCONTROL17, 3, 7, 1, bypass_tlv), SOC_SINGLE_TLV("Left Mixer Right Bypass Volume", ES8328_DACCONTROL19, 3, 7, 1, bypass_tlv), SOC_SINGLE_TLV("Right Mixer Left Bypass Volume", ES8328_DACCONTROL18, 3, 7, 1, bypass_tlv), SOC_SINGLE_TLV("Right Mixer Right Bypass Volume", ES8328_DACCONTROL20, 3, 7, 1, bypass_tlv), SOC_DOUBLE_R_TLV("PCM Volume", ES8328_LDACVOL, ES8328_RDACVOL, 0, ES8328_DACVOL_MAX, 1, dac_adc_tlv), SOC_DOUBLE_R_TLV("Output 1 Playback Volume", ES8328_LOUT1VOL, ES8328_ROUT1VOL, 0, ES8328_OUT1VOL_MAX, 0, play_tlv),
static const DECLARE_TLV_DB_SCALE(mingain, -1200, 600, 0); static const DECLARE_TLV_DB_SCALE(maxgain, -675, 600, 0); static const DECLARE_TLV_DB_SCALE(boost_vol, -1200, 75, 0); static const DECLARE_TLV_DB_SCALE(ngth, -7650, 150, 0); static const char * const ml26124_companding[] = {"16bit PCM", "u-law", "A-law"}; static SOC_ENUM_SINGLE_DECL(ml26124_adc_companding_enum, ML26124_SAI_TRANS_CTL, 6, ml26124_companding); static SOC_ENUM_SINGLE_DECL(ml26124_dac_companding_enum, ML26124_SAI_RCV_CTL, 6, ml26124_companding); static const struct snd_kcontrol_new ml26124_snd_controls[] = { SOC_SINGLE_TLV("Capture Digital Volume", ML26124_RECORD_DIG_VOL, 0, 0xff, 1, digital_tlv), SOC_SINGLE_TLV("Playback Digital Volume", ML26124_PLBAK_DIG_VOL, 0, 0xff, 1, digital_tlv), SOC_SINGLE_TLV("Digital Boost Volume", ML26124_DIGI_BOOST_VOL, 0, 0x3f, 0, boost_vol), SOC_SINGLE_TLV("EQ Band0 Volume", ML26124_EQ_GAIN_BRAND0, 0, 0xff, 1, digital_tlv), SOC_SINGLE_TLV("EQ Band1 Volume", ML26124_EQ_GAIN_BRAND1, 0, 0xff, 1, digital_tlv), SOC_SINGLE_TLV("EQ Band2 Volume", ML26124_EQ_GAIN_BRAND2, 0, 0xff, 1, digital_tlv), SOC_SINGLE_TLV("EQ Band3 Volume", ML26124_EQ_GAIN_BRAND3, 0, 0xff, 1, digital_tlv), SOC_SINGLE_TLV("EQ Band4 Volume", ML26124_EQ_GAIN_BRAND4, 0, 0xff, 1, digital_tlv), SOC_SINGLE_TLV("ALC Target Level", ML26124_ALC_TARGET_LEV, 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, wm8731_get_deemph, wm8731_put_deemph), }; /* Output Mixer */ static const struct snd_kcontrol_new wm8731_output_mixer_controls[] = { SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0),