SOC_SINGLE_MULTI_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, msm_voice_slowtalk_get, msm_voice_slowtalk_put), #ifdef CONFIG_SEC_DHA_SOL_MAL #if defined(CONFIG_AUDIO_DUAL_CP) || defined(CONFIG_MACH_KLTE_CTC) \ || defined(CONFIG_MACH_KLTE_CMCCDUOS) || defined(CONFIG_MACH_KLTE_CUDUOS) \ || defined(CONFIG_MACH_MEGA23GEUR_OPEN) || defined(CONFIG_MACH_MS01_EUR_3G) \ || defined(CONFIG_MACH_MEGA2LTE_KTT) || defined(CONFIG_MACH_ATLANTIC3GEUR_OPEN) \ || defined(CONFIG_MACH_MS01_EUR_LTE) || defined(CONFIG_MACH_MS01_KOR_LTE) || defined(CONFIG_DSDA_VIA_UART) SOC_SINGLE_MULTI_EXT("Sec Set DHA data", SND_SOC_NOPM, 0, VSID_MAX, 0, 15, msm_sec_dha_get, msm_sec_dha_put), #else SOC_SINGLE_MULTI_EXT("Sec Set DHA data", SND_SOC_NOPM, 0, 65535, 0, 14, msm_sec_dha_get, msm_sec_dha_put), #endif #endif /* CONFIG_SEC_DHA_SOL_MAL */ SOC_SINGLE_EXT("Loopback Enable", SND_SOC_NOPM, 0, 1, 0, msm_loopback_get, msm_loopback_put), SOC_SINGLE_EXT("Roaming Enable", SND_SOC_NOPM, 0, 1, 0, msm_roaming_get, msm_roaming_put), }; static struct snd_pcm_ops msm_pcm_ops = { .open = msm_pcm_open, .hw_params = msm_pcm_hw_params, .close = msm_pcm_close, .prepare = msm_pcm_prepare, .trigger = msm_pcm_trigger, .ioctl = msm_pcm_ioctl, }; static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd)
return 0; } static int msm_voice_fens_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { ucontrol->value.integer.value[0] = voc_get_pp_enable(voc_get_session_id(VOICE_SESSION_NAME), MODULE_ID_VOICE_MODULE_FENS); return 0; } static struct snd_kcontrol_new msm_voice_controls[] = { SOC_SINGLE_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_rx_device_mute_get, msm_voice_rx_device_mute_put), SOC_SINGLE_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_mute_get, msm_voice_mute_put), #if defined(CONFIG_MACH_JF_VZW) || defined(CONFIG_MACH_JF_USC)|| \ defined(CONFIG_MACH_MELIUS_USC) || defined(CONFIG_MACH_SERRANO_USC) || \ defined(CONFIG_MACH_SERRANO_VZW) || defined(CONFIG_MACH_M2_VZW) || \ defined(CONFIG_MACH_GOLDEN_VZW) /* 8 level Voice Rx volume for VZW and USC */ SOC_SINGLE_EXT("Voice Rx Volume", SND_SOC_NOPM, 0, 7, 0, msm_voice_volume_get, msm_voice_volume_put), #else SOC_SINGLE_EXT("Voice Rx Volume", SND_SOC_NOPM, 0, 5, 0, msm_voice_volume_get, msm_voice_volume_put), #endif SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get,
SOC_ENUM("Clock Missing Period", pcm512x_clk_missing), SOC_ENUM("Auto Mute Time Left", pcm512x_autom_l), SOC_ENUM("Auto Mute Time Right", pcm512x_autom_r), SOC_SINGLE("Auto Mute Mono Switch", PCM512x_DIGITAL_MUTE_3, PCM512x_ACTL_SHIFT, 1, 0), SOC_DOUBLE("Auto Mute Switch", PCM512x_DIGITAL_MUTE_3, PCM512x_AMLE_SHIFT, PCM512x_AMRE_SHIFT, 1, 0), SOC_ENUM("Volume Ramp Down Rate", pcm512x_vndf), SOC_ENUM("Volume Ramp Down Step", pcm512x_vnds), SOC_ENUM("Volume Ramp Up Rate", pcm512x_vnuf), SOC_ENUM("Volume Ramp Up Step", pcm512x_vnus), SOC_ENUM("Volume Ramp Down Emergency Rate", pcm512x_vedf), SOC_ENUM("Volume Ramp Down Emergency Step", pcm512x_veds), SOC_SINGLE_EXT("Max Overclock PLL", SND_SOC_NOPM, 0, 20, 0, pcm512x_overclock_pll_get, pcm512x_overclock_pll_put), SOC_SINGLE_EXT("Max Overclock DSP", SND_SOC_NOPM, 0, 40, 0, pcm512x_overclock_dsp_get, pcm512x_overclock_dsp_put), SOC_SINGLE_EXT("Max Overclock DAC", SND_SOC_NOPM, 0, 40, 0, pcm512x_overclock_dac_get, pcm512x_overclock_dac_put), }; static const struct snd_soc_dapm_widget pcm512x_dapm_widgets[] = { SND_SOC_DAPM_DAC("DACL", NULL, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_DAC("DACR", NULL, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_OUTPUT("OUTL"), SND_SOC_DAPM_OUTPUT("OUTR"), }; static const struct snd_soc_dapm_route pcm512x_dapm_routes[] = {
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ENABLESIDETONE), ENABLESIDETONE), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ANDROID_AUDIO_MODE), ANDROID_AUDIO_MODE), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(InterModemPcm_ASRC_Switch), InterModemPcm_ASRC_Switch), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(Audio_Debug_Setting), Audio_Debug_Setting), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(Audio_IPOH_State), Audio_IPOH_State), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(Audio_I2S1_Setting), Audio_I2S1_Setting), }; static const struct snd_kcontrol_new Audio_snd_routing_controls[] = { SOC_ENUM_EXT("Audio_SideGen_Switch", Audio_Routing_Enum[0], Audio_SideGen_Get, Audio_SideGen_Set), SOC_ENUM_EXT("Audio_SideGen_SampleRate", Audio_Routing_Enum[1], Audio_SideGen_SampleRate_Get, Audio_SideGen_SampleRate_Set), SOC_ENUM_EXT("Audio_SideGen_Amplitude", Audio_Routing_Enum[2], Audio_SideGen_Amplitude_Get, Audio_SideGen_Amplitude_Set), SOC_ENUM_EXT("Audio_Sidetone_Switch", Audio_Routing_Enum[3], Audio_SideTone_Get, Audio_SideTone_Set), SOC_ENUM_EXT("Audio_Mode_Switch", Audio_Routing_Enum[4], Audio_Mode_Get, Audio_Mode_Set), SOC_SINGLE_EXT("Audio IRQ1 CNT", SND_SOC_NOPM, 0, 65536, 0, Audio_Irqcnt1_Get, Audio_Irqcnt1_Set), SOC_SINGLE_EXT("Audio IRQ2 CNT", SND_SOC_NOPM, 0, 65536, 0, Audio_Irqcnt2_Get, Audio_Irqcnt2_Set), SOC_SINGLE_EXT("Audio HPL Offset", SND_SOC_NOPM, 0 , 0x20000, 0, Audio_Hpl_Offset_Get, Audio_Hpl_Offset_Set), SOC_SINGLE_EXT("Audio HPR Offset", SND_SOC_NOPM, 0, 0x20000, 0, Audio_Hpr_Offset_Get, Audio_Hpr_Offset_Set), //SOC_ENUM_EXT("InterModemPcm_ASRC_Switch", Audio_Routing_Enum[5], Audio_ModemPcm_ASRC_Get, Audio_ModemPcm_ASRC_Set), SOC_ENUM_EXT("Audio_Debug_Setting", Audio_Routing_Enum[6], AudioDebug_Setting_Get, AudioDebug_Setting_Set), SOC_ENUM_EXT("Audio_Ipoh_Setting", Audio_Routing_Enum[7], Audio_Ipoh_Setting_Get, Audio_Ipoh_Setting_Set), SOC_ENUM_EXT("Audio_I2S1_Setting", Audio_Routing_Enum[8], AudioI2S1_Setting_Get, AudioI2S1_Setting_Set), }; void EnAble_Anc_Path(int state) { // todo? printk("%s not supported now!!!\n ", __func__);
return 0; } static struct snd_kcontrol_new msm_voice_controls[] = { SOC_SINGLE_MULTI_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_rx_device_mute_put), SOC_SINGLE_MULTI_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_mute_put), SOC_SINGLE_MULTI_EXT("Voice Rx Gain", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_gain_put), SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, msm_voice_tty_mode_put), SOC_SINGLE_MULTI_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, NULL, msm_voice_slowtalk_put), /* Dummy control to expose stereo recording support in kernel to user-space */ SOC_SINGLE_EXT("Stereo Recording", SND_SOC_NOPM, 1, VSID_MAX, 0, NULL, NULL), }; static struct snd_pcm_ops msm_pcm_ops = { .open = msm_pcm_open, .hw_params = msm_pcm_hw_params, .close = msm_pcm_close, .prepare = msm_pcm_prepare, .trigger = msm_pcm_trigger, .ioctl = msm_pcm_ioctl, }; static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_card *card = rtd->card->snd_card;
ucontrol->value.integer.value[0] = tegra_i2sloopback_func; return 0; } static int tegra_set_i2sloopback(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { if (tegra_i2sloopback_func == ucontrol->value.integer.value[0]) return 0; tegra_i2sloopback_func = ucontrol->value.integer.value[0]; return 1; } struct snd_kcontrol_new tegra_avp_controls[] = { SOC_SINGLE_EXT("AVP alsa device select", 0, 0, TEGRA_ALSA_MAX_DEVICES, \ 0, tegra_get_avp_device, tegra_set_avp_device), SOC_SINGLE_EXT("AVP DMA channel id", 0, 0, TEGRA_DMA_MAX_CHANNELS, \ 0, tegra_get_dma_ch_id, NULL), SOC_SINGLE_EXT("AVP DMA address", 0, 0, 0xFFFFFFFF, \ 0, tegra_get_dma_addr, tegra_set_dma_addr), }; static const struct snd_kcontrol_new tegra_i2s_lpbk_control = SOC_ENUM_EXT("I2S LoopBack", tegra_enum, tegra_get_i2sloopback, tegra_set_i2sloopback); static int tegra_set_headset_plug_state(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct tegra_asoc_utils_data *data = snd_kcontrol_chip(kcontrol); int switch_state;
/* Set volume step to ... */ vstep->vol_step = sel; return 0; } static const struct snd_kcontrol_new max98506_snd_controls[] = { SOC_SINGLE_EXT_TLV("Speaker Gain", MAX98506_R02D_GAIN, MAX98506_SPK_GAIN_SHIFT, (1 << MAX98506_SPK_GAIN_WIDTH) - 1, 0, max98506_spk_gain_get, max98506_spk_gain_put, max98506_spk_tlv), SOC_SINGLE_EXT("Speaker Ramp", 0, 0, 1, 0, max98506_spk_ramp_get, max98506_spk_ramp_put), SOC_SINGLE_EXT("Speaker ZCD", 0, 0, 1, 0, max98506_spk_zcd_get, max98506_spk_zcd_put), SOC_SINGLE_EXT("ALC Enable", 0, 0, 1, 0, max98506_alc_en_get, max98506_alc_en_put), SOC_SINGLE_EXT("ALC Threshold", 0, 0, (1<<MAX98506_ALC_TH_WIDTH)-1, 0, max98506_alc_threshold_get, max98506_alc_threshold_put), SOC_ENUM("Boost Output Voltage", max98506_boost_voltage_enum), SOC_ENUM_EXT("SPK out", spk_state_enum[0], max98506_spk_out_get, max98506_spk_out_put),
static struct snd_kcontrol_new msm_voice_controls[] = { SOC_SINGLE_MULTI_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_rx_device_mute_put), SOC_SINGLE_MULTI_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_mute_put), SOC_SINGLE_MULTI_EXT("Voice Rx Gain", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_gain_put), SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, msm_voice_tty_mode_put), SOC_SINGLE_MULTI_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, NULL, msm_voice_slowtalk_put), #ifdef CONFIG_SEC_DHA_SOL_MAL SOC_SINGLE_MULTI_EXT("Sec Set DHA data", SND_SOC_NOPM, 0, VSID_MAX, 0, 15, msm_sec_dha_get, msm_sec_dha_put), #endif /* CONFIG_SEC_DHA_SOL_MAL */ SOC_SINGLE_EXT("Loopback Enable", SND_SOC_NOPM, 0, 1, 0, msm_loopback_get, msm_loopback_put), }; static struct snd_pcm_ops msm_pcm_ops = { .open = msm_pcm_open, .hw_params = msm_pcm_hw_params, .close = msm_pcm_close, .prepare = msm_pcm_prepare, .trigger = msm_pcm_trigger, .ioctl = msm_pcm_ioctl, }; static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_card *card = rtd->card->snd_card;
return 0; } static int Audio_Wcn_Cmb_Set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { #if 0//temp mark for early porting mAudio_Wcn_Cmb = ucontrol->value.integer.value[0]; printk("%s mAudio_Wcn_Cmb = 0x%x \n", __func__, mAudio_Wcn_Cmb); //mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X)mAudio_Wcn_Cmb);//temp mark for early porting #endif return 0; } static const struct snd_kcontrol_new Audio_snd_fm_i2s_controls[] = { SOC_SINGLE_EXT("Audio FM I2S Volume", SND_SOC_NOPM, 0, 0x80000, 0, Audio_fm_i2s_Volume_Get, Audio_fm_i2s_Volume_Set), SOC_ENUM_EXT("cmb stub Audio Control", wcn_stub_audio_ctr_Enum[0], Audio_Wcn_Cmb_Get, Audio_Wcn_Cmb_Set), }; static struct snd_pcm_hardware mtk_fm_i2s_hardware = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID), .formats = SND_SOC_STD_MT_FMTS, .rates = SOC_HIGH_USE_RATE, .rate_min = SOC_NORMAL_USE_RATE_MIN, .rate_max = SOC_NORMAL_USE_RATE_MAX, .channels_min = SOC_NORMAL_USE_CHANNELS_MIN, .channels_max = SOC_NORMAL_USE_CHANNELS_MAX,
return 0; } static int msm_voice_slowtalk_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { ucontrol->value.integer.value[0] = voc_get_pp_enable(voc_get_session_id(VOICE_SESSION_NAME), MODULE_ID_VOICE_MODULE_ST); return 0; } static struct snd_kcontrol_new msm_voice_controls[] = { SOC_SINGLE_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_rx_device_mute_get, msm_voice_rx_device_mute_put), SOC_SINGLE_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_mute_get, msm_voice_mute_put), SOC_SINGLE_EXT("Voice Rx Volume", SND_SOC_NOPM, 0, 5, 0, msm_voice_volume_get, msm_voice_volume_put), SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, msm_voice_tty_mode_put), SOC_SINGLE_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, 1, 0, msm_voice_slowtalk_get, msm_voice_slowtalk_put), SOC_SINGLE_EXT("VoLTE Rx Device Mute", SND_SOC_NOPM, 0, 1, 0, msm_volte_rx_device_mute_get, msm_volte_rx_device_mute_put), SOC_SINGLE_EXT("VoLTE Tx Mute", SND_SOC_NOPM, 0, 1, 0, msm_volte_mute_get, msm_volte_mute_put), SOC_SINGLE_EXT("VoLTE Rx Volume", SND_SOC_NOPM, 0, 5, 0,
static const struct snd_kcontrol_new mm_ul11_control = SOC_DAPM_ENUM_EXT("Route", abe_enum[9], ul_mux_get_route, ul_mux_put_route); static const struct snd_kcontrol_new mm_vx0_control = SOC_DAPM_ENUM_EXT("Route", abe_enum[10], ul_mux_get_route, ul_mux_put_route); static const struct snd_kcontrol_new mm_vx1_control = SOC_DAPM_ENUM_EXT("Route", abe_enum[11], ul_mux_get_route, ul_mux_put_route); /* DL1 mixer paths */ static const struct snd_kcontrol_new dl1_mixer_controls[] = { SOC_SINGLE_EXT("Tones", OMAP_AESS_MIXDL1_TONES, 0, 1, 0, abe_get_mixer, put_mixer), SOC_SINGLE_EXT("Voice", OMAP_AESS_MIXDL1_VX_DL, 0, 1, 0, abe_get_mixer, put_mixer), SOC_SINGLE_EXT("Capture", OMAP_AESS_MIXDL1_MM_UL2, 0, 1, 0, abe_get_mixer, put_mixer), SOC_SINGLE_EXT("Multimedia", OMAP_AESS_MIXDL1_MM_DL, 0, 1, 0, abe_get_mixer, put_mixer), }; /* DL2 mixer paths */ static const struct snd_kcontrol_new dl2_mixer_controls[] = { SOC_SINGLE_EXT("Tones", OMAP_AESS_MIXDL2_TONES, 0, 1, 0, abe_get_mixer, put_mixer), SOC_SINGLE_EXT("Voice", OMAP_AESS_MIXDL2_VX_DL, 0, 1, 0, abe_get_mixer, put_mixer), SOC_SINGLE_EXT("Capture", OMAP_AESS_MIXDL2_MM_UL2, 0, 1, 0,
static int msm8960_slim_0_tx_ch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { msm8960_slim_0_tx_ch = ucontrol->value.integer.value[0]; pr_debug("%s: msm8960_slim_0_tx_ch = %d\n", __func__, msm8960_slim_0_tx_ch); return 1; } static const struct snd_kcontrol_new tabla_msm8960_controls[] = { SOC_ENUM_EXT("Speaker Function", msm8960_enum[0], msm8960_get_spk, msm8960_set_spk), SOC_SINGLE_EXT("SLIM_0_RX Channels", 0, 0, msm8960_SLIM_0_RX_MAX_CHANNELS, 0, msm8960_slim_0_rx_ch_get, msm8960_slim_0_rx_ch_put), SOC_SINGLE_EXT("SLIM_0_TX Channels", 0, 0, msm8960_SLIM_0_TX_MAX_CHANNELS, 0, msm8960_slim_0_tx_ch_get, msm8960_slim_0_tx_ch_put), }; static int msm8960_audrx_init(struct snd_soc_pcm_runtime *rtd) { int err; struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; pr_debug("%s()\n", __func__); err = snd_soc_add_controls(codec, tabla_msm8960_controls,
return 0; } static int msm_voice_slowtalk_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { ucontrol->value.integer.value[0] = voc_get_pp_enable(voc_get_session_id(VOICE_SESSION_NAME), MODULE_ID_VOICE_MODULE_ST); return 0; } static struct snd_kcontrol_new msm_voice_controls[] = { SOC_SINGLE_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_rx_device_mute_get, msm_voice_rx_device_mute_put), SOC_SINGLE_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_mute_get, msm_voice_mute_put), //[Audio][BSP] [email protected] phonememo initial code [START] SOC_SINGLE_EXT("Voice Tx Mute Phonememo", SND_SOC_NOPM, 0, 1, 0, msm_voice_mute_get, msm_phonememo_voice_mute_put), //[Audio][BSP] [email protected] phonememo initial code [END] #if defined(CONFIG_SND_VOICE_VOLUME) SOC_SINGLE_EXT("Voice Rx Volume", SND_SOC_NOPM, 0, CONFIG_SND_VOICE_VOLUME, 0, #else SOC_SINGLE_EXT("Voice Rx Volume", SND_SOC_NOPM, 0, 9, 0, #endif msm_voice_volume_get, msm_voice_volume_put), SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, msm_voice_tty_mode_put),
} pr_info("%s: msm8960_auxpcm_rate = %d" "ucontrol->value.integer.value[0] = %d\n", __func__, msm8960_auxpcm_rate, (int)ucontrol->value.integer.value[0]); return 0; } static const struct snd_kcontrol_new tabla_msm8960_controls[] = { SOC_ENUM_EXT("Speaker Function", msm8960_enum[0], msm8960_get_spk, msm8960_set_spk), SOC_ENUM_EXT("SLIM_0_RX Channels", msm8960_enum[1], msm8960_slim_0_rx_ch_get, msm8960_slim_0_rx_ch_put), SOC_ENUM_EXT("SLIM_0_TX Channels", msm8960_enum[2], msm8960_slim_0_tx_ch_get, msm8960_slim_0_tx_ch_put), SOC_SINGLE_EXT("SPK AMP SWITCH", SND_SOC_NOPM, 0, 1, 0, spk_get_ctl, spk_set_ctl), SOC_ENUM_EXT("Internal BTSCO SampleRate", msm8960_btsco_enum[0], msm8960_btsco_rate_get, msm8960_btsco_rate_put), SOC_ENUM_EXT("AUX PCM SampleRate", msm8960_auxpcm_enum[0], msm8960_auxpcm_rate_get, msm8960_auxpcm_rate_put), }; #if 0 //FIXME static const struct snd_kcontrol_new tabla_xbvol_controls[] = { SOC_SINGLE_TLV("LINEOUT1XB Volume", TABLA_A_RX_LINE_1_GAIN, 0, 12, 1, line_gain), SOC_SINGLE_TLV("LINEOUT3XB Volume", TABLA_A_RX_LINE_3_GAIN, 0, 12, 1, line_gain), }; #endif
struct snd_ctl_elem_value *ucontrol) { int delay = ucontrol->value.integer.value[0]; if (delay > 1000) delay = 1000; else if (delay < 0) delay = 0; pr_info("Delay for %d msec\n", delay); msleep_interruptible(delay); return 1; } static const struct snd_kcontrol_new b2_snd_controls[] = { SOC_SINGLE_EXT("Dummy Delay", SND_SOC_NOPM, 0, 1000, 0, dummy_delay_get, dummy_delay_put), }; static int i2s_dai_init(struct snd_soc_pcm_runtime *rtd) { int err; struct snd_soc_codec *codec = rtd->codec; err = snd_soc_add_codec_controls(codec, b2_snd_controls, ARRAY_SIZE(b2_snd_controls)); if (err < 0) return err; return 0; } static struct snd_soc_ops b2_ops = {
} else snd_soc_dapm_put_volsw(kcontrol, ucontrol); } else { snd_soc_dapm_put_volsw(kcontrol, ucontrol); wm8350_dapm_event(codec, SNDRV_CTL_POWER_D3hot); } } /* * DAPM Controls */ /* Left Playback Mixer */ static const struct snd_kcontrol_new wm8350_left_play_mixer_controls[] = { SOC_DAPM_SINGLE("Playback Switch", WM8350_LEFT_MIXER_CONTROL, 11, 1, 0), SOC_SINGLE_EXT("Left Bypass Switch", WM8350_LEFT_MIXER_CONTROL, 2, 1, 0, snd_soc_dapm_get_volsw, wm8350_dapm_put_volsw), SOC_DAPM_SINGLE("Right Playback Switch", WM8350_LEFT_MIXER_CONTROL, 12, 1, 0), SOC_DAPM_SINGLE("Left Sidetone Switch", WM8350_LEFT_MIXER_CONTROL, 0, 1, 0), SOC_DAPM_SINGLE("Right Sidetone Switch", WM8350_LEFT_MIXER_CONTROL, 1, 1, 0), }; /* Right Playback Mixer */ static const struct snd_kcontrol_new wm8350_right_play_mixer_controls[] = { SOC_DAPM_SINGLE("Playback Switch", WM8350_RIGHT_MIXER_CONTROL, 12, 1, 0), SOC_SINGLE_EXT("Right Bypass Switch", WM8350_RIGHT_MIXER_CONTROL, 3, 1, 0, snd_soc_dapm_get_volsw, wm8350_dapm_put_volsw), SOC_DAPM_SINGLE("Left Playback Switch", WM8350_RIGHT_MIXER_CONTROL, 11, 1, 0), SOC_DAPM_SINGLE("Left Sidetone Switch", WM8350_RIGHT_MIXER_CONTROL, 0, 1, 0), SOC_DAPM_SINGLE("Right Sidetone Switch", WM8350_RIGHT_MIXER_CONTROL, 1, 1, 0), };
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); static const struct snd_kcontrol_new wm8904_dac_snd_controls[] = { SOC_SINGLE_TLV("Digital Playback Boost Volume", WM8904_AUDIO_INTERFACE_0, 9, 3, 0, dac_boost_tlv), SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8904_DAC_DIGITAL_VOLUME_LEFT, WM8904_DAC_DIGITAL_VOLUME_RIGHT, 1, 96, 0, digital_tlv), SOC_DOUBLE_R_TLV("Headphone Volume", WM8904_ANALOGUE_OUT1_LEFT,
{ ucontrol->value.integer.value[0] = 0; return 0; } static const struct soc_enum tt_scenario_mode_enum[] = { SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tt_scenario_modes),tt_scenario_modes), }; static const struct snd_kcontrol_new tt_controls[] = { SOC_ENUM_EXT("TT Scenario", tt_scenario_enum[0], tt_get_scenario, tt_set_scenario), SOC_ENUM_EXT("TT Mode", tt_scenario_mode_enum[0], tt_get_scenario_mode, tt_set_scenario_mode), SOC_SINGLE_EXT("TT Playback Volume %", 0, 0, 100, 0, tt_get_volume, tt_set_volume), SOC_SINGLE_EXT("TT Playback Volume dB", 0, 0, 90, 0, tt_get_volume_dB, tt_set_volume_dB), SOC_SINGLE_EXT("TT Mic Gain", 0, 0, 64, 0, tt_get_mic_gain, tt_set_mic_gain), SOC_SINGLE_EXT("TT Speaker Level", 0, 0, 2147483647, 0, tt_get_speaker_level, tt_set_speaker_level), SOC_SINGLE_EXT("TT Line Out Level", 0, 0, 900000, 0, tt_get_line_out_level, tt_set_line_out_level), SOC_SINGLE_BOOL_EXT("TT BTHF Line Out", &tt_hf_line_out, tt_get_hf_line_out, tt_set_hf_line_out), SOC_SINGLE_EXT("Unmute Amp", 0, 0, 1, 0, tt_get_unmute_amp, tt_set_unmute_amp), SOC_SINGLE_BOOL_EXT("TT Headphones Detect", &tt_hpdetect, tt_hpdetect_get, tt_hpdetect_put), #ifdef INCLUDE_TEST_KCONTROLS
SOC_SINGLE_MULTI_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_rx_device_mute_put), SOC_SINGLE_MULTI_EXT("Voice Tx Device Mute", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_tx_device_mute_put), SOC_SINGLE_MULTI_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_mute_put), SOC_SINGLE_MULTI_EXT("Voice Rx Gain", SND_SOC_NOPM, 0, VSID_MAX, 0, 3, NULL, msm_voice_gain_put), SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, msm_voice_tty_mode_put), SOC_SINGLE_MULTI_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, VSID_MAX, 0, 2, NULL, msm_voice_slowtalk_put), #ifdef CONFIG_SEC_SOLUTION SOC_SINGLE_MULTI_EXT("Sec Set DHA data", SND_SOC_NOPM, 0, 65535, 0, 14, msm_sec_dha_get, msm_sec_dha_put), SOC_SINGLE_EXT("Loopback Enable", SND_SOC_NOPM, 0, 1, 0, msm_loopback_get, msm_loopback_put), #endif // Dummy control to expose stereo recording support in kernel to user-space SOC_SINGLE_EXT("Stereo Recording", SND_SOC_NOPM, 1, VSID_MAX, 0, NULL, NULL), }; static struct snd_pcm_ops msm_pcm_ops = { .open = msm_pcm_open, .hw_params = msm_pcm_hw_params, .close = msm_pcm_close, .prepare = msm_pcm_prepare, .trigger = msm_pcm_trigger, .ioctl = msm_pcm_ioctl, };
dev_dbg(codec->dev, "%s: enter.\n", __func__); r = wl1273->core->set_volume(wl1273->core, ucontrol->value.integer.value[0]); if (r) return r; return 1; } static const struct snd_kcontrol_new wl1273_controls[] = { SOC_ENUM_EXT("Codec Mode", wl1273_enum, snd_wl1273_get_audio_route, snd_wl1273_set_audio_route), SOC_ENUM_EXT("Audio Switch", wl1273_audio_enum, snd_wl1273_fm_audio_get, snd_wl1273_fm_audio_put), SOC_SINGLE_EXT("Volume", 0, 0, WL1273_MAX_VOLUME, 0, snd_wl1273_fm_volume_get, snd_wl1273_fm_volume_put), }; static int wl1273_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); switch (wl1273->mode) { case WL1273_MODE_BT: snd_pcm_hw_constraint_minmax(substream->runtime, SNDRV_PCM_HW_PARAM_RATE, 8000, 8000); snd_pcm_hw_constraint_minmax(substream->runtime,
return 0; } static int msm_voice_fens_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { ucontrol->value.integer.value[0] = voc_get_pp_enable(voc_get_session_id(VOICE_SESSION_NAME), MODULE_ID_VOICE_MODULE_FENS); return 0; } static struct snd_kcontrol_new msm_voice_controls[] = { SOC_SINGLE_EXT("Voice Rx Device Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_rx_device_mute_get, msm_voice_rx_device_mute_put), SOC_SINGLE_EXT("Voice Tx Mute", SND_SOC_NOPM, 0, 1, 0, msm_voice_mute_get, msm_voice_mute_put), SOC_SINGLE_EXT("Voice Rx Volume", SND_SOC_NOPM, 0, 5, 0, msm_voice_volume_get, msm_voice_volume_put), SOC_ENUM_EXT("TTY Mode", msm_tty_mode_enum[0], msm_voice_tty_mode_get, msm_voice_tty_mode_put), SOC_SINGLE_EXT("Widevoice Enable", SND_SOC_NOPM, 0, 1, 0, msm_voice_widevoice_get, msm_voice_widevoice_put), SOC_SINGLE_EXT("Slowtalk Enable", SND_SOC_NOPM, 0, 1, 0, msm_voice_slowtalk_get, msm_voice_slowtalk_put), SOC_SINGLE_EXT("FENS Enable", SND_SOC_NOPM, 0, 1, 0, msm_voice_fens_get, msm_voice_fens_put), SOC_SINGLE_EXT("VoLTE Rx Device Mute", SND_SOC_NOPM, 0, 1, 0, msm_volte_rx_device_mute_get,
static const char * const es9018_clk_divider_texts[] = { "DIV4", "DIV8", "DIV16", "DIV16" }; static const struct soc_enum es9018_power_state_enum = SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(es9018_power_state_texts), es9018_power_state_texts); static const struct soc_enum es9018_clk_divider_enum = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(es9018_clk_divider_texts), es9018_clk_divider_texts); static struct snd_kcontrol_new es9018_digital_ext_snd_controls[] = { /* commit controls */ SOC_SINGLE_EXT("Es9018 Left Volume", SND_SOC_NOPM, 0, 256, 0, es9018_get_left_volume_enum, es9018_put_left_volume_enum), SOC_SINGLE_EXT("Es9018 Right Volume", SND_SOC_NOPM, 0, 256, 0, es9018_get_right_volume_enum, es9018_put_right_volume_enum), SOC_SINGLE_EXT("Es9018 Master Volume", SND_SOC_NOPM, 0, 100, 0, es9018_get_master_volume_enum, es9018_put_master_volume_enum), SOC_ENUM_EXT("Es9018 State", es9018_power_state_enum, es9018_get_power_state_enum, es9018_put_power_state_enum), SOC_ENUM_EXT("Es9018 CLK Divider", es9018_clk_divider_enum, es9018_get_clk_divider, es9018_set_clk_divider), }; static int es9018_read_reg(struct i2c_client *client, int reg) { int ret;
static const char * const max98925_boost_voltage_text[] = {"8.5V", "8.25V", "8.0V", "7.75V", "7.5V", "7.25V", "7.0V", "6.75V", "6.5V", "6.5V", "6.5V", "6.5V", "6.5V", "6.5V", "6.5V", "6.5V"}; static const struct soc_enum max98925_boost_voltage_enum = SOC_ENUM_SINGLE(MAX98925_R037_CONFIGURATION, MAX98925_BST_VOUT_SHIFT, 15, max98925_boost_voltage_text); static const struct snd_kcontrol_new max98925_snd_controls[] = { SOC_SINGLE_EXT_TLV("Speaker Volume", MAX98925_R02D_GAIN, MAX98925_SPK_GAIN_SHIFT, (1<<MAX98925_SPK_GAIN_WIDTH)-1, 0, max98925_spk_vol_get, max98925_spk_vol_put, max98925_spk_tlv), SOC_SINGLE_EXT("Speaker Ramp", 0, 0, 1, 0, max98925_spk_ramp_get, max98925_spk_ramp_put), SOC_SINGLE_EXT("Speaker ZCD", 0, 0, 1, 0, max98925_spk_zcd_get, max98925_spk_zcd_put), SOC_SINGLE_EXT("ALC Enable", 0, 0, 1, 0, max98925_alc_en_get, max98925_alc_en_put), SOC_SINGLE_EXT("ALC Threshold", 0, 0, (1<<MAX98925_ALC_TH_WIDTH)-1, 0, max98925_alc_threshold_get, max98925_alc_threshold_put), SOC_ENUM("Boost Output Voltage", max98925_boost_voltage_enum), }; static int max98925_add_widgets(struct snd_soc_codec *codec) {
static const struct snd_kcontrol_new tabla_msm_controls[] = { SOC_ENUM_EXT("Speaker Function", msm_enum[0], msm_get_spk, msm_set_spk), SOC_ENUM_EXT("SLIM_0_RX Channels", msm_enum[1], msm_slim_0_rx_ch_get, msm_slim_0_rx_ch_put), SOC_ENUM_EXT("SLIM_0_TX Channels", msm_enum[2], msm_slim_0_tx_ch_get, msm_slim_0_tx_ch_put), }; static const struct snd_kcontrol_new int_btsco_rate_mixer_controls[] = { SOC_ENUM_EXT("Internal BTSCO SampleRate", msm_btsco_enum[0], msm_btsco_rate_get, msm_btsco_rate_put), }; static const struct snd_kcontrol_new incall_rec_mode_mixer_controls[] = { SOC_SINGLE_EXT("Incall Rec Mode", SND_SOC_NOPM, 0, 1, 0, msm_incall_rec_mode_get, msm_incall_rec_mode_put), }; static int msm_btsco_init(struct snd_soc_pcm_runtime *rtd) { int err = 0; struct snd_soc_platform *platform = rtd->platform; err = snd_soc_add_platform_controls(platform, int_btsco_rate_mixer_controls, ARRAY_SIZE(int_btsco_rate_mixer_controls)); if (err < 0) return err; return 0; }
static const struct snd_kcontrol_new sec_auxpcm_lb_vol_mixer_controls[] = { SOC_SINGLE_EXT_TLV("SEC AUXPCM LOOPBACK Volume", AFE_PORT_ID_SECONDARY_PCM_TX, 0, INT_RX_VOL_GAIN, 0, msm_qti_pp_get_auxpcm_lb_vol_mixer, msm_qti_pp_set_auxpcm_lb_vol_mixer, auxpcm_lb_vol_gain), }; static const struct snd_kcontrol_new multi_ch_channel_map_mixer_controls[] = { SOC_SINGLE_MULTI_EXT("Playback Channel Map", SND_SOC_NOPM, 0, 16, 0, 8, msm_qti_pp_get_channel_map_mixer, msm_qti_pp_put_channel_map_mixer), }; static const struct snd_kcontrol_new get_rms_controls[] = { SOC_SINGLE_EXT("Get RMS", SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, msm_qti_pp_get_rms_value_control, msm_qti_pp_put_rms_value_control), }; static const struct snd_kcontrol_new eq_enable_mixer_controls[] = { SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_qti_pp_get_eq_enable_mixer, msm_qti_pp_put_eq_enable_mixer), SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_qti_pp_get_eq_enable_mixer, msm_qti_pp_put_eq_enable_mixer), SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_qti_pp_get_eq_enable_mixer, msm_qti_pp_put_eq_enable_mixer), }; static const struct snd_kcontrol_new eq_band_mixer_controls[] = {
*/ static int speaker_gain_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int value = ucontrol->value.integer.value[0]; spk_gain = value; if (!spk_unmute) speaker_gain_set(value); return 0; } static const struct snd_kcontrol_new amp_gain_controls[] = { SOC_SINGLE_EXT("Speaker Gain", 0, 0, 3, 0, speaker_gain_get, speaker_gain_put), }; /** * spk_unmute_state - set the unmute state of the speaker * @to: zero to unmute, non-zero to ununmute. */ static void spk_unmute_state(int to) { pr_debug("%s: to=%d\n", __func__, to); spk_unmute = to; gpio_set_value(pdata->amp_gpio, to); /* if we're umuting, also re-set the gain */ if (to && pdata->amp_gain[0] > 0)
return 1; } static int omap_mcbsp_st_get_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; ucontrol->value.integer.value[0] = omap_st_is_enabled(mc->reg); return 0; } static const struct snd_kcontrol_new omap_mcbsp2_st_controls[] = { SOC_SINGLE_EXT("McBSP2 Sidetone Switch", 1, 0, 1, 0, omap_mcbsp_st_get_mode, omap_mcbsp_st_put_mode), OMAP_MCBSP_SOC_SINGLE_S16_EXT("McBSP2 Sidetone Channel 0 Volume", -32768, 32767, omap_mcbsp2_get_st_ch0_volume, omap_mcbsp2_set_st_ch0_volume), OMAP_MCBSP_SOC_SINGLE_S16_EXT("McBSP2 Sidetone Channel 1 Volume", -32768, 32767, omap_mcbsp2_get_st_ch1_volume, omap_mcbsp2_set_st_ch1_volume), }; static const struct snd_kcontrol_new omap_mcbsp3_st_controls[] = { SOC_SINGLE_EXT("McBSP3 Sidetone Switch", 2, 0, 1, 0, omap_mcbsp_st_get_mode, omap_mcbsp_st_put_mode), OMAP_MCBSP_SOC_SINGLE_S16_EXT("McBSP3 Sidetone Channel 0 Volume", -32768, 32767,
ucontrol->value.integer.value[0] = priv->audio_wcn_cmb; return 0; } static int audio_wcn_cmb_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct mt_pcm_mrgrx_priv *priv = snd_soc_component_get_drvdata(component); priv->audio_wcn_cmb = ucontrol->value.integer.value[0]; mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X) priv->audio_wcn_cmb); return 0; } static const struct snd_kcontrol_new audio_snd_mrgrx_controls[] = { SOC_SINGLE_EXT("Audio Mrgrx Volume", SND_SOC_NOPM, 0, 0x80000, 0, audio_mrgrx_volume_get, audio_mrgrx_volume_set), SOC_ENUM_EXT("cmb stub Audio Control", wcn_stub_audio_ctr_Enum[0], audio_wcn_cmb_get, audio_wcn_cmb_set), }; static struct snd_pcm_hardware mt_pcm_mrgrx_hardware = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID), .formats = SNDRV_PCM_FMTBIT_S16_LE, .rates = SOC_NORMAL_USE_RATE, .rate_min = SOC_NORMAL_USE_RATE_MIN, .rate_max = SOC_NORMAL_USE_RATE_MAX, .channels_min = SOC_NORMAL_USE_CHANNELS_MIN, .channels_max = SOC_NORMAL_USE_CHANNELS_MAX, .buffer_bytes_max = MRGRX_MAX_BUFFER_SIZE, .period_bytes_min = SOC_NORMAL_USE_PERIOD_SIZE_MIN,
return 0; } static int Audio_Wcn_Cmb_Set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { mAudio_Wcn_Cmb = ucontrol->value.integer.value[0]; printk("%s mAudio_Wcn_Cmb = 0x%x \n", __func__, mAudio_Wcn_Cmb); #ifndef DENALI_FPGA_EARLYPORTING mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X)mAudio_Wcn_Cmb); #endif return 0; } static const struct snd_kcontrol_new Audio_snd_mrgrx_controls[] = { SOC_SINGLE_EXT("Audio Mrgrx Volume", SND_SOC_NOPM, 0, 0x80000, 0, Audio_mrgrx_Volume_Get, Audio_mrgrx_Volume_Set), SOC_ENUM_EXT("cmb stub Audio Control", wcn_stub_audio_ctr_Enum[0], Audio_Wcn_Cmb_Get, Audio_Wcn_Cmb_Set), }; static struct snd_pcm_hardware mtk_mrgrx_hardware = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID), .formats = SND_SOC_STD_MT_FMTS, .rates = SOC_HIGH_USE_RATE, .rate_min = SOC_NORMAL_USE_RATE_MIN, .rate_max = SOC_NORMAL_USE_RATE_MAX, .channels_min = SOC_NORMAL_USE_CHANNELS_MIN, .channels_max = SOC_NORMAL_USE_CHANNELS_MAX,
ucontrol->value.integer.value[0] = tegra_i2sloopback_func; return 0; } static int tegra_set_i2sloopback(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { if (tegra_i2sloopback_func == ucontrol->value.integer.value[0]) return 0; tegra_i2sloopback_func = ucontrol->value.integer.value[0]; return 1; } struct snd_kcontrol_new tegra_avp_controls[] = { SOC_SINGLE_EXT("AVP alsa device select", 0, 0, TEGRA_ALSA_MAX_DEVICES, \ 0, tegra_get_avp_device, tegra_set_avp_device), { .name = "AVP DMA channel id", \ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ .info = snd_soc_info_volsw, \ .access = SNDRV_CTL_ELEM_ACCESS_READ, \ .get = tegra_get_dma_ch_id, \ .private_value = SOC_SINGLE_VALUE(0, 0, \ TEGRA_DMA_MAX_CHANNELS, 0) }, SOC_SINGLE_EXT("AVP DMA address", 0, 0, 0xFFFFFFFF, \ 0, tegra_get_dma_addr, tegra_set_dma_addr), }; static const struct snd_kcontrol_new tegra_i2s_lpbk_control = SOC_ENUM_EXT("I2S LoopBack", tegra_enum, tegra_get_i2sloopback,