summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-05-01 17:00:38 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2018-05-01 17:00:37 -0700
commit6934044c51d40f36c12677bcd89f95c3be8b75b7 (patch)
tree12fb6b465d64b8e1abac3ff4765f0f1c08e1afb2
parent2223ffa69b6f32b7018a7f155e4e1bc03f7da373 (diff)
parentdc4f540fd2617680a0bd791e2674166b9009d63d (diff)
Merge "ASoC: msm: move tdm grp mgt to afe for anc support"
-rw-r--r--include/sound/q6afe-v2.h81
-rw-r--r--sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c80
-rw-r--r--sound/soc/msm/qdsp6v2/q6afe.c76
3 files changed, 156 insertions, 81 deletions
diff --git a/include/sound/q6afe-v2.h b/include/sound/q6afe-v2.h
index 5031e62beb17..922ebb69205d 100644
--- a/include/sound/q6afe-v2.h
+++ b/include/sound/q6afe-v2.h
@@ -208,6 +208,87 @@ enum {
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 {
MAD_HW_NONE = 0x00,
MAD_HW_AUDIO = 0x01,
diff --git a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
index 26b40d2081f0..8098db80194d 100644
--- a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
@@ -91,86 +91,6 @@ enum {
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 {
DECLARE_BITMAP(status_mask, STATUS_MAX);
DECLARE_BITMAP(hwfree_status, STATUS_MAX);
diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c
index 352ea9257832..84ab632d9b9c 100644
--- a/sound/soc/msm/qdsp6v2/q6afe.c
+++ b/sound/soc/msm/qdsp6v2/q6afe.c
@@ -178,6 +178,42 @@ done:
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 topology;
@@ -356,6 +392,7 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv)
return -EINVAL;
}
if (data->opcode == RESET_EVENTS) {
+ int i = 0;
pr_debug("%s: reset event = %d %d apr[%pK]\n",
__func__,
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;
}
+ /*
+ * 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;
}
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 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__,
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();
if (ret != 0) {
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",
__func__, ret);
+rtn:
+
return ret;
}
@@ -6556,6 +6626,10 @@ static int __init afe_init(void)
pr_err("%s: could not init cal data! %d\n", __func__, ret);
config_debug_fs_init();
+
+ for (i = 0; i < IDX_GROUP_TDM_MAX; i++)
+ atomic_set(&tdm_gp_en_ref[i], 0);
+
return 0;
}