From ea098207c6216d191b7c696772d5ebbffcdd2018 Mon Sep 17 00:00:00 2001 From: Erin Yan Date: Wed, 24 Mar 2021 14:33:54 +0800 Subject: [PATCH] asoc: add get function for mixer controls When set amixer command, it will first read the control element before write. If the get function is missing, the amixer command will fail. Signed-off-by: Erin Yan Change-Id: Id5eb1ead1787490d75a21b9cc9ee69bc54e0ea5b --- asoc/msm-pcm-routing-v2.c | 60 ++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index b9d12259ee4f..24d43e0f5868 100755 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -79,6 +79,9 @@ static int msm_ec_ref_ch = 4; static int msm_ec_ref_ch_downmixed = 4; static int msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S16_LE; static int msm_ec_ref_sampling_rate = 48000; +static uint16_t msm_ec_ref_ch_weights[PCM_FORMAT_MAX_NUM_CHANNEL_V8] + [PCM_FORMAT_MAX_NUM_CHANNEL_V8]; + static uint32_t voc_session_id = ALL_SESSION_VSID; static int msm_route_ext_ec_ref; static bool is_custom_stereo_on; @@ -5477,19 +5480,34 @@ static int msm_ec_ref_ch_downmixed_put(struct snd_kcontrol *kcontrol, return 0; } -static int msm_ec_ref_chmixer_weights_put(struct snd_kcontrol *kcontrol, +static int msm_ec_ref_chmixer_weights_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int i = 0, ret = 0; - uint16_t weights[PCM_FORMAT_MAX_NUM_CHANNEL_V8] = {0}; int out_channel_idx = ((struct soc_multi_mixer_control *) kcontrol->private_value)->shift; for (; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) - weights[i] = ucontrol->value.integer.value[i]; + ucontrol->value.integer.value[i] = + msm_ec_ref_ch_weights[out_channel_idx][i]; + + return ret; +} + +static int msm_ec_ref_chmixer_weights_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int i = 0, ret = 0; + int out_channel_idx = ((struct soc_multi_mixer_control *) + kcontrol->private_value)->shift; + + for (; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) + msm_ec_ref_ch_weights[out_channel_idx][i] = + ucontrol->value.integer.value[i]; ret = adm_ec_ref_chmixer_weights(out_channel_idx, - weights, PCM_FORMAT_MAX_NUM_CHANNEL_V8); + msm_ec_ref_ch_weights[out_channel_idx], + PCM_FORMAT_MAX_NUM_CHANNEL_V8); pr_debug("%s: ch_index = %d, ret = %d\n", __func__, out_channel_idx, ret); return ret; } @@ -5849,28 +5867,36 @@ static const struct snd_kcontrol_new ec_ref_param_controls[] = { msm_route_ec_ref_params_enum[0], msm_ec_ref_ch_downmixed_get, msm_ec_ref_ch_downmixed_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch1", SND_SOC_NOPM, - 0, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 0, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch2", SND_SOC_NOPM, - 1, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 1, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch3", SND_SOC_NOPM, - 2, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 2, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch4", SND_SOC_NOPM, - 3, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 3, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch5", SND_SOC_NOPM, - 4, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 4, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch6", SND_SOC_NOPM, - 5, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 5, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch7", SND_SOC_NOPM, - 6, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 6, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch8", SND_SOC_NOPM, - 7, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL, + 7, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, + msm_ec_ref_chmixer_weights_get, msm_ec_ref_chmixer_weights_put), SOC_ENUM_EXT("AFE_LOOPBACK_TX Port", msm_route_ec_ref_rx_enum[0], msm_routing_afe_lb_tx_port_get, msm_routing_afe_lb_tx_port_put), @@ -31376,6 +31402,13 @@ static const struct snd_kcontrol_new pll_clk_drift_controls[] = { 0, 128, msm_routing_get_pll_clk_drift, msm_routing_put_pll_clk_drift), }; +static int msm_routing_get_port_chmap_mixer(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + /* can't get the chmap info without be_idx */ + return 0; +} + static int msm_routing_put_port_chmap_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -31404,7 +31437,8 @@ static int msm_routing_put_port_chmap_mixer(struct snd_kcontrol *kcontrol, static const struct snd_kcontrol_new port_multi_channel_map_mixer_controls[] = { SOC_SINGLE_MULTI_EXT("Backend Device Channel Map", SND_SOC_NOPM, 0, MSM_BACKEND_DAI_MAX, 0, - PCM_FORMAT_MAX_NUM_CHANNEL_V8 + 1, NULL, + PCM_FORMAT_MAX_NUM_CHANNEL_V8 + 1, + msm_routing_get_port_chmap_mixer, msm_routing_put_port_chmap_mixer), };