From cdde1800606f6a67b01dadad53e8fad06cc1fed1 Mon Sep 17 00:00:00 2001 From: Chaithanya Krishna Bacharaju Date: Thu, 24 Jan 2019 13:38:42 +0530 Subject: [PATCH] asoc: Add support for Aptx Adaptive decoder Add support for Aptx Adaptive decoder. Introduce new get and put for ABR feedback decoder controls since same decoder config format is required to be passed by client in regular and feedback decoder configuration. Change-Id: I96d9daef2a0967788640c2efb5478119eeae48ab Signed-off-by: Chaithanya Krishna Bacharaju --- asoc/msm-dai-q6-v2.c | 89 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 14 deletions(-) diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index 10acd501a80d..c2be85b03245 100644 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -3226,11 +3226,64 @@ static int msm_dai_q6_afe_dec_cfg_info(struct snd_kcontrol *kcontrol, return 0; } +static int msm_dai_q6_afe_feedback_dec_cfg_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; + u32 format_size = 0; + + if (!dai_data) { + pr_err("%s: Invalid dai data\n", __func__); + return -EINVAL; + } + + format_size = sizeof(dai_data->dec_config.format); + memcpy(ucontrol->value.bytes.data, + &dai_data->dec_config.format, + format_size); + + pr_debug("%s: abr_dec_cfg for %d format\n", + __func__, dai_data->dec_config.format); + memcpy(ucontrol->value.bytes.data + format_size, + &dai_data->dec_config.abr_dec_cfg, + sizeof(struct afe_imc_dec_enc_info)); + + return 0; +} + +static int msm_dai_q6_afe_feedback_dec_cfg_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; + u32 format_size = 0; + + if (!dai_data) { + pr_err("%s: Invalid dai data\n", __func__); + return -EINVAL; + } + + memset(&dai_data->dec_config, 0x0, + sizeof(struct afe_dec_config)); + format_size = sizeof(dai_data->dec_config.format); + memcpy(&dai_data->dec_config.format, + ucontrol->value.bytes.data, + format_size); + + pr_debug("%s: abr_dec_cfg for %d format\n", + __func__, dai_data->dec_config.format); + memcpy(&dai_data->dec_config.abr_dec_cfg, + ucontrol->value.bytes.data + format_size, + sizeof(struct afe_imc_dec_enc_info)); + dai_data->dec_config.abr_dec_cfg.is_abr_enabled = true; + return 0; +} + static int msm_dai_q6_afe_dec_cfg_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; u32 format_size = 0; + int ret = 0; if (!dai_data) { pr_err("%s: Invalid dai data\n", __func__); @@ -3247,20 +3300,23 @@ static int msm_dai_q6_afe_dec_cfg_get(struct snd_kcontrol *kcontrol, &dai_data->dec_config.data, sizeof(struct asm_aac_dec_cfg_v2_t)); break; + case DEC_FMT_APTX_ADAPTIVE: + memcpy(ucontrol->value.bytes.data + format_size, + &dai_data->dec_config.data, + sizeof(struct asm_aptx_ad_dec_cfg_t)); + break; case DEC_FMT_SBC: case DEC_FMT_MP3: /* No decoder specific data available */ break; default: - pr_debug("%s: Default decoder config for %d format: Expect abr_dec_cfg\n", + pr_err("%s: Invalid format %d\n", __func__, dai_data->dec_config.format); - memcpy(ucontrol->value.bytes.data + format_size, - &dai_data->dec_config.abr_dec_cfg, - sizeof(struct afe_abr_dec_cfg_t)); - + ret = -EINVAL; break; } - return 0; + + return ret; } static int msm_dai_q6_afe_dec_cfg_put(struct snd_kcontrol *kcontrol, @@ -3268,6 +3324,7 @@ static int msm_dai_q6_afe_dec_cfg_put(struct snd_kcontrol *kcontrol, { struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; u32 format_size = 0; + int ret = 0; if (!dai_data) { pr_err("%s: Invalid dai data\n", __func__); @@ -3293,15 +3350,19 @@ static int msm_dai_q6_afe_dec_cfg_put(struct snd_kcontrol *kcontrol, ucontrol->value.bytes.data + format_size, sizeof(struct asm_sbc_dec_cfg_t)); break; - default: - pr_debug("%s: Default decoder config for %d format: Expect abr_dec_cfg\n", - __func__, dai_data->dec_config.format); - memcpy(&dai_data->dec_config.abr_dec_cfg, + case DEC_FMT_APTX_ADAPTIVE: + memcpy(&dai_data->dec_config.data, ucontrol->value.bytes.data + format_size, - sizeof(struct afe_abr_dec_cfg_t)); + sizeof(struct asm_aptx_ad_dec_cfg_t)); + break; + default: + pr_err("%s: Invalid format %d\n", + __func__, dai_data->dec_config.format); + ret = -EINVAL; break; } - return 0; + + return ret; } static const struct snd_kcontrol_new afe_dec_config_controls[] = { @@ -3311,8 +3372,8 @@ static const struct snd_kcontrol_new afe_dec_config_controls[] = { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = "SLIM_7_TX Decoder Config", .info = msm_dai_q6_afe_dec_cfg_info, - .get = msm_dai_q6_afe_dec_cfg_get, - .put = msm_dai_q6_afe_dec_cfg_put, + .get = msm_dai_q6_afe_feedback_dec_cfg_get, + .put = msm_dai_q6_afe_feedback_dec_cfg_put, }, { .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |