Merge "ASoC: msm: add support for multi-copps for multiple BEs"
This commit is contained in:
commit
38b12d2ace
10 changed files with 531 additions and 279 deletions
|
@ -58,9 +58,9 @@ enum {
|
|||
struct route_payload {
|
||||
unsigned int copp_idx[MAX_COPPS_PER_PORT];
|
||||
unsigned int port_id[MAX_COPPS_PER_PORT];
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
int app_type[MAX_COPPS_PER_PORT];
|
||||
int acdb_dev_id[MAX_COPPS_PER_PORT];
|
||||
int sample_rate[MAX_COPPS_PER_PORT];
|
||||
unsigned short num_copps;
|
||||
unsigned int session_id;
|
||||
};
|
||||
|
|
|
@ -42,6 +42,8 @@
|
|||
#define AFE_CLK_VERSION_V1 1
|
||||
#define AFE_CLK_VERSION_V2 2
|
||||
|
||||
typedef int (*routing_cb)(int port);
|
||||
|
||||
enum {
|
||||
/* IDX 0->4 */
|
||||
IDX_PRIMARY_I2S_RX,
|
||||
|
@ -363,4 +365,5 @@ int afe_send_custom_tdm_header_cfg(
|
|||
u16 port_id);
|
||||
int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
|
||||
u32 rate);
|
||||
void afe_set_routing_callback(routing_cb);
|
||||
#endif /* __Q6AFE_V2_H__ */
|
||||
|
|
|
@ -3220,48 +3220,45 @@ static int msm_compr_playback_app_type_cfg_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (0 != ucontrol->value.integer.value[2])
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
pr_debug("%s: app_type- %d acdb_dev_id- %d sample_rate- %d session_type- %d\n",
|
||||
__func__, app_type, acdb_dev_id, sample_rate, SESSION_TYPE_RX);
|
||||
msm_pcm_routing_reg_stream_app_type_cfg(fe_id, app_type,
|
||||
acdb_dev_id, sample_rate, SESSION_TYPE_RX);
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_compr_playback_app_type_cfg_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_RX,
|
||||
&app_type, &acdb_dev_id, &sample_rate);
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
@ -3271,8 +3268,8 @@ static int msm_compr_playback_app_type_cfg_get(struct snd_kcontrol *kcontrol,
|
|||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, SESSION_TYPE_RX,
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
@ -3282,48 +3279,45 @@ static int msm_compr_capture_app_type_cfg_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
pr_debug("%s: app_type- %d acdb_dev_id- %d sample_rate- %d session_type- %d\n",
|
||||
__func__, app_type, acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
msm_pcm_routing_reg_stream_app_type_cfg(fe_id, app_type,
|
||||
acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_compr_capture_app_type_cfg_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_TX,
|
||||
&app_type, &acdb_dev_id, &sample_rate);
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
@ -3333,8 +3327,8 @@ static int msm_compr_capture_app_type_cfg_get(struct snd_kcontrol *kcontrol,
|
|||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, SESSION_TYPE_TX,
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
|
|
@ -2204,26 +2204,26 @@ static int msm_lsm_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if ((fe_id < MSM_FRONTEND_DAI_LSM1) ||
|
||||
(fe_id > MSM_FRONTEND_DAI_LSM8)) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
|
||||
pr_debug("%s: app_type- %d acdb_dev_id- %d sample_rate- %d session_type- %d\n",
|
||||
__func__, app_type, acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
msm_pcm_routing_reg_stream_app_type_cfg(fe_id, app_type,
|
||||
acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2232,21 +2232,17 @@ static int msm_lsm_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if ((fe_id < MSM_FRONTEND_DAI_LSM1) ||
|
||||
(fe_id > MSM_FRONTEND_DAI_LSM8)) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_TX,
|
||||
&app_type, &acdb_dev_id, &sample_rate);
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
@ -2256,8 +2252,8 @@ static int msm_lsm_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
|||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, SESSION_TYPE_TX,
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
|
||||
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -556,48 +556,45 @@ static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
pr_debug("%s: app_type- %d acdb_dev_id- %d sample_rate- %d session_type- %d\n",
|
||||
__func__, app_type, acdb_dev_id, sample_rate, SESSION_TYPE_RX);
|
||||
msm_pcm_routing_reg_stream_app_type_cfg(fe_id, app_type,
|
||||
acdb_dev_id, sample_rate, SESSION_TYPE_RX);
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_RX,
|
||||
&app_type, &acdb_dev_id, &sample_rate);
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
@ -607,8 +604,8 @@ static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
|||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, SESSION_TYPE_RX,
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
@ -618,48 +615,45 @@ static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
pr_debug("%s: app_type- %d acdb_dev_id- %d sample_rate- %d session_type- %d\n",
|
||||
__func__, app_type, acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
msm_pcm_routing_reg_stream_app_type_cfg(fe_id, app_type,
|
||||
acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_TX,
|
||||
&app_type, &acdb_dev_id, &sample_rate);
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
@ -669,8 +663,8 @@ static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
|||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, SESSION_TYPE_TX,
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
|
|
@ -1182,48 +1182,45 @@ static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (0 != ucontrol->value.integer.value[2])
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
pr_debug("%s: app_type- %d acdb_dev_id- %d sample_rate- %d session_type- %d\n",
|
||||
__func__, app_type, acdb_dev_id, sample_rate, SESSION_TYPE_RX);
|
||||
msm_pcm_routing_reg_stream_app_type_cfg(fe_id, app_type,
|
||||
acdb_dev_id, sample_rate, SESSION_TYPE_RX);
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_RX,
|
||||
&app_type, &acdb_dev_id, &sample_rate);
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
@ -1233,8 +1230,8 @@ static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
|||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, SESSION_TYPE_RX,
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
@ -1244,48 +1241,45 @@ static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
pr_debug("%s: app_type- %d acdb_dev_id- %d sample_rate- %d session_type- %d\n",
|
||||
__func__, app_type, acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
msm_pcm_routing_reg_stream_app_type_cfg(fe_id, app_type,
|
||||
acdb_dev_id, sample_rate, SESSION_TYPE_TX);
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_routing_reg_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
pr_debug("%s: fe_id- %llu\n", __func__, fe_id);
|
||||
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds fe_id %llu\n",
|
||||
__func__, fe_id);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, SESSION_TYPE_TX,
|
||||
&app_type, &acdb_dev_id, &sample_rate);
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_routing_get_stream_app_type_cfg failed returned %d\n",
|
||||
__func__, ret);
|
||||
|
@ -1295,8 +1289,8 @@ static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
|||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, SESSION_TYPE_TX,
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
|
|
@ -56,8 +56,6 @@
|
|||
#define DS2_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
static int get_cal_path(int path_type);
|
||||
|
||||
static struct mutex routing_lock;
|
||||
|
||||
static struct cal_type_data *cal_data;
|
||||
|
@ -124,6 +122,18 @@ static struct msm_pcm_route_bdai_pp_params
|
|||
{DISPLAY_PORT_RX, 0, 0, 0},
|
||||
};
|
||||
|
||||
/*
|
||||
* The be_dai_name_table is passed to HAL so that it can specify the
|
||||
* BE ID for the BE it wants to enable based on the name. Thus there
|
||||
* is a matching table and structure in HAL that need to be updated
|
||||
* if any changes to these are made.
|
||||
*/
|
||||
struct msm_pcm_route_bdai_name {
|
||||
unsigned int be_id;
|
||||
char be_name[LPASS_BE_NAME_MAX_LENGTH];
|
||||
};
|
||||
static struct msm_pcm_route_bdai_name be_dai_name_table[MSM_BACKEND_DAI_MAX];
|
||||
|
||||
static int msm_routing_send_device_pp_params(int port_id, int copp_idx);
|
||||
|
||||
static int msm_routing_get_bit_width(unsigned int format)
|
||||
|
@ -663,7 +673,7 @@ static unsigned long session_copp_map[MSM_FRONTEND_DAI_MAX][2]
|
|||
static struct msm_pcm_routing_app_type_data app_type_cfg[MAX_APP_TYPES];
|
||||
static struct msm_pcm_routing_app_type_data lsm_app_type_cfg[MAX_APP_TYPES];
|
||||
static struct msm_pcm_stream_app_type_cfg
|
||||
fe_dai_app_type_cfg[MSM_FRONTEND_DAI_MAX][2];
|
||||
fe_dai_app_type_cfg[MSM_FRONTEND_DAI_MAX][2][MSM_BACKEND_DAI_MAX];
|
||||
|
||||
/* The caller of this should aqcuire routing lock */
|
||||
void msm_pcm_routing_get_bedai_info(int be_idx,
|
||||
|
@ -731,45 +741,64 @@ static bool is_mm_lsm_fe_id(int fe_id)
|
|||
return rc;
|
||||
}
|
||||
|
||||
|
||||
void msm_pcm_routing_reg_stream_app_type_cfg(int fedai_id, int app_type,
|
||||
int acdb_dev_id, int sample_rate, int session_type)
|
||||
int msm_pcm_routing_reg_stream_app_type_cfg(int fedai_id, int session_type,
|
||||
int be_id, int app_type,
|
||||
int acdb_dev_id, int sample_rate)
|
||||
{
|
||||
pr_debug("%s: fedai_id %d, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fedai_id, session_type, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
int ret = 0;
|
||||
|
||||
pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fedai_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
|
||||
if (!is_mm_lsm_fe_id(fedai_id)) {
|
||||
pr_err("%s: Invalid machine driver ID %d\n",
|
||||
__func__, fedai_id);
|
||||
return;
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
if (session_type != SESSION_TYPE_RX &&
|
||||
session_type != SESSION_TYPE_TX) {
|
||||
pr_err("%s: Invalid session type %d\n",
|
||||
__func__, session_type);
|
||||
return;
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].app_type = app_type;
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].acdb_dev_id = acdb_dev_id;
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].sample_rate = sample_rate;
|
||||
if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds be_id %d\n",
|
||||
__func__, be_id);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][be_id].app_type = app_type;
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][be_id].acdb_dev_id =
|
||||
acdb_dev_id;
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][be_id].sample_rate =
|
||||
sample_rate;
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* msm_pcm_routing_get_stream_app_type_cfg
|
||||
*
|
||||
* Receives fedai_id, session_type and populates app_type, acdb_dev_id, &
|
||||
* sample rate. Returns 0 on success. On failure returns
|
||||
* Receives fedai_id, session_type, be_id, and populates app_type,
|
||||
* acdb_dev_id, & sample rate. Returns 0 on success. On failure returns
|
||||
* -EINVAL and does not alter passed values.
|
||||
*
|
||||
* fedai_id - Passed value, front end ID for which app type config is wanted
|
||||
* session_type - Passed value, session type for which app type config
|
||||
* is wanted
|
||||
* be_id - Passed value, back end device id for which app type config is wanted
|
||||
* app_type - Returned value, app type used by app type config
|
||||
* acdb_dev_id - Returned value, ACDB device ID used by app type config
|
||||
* sample_rate - Returned value, sample rate used by app type config
|
||||
*/
|
||||
int msm_pcm_routing_get_stream_app_type_cfg(int fedai_id, int session_type,
|
||||
int *app_type, int *acdb_dev_id, int *sample_rate)
|
||||
int be_id, int *app_type,
|
||||
int *acdb_dev_id, int *sample_rate)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
|
@ -791,18 +820,25 @@ int msm_pcm_routing_get_stream_app_type_cfg(int fedai_id, int session_type,
|
|||
ret = -EINVAL;
|
||||
goto done;
|
||||
} else if (session_type != SESSION_TYPE_RX &&
|
||||
session_type != SESSION_TYPE_TX) {
|
||||
session_type != SESSION_TYPE_TX) {
|
||||
pr_err("%s: Invalid session type %d\n",
|
||||
__func__, session_type);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
} else if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) {
|
||||
pr_err("%s: Received out of bounds be_id %d\n",
|
||||
__func__, be_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
*app_type = fe_dai_app_type_cfg[fedai_id][session_type].app_type;
|
||||
*acdb_dev_id = fe_dai_app_type_cfg[fedai_id][session_type].acdb_dev_id;
|
||||
*sample_rate = fe_dai_app_type_cfg[fedai_id][session_type].sample_rate;
|
||||
|
||||
pr_debug("%s: fedai_id %d, session_type %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fedai_id, session_type,
|
||||
*app_type = fe_dai_app_type_cfg[fedai_id][session_type][be_id].app_type;
|
||||
*acdb_dev_id =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][be_id].acdb_dev_id;
|
||||
*sample_rate =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][be_id].sample_rate;
|
||||
|
||||
pr_debug("%s: fedai_id %d, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fedai_id, session_type, be_id,
|
||||
*app_type, *acdb_dev_id, *sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
|
@ -858,24 +894,27 @@ static struct cal_block_data *msm_routing_find_topology(int path,
|
|||
return msm_routing_find_topology_by_path(path);
|
||||
}
|
||||
|
||||
static int msm_routing_get_adm_topology(int path, int fedai_id,
|
||||
int session_type)
|
||||
static int msm_routing_get_adm_topology(int fedai_id, int session_type,
|
||||
int be_id)
|
||||
{
|
||||
int topology = NULL_COPP_TOPOLOGY;
|
||||
struct cal_block_data *cal_block = NULL;
|
||||
int topology = NULL_COPP_TOPOLOGY;
|
||||
struct cal_block_data *cal_block = NULL;
|
||||
int app_type = 0, acdb_dev_id = 0;
|
||||
pr_debug("%s\n", __func__);
|
||||
|
||||
path = get_cal_path(path);
|
||||
pr_debug("%s: fedai_id %d, session_type %d, be_id %d\n",
|
||||
__func__, fedai_id, session_type, be_id);
|
||||
|
||||
if (cal_data == NULL)
|
||||
goto done;
|
||||
|
||||
mutex_lock(&cal_data->lock);
|
||||
|
||||
app_type = fe_dai_app_type_cfg[fedai_id][session_type].app_type;
|
||||
acdb_dev_id = fe_dai_app_type_cfg[fedai_id][session_type].acdb_dev_id;
|
||||
app_type = fe_dai_app_type_cfg[fedai_id][session_type][be_id].app_type;
|
||||
acdb_dev_id =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][be_id].acdb_dev_id;
|
||||
|
||||
cal_block = msm_routing_find_topology(path, app_type, acdb_dev_id);
|
||||
cal_block = msm_routing_find_topology(session_type, app_type,
|
||||
acdb_dev_id);
|
||||
if (cal_block == NULL)
|
||||
goto unlock;
|
||||
|
||||
|
@ -905,8 +944,8 @@ static void msm_pcm_routing_build_matrix(int fedai_id, int sess_type,
|
|||
int i, port_type, j, num_copps = 0;
|
||||
struct route_payload payload;
|
||||
|
||||
port_type = ((path_type == ADM_PATH_PLAYBACK ||
|
||||
path_type == ADM_PATH_COMPRESSED_RX) ?
|
||||
port_type = ((path_type == ADM_PATH_PLAYBACK ||
|
||||
path_type == ADM_PATH_COMPRESSED_RX) ?
|
||||
MSM_AFE_PORT_TYPE_RX : MSM_AFE_PORT_TYPE_TX);
|
||||
|
||||
for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
|
||||
|
@ -921,6 +960,18 @@ static void msm_pcm_routing_build_matrix(int fedai_id, int sess_type,
|
|||
payload.port_id[num_copps] =
|
||||
msm_bedais[i].port_id;
|
||||
payload.copp_idx[num_copps] = j;
|
||||
payload.app_type[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fedai_id][sess_type][i]
|
||||
.app_type;
|
||||
payload.acdb_dev_id[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fedai_id][sess_type][i]
|
||||
.acdb_dev_id;
|
||||
payload.sample_rate[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fedai_id][sess_type][i]
|
||||
.sample_rate;
|
||||
num_copps++;
|
||||
}
|
||||
}
|
||||
|
@ -930,12 +981,6 @@ static void msm_pcm_routing_build_matrix(int fedai_id, int sess_type,
|
|||
if (num_copps) {
|
||||
payload.num_copps = num_copps;
|
||||
payload.session_id = fe_dai_map[fedai_id][sess_type].strm_id;
|
||||
payload.app_type =
|
||||
fe_dai_app_type_cfg[fedai_id][sess_type].app_type;
|
||||
payload.acdb_dev_id =
|
||||
fe_dai_app_type_cfg[fedai_id][sess_type].acdb_dev_id;
|
||||
payload.sample_rate =
|
||||
fe_dai_app_type_cfg[fedai_id][sess_type].sample_rate;
|
||||
adm_matrix_map(path_type, payload, perf_mode, passthr_mode);
|
||||
msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode);
|
||||
}
|
||||
|
@ -1001,7 +1046,8 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
|
|||
int dspst_id, int stream_type,
|
||||
uint32_t passthr_mode)
|
||||
{
|
||||
int i, j, session_type, path_type, port_type, topology, num_copps = 0;
|
||||
int i, j, session_type, path_type, port_type, topology;
|
||||
int num_copps = 0;
|
||||
struct route_payload payload;
|
||||
u32 channels, sample_rate;
|
||||
u16 bit_width = 16;
|
||||
|
@ -1069,13 +1115,13 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
|
|||
bit_width = msm_routing_get_bit_width(
|
||||
msm_bedais[i].format);
|
||||
app_type =
|
||||
fe_dai_app_type_cfg[fe_id][session_type].app_type;
|
||||
fe_dai_app_type_cfg[fe_id][session_type][i].app_type;
|
||||
if (app_type && is_lsm) {
|
||||
app_type_idx =
|
||||
msm_pcm_routing_get_lsm_app_type_idx(app_type);
|
||||
sample_rate =
|
||||
fe_dai_app_type_cfg[fe_id][session_type].
|
||||
sample_rate;
|
||||
fe_dai_app_type_cfg[fe_id][session_type][i]
|
||||
.sample_rate;
|
||||
bit_width =
|
||||
lsm_app_type_cfg[app_type_idx].bit_width;
|
||||
} else if (app_type) {
|
||||
|
@ -1083,17 +1129,17 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
|
|||
msm_pcm_routing_get_app_type_idx(
|
||||
app_type);
|
||||
sample_rate =
|
||||
fe_dai_app_type_cfg[fe_id][session_type].sample_rate;
|
||||
fe_dai_app_type_cfg[fe_id][session_type][i].sample_rate;
|
||||
bit_width =
|
||||
app_type_cfg[app_type_idx].bit_width;
|
||||
} else {
|
||||
sample_rate = msm_bedais[i].sample_rate;
|
||||
}
|
||||
acdb_dev_id =
|
||||
fe_dai_app_type_cfg[fe_id][session_type].acdb_dev_id;
|
||||
topology = msm_routing_get_adm_topology(path_type,
|
||||
fe_id, session_type);
|
||||
|
||||
fe_dai_app_type_cfg[fe_id][session_type][i].acdb_dev_id;
|
||||
topology = msm_routing_get_adm_topology(fe_id,
|
||||
session_type,
|
||||
i);
|
||||
if (passthr_mode == COMPRESSED_PASSTHROUGH_DSD)
|
||||
topology = COMPRESS_PASSTHROUGH_NONE_TOPOLOGY;
|
||||
pr_debug("%s: Before adm open topology %d\n", __func__,
|
||||
|
@ -1130,6 +1176,18 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
|
|||
payload.port_id[num_copps] =
|
||||
msm_bedais[i].port_id;
|
||||
payload.copp_idx[num_copps] = j;
|
||||
payload.app_type[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fe_id][session_type][i]
|
||||
.app_type;
|
||||
payload.acdb_dev_id[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fe_id][session_type][i]
|
||||
.acdb_dev_id;
|
||||
payload.sample_rate[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fe_id][session_type][i]
|
||||
.sample_rate;
|
||||
num_copps++;
|
||||
}
|
||||
}
|
||||
|
@ -1143,12 +1201,6 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
|
|||
if (num_copps) {
|
||||
payload.num_copps = num_copps;
|
||||
payload.session_id = fe_dai_map[fe_id][session_type].strm_id;
|
||||
payload.app_type =
|
||||
fe_dai_app_type_cfg[fe_id][session_type].app_type;
|
||||
payload.acdb_dev_id =
|
||||
fe_dai_app_type_cfg[fe_id][session_type].acdb_dev_id;
|
||||
payload.sample_rate =
|
||||
fe_dai_app_type_cfg[fe_id][session_type].sample_rate;
|
||||
adm_matrix_map(path_type, payload, perf_mode, passthr_mode);
|
||||
msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode);
|
||||
}
|
||||
|
@ -1247,22 +1299,24 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode,
|
|||
msm_bedais[i].format);
|
||||
|
||||
app_type =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].app_type;
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][i].app_type;
|
||||
if (app_type) {
|
||||
app_type_idx =
|
||||
msm_pcm_routing_get_app_type_idx(app_type);
|
||||
sample_rate =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].
|
||||
sample_rate;
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][i]
|
||||
.sample_rate;
|
||||
bits_per_sample =
|
||||
app_type_cfg[app_type_idx].bit_width;
|
||||
} else
|
||||
sample_rate = msm_bedais[i].sample_rate;
|
||||
|
||||
acdb_dev_id =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].acdb_dev_id;
|
||||
topology = msm_routing_get_adm_topology(path_type,
|
||||
fedai_id, session_type);
|
||||
fe_dai_app_type_cfg[fedai_id][session_type][i]
|
||||
.acdb_dev_id;
|
||||
topology = msm_routing_get_adm_topology(fedai_id,
|
||||
session_type,
|
||||
i);
|
||||
copp_idx = adm_open(msm_bedais[i].port_id, path_type,
|
||||
sample_rate, channels, topology,
|
||||
perf_mode, bits_per_sample,
|
||||
|
@ -1293,6 +1347,18 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode,
|
|||
payload.port_id[num_copps] =
|
||||
msm_bedais[i].port_id;
|
||||
payload.copp_idx[num_copps] = j;
|
||||
payload.app_type[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fedai_id][session_type]
|
||||
[i].app_type;
|
||||
payload.acdb_dev_id[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fedai_id][session_type]
|
||||
[i].acdb_dev_id;
|
||||
payload.sample_rate[num_copps] =
|
||||
fe_dai_app_type_cfg
|
||||
[fedai_id][session_type]
|
||||
[i].sample_rate;
|
||||
num_copps++;
|
||||
}
|
||||
}
|
||||
|
@ -1307,12 +1373,6 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode,
|
|||
if (num_copps) {
|
||||
payload.num_copps = num_copps;
|
||||
payload.session_id = fe_dai_map[fedai_id][session_type].strm_id;
|
||||
payload.app_type =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].app_type;
|
||||
payload.acdb_dev_id =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].acdb_dev_id;
|
||||
payload.sample_rate =
|
||||
fe_dai_app_type_cfg[fedai_id][session_type].sample_rate;
|
||||
adm_matrix_map(path_type, payload, perf_mode, passthr_mode);
|
||||
msm_pcm_routng_cfg_matrix_map_pp(payload, path_type, perf_mode);
|
||||
}
|
||||
|
@ -1491,30 +1551,31 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
|
|||
msm_bedais[reg].format);
|
||||
|
||||
app_type =
|
||||
fe_dai_app_type_cfg[val][session_type].app_type;
|
||||
fe_dai_app_type_cfg[val][session_type][reg].app_type;
|
||||
if (app_type && is_lsm) {
|
||||
app_type_idx =
|
||||
msm_pcm_routing_get_lsm_app_type_idx(app_type);
|
||||
sample_rate =
|
||||
fe_dai_app_type_cfg[val][session_type].
|
||||
sample_rate;
|
||||
fe_dai_app_type_cfg[val][session_type][reg]
|
||||
.sample_rate;
|
||||
bits_per_sample =
|
||||
lsm_app_type_cfg[app_type_idx].bit_width;
|
||||
} else if (app_type) {
|
||||
app_type_idx =
|
||||
msm_pcm_routing_get_app_type_idx(app_type);
|
||||
sample_rate =
|
||||
fe_dai_app_type_cfg[val][session_type].
|
||||
sample_rate;
|
||||
fe_dai_app_type_cfg[val][session_type][reg]
|
||||
.sample_rate;
|
||||
bits_per_sample =
|
||||
app_type_cfg[app_type_idx].bit_width;
|
||||
} else
|
||||
sample_rate = msm_bedais[reg].sample_rate;
|
||||
|
||||
topology = msm_routing_get_adm_topology(path_type, val,
|
||||
session_type);
|
||||
topology = msm_routing_get_adm_topology(val,
|
||||
session_type,
|
||||
reg);
|
||||
acdb_dev_id =
|
||||
fe_dai_app_type_cfg[val][session_type].acdb_dev_id;
|
||||
fe_dai_app_type_cfg[val][session_type][reg].acdb_dev_id;
|
||||
copp_idx = adm_open(msm_bedais[reg].port_id, path_type,
|
||||
sample_rate, channels, topology,
|
||||
fdai->perf_mode, bits_per_sample,
|
||||
|
@ -1847,6 +1908,68 @@ static int msm_routing_put_voice_stub_mixer(struct snd_kcontrol *kcontrol,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the mapping between port ID and backend ID to enable the AFE callback
|
||||
* to determine the acdb_dev_id from the port id
|
||||
*/
|
||||
int msm_pcm_get_be_id_from_port_id(int port_id)
|
||||
{
|
||||
int i;
|
||||
int be_id = -EINVAL;
|
||||
|
||||
for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
|
||||
if (msm_bedais[i].port_id == port_id) {
|
||||
be_id = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return be_id;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the registered dev_acdb_id given a port ID to enable identifying the
|
||||
* correct AFE calibration information by comparing the header information.
|
||||
*/
|
||||
static int msm_pcm_get_dev_acdb_id_by_port_id(int port_id)
|
||||
{
|
||||
int acdb_id = -EINVAL;
|
||||
int i = 0;
|
||||
int session;
|
||||
int port_type = afe_get_port_type(port_id);
|
||||
int be_id = msm_pcm_get_be_id_from_port_id(port_id);
|
||||
|
||||
pr_debug("%s:port_id %d be_id %d, port_type 0x%x\n",
|
||||
__func__, port_id, be_id, port_type);
|
||||
|
||||
if (port_type == MSM_AFE_PORT_TYPE_TX) {
|
||||
session = SESSION_TYPE_TX;
|
||||
} else if (port_type == MSM_AFE_PORT_TYPE_RX) {
|
||||
session = SESSION_TYPE_RX;
|
||||
} else {
|
||||
pr_err("%s: Invalid port type %d\n", __func__, port_type);
|
||||
acdb_id = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (be_id < 0) {
|
||||
pr_err("%s: Error getting backend id %d\n", __func__, be_id);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
mutex_lock(&routing_lock);
|
||||
i = find_first_bit(&msm_bedais[be_id].fe_sessions[0],
|
||||
MSM_FRONTEND_DAI_MAX);
|
||||
if (i < MSM_FRONTEND_DAI_MAX)
|
||||
acdb_id = fe_dai_app_type_cfg[i][session][be_id].acdb_dev_id;
|
||||
|
||||
pr_debug("%s: FE[%d] session[%d] BE[%d] acdb_id(%d)\n",
|
||||
__func__, i, session, be_id, acdb_id);
|
||||
mutex_unlock(&routing_lock);
|
||||
exit:
|
||||
return acdb_id;
|
||||
}
|
||||
|
||||
static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
|
@ -13884,21 +14007,21 @@ static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
|
|||
bedai->format);
|
||||
|
||||
app_type =
|
||||
fe_dai_app_type_cfg[i][session_type].app_type;
|
||||
fe_dai_app_type_cfg[i][session_type][be_id].app_type;
|
||||
if (app_type && is_lsm) {
|
||||
app_type_idx =
|
||||
msm_pcm_routing_get_lsm_app_type_idx(app_type);
|
||||
sample_rate =
|
||||
fe_dai_app_type_cfg[i][session_type].
|
||||
sample_rate;
|
||||
fe_dai_app_type_cfg[i][session_type][be_id]
|
||||
.sample_rate;
|
||||
bits_per_sample =
|
||||
lsm_app_type_cfg[app_type_idx].bit_width;
|
||||
} else if (app_type) {
|
||||
app_type_idx =
|
||||
msm_pcm_routing_get_app_type_idx(app_type);
|
||||
sample_rate =
|
||||
fe_dai_app_type_cfg[i][session_type].
|
||||
sample_rate;
|
||||
fe_dai_app_type_cfg[i][session_type]
|
||||
[be_id].sample_rate;
|
||||
bits_per_sample =
|
||||
app_type_cfg[app_type_idx].bit_width;
|
||||
} else
|
||||
|
@ -13912,9 +14035,9 @@ static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
|
|||
else
|
||||
channels = bedai->adm_override_ch;
|
||||
acdb_dev_id =
|
||||
fe_dai_app_type_cfg[i][session_type].acdb_dev_id;
|
||||
topology = msm_routing_get_adm_topology(path_type, i,
|
||||
session_type);
|
||||
fe_dai_app_type_cfg[i][session_type][be_id].acdb_dev_id;
|
||||
topology = msm_routing_get_adm_topology(i, session_type,
|
||||
be_id);
|
||||
copp_idx = adm_open(bedai->port_id, path_type,
|
||||
sample_rate, channels, topology,
|
||||
fdai->perf_mode, bits_per_sample,
|
||||
|
@ -14201,6 +14324,64 @@ static const struct snd_kcontrol_new aptx_dec_license_controls[] = {
|
|||
msm_aptx_dec_license_control_put),
|
||||
};
|
||||
|
||||
static int msm_routing_be_dai_name_table_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
|
||||
uinfo->count = sizeof(be_dai_name_table);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_routing_be_dai_name_table_tlv_get(unsigned int __user *bytes,
|
||||
unsigned int size)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
if (size < sizeof(be_dai_name_table)) {
|
||||
pr_err("%s: invalid size %d requested, returning\n",
|
||||
__func__, size);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill be_dai_name_table from msm_bedais table to reduce code changes
|
||||
* needed when adding new backends
|
||||
*/
|
||||
for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
|
||||
be_dai_name_table[i].be_id = i;
|
||||
strlcpy(be_dai_name_table[i].be_name,
|
||||
msm_bedais[i].name,
|
||||
LPASS_BE_NAME_MAX_LENGTH);
|
||||
}
|
||||
|
||||
ret = copy_to_user(bytes, &be_dai_name_table,
|
||||
sizeof(be_dai_name_table));
|
||||
if (ret) {
|
||||
pr_err("%s: failed to copy be_dai_name_table\n", __func__);
|
||||
ret = -EFAULT;
|
||||
}
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct snd_kcontrol_new
|
||||
msm_routing_be_dai_name_table_mixer_controls[] = {
|
||||
{
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |
|
||||
SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,
|
||||
.info = msm_routing_be_dai_name_table_info,
|
||||
.name = "Backend DAI Name Table",
|
||||
.tlv.c = snd_soc_bytes_tlv_callback,
|
||||
.private_value = (unsigned long) &(struct soc_bytes_ext) {
|
||||
.max = sizeof(be_dai_name_table),
|
||||
.get = msm_routing_be_dai_name_table_tlv_get,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_pcm_ops msm_routing_pcm_ops = {
|
||||
.hw_params = msm_pcm_routing_hw_params,
|
||||
.close = msm_pcm_routing_close,
|
||||
|
@ -14253,6 +14434,10 @@ static int msm_routing_probe(struct snd_soc_platform *platform)
|
|||
device_pp_params_mixer_controls,
|
||||
ARRAY_SIZE(device_pp_params_mixer_controls));
|
||||
|
||||
snd_soc_add_platform_controls(platform,
|
||||
msm_routing_be_dai_name_table_mixer_controls,
|
||||
ARRAY_SIZE(msm_routing_be_dai_name_table_mixer_controls));
|
||||
|
||||
msm_dts_eagle_add_controls(platform);
|
||||
|
||||
snd_soc_add_platform_controls(platform, msm_source_tracking_controls,
|
||||
|
@ -14327,15 +14512,6 @@ int msm_routing_check_backend_enabled(int fedai_id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_cal_path(int path_type)
|
||||
{
|
||||
if (path_type == ADM_PATH_PLAYBACK ||
|
||||
path_type == ADM_PATH_COMPRESSED_RX)
|
||||
return RX_DEVICE;
|
||||
else
|
||||
return TX_DEVICE;
|
||||
}
|
||||
|
||||
static int msm_routing_set_cal(int32_t cal_type,
|
||||
size_t data_size, void *data)
|
||||
{
|
||||
|
@ -14394,6 +14570,11 @@ static int __init msm_soc_routing_platform_init(void)
|
|||
if (msm_routing_init_cal_data())
|
||||
pr_err("%s: could not init cal data!\n", __func__);
|
||||
|
||||
afe_set_routing_callback(
|
||||
(routing_cb)msm_pcm_get_dev_acdb_id_by_port_id);
|
||||
|
||||
memset(&be_dai_name_table, 0, sizeof(be_dai_name_table));
|
||||
|
||||
return platform_driver_register(&msm_routing_pcm_driver);
|
||||
}
|
||||
module_init(msm_soc_routing_platform_init);
|
||||
|
@ -14401,6 +14582,7 @@ module_init(msm_soc_routing_platform_init);
|
|||
static void __exit msm_soc_routing_platform_exit(void)
|
||||
{
|
||||
msm_routing_delete_cal_data();
|
||||
memset(&be_dai_name_table, 0, sizeof(be_dai_name_table));
|
||||
platform_driver_unregister(&msm_routing_pcm_driver);
|
||||
}
|
||||
module_exit(msm_soc_routing_platform_exit);
|
||||
|
|
|
@ -13,6 +13,12 @@
|
|||
#define _MSM_PCM_ROUTING_H
|
||||
#include <sound/apr_audio-v2.h>
|
||||
|
||||
/*
|
||||
* These names are used by HAL to specify the BE. If any changes are
|
||||
* made to the string names or the max name length corresponding
|
||||
* changes need to be made in the HAL to ensure they still match.
|
||||
*/
|
||||
#define LPASS_BE_NAME_MAX_LENGTH 24
|
||||
#define LPASS_BE_PRI_I2S_RX "PRIMARY_I2S_RX"
|
||||
#define LPASS_BE_PRI_I2S_TX "PRIMARY_I2S_TX"
|
||||
#define LPASS_BE_SLIMBUS_0_RX "SLIMBUS_0_RX"
|
||||
|
@ -470,8 +476,10 @@ void msm_pcm_routing_get_fedai_info(int fe_idx, int sess_type,
|
|||
void msm_pcm_routing_acquire_lock(void);
|
||||
void msm_pcm_routing_release_lock(void);
|
||||
|
||||
void msm_pcm_routing_reg_stream_app_type_cfg(int fedai_id, int app_type,
|
||||
int acdb_dev_id, int sample_rate, int session_type);
|
||||
int msm_pcm_routing_reg_stream_app_type_cfg(int fedai_id, int session_type,
|
||||
int be_id, int app_type,
|
||||
int acdb_dev_id, int sample_rate);
|
||||
int msm_pcm_routing_get_stream_app_type_cfg(int fedai_id, int session_type,
|
||||
int *app_type, int *acdb_dev_id, int *sample_rate);
|
||||
int be_id, int *app_type,
|
||||
int *acdb_dev_id, int *sample_rate);
|
||||
#endif /*_MSM_PCM_H*/
|
||||
|
|
|
@ -2815,8 +2815,8 @@ int adm_matrix_map(int path, struct route_payload payload_map, int perf_mode,
|
|||
[port_idx][copp_idx]),
|
||||
get_cal_path(path),
|
||||
payload_map.session_id,
|
||||
payload_map.app_type,
|
||||
payload_map.acdb_dev_id);
|
||||
payload_map.app_type[i],
|
||||
payload_map.acdb_dev_id[i]);
|
||||
|
||||
if (!test_bit(ADM_STATUS_CALIBRATION_REQUIRED,
|
||||
(void *)&this_adm.copp.adm_status[port_idx]
|
||||
|
@ -2827,9 +2827,9 @@ int adm_matrix_map(int path, struct route_payload payload_map, int perf_mode,
|
|||
}
|
||||
send_adm_cal(payload_map.port_id[i], copp_idx,
|
||||
get_cal_path(path), perf_mode,
|
||||
payload_map.app_type,
|
||||
payload_map.acdb_dev_id,
|
||||
payload_map.sample_rate);
|
||||
payload_map.app_type[i],
|
||||
payload_map.acdb_dev_id[i],
|
||||
payload_map.sample_rate[i]);
|
||||
/* ADM COPP calibration is already sent */
|
||||
clear_bit(ADM_STATUS_CALIBRATION_REQUIRED,
|
||||
(void *)&this_adm.copp.
|
||||
|
|
|
@ -119,6 +119,8 @@ struct afe_ctl {
|
|||
struct aanc_data aanc_info;
|
||||
struct mutex afe_cmd_lock;
|
||||
int set_custom_topology;
|
||||
int dev_acdb_id[AFE_MAX_PORTS];
|
||||
routing_cb rt_cb;
|
||||
};
|
||||
|
||||
static atomic_t afe_ports_mad_type[SLIMBUS_PORT_LAST - SLIMBUS_0_RX];
|
||||
|
@ -1245,6 +1247,10 @@ static struct cal_block_data *afe_find_cal_topo_id_by_port(
|
|||
struct cal_block_data *cal_block = NULL;
|
||||
int32_t path;
|
||||
struct audio_cal_info_afe_top *afe_top;
|
||||
int afe_port_index = q6audio_get_port_index(port_id);
|
||||
|
||||
if (afe_port_index < 0)
|
||||
goto err_exit;
|
||||
|
||||
list_for_each_safe(ptr, next,
|
||||
&cal_type->cal_blocks) {
|
||||
|
@ -1255,13 +1261,17 @@ static struct cal_block_data *afe_find_cal_topo_id_by_port(
|
|||
MSM_AFE_PORT_TYPE_TX)?(TX_DEVICE):(RX_DEVICE));
|
||||
afe_top =
|
||||
(struct audio_cal_info_afe_top *)cal_block->cal_info;
|
||||
if (afe_top->path == path) {
|
||||
if ((afe_top->path == path) &&
|
||||
(afe_top->acdb_id ==
|
||||
this_afe.dev_acdb_id[afe_port_index])) {
|
||||
pr_debug("%s: top_id:%x acdb_id:%d afe_port:%d\n",
|
||||
__func__, afe_top->topology, afe_top->acdb_id,
|
||||
q6audio_get_port_id(port_id));
|
||||
__func__, afe_top->topology, afe_top->acdb_id,
|
||||
q6audio_get_port_id(port_id));
|
||||
return cal_block;
|
||||
}
|
||||
}
|
||||
|
||||
err_exit:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1405,6 +1415,41 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static struct cal_block_data *afe_find_cal(int cal_index, int port_id)
|
||||
{
|
||||
struct list_head *ptr, *next;
|
||||
struct cal_block_data *cal_block = NULL;
|
||||
struct audio_cal_info_afe *afe_cal_info = NULL;
|
||||
int afe_port_index = q6audio_get_port_index(port_id);
|
||||
|
||||
pr_debug("%s: cal_index %d port_id %d port_index %d\n", __func__,
|
||||
cal_index, port_id, afe_port_index);
|
||||
if (afe_port_index < 0) {
|
||||
pr_err("%s: Error getting AFE port index %d\n",
|
||||
__func__, afe_port_index);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
list_for_each_safe(ptr, next,
|
||||
&this_afe.cal_data[cal_index]->cal_blocks) {
|
||||
cal_block = list_entry(ptr, struct cal_block_data, list);
|
||||
afe_cal_info = cal_block->cal_info;
|
||||
if ((afe_cal_info->acdb_id ==
|
||||
this_afe.dev_acdb_id[afe_port_index]) &&
|
||||
(afe_cal_info->sample_rate ==
|
||||
this_afe.afe_sample_rates[afe_port_index])) {
|
||||
pr_debug("%s: cal block is a match, size is %zd\n",
|
||||
__func__, cal_block->cal_data.size);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
pr_err("%s: no matching cal_block found\n", __func__);
|
||||
cal_block = NULL;
|
||||
|
||||
exit:
|
||||
return cal_block;
|
||||
}
|
||||
|
||||
static void send_afe_cal_type(int cal_index, int port_id)
|
||||
{
|
||||
struct cal_block_data *cal_block = NULL;
|
||||
|
@ -1418,7 +1463,14 @@ static void send_afe_cal_type(int cal_index, int port_id)
|
|||
}
|
||||
|
||||
mutex_lock(&this_afe.cal_data[cal_index]->lock);
|
||||
cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]);
|
||||
|
||||
if ((cal_index == AFE_COMMON_RX_CAL) ||
|
||||
(cal_index == AFE_COMMON_TX_CAL))
|
||||
cal_block = afe_find_cal(cal_index, port_id);
|
||||
else
|
||||
cal_block = cal_utils_get_only_cal_block(
|
||||
this_afe.cal_data[cal_index]);
|
||||
|
||||
if (cal_block == NULL) {
|
||||
pr_err("%s cal_block not found!!\n", __func__);
|
||||
goto unlock;
|
||||
|
@ -2518,6 +2570,13 @@ int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
|
|||
return ret;
|
||||
}
|
||||
|
||||
if ((index >= 0) && (index < AFE_MAX_PORTS)) {
|
||||
this_afe.afe_sample_rates[index] = rate;
|
||||
|
||||
if (this_afe.rt_cb)
|
||||
this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id);
|
||||
}
|
||||
|
||||
/* Also send the topology id here: */
|
||||
port_index = afe_get_port_index(port_id);
|
||||
if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) {
|
||||
|
@ -2612,6 +2671,11 @@ void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode)
|
|||
this_afe.afe_cal_mode[port_index] = afe_cal_mode;
|
||||
}
|
||||
|
||||
void afe_set_routing_callback(routing_cb cb)
|
||||
{
|
||||
this_afe.rt_cb = cb;
|
||||
}
|
||||
|
||||
int afe_port_send_usb_dev_param(u16 port_id, union afe_port_config *afe_config)
|
||||
{
|
||||
struct afe_usb_audio_dev_param_command config;
|
||||
|
@ -2841,6 +2905,13 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
|
|||
return ret;
|
||||
}
|
||||
|
||||
if ((index >= 0) && (index < AFE_MAX_PORTS)) {
|
||||
this_afe.afe_sample_rates[index] = rate;
|
||||
|
||||
if (this_afe.rt_cb)
|
||||
this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id);
|
||||
}
|
||||
|
||||
mutex_lock(&this_afe.afe_cmd_lock);
|
||||
/* Also send the topology id here: */
|
||||
port_index = afe_get_port_index(port_id);
|
||||
|
@ -3045,7 +3116,6 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
|
|||
|
||||
port_index = afe_get_port_index(port_id);
|
||||
if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) {
|
||||
this_afe.afe_sample_rates[port_index] = rate;
|
||||
/*
|
||||
* If afe_port_start() for tx port called before
|
||||
* rx port, then aanc rx sample rate is zero. So,
|
||||
|
@ -3408,6 +3478,14 @@ int afe_open(u16 port_id,
|
|||
pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((index >= 0) && (index < AFE_MAX_PORTS)) {
|
||||
this_afe.afe_sample_rates[index] = rate;
|
||||
|
||||
if (this_afe.rt_cb)
|
||||
this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id);
|
||||
}
|
||||
|
||||
/* Also send the topology id here: */
|
||||
afe_send_custom_topology(); /* One time call: only for first time */
|
||||
afe_send_port_topology_id(port_id);
|
||||
|
@ -5398,6 +5476,7 @@ int afe_close(int port_id)
|
|||
if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) {
|
||||
this_afe.afe_sample_rates[port_index] = 0;
|
||||
this_afe.topology[port_index] = 0;
|
||||
this_afe.dev_acdb_id[port_index] = 0;
|
||||
} else {
|
||||
pr_err("%s: port %d\n", __func__, port_index);
|
||||
ret = -EINVAL;
|
||||
|
@ -6873,6 +6952,8 @@ static int __init afe_init(void)
|
|||
mutex_init(&this_afe.afe_cmd_lock);
|
||||
for (i = 0; i < AFE_MAX_PORTS; i++) {
|
||||
this_afe.afe_cal_mode[i] = AFE_CAL_MODE_DEFAULT;
|
||||
this_afe.afe_sample_rates[i] = 0;
|
||||
this_afe.dev_acdb_id[i] = 0;
|
||||
init_waitqueue_head(&this_afe.wait[i]);
|
||||
}
|
||||
wakeup_source_init(&wl.ws, "spkr-prot");
|
||||
|
|
Loading…
Add table
Reference in a new issue