diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index 2802a4fa17..53622e0854 100644 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -2249,6 +2249,10 @@ static int msm_dai_q6_afe_enc_cfg_get(struct snd_kcontrol *kcontrol, sizeof(struct asm_aac_enc_cfg_v2_t)); break; case ENC_FMT_APTX: + memcpy(ucontrol->value.bytes.data + format_size, + &dai_data->enc_config.data, + sizeof(struct asm_aptx_enc_cfg_t)); + break; case ENC_FMT_APTX_HD: memcpy(ucontrol->value.bytes.data + format_size, &dai_data->enc_config.data, @@ -2298,6 +2302,10 @@ static int msm_dai_q6_afe_enc_cfg_put(struct snd_kcontrol *kcontrol, sizeof(struct asm_aac_enc_cfg_v2_t)); break; case ENC_FMT_APTX: + memcpy(&dai_data->enc_config.data, + ucontrol->value.bytes.data + format_size, + sizeof(struct asm_aptx_enc_cfg_t)); + break; case ENC_FMT_APTX_HD: memcpy(&dai_data->enc_config.data, ucontrol->value.bytes.data + format_size, diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 8e96f6fecb..2bdfd10fdc 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -2895,6 +2895,24 @@ static int q6afe_send_enc_config(u16 port_id, goto exit; } + if (format == ASM_MEDIA_FMT_APTX) { + config.param.payload_size = + payload_size + sizeof(config.port.sync_mode_param); + pr_debug("%s: sending AFE_PARAM_ID_APTX_SYNC_MODE to DSP", + __func__); + config.pdata.param_id = AFE_PARAM_ID_APTX_SYNC_MODE; + config.pdata.param_size = sizeof(config.port.sync_mode_param); + config.port.sync_mode_param.sync_mode = + config.port.enc_blk_param.enc_blk_config.aptx_config. + aptx_v2_cfg.sync_mode; + ret = afe_apr_send_pkt(&config, &this_afe.wait[index]); + if (ret) { + pr_err("%s: AFE_PARAM_ID_APTX_SYNC_MODE for port 0x%x failed %d\n", + __func__, port_id, ret); + goto exit; + } + } + config.param.payload_size = payload_size + sizeof(config.port.enc_pkt_id_param); pr_debug("%s:sending AFE_ENCODER_PARAM_ID_PACKETIZER to DSP payload = %d", diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h index df635ccad1..be56d74eef 100644 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -3074,6 +3074,16 @@ struct afe_param_id_set_topology_cfg { u32 topology_id; } __packed; +#define AFE_PARAM_ID_APTX_SYNC_MODE 0x00013205 + +struct afe_param_id_aptx_sync_mode { + /* + * sync mode: 0x0 = stereo sync mode (default) + * 0x01 = dual mono sync mode + * 0x02 = dual mono with no sync on either L or R + */ + uint32_t sync_mode; +} __packed; /* * Generic encoder module ID. @@ -3305,6 +3315,21 @@ struct asm_custom_enc_cfg_t { uint8_t channel_mapping[8]; uint32_t custom_size; } __packed; + +struct asm_aptx_v2_enc_cfg_ext_t { + /* + * sync mode: 0x0 = stereo sync mode (default) + * 0x01 = dual mono sync mode + * 0x02 = dual mono with no sync on either L or R + */ + uint32_t sync_mode; +} __packed; + +struct asm_aptx_enc_cfg_t { + struct asm_custom_enc_cfg_t custom_cfg; + struct asm_aptx_v2_enc_cfg_ext_t aptx_v2_cfg; +} __packed; + #define ASM_MEDIA_FMT_CELT 0x00013221 struct asm_celt_specific_enc_cfg_t { /* @@ -3421,6 +3446,7 @@ union afe_enc_config_data { struct asm_aac_enc_cfg_v2_t aac_config; struct asm_custom_enc_cfg_t custom_config; struct asm_celt_enc_cfg_t celt_config; + struct asm_aptx_enc_cfg_t aptx_config; }; struct afe_enc_config { @@ -3461,6 +3487,7 @@ union afe_port_config { struct afe_param_id_set_topology_cfg topology; struct afe_param_id_tdm_cfg tdm; struct afe_param_id_usb_audio_cfg usb_audio; + struct afe_param_id_aptx_sync_mode sync_mode_param; struct afe_enc_fmt_id_param_t enc_fmt; struct afe_port_media_type_t media_type; struct afe_enc_cfg_blk_param_t enc_blk_param;