snd_dev_controls[idx].private_value = 0; return 0; } #define MSM_EXT(xname, xindex, fp_info, fp_get, fp_put, addr) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ .name = xname, .index = xindex, \ .info = fp_info,\ .get = fp_get, .put = fp_put, \ .private_value = addr, \ } static struct snd_kcontrol_new snd_msm_controls[] = { MSM_EXT("Count", 1, msm_scontrol_count_info, msm_scontrol_count_get, \ NULL, 0), MSM_EXT("Stream", 2, msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Record", 3, msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Voice", 4, msm_voice_info, msm_voice_get, \ msm_voice_put, 0), MSM_EXT("Volume", 5, msm_volume_info, msm_volume_get, \ msm_volume_put, 0), MSM_EXT("VoiceVolume", 6, msm_v_volume_info, msm_v_volume_get, \ msm_v_volume_put, 0), MSM_EXT("VoiceMute", 7, msm_v_mute_info, msm_v_mute_get, \ msm_v_mute_put, 0), MSM_EXT("Voice Call", 8, msm_v_call_info, msm_v_call_get, \ msm_v_call_put, 0), MSM_EXT("Device_Volume", 9, msm_device_volume_info,
} #define MSM_EXT_TLV(xname, xindex, fp_info, fp_get, fp_put, addr, tlv_array) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ .access = (SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ SNDRV_CTL_ELEM_ACCESS_READWRITE), \ .name = xname, .index = xindex, \ .info = fp_info,\ .get = fp_get, .put = fp_put, .tlv.p = tlv_array, \ .private_value = addr, \ } static struct snd_kcontrol_new snd_msm_controls[] = { MSM_EXT_TLV("PCM Playback Volume", 0, snd_msm_volume_info, \ snd_msm_volume_get, snd_msm_volume_put, 0, db_scale_linear), MSM_EXT("device", 1, snd_msm_device_info, snd_msm_device_get, \ snd_msm_device_put, 0), }; static int msm_new_mixer(struct snd_soc_codec *codec) { unsigned int idx; int err; pr_err("msm_soc: ALSA MSM Mixer Setting\n"); strcpy(codec->card->snd_card->mixername, "MSM Mixer"); for (idx = 0; idx < ARRAY_SIZE(snd_msm_controls); idx++) { err = snd_ctl_add(codec->card->snd_card, snd_ctl_new1(&snd_msm_controls[idx], NULL)); if (err < 0) return err; }
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ .name = xname, \ .info = fp_info,\ .get = fp_get, .put = fp_put, \ .private_value = addr, \ } /* If new controls are to be added which would be constant across the * different targets, please add to the structure * snd_msm_controls. Please do not add any controls to the structure * snd_msm_secondary_controls defined below unless they are msm8x60 * specific. */ static struct snd_kcontrol_new snd_msm_controls[] = { MSM_EXT("Count", msm_scontrol_count_info, msm_scontrol_count_get, \ NULL, 0), MSM_EXT("Stream", msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Record", msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Voice", msm_voice_info, msm_voice_get, \ msm_voice_put, 0), MSM_EXT("Volume", msm_volume_info, msm_volume_get, \ msm_volume_put, 0), MSM_EXT("VoiceVolume", msm_v_volume_info, msm_v_volume_get, \ msm_v_volume_put, 0), MSM_EXT("VoiceMute", msm_v_mute_info, msm_v_mute_get, \ msm_v_mute_put, 0), MSM_EXT("Voice Call", msm_v_call_info, msm_v_call_get, \ msm_v_call_put, 0), MSM_EXT("Device_Volume", msm_device_volume_info, msm_device_volume_get, \
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ .name = xname, \ .info = fp_info,\ .get = fp_get, .put = fp_put, \ .private_value = addr, \ } /* If new controls are to be added which would be constant across the * different targets, please add to the structure * snd_msm_controls. Please do not add any controls to the structure * snd_msm_secondary_controls defined below unless they are msm8x60 * specific. */ static struct snd_kcontrol_new snd_msm_controls[] = { MSM_EXT("Count", msm_scontrol_count_info, msm_scontrol_count_get, \ NULL, 0), MSM_EXT("Stream", msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Record", msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Voice", msm_voice_info, msm_voice_get, \ msm_voice_put, 0), MSM_EXT("Volume", msm_volume_info, msm_volume_get, \ msm_volume_put, 0), MSM_EXT("VoiceVolume", msm_v_volume_info, msm_v_volume_get, \ msm_v_volume_put, 0), MSM_EXT("VoiceMute", msm_v_mute_info, msm_v_mute_get, \ msm_v_mute_put, 0), MSM_EXT("Voice Call", msm_v_call_info, msm_v_call_get, \ msm_v_call_put, 0), MSM_EXT("Device_Volume", msm_device_volume_info,
snd_dev_controls[idx].private_value = 0; return 0; } #define MSM_EXT(xname, fp_info, fp_get, fp_put, addr) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ .name = xname, \ .info = fp_info,\ .get = fp_get, .put = fp_put, \ .private_value = addr, \ } static struct snd_kcontrol_new snd_msm_controls[] = { MSM_EXT("Count", msm_scontrol_count_info, msm_scontrol_count_get, \ NULL, 0), MSM_EXT("Stream", msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Record", msm_route_info, msm_route_get, \ msm_route_put, 0), MSM_EXT("Voice", msm_voice_info, msm_voice_get, \ msm_voice_put, 0), MSM_EXT("Volume", msm_volume_info, msm_volume_get, \ msm_volume_put, 0), MSM_EXT("VoiceVolume", msm_v_volume_info, msm_v_volume_get, \ msm_v_volume_put, 0), MSM_EXT("VoiceMute", msm_v_mute_info, msm_v_mute_get, \ msm_v_mute_put, 0), MSM_EXT("Voice Call", msm_v_call_info, msm_v_call_get, \ msm_v_call_put, 0), MSM_EXT("Device_Volume", msm_device_volume_info,
} #define MSM_EXT_TLV(xname, xindex, fp_info, fp_get, fp_put, addr, tlv_array) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ .access = (SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ SNDRV_CTL_ELEM_ACCESS_READWRITE), \ .name = xname, .index = xindex, \ .info = fp_info,\ .get = fp_get, .put = fp_put, .tlv.p = tlv_array, \ .private_value = addr, \ } static struct snd_kcontrol_new snd_msm_controls[] = { MSM_EXT_TLV("PCM Playback Volume", 0, snd_msm_volume_info, \ snd_msm_volume_get, snd_msm_volume_put, 0, db_scale_linear), MSM_EXT("device", 0, snd_msm_device_info, snd_msm_device_get, \ snd_msm_device_put, 0), MSM_EXT("Device Volume", 0, snd_msm_device_vol_info, NULL, \ snd_msm_device_vol_put, 0), }; static int msm_new_mixer(struct snd_soc_codec *codec) { unsigned int idx; int err; pr_err("msm_soc: ALSA MSM Mixer Setting\n"); strcpy(codec->card->snd_card->mixername, "MSM Mixer"); for (idx = 0; idx < ARRAY_SIZE(snd_msm_controls); idx++) { err = snd_ctl_add(codec->card->snd_card, snd_ctl_new1(&snd_msm_controls[idx], NULL)); if (err < 0)
static int msm_voice_mute_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int dir = ucontrol->value.integer.value[0]; int mute = ucontrol->value.integer.value[1]; pr_debug("%s: dir=%d, mute=%d\n", __func__, dir, mute); voc_set_tx_mute(dir, mute); return 0; } static struct snd_kcontrol_new msm_voice_controls[] = { MSM_EXT("VoiceVolume", msm_voice_volume_info, msm_voice_volume_get, \ msm_voice_volume_put, 0), MSM_EXT("VoiceMute", msm_voice_mute_info, msm_voice_mute_get, \ msm_voice_mute_put, 0), }; 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, }; static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_card *card = rtd->card->snd_card;