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,
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);
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;
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);
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);
{
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);
pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_ENABLE failed %d\n",
__func__, ret);
+rtn:
+
return ret;
}
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;
}