OSDN Git Service

ASoC: msm: move tdm grp mgt to afe for anc support
authorDerek Chen <chenche@codeaurora.org>
Mon, 4 Dec 2017 22:30:08 +0000 (17:30 -0500)
committerGerrit - the friendly Code Review server <code-review@localhost>
Fri, 20 Apr 2018 17:43:33 +0000 (10:43 -0700)
Move TDM group management from CPU dai to AFE
driver to support LPASS resource access from
ANC platform driver.

CRs-fixed: 2153236
Signed-off-by: Derek Chen <chenche@codeaurora.org>
Change-Id: Ib22bb95cd72426e44863200e0d4581c62b12481a

include/sound/q6afe-v2.h
sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
sound/soc/msm/qdsp6v2/q6afe.c

index 5031e62..922ebb6 100644 (file)
@@ -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,
index 26b40d2..8098db8 100644 (file)
@@ -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);
index 352ea92..84ab632 100644 (file)
@@ -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;
 }