From 3693b6559cf08c0b52d0d11dc6ae90713cf09bd0 Mon Sep 17 00:00:00 2001 From: Bhalchandra Gajare Date: Sat, 12 May 2018 18:52:56 -0700 Subject: [PATCH] asoc: msm-pcm-routing: add Listen app type config v2 mixer control It is required to know the number of output channels for any particular app_type so that channel mixing can be performed if the channels do not match as that of the listen stream. Add new Listen app type config V2 mixer control that reads the num_out_channels field along with the others. Change-Id: I49a74004e12dfa5a4c1ebaac4ac065acc6ff5bc3 Signed-off-by: Bhalchandra Gajare --- asoc/msm-pcm-routing-v2.c | 13 ++++++++++++- asoc/msm-pcm-routing-v2.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 1ee5687e0f5d..b1f008890410 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -14826,16 +14826,20 @@ static int msm_routing_put_lsm_app_type_cfg_control( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { + int shift = ((struct soc_multi_mixer_control *) + kcontrol->private_value)->shift; int i = 0, j; int num_app_types = ucontrol->value.integer.value[i++]; memset(lsm_app_type_cfg, 0, MAX_APP_TYPES* - sizeof(struct msm_pcm_routing_app_type_data)); + sizeof(struct msm_pcm_routing_app_type_data)); + if (num_app_types > MAX_APP_TYPES) { pr_err("%s: number of app types exceed the max supported\n", __func__); return -EINVAL; } + for (j = 0; j < num_app_types; j++) { lsm_app_type_cfg[j].app_type = ucontrol->value.integer.value[i++]; @@ -14843,6 +14847,10 @@ static int msm_routing_put_lsm_app_type_cfg_control( ucontrol->value.integer.value[i++]; lsm_app_type_cfg[j].bit_width = ucontrol->value.integer.value[i++]; + /* Shift of 1 indicates this is V2 mixer control */ + if (shift == 1) + lsm_app_type_cfg[j].num_out_channels = + ucontrol->value.integer.value[i++]; } return 0; @@ -14852,6 +14860,9 @@ static const struct snd_kcontrol_new lsm_app_type_cfg_controls[] = { SOC_SINGLE_MULTI_EXT("Listen App Type Config", SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 128, msm_routing_get_lsm_app_type_cfg_control, msm_routing_put_lsm_app_type_cfg_control), + SOC_SINGLE_MULTI_EXT("Listen App Type Config V2", SND_SOC_NOPM, 1, + 0xFFFFFFFF, 0, 128, msm_routing_get_lsm_app_type_cfg_control, + msm_routing_put_lsm_app_type_cfg_control), }; static int msm_routing_get_use_ds1_or_ds2_control( diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h index 345e4d9cb98e..45a528d6f2f4 100644 --- a/asoc/msm-pcm-routing-v2.h +++ b/asoc/msm-pcm-routing-v2.h @@ -500,6 +500,7 @@ struct msm_pcm_routing_app_type_data { int app_type; u32 sample_rate; int bit_width; + u32 num_out_channels; }; struct msm_pcm_stream_app_type_cfg {