Loading include/sound/q6afe-v2.h +81 −0 Original line number Diff line number Diff line Loading @@ -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, Loading sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c +0 −80 Original line number Diff line number Diff line Loading @@ -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); Loading sound/soc/msm/qdsp6v2/q6afe.c +75 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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; } Loading Loading
include/sound/q6afe-v2.h +81 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c +0 −80 Original line number Diff line number Diff line Loading @@ -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); Loading
sound/soc/msm/qdsp6v2/q6afe.c +75 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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; } Loading