dsp: add LDAC encoder support

Add support for LDAC encoding in dsp to
enable LDAC encoder over split a2dp path.

CRs-Fixed: 2143086
Change-Id: Ia5ed981f5cd9cc61621d667362585ec7a7e64fa1
Signed-off-by: Preetam Singh Ranawat <apranawat@codeaurora.org>
This commit is contained in:
Preetam Singh Ranawat 2017-10-25 15:02:28 +05:30 committed by Gerrit - the friendly Code Review server
parent 9326b2df53
commit 0a087aff7b
3 changed files with 66 additions and 2 deletions

View file

@ -51,6 +51,7 @@ enum {
ENC_FMT_APTX = ASM_MEDIA_FMT_APTX,
ENC_FMT_APTX_HD = ASM_MEDIA_FMT_APTX_HD,
ENC_FMT_CELT = ASM_MEDIA_FMT_CELT,
ENC_FMT_LDAC = ASM_MEDIA_FMT_LDAC,
};
enum {
@ -2263,6 +2264,11 @@ static int msm_dai_q6_afe_enc_cfg_get(struct snd_kcontrol *kcontrol,
&dai_data->enc_config.data,
sizeof(struct asm_celt_enc_cfg_t));
break;
case ENC_FMT_LDAC:
memcpy(ucontrol->value.bytes.data + format_size,
&dai_data->enc_config.data,
sizeof(struct asm_ldac_enc_cfg_t));
break;
default:
pr_debug("%s: unknown format = %d\n",
__func__, dai_data->enc_config.format);
@ -2316,6 +2322,11 @@ static int msm_dai_q6_afe_enc_cfg_put(struct snd_kcontrol *kcontrol,
ucontrol->value.bytes.data + format_size,
sizeof(struct asm_celt_enc_cfg_t));
break;
case ENC_FMT_LDAC:
memcpy(&dai_data->enc_config.data,
ucontrol->value.bytes.data + format_size,
sizeof(struct asm_ldac_enc_cfg_t));
break;
default:
pr_debug("%s: Ignore enc config for unknown format = %d\n",
__func__, dai_data->enc_config.format);

View file

@ -2972,7 +2972,7 @@ static int q6afe_send_enc_config(u16 port_id,
pr_debug("%s:update DSP for enc format = %d\n", __func__, format);
if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2 &&
format != ASM_MEDIA_FMT_APTX && format != ASM_MEDIA_FMT_APTX_HD &&
format != ASM_MEDIA_FMT_CELT) {
format != ASM_MEDIA_FMT_CELT && format != ASM_MEDIA_FMT_LDAC) {
pr_err("%s:Unsuppported format Ignore AFE config\n", __func__);
return 0;
}
@ -3066,7 +3066,15 @@ static int q6afe_send_enc_config(u16 port_id,
config.pdata.module_id = AFE_MODULE_PORT;
config.pdata.param_id = AFE_PARAM_ID_PORT_MEDIA_TYPE;
config.port.media_type.minor_version = AFE_API_VERSION_PORT_MEDIA_TYPE;
config.port.media_type.sample_rate = afe_config.slim_sch.sample_rate;
if (format == ASM_MEDIA_FMT_LDAC) {
config.port.media_type.sample_rate =
config.port.enc_blk_param.enc_blk_config.ldac_config.
custom_config.sample_rate;
} else {
config.port.media_type.sample_rate =
afe_config.slim_sch.sample_rate;
}
if (afe_in_bit_width)
config.port.media_type.bit_width = afe_in_bit_width;
else

View file

@ -3377,6 +3377,50 @@ struct asm_celt_enc_cfg_t {
struct asm_celt_specific_enc_cfg_t celt_specific_config;
} __packed;
#define ASM_MEDIA_FMT_LDAC 0x00013224
struct asm_ldac_specific_enc_cfg_t {
/*
* This is used to calculate the encoder output
* bytes per frame (i.e. bytes per packet).
* Bit rate also configures the EQMID.
* The min bit rate 303000 bps is calculated for
* 44.1 kHz and 88.2 KHz sampling frequencies with
* Mobile use Quality.
* The max bit rate of 990000 bps is calculated for
* 96kHz and 48 KHz with High Quality
* @Range(in bits per second)
* 303000 for Mobile use Quality
* 606000 for standard Quality
* 909000 for High Quality
*/
uint32_t bit_rate;
/*
* The channel setting information for LDAC specification
* of Bluetooth A2DP which is determined by SRC and SNK
* devices in Bluetooth transmission.
* @Range:
* 0 for native mode
* 4 for mono
* 2 for dual channel
* 1 for stereo
*/
uint16_t channel_mode;
/*
* Maximum Transmission Unit (MTU).
* The minimum MTU that a L2CAP implementation for LDAC shall
* support is 679 bytes, because LDAC is optimized with 2-DH5
* packet as its target.
* @Range : 679
* @Default: 679 for LDACBT_MTU_2DH5
*/
uint16_t mtu;
} __packed;
struct asm_ldac_enc_cfg_t {
struct asm_custom_enc_cfg_t custom_config;
struct asm_ldac_specific_enc_cfg_t ldac_specific_config;
} __packed;
struct afe_enc_fmt_id_param_t {
/*
* Supported values:
@ -3447,6 +3491,7 @@ union afe_enc_config_data {
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 asm_ldac_enc_cfg_t ldac_config;
};
struct afe_enc_config {