Merge "ASoC: msm: move tdm grp mgt to afe for anc support"
This commit is contained in:
commit
6934044c51
3 changed files with 156 additions and 81 deletions
|
@ -208,6 +208,87 @@ enum {
|
||||||
AFE_MAX_PORTS
|
AFE_MAX_PORTS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IDX_PRIMARY_TDM_RX_0,
|
||||||
|
IDX_PRIMARY_TDM_RX_1,
|
||||||
|
IDX_PRIMARY_TDM_RX_2,
|
||||||
|
IDX_PRIMARY_TDM_RX_3,
|
||||||
|
IDX_PRIMARY_TDM_RX_4,
|
||||||
|
IDX_PRIMARY_TDM_RX_5,
|
||||||
|
IDX_PRIMARY_TDM_RX_6,
|
||||||
|
IDX_PRIMARY_TDM_RX_7,
|
||||||
|
IDX_PRIMARY_TDM_TX_0,
|
||||||
|
IDX_PRIMARY_TDM_TX_1,
|
||||||
|
IDX_PRIMARY_TDM_TX_2,
|
||||||
|
IDX_PRIMARY_TDM_TX_3,
|
||||||
|
IDX_PRIMARY_TDM_TX_4,
|
||||||
|
IDX_PRIMARY_TDM_TX_5,
|
||||||
|
IDX_PRIMARY_TDM_TX_6,
|
||||||
|
IDX_PRIMARY_TDM_TX_7,
|
||||||
|
IDX_SECONDARY_TDM_RX_0,
|
||||||
|
IDX_SECONDARY_TDM_RX_1,
|
||||||
|
IDX_SECONDARY_TDM_RX_2,
|
||||||
|
IDX_SECONDARY_TDM_RX_3,
|
||||||
|
IDX_SECONDARY_TDM_RX_4,
|
||||||
|
IDX_SECONDARY_TDM_RX_5,
|
||||||
|
IDX_SECONDARY_TDM_RX_6,
|
||||||
|
IDX_SECONDARY_TDM_RX_7,
|
||||||
|
IDX_SECONDARY_TDM_TX_0,
|
||||||
|
IDX_SECONDARY_TDM_TX_1,
|
||||||
|
IDX_SECONDARY_TDM_TX_2,
|
||||||
|
IDX_SECONDARY_TDM_TX_3,
|
||||||
|
IDX_SECONDARY_TDM_TX_4,
|
||||||
|
IDX_SECONDARY_TDM_TX_5,
|
||||||
|
IDX_SECONDARY_TDM_TX_6,
|
||||||
|
IDX_SECONDARY_TDM_TX_7,
|
||||||
|
IDX_TERTIARY_TDM_RX_0,
|
||||||
|
IDX_TERTIARY_TDM_RX_1,
|
||||||
|
IDX_TERTIARY_TDM_RX_2,
|
||||||
|
IDX_TERTIARY_TDM_RX_3,
|
||||||
|
IDX_TERTIARY_TDM_RX_4,
|
||||||
|
IDX_TERTIARY_TDM_RX_5,
|
||||||
|
IDX_TERTIARY_TDM_RX_6,
|
||||||
|
IDX_TERTIARY_TDM_RX_7,
|
||||||
|
IDX_TERTIARY_TDM_TX_0,
|
||||||
|
IDX_TERTIARY_TDM_TX_1,
|
||||||
|
IDX_TERTIARY_TDM_TX_2,
|
||||||
|
IDX_TERTIARY_TDM_TX_3,
|
||||||
|
IDX_TERTIARY_TDM_TX_4,
|
||||||
|
IDX_TERTIARY_TDM_TX_5,
|
||||||
|
IDX_TERTIARY_TDM_TX_6,
|
||||||
|
IDX_TERTIARY_TDM_TX_7,
|
||||||
|
IDX_QUATERNARY_TDM_RX_0,
|
||||||
|
IDX_QUATERNARY_TDM_RX_1,
|
||||||
|
IDX_QUATERNARY_TDM_RX_2,
|
||||||
|
IDX_QUATERNARY_TDM_RX_3,
|
||||||
|
IDX_QUATERNARY_TDM_RX_4,
|
||||||
|
IDX_QUATERNARY_TDM_RX_5,
|
||||||
|
IDX_QUATERNARY_TDM_RX_6,
|
||||||
|
IDX_QUATERNARY_TDM_RX_7,
|
||||||
|
IDX_QUATERNARY_TDM_TX_0,
|
||||||
|
IDX_QUATERNARY_TDM_TX_1,
|
||||||
|
IDX_QUATERNARY_TDM_TX_2,
|
||||||
|
IDX_QUATERNARY_TDM_TX_3,
|
||||||
|
IDX_QUATERNARY_TDM_TX_4,
|
||||||
|
IDX_QUATERNARY_TDM_TX_5,
|
||||||
|
IDX_QUATERNARY_TDM_TX_6,
|
||||||
|
IDX_QUATERNARY_TDM_TX_7,
|
||||||
|
IDX_TDM_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IDX_GROUP_PRIMARY_TDM_RX,
|
||||||
|
IDX_GROUP_PRIMARY_TDM_TX,
|
||||||
|
IDX_GROUP_SECONDARY_TDM_RX,
|
||||||
|
IDX_GROUP_SECONDARY_TDM_TX,
|
||||||
|
IDX_GROUP_TERTIARY_TDM_RX,
|
||||||
|
IDX_GROUP_TERTIARY_TDM_TX,
|
||||||
|
IDX_GROUP_QUATERNARY_TDM_RX,
|
||||||
|
IDX_GROUP_QUATERNARY_TDM_TX,
|
||||||
|
IDX_GROUP_TDM_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
enum afe_mad_type {
|
enum afe_mad_type {
|
||||||
MAD_HW_NONE = 0x00,
|
MAD_HW_NONE = 0x00,
|
||||||
MAD_HW_AUDIO = 0x01,
|
MAD_HW_AUDIO = 0x01,
|
||||||
|
|
|
@ -91,86 +91,6 @@ enum {
|
||||||
RATE_MAX_NUM_OF_AUX_PCM_RATES,
|
RATE_MAX_NUM_OF_AUX_PCM_RATES,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
|
||||||
IDX_PRIMARY_TDM_RX_0,
|
|
||||||
IDX_PRIMARY_TDM_RX_1,
|
|
||||||
IDX_PRIMARY_TDM_RX_2,
|
|
||||||
IDX_PRIMARY_TDM_RX_3,
|
|
||||||
IDX_PRIMARY_TDM_RX_4,
|
|
||||||
IDX_PRIMARY_TDM_RX_5,
|
|
||||||
IDX_PRIMARY_TDM_RX_6,
|
|
||||||
IDX_PRIMARY_TDM_RX_7,
|
|
||||||
IDX_PRIMARY_TDM_TX_0,
|
|
||||||
IDX_PRIMARY_TDM_TX_1,
|
|
||||||
IDX_PRIMARY_TDM_TX_2,
|
|
||||||
IDX_PRIMARY_TDM_TX_3,
|
|
||||||
IDX_PRIMARY_TDM_TX_4,
|
|
||||||
IDX_PRIMARY_TDM_TX_5,
|
|
||||||
IDX_PRIMARY_TDM_TX_6,
|
|
||||||
IDX_PRIMARY_TDM_TX_7,
|
|
||||||
IDX_SECONDARY_TDM_RX_0,
|
|
||||||
IDX_SECONDARY_TDM_RX_1,
|
|
||||||
IDX_SECONDARY_TDM_RX_2,
|
|
||||||
IDX_SECONDARY_TDM_RX_3,
|
|
||||||
IDX_SECONDARY_TDM_RX_4,
|
|
||||||
IDX_SECONDARY_TDM_RX_5,
|
|
||||||
IDX_SECONDARY_TDM_RX_6,
|
|
||||||
IDX_SECONDARY_TDM_RX_7,
|
|
||||||
IDX_SECONDARY_TDM_TX_0,
|
|
||||||
IDX_SECONDARY_TDM_TX_1,
|
|
||||||
IDX_SECONDARY_TDM_TX_2,
|
|
||||||
IDX_SECONDARY_TDM_TX_3,
|
|
||||||
IDX_SECONDARY_TDM_TX_4,
|
|
||||||
IDX_SECONDARY_TDM_TX_5,
|
|
||||||
IDX_SECONDARY_TDM_TX_6,
|
|
||||||
IDX_SECONDARY_TDM_TX_7,
|
|
||||||
IDX_TERTIARY_TDM_RX_0,
|
|
||||||
IDX_TERTIARY_TDM_RX_1,
|
|
||||||
IDX_TERTIARY_TDM_RX_2,
|
|
||||||
IDX_TERTIARY_TDM_RX_3,
|
|
||||||
IDX_TERTIARY_TDM_RX_4,
|
|
||||||
IDX_TERTIARY_TDM_RX_5,
|
|
||||||
IDX_TERTIARY_TDM_RX_6,
|
|
||||||
IDX_TERTIARY_TDM_RX_7,
|
|
||||||
IDX_TERTIARY_TDM_TX_0,
|
|
||||||
IDX_TERTIARY_TDM_TX_1,
|
|
||||||
IDX_TERTIARY_TDM_TX_2,
|
|
||||||
IDX_TERTIARY_TDM_TX_3,
|
|
||||||
IDX_TERTIARY_TDM_TX_4,
|
|
||||||
IDX_TERTIARY_TDM_TX_5,
|
|
||||||
IDX_TERTIARY_TDM_TX_6,
|
|
||||||
IDX_TERTIARY_TDM_TX_7,
|
|
||||||
IDX_QUATERNARY_TDM_RX_0,
|
|
||||||
IDX_QUATERNARY_TDM_RX_1,
|
|
||||||
IDX_QUATERNARY_TDM_RX_2,
|
|
||||||
IDX_QUATERNARY_TDM_RX_3,
|
|
||||||
IDX_QUATERNARY_TDM_RX_4,
|
|
||||||
IDX_QUATERNARY_TDM_RX_5,
|
|
||||||
IDX_QUATERNARY_TDM_RX_6,
|
|
||||||
IDX_QUATERNARY_TDM_RX_7,
|
|
||||||
IDX_QUATERNARY_TDM_TX_0,
|
|
||||||
IDX_QUATERNARY_TDM_TX_1,
|
|
||||||
IDX_QUATERNARY_TDM_TX_2,
|
|
||||||
IDX_QUATERNARY_TDM_TX_3,
|
|
||||||
IDX_QUATERNARY_TDM_TX_4,
|
|
||||||
IDX_QUATERNARY_TDM_TX_5,
|
|
||||||
IDX_QUATERNARY_TDM_TX_6,
|
|
||||||
IDX_QUATERNARY_TDM_TX_7,
|
|
||||||
IDX_TDM_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
IDX_GROUP_PRIMARY_TDM_RX,
|
|
||||||
IDX_GROUP_PRIMARY_TDM_TX,
|
|
||||||
IDX_GROUP_SECONDARY_TDM_RX,
|
|
||||||
IDX_GROUP_SECONDARY_TDM_TX,
|
|
||||||
IDX_GROUP_TERTIARY_TDM_RX,
|
|
||||||
IDX_GROUP_TERTIARY_TDM_TX,
|
|
||||||
IDX_GROUP_QUATERNARY_TDM_RX,
|
|
||||||
IDX_GROUP_QUATERNARY_TDM_TX,
|
|
||||||
IDX_GROUP_TDM_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct msm_dai_q6_dai_data {
|
struct msm_dai_q6_dai_data {
|
||||||
DECLARE_BITMAP(status_mask, STATUS_MAX);
|
DECLARE_BITMAP(status_mask, STATUS_MAX);
|
||||||
DECLARE_BITMAP(hwfree_status, STATUS_MAX);
|
DECLARE_BITMAP(hwfree_status, STATUS_MAX);
|
||||||
|
|
|
@ -178,6 +178,42 @@ done:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static atomic_t tdm_gp_en_ref[IDX_GROUP_TDM_MAX];
|
||||||
|
|
||||||
|
static int afe_get_tdm_group_idx(u16 group_id)
|
||||||
|
{
|
||||||
|
int gp_idx = -1;
|
||||||
|
|
||||||
|
switch (group_id) {
|
||||||
|
case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_RX:
|
||||||
|
gp_idx = IDX_GROUP_PRIMARY_TDM_RX;
|
||||||
|
break;
|
||||||
|
case AFE_GROUP_DEVICE_ID_PRIMARY_TDM_TX:
|
||||||
|
gp_idx = IDX_GROUP_PRIMARY_TDM_TX;
|
||||||
|
break;
|
||||||
|
case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_RX:
|
||||||
|
gp_idx = IDX_GROUP_SECONDARY_TDM_RX;
|
||||||
|
break;
|
||||||
|
case AFE_GROUP_DEVICE_ID_SECONDARY_TDM_TX:
|
||||||
|
gp_idx = IDX_GROUP_SECONDARY_TDM_TX;
|
||||||
|
break;
|
||||||
|
case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_RX:
|
||||||
|
gp_idx = IDX_GROUP_TERTIARY_TDM_RX;
|
||||||
|
break;
|
||||||
|
case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX:
|
||||||
|
gp_idx = IDX_GROUP_TERTIARY_TDM_TX;
|
||||||
|
break;
|
||||||
|
case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX:
|
||||||
|
gp_idx = IDX_GROUP_QUATERNARY_TDM_RX;
|
||||||
|
break;
|
||||||
|
case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX:
|
||||||
|
gp_idx = IDX_GROUP_QUATERNARY_TDM_TX;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return gp_idx;
|
||||||
|
}
|
||||||
|
|
||||||
int afe_get_topology(int port_id)
|
int afe_get_topology(int port_id)
|
||||||
{
|
{
|
||||||
int topology;
|
int topology;
|
||||||
|
@ -356,6 +392,7 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (data->opcode == RESET_EVENTS) {
|
if (data->opcode == RESET_EVENTS) {
|
||||||
|
int i = 0;
|
||||||
pr_debug("%s: reset event = %d %d apr[%pK]\n",
|
pr_debug("%s: reset event = %d %d apr[%pK]\n",
|
||||||
__func__,
|
__func__,
|
||||||
data->reset_event, data->reset_proc, this_afe.apr);
|
data->reset_event, data->reset_proc, this_afe.apr);
|
||||||
|
@ -398,6 +435,12 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv)
|
||||||
this_afe.rx_cb = NULL;
|
this_afe.rx_cb = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* reset TDM group enable ref cnt
|
||||||
|
*/
|
||||||
|
for (i = 0; i < IDX_GROUP_TDM_MAX; i++)
|
||||||
|
atomic_set(&tdm_gp_en_ref[i], 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
afe_callback_debug_print(data);
|
afe_callback_debug_print(data);
|
||||||
|
@ -3864,11 +3907,36 @@ int afe_port_group_enable(u16 group_id,
|
||||||
{
|
{
|
||||||
struct afe_group_device_enable group_enable = {0};
|
struct afe_group_device_enable group_enable = {0};
|
||||||
struct param_hdr_v3 param_hdr = {0};
|
struct param_hdr_v3 param_hdr = {0};
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
int gp_idx;
|
||||||
|
|
||||||
pr_debug("%s: group id: 0x%x enable: %d\n", __func__,
|
pr_debug("%s: group id: 0x%x enable: %d\n", __func__,
|
||||||
group_id, enable);
|
group_id, enable);
|
||||||
|
|
||||||
|
gp_idx = afe_get_tdm_group_idx(group_id);
|
||||||
|
|
||||||
|
if ((gp_idx >= 0) && (gp_idx < IDX_GROUP_TDM_MAX)) {
|
||||||
|
|
||||||
|
atomic_t *gp_ref = &tdm_gp_en_ref[gp_idx];
|
||||||
|
|
||||||
|
if (enable)
|
||||||
|
atomic_inc(gp_ref);
|
||||||
|
else
|
||||||
|
atomic_dec(gp_ref);
|
||||||
|
|
||||||
|
if ((enable) && (atomic_read(gp_ref) > 1)) {
|
||||||
|
pr_err("%s: this TDM group is enabled already %d refs_cnt %d\n",
|
||||||
|
__func__, group_id, atomic_read(gp_ref));
|
||||||
|
goto rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!enable) && (atomic_read(gp_ref) > 0)) {
|
||||||
|
pr_err("%s: this TDM group will be disabled in last call %d refs_cnt %d\n",
|
||||||
|
__func__, group_id, atomic_read(gp_ref));
|
||||||
|
goto rtn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = afe_q6_interface_prepare();
|
ret = afe_q6_interface_prepare();
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
|
pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
|
||||||
|
@ -3896,6 +3964,8 @@ int afe_port_group_enable(u16 group_id,
|
||||||
pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_ENABLE failed %d\n",
|
pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_ENABLE failed %d\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
|
|
||||||
|
rtn:
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6556,6 +6626,10 @@ static int __init afe_init(void)
|
||||||
pr_err("%s: could not init cal data! %d\n", __func__, ret);
|
pr_err("%s: could not init cal data! %d\n", __func__, ret);
|
||||||
|
|
||||||
config_debug_fs_init();
|
config_debug_fs_init();
|
||||||
|
|
||||||
|
for (i = 0; i < IDX_GROUP_TDM_MAX; i++)
|
||||||
|
atomic_set(&tdm_gp_en_ref[i], 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue