dsp: Add support for Aptx Adaptive decoder
Add support for Aptx Adaptive decoder. Introduce flag to indicate ABR feedback decoder configuration to differentiate from regular decoder configuration. Change-Id: I272e0a9572a56e878f7ad1385514b3be7010145a Signed-off-by: Chaithanya Krishna Bacharaju <chaithan@codeaurora.org>
此提交包含在:

提交者
Meng Wang

父節點
5bb681434b
當前提交
4a466532e4
57
dsp/q6afe.c
57
dsp/q6afe.c
@@ -1,6 +1,5 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
@@ -76,6 +75,11 @@ enum {
|
|||||||
Q6AFE_MSM_SPKR_FTM_MODE
|
Q6AFE_MSM_SPKR_FTM_MODE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
APTX_AD_48 = 0,
|
||||||
|
APTX_AD_44_1 = 1
|
||||||
|
};
|
||||||
|
|
||||||
struct wlock {
|
struct wlock {
|
||||||
struct wakeup_source ws;
|
struct wakeup_source ws;
|
||||||
};
|
};
|
||||||
@@ -3541,6 +3545,29 @@ static int q6afe_send_dec_config(u16 port_id,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ASM_MEDIA_FMT_APTX_ADAPTIVE:
|
||||||
|
if (!cfg->abr_dec_cfg.is_abr_enabled) {
|
||||||
|
pr_debug("%s: sending aptx adaptive congestion buffer size to dsp\n",
|
||||||
|
__func__);
|
||||||
|
param_hdr.param_id =
|
||||||
|
AFE_DECODER_PARAM_ID_CONGESTION_BUFFER_SIZE;
|
||||||
|
param_hdr.param_size =
|
||||||
|
sizeof(struct avs_dec_congestion_buffer_param_t);
|
||||||
|
dec_buffer_id_param.version = 0;
|
||||||
|
dec_buffer_id_param.max_nr_buffers = 226;
|
||||||
|
dec_buffer_id_param.pre_buffer_size = 226;
|
||||||
|
ret = q6afe_pack_and_set_param_in_band(port_id,
|
||||||
|
q6audio_get_port_index(port_id),
|
||||||
|
param_hdr,
|
||||||
|
(u8 *) &dec_buffer_id_param);
|
||||||
|
if (ret) {
|
||||||
|
pr_err("%s: aptx adaptive congestion buffer size for port 0x%x failed %d\n",
|
||||||
|
__func__, port_id, ret);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall through for abr enabled case */
|
||||||
default:
|
default:
|
||||||
pr_debug("%s:sending AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION to DSP payload\n",
|
pr_debug("%s:sending AFE_ENCDEC_PARAM_ID_DEC_TO_ENC_COMMUNICATION to DSP payload\n",
|
||||||
__func__);
|
__func__);
|
||||||
@@ -3561,7 +3588,7 @@ static int q6afe_send_dec_config(u16 port_id,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("%s:Sending AFE_API_VERSION_PORT_MEDIA_TYPE to DSP", __func__);
|
pr_debug("%s: Send AFE_API_VERSION_PORT_MEDIA_TYPE to DSP\n", __func__);
|
||||||
param_hdr.module_id = AFE_MODULE_PORT;
|
param_hdr.module_id = AFE_MODULE_PORT;
|
||||||
param_hdr.param_id = AFE_PARAM_ID_PORT_MEDIA_TYPE;
|
param_hdr.param_id = AFE_PARAM_ID_PORT_MEDIA_TYPE;
|
||||||
param_hdr.param_size = sizeof(struct afe_port_media_type_t);
|
param_hdr.param_size = sizeof(struct afe_port_media_type_t);
|
||||||
@@ -3575,6 +3602,15 @@ static int q6afe_send_dec_config(u16 port_id,
|
|||||||
media_type.sample_rate =
|
media_type.sample_rate =
|
||||||
cfg->data.sbc_config.sample_rate;
|
cfg->data.sbc_config.sample_rate;
|
||||||
break;
|
break;
|
||||||
|
case ASM_MEDIA_FMT_APTX_ADAPTIVE:
|
||||||
|
if (!cfg->abr_dec_cfg.is_abr_enabled) {
|
||||||
|
media_type.sample_rate =
|
||||||
|
(cfg->data.aptx_ad_config.sample_rate == APTX_AD_44_1) ?
|
||||||
|
AFE_PORT_SAMPLE_RATE_44_1K :
|
||||||
|
AFE_PORT_SAMPLE_RATE_48K;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall through for abr enabled case */
|
||||||
default:
|
default:
|
||||||
media_type.sample_rate =
|
media_type.sample_rate =
|
||||||
afe_config.slim_sch.sample_rate;
|
afe_config.slim_sch.sample_rate;
|
||||||
@@ -3600,11 +3636,19 @@ static int q6afe_send_dec_config(u16 port_id,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2) {
|
if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2 &&
|
||||||
|
format != ASM_MEDIA_FMT_APTX_ADAPTIVE) {
|
||||||
pr_debug("%s:Unsuppported dec format. Ignore AFE config %u\n",
|
pr_debug("%s:Unsuppported dec format. Ignore AFE config %u\n",
|
||||||
__func__, format);
|
__func__, format);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE &&
|
||||||
|
cfg->abr_dec_cfg.is_abr_enabled) {
|
||||||
|
pr_debug("%s: Ignore AFE config for abr case\n", __func__);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
pr_debug("%s: sending AFE_DECODER_PARAM_ID_DEC_MEDIA_FMT to DSP payload\n",
|
pr_debug("%s: sending AFE_DECODER_PARAM_ID_DEC_MEDIA_FMT to DSP payload\n",
|
||||||
__func__);
|
__func__);
|
||||||
param_hdr.module_id = AFE_MODULE_ID_DECODER;
|
param_hdr.module_id = AFE_MODULE_ID_DECODER;
|
||||||
@@ -3623,9 +3667,10 @@ static int q6afe_send_dec_config(u16 port_id,
|
|||||||
|
|
||||||
switch (cfg->format) {
|
switch (cfg->format) {
|
||||||
case ASM_MEDIA_FMT_AAC_V2:
|
case ASM_MEDIA_FMT_AAC_V2:
|
||||||
|
case ASM_MEDIA_FMT_APTX_ADAPTIVE:
|
||||||
param_hdr.param_size = sizeof(struct afe_dec_media_fmt_t);
|
param_hdr.param_size = sizeof(struct afe_dec_media_fmt_t);
|
||||||
|
|
||||||
pr_debug("%s:send AFE_DECODER_PARAM_ID DEC_MEDIA_FMT to DSP payload\n",
|
pr_debug("%s:send AVS_DECODER_PARAM_ID DEC_MEDIA_FMT to DSP payload\n",
|
||||||
__func__);
|
__func__);
|
||||||
param_hdr.param_id = AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT;
|
param_hdr.param_id = AVS_DECODER_PARAM_ID_DEC_MEDIA_FMT;
|
||||||
dec_media_fmt.dec_media_config = cfg->data;
|
dec_media_fmt.dec_media_config = cfg->data;
|
||||||
@@ -3634,7 +3679,7 @@ static int q6afe_send_dec_config(u16 port_id,
|
|||||||
param_hdr,
|
param_hdr,
|
||||||
(u8 *) &dec_media_fmt);
|
(u8 *) &dec_media_fmt);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("%s: AFE_DECODER_PARAM_ID DEC_MEDIA_FMT for port 0x%x failed %d\n",
|
pr_err("%s: AVS_DECODER_PARAM_ID DEC_MEDIA_FMT for port 0x%x failed %d\n",
|
||||||
__func__, port_id, ret);
|
__func__, port_id, ret);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
@@ -2477,6 +2477,7 @@ struct afe_port_data_cmd_rt_proxy_port_read_v2 {
|
|||||||
#define AFE_MODULE_AUDIO_DEV_INTERFACE 0x0001020C
|
#define AFE_MODULE_AUDIO_DEV_INTERFACE 0x0001020C
|
||||||
#define AFE_PORT_SAMPLE_RATE_8K 8000
|
#define AFE_PORT_SAMPLE_RATE_8K 8000
|
||||||
#define AFE_PORT_SAMPLE_RATE_16K 16000
|
#define AFE_PORT_SAMPLE_RATE_16K 16000
|
||||||
|
#define AFE_PORT_SAMPLE_RATE_44_1K 44100
|
||||||
#define AFE_PORT_SAMPLE_RATE_48K 48000
|
#define AFE_PORT_SAMPLE_RATE_48K 48000
|
||||||
#define AFE_PORT_SAMPLE_RATE_96K 96000
|
#define AFE_PORT_SAMPLE_RATE_96K 96000
|
||||||
#define AFE_PORT_SAMPLE_RATE_176P4K 176400
|
#define AFE_PORT_SAMPLE_RATE_176P4K 176400
|
||||||
@@ -3795,6 +3796,7 @@ struct afe_imc_dec_enc_info {
|
|||||||
|
|
||||||
struct afe_abr_dec_cfg_t {
|
struct afe_abr_dec_cfg_t {
|
||||||
struct afe_imc_dec_enc_info imc_info;
|
struct afe_imc_dec_enc_info imc_info;
|
||||||
|
bool is_abr_enabled;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct afe_abr_enc_cfg_t {
|
struct afe_abr_enc_cfg_t {
|
||||||
@@ -4437,6 +4439,19 @@ struct asm_aac_dec_cfg_v2_t {
|
|||||||
*/
|
*/
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Payload of the APTX AD decoder configuration parameters in the
|
||||||
|
* #ASM_MEDIA_FMT_APTX_ADAPTIVE media format.
|
||||||
|
*/
|
||||||
|
struct asm_aptx_ad_dec_cfg_t {
|
||||||
|
uint32_t sample_rate;
|
||||||
|
/*
|
||||||
|
* Number of samples per second.
|
||||||
|
*
|
||||||
|
* @values 0x0(48000Hz), 0x1(44100Hz)
|
||||||
|
*/
|
||||||
|
} __packed;
|
||||||
|
|
||||||
union afe_enc_config_data {
|
union afe_enc_config_data {
|
||||||
struct asm_sbc_enc_cfg_t sbc_config;
|
struct asm_sbc_enc_cfg_t sbc_config;
|
||||||
struct asm_aac_enc_cfg_t aac_config;
|
struct asm_aac_enc_cfg_t aac_config;
|
||||||
@@ -4458,6 +4473,7 @@ union afe_dec_config_data {
|
|||||||
struct asm_sbc_dec_cfg_t sbc_config;
|
struct asm_sbc_dec_cfg_t sbc_config;
|
||||||
struct asm_aac_dec_cfg_v2_t aac_config;
|
struct asm_aac_dec_cfg_v2_t aac_config;
|
||||||
struct asm_mp3_dec_cfg_t mp3_config;
|
struct asm_mp3_dec_cfg_t mp3_config;
|
||||||
|
struct asm_aptx_ad_dec_cfg_t aptx_ad_config;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct afe_dec_config {
|
struct afe_dec_config {
|
||||||
|
新增問題並參考
封鎖使用者