Loading include/sound/q6adm-v2.h +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ enum { ADM_CUSTOM_TOP_CAL = 0, ADM_AUDPROC_CAL, ADM_LSM_AUDPROC_CAL, ADM_AUDVOL_CAL, ADM_RTAC_INFO_CAL, ADM_RTAC_APR_CAL, Loading Loading @@ -196,4 +197,5 @@ int adm_programable_channel_mixer(int port_id, int copp_idx, int session_id, int session_type, struct msm_pcm_channel_mixer *ch_mixer, int channel_index); void adm_set_lsm_port_id(int port_id); #endif /* __Q6_ADM_V2_H__ */ include/uapi/linux/msm_audio_calibration.h +5 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,8 @@ enum { AFE_SIDETONE_IIR_CAL_TYPE, AFE_LSM_TOPOLOGY_CAL_TYPE, AFE_LSM_TX_CAL_TYPE, ADM_LSM_TOPOLOGY_CAL_TYPE, ADM_LSM_AUDPROC_CAL_TYPE, MAX_CAL_TYPES, }; Loading @@ -110,6 +112,9 @@ enum { #define AFE_SIDETONE_IIR_CAL_TYPE AFE_SIDETONE_IIR_CAL_TYPE #define AFE_LSM_TOPOLOGY_CAL_TYPE AFE_LSM_TOPOLOGY_CAL_TYPE #define AFE_LSM_TX_CAL_TYPE AFE_LSM_TX_CAL_TYPE #define ADM_LSM_TOPOLOGY_CAL_TYPE ADM_LSM_TOPOLOGY_CAL_TYPE #define ADM_LSM_AUDPROC_CAL_TYPE ADM_LSM_AUDPROC_CAL_TYPE #define LSM_CAL_TYPES enum { VERSION_0_0, Loading sound/soc/msm/qdsp6v2/audio_cal_utils.c +4 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ size_t get_cal_info_size(int32_t cal_type) size = sizeof(struct audio_cal_info_voc_col); break; case ADM_TOPOLOGY_CAL_TYPE: case ADM_LSM_TOPOLOGY_CAL_TYPE: size = sizeof(struct audio_cal_info_adm_top); break; case ADM_CUST_TOPOLOGY_CAL_TYPE: Loading @@ -61,6 +62,7 @@ size_t get_cal_info_size(int32_t cal_type) size = 0; break; case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: size = sizeof(struct audio_cal_info_audproc); break; case ADM_AUDVOL_CAL_TYPE: Loading Loading @@ -202,6 +204,7 @@ size_t get_user_cal_type_size(int32_t cal_type) size = sizeof(struct audio_cal_type_voc_col); break; case ADM_TOPOLOGY_CAL_TYPE: case ADM_LSM_TOPOLOGY_CAL_TYPE: size = sizeof(struct audio_cal_type_adm_top); break; case ADM_CUST_TOPOLOGY_CAL_TYPE: Loading @@ -209,6 +212,7 @@ size_t get_user_cal_type_size(int32_t cal_type) size = sizeof(struct audio_cal_type_basic); break; case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: size = sizeof(struct audio_cal_type_audproc); break; case ADM_AUDVOL_CAL_TYPE: Loading sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +69 −25 Original line number Diff line number Diff line Loading @@ -59,7 +59,7 @@ static struct mutex routing_lock; static struct cal_type_data *cal_data; static struct cal_type_data *cal_data[MAX_ROUTING_CAL_TYPES]; static int fm_switch_enable; static int hfp_switch_enable; Loading Loading @@ -876,20 +876,21 @@ done: } EXPORT_SYMBOL(msm_pcm_routing_get_stream_app_type_cfg); static struct cal_block_data *msm_routing_find_topology_by_path(int path) static struct cal_block_data *msm_routing_find_topology_by_path(int path, int cal_index) { struct list_head *ptr, *next; struct cal_block_data *cal_block = NULL; pr_debug("%s\n", __func__); list_for_each_safe(ptr, next, &cal_data->cal_blocks) { &cal_data[cal_index]->cal_blocks) { cal_block = list_entry(ptr, struct cal_block_data, list); if (((struct audio_cal_info_adm_top *)cal_block->cal_info) ->path == path) { if (((struct audio_cal_info_adm_top *)cal_block ->cal_info)->path == path) { return cal_block; } } Loading @@ -899,7 +900,8 @@ static struct cal_block_data *msm_routing_find_topology_by_path(int path) static struct cal_block_data *msm_routing_find_topology(int path, int app_type, int acdb_id) int acdb_id, int cal_index) { struct list_head *ptr, *next; struct cal_block_data *cal_block = NULL; Loading @@ -907,7 +909,7 @@ static struct cal_block_data *msm_routing_find_topology(int path, pr_debug("%s\n", __func__); list_for_each_safe(ptr, next, &cal_data->cal_blocks) { &cal_data[cal_index]->cal_blocks) { cal_block = list_entry(ptr, struct cal_block_data, list); Loading @@ -922,7 +924,7 @@ static struct cal_block_data *msm_routing_find_topology(int path, } pr_debug("%s: Can't find topology for path %d, app %d, acdb_id %d defaulting to search by path\n", __func__, path, app_type, acdb_id); return msm_routing_find_topology_by_path(path); return msm_routing_find_topology_by_path(cal_index, path); } static int msm_routing_get_adm_topology(int fedai_id, int session_type, Loading @@ -938,21 +940,31 @@ static int msm_routing_get_adm_topology(int fedai_id, int session_type, if (cal_data == NULL) goto done; mutex_lock(&cal_data->lock); app_type = fe_dai_app_type_cfg[fedai_id][session_type][be_id].app_type; acdb_dev_id = fe_dai_app_type_cfg[fedai_id][session_type][be_id].acdb_dev_id; mutex_lock(&cal_data[ADM_TOPOLOGY_CAL_TYPE_IDX]->lock); cal_block = msm_routing_find_topology(session_type, app_type, acdb_dev_id); if (cal_block == NULL) goto unlock; acdb_dev_id, ADM_TOPOLOGY_CAL_TYPE_IDX); if (cal_block != NULL) topology = ((struct audio_cal_info_adm_top *) cal_block->cal_info)->topology; mutex_unlock(&cal_data[ADM_TOPOLOGY_CAL_TYPE_IDX]->lock); if (cal_block == NULL) { pr_debug("%s: Check for LSM topology\n", __func__); mutex_lock(&cal_data[ADM_LSM_TOPOLOGY_CAL_TYPE_IDX]->lock); cal_block = msm_routing_find_topology(session_type, app_type, acdb_dev_id, ADM_LSM_TOPOLOGY_CAL_TYPE_IDX); if (cal_block != NULL) topology = ((struct audio_cal_info_adm_top *) cal_block->cal_info)->topology; unlock: mutex_unlock(&cal_data->lock); mutex_unlock(&cal_data[ADM_LSM_TOPOLOGY_CAL_TYPE_IDX]->lock); } done: pr_debug("%s: Using topology %d\n", __func__, topology); return topology; Loading Loading @@ -2553,6 +2565,7 @@ static int msm_routing_lsm_func_put(struct snd_kcontrol *kcontrol, pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, mad_type); adm_set_lsm_port_id(port_id); return afe_port_set_mad_type(port_id, mad_type); } Loading Loading @@ -16405,13 +16418,39 @@ int msm_routing_check_backend_enabled(int fedai_id) return 0; } static int get_cal_type_index(int32_t cal_type) { int ret = -EINVAL; switch (cal_type) { case ADM_TOPOLOGY_CAL_TYPE: ret = ADM_TOPOLOGY_CAL_TYPE_IDX; break; case ADM_LSM_TOPOLOGY_CAL_TYPE: ret = ADM_LSM_TOPOLOGY_CAL_TYPE_IDX; break; default: pr_err("%s: Invalid cal type %d\n", __func__, cal_type); } return ret; } static int msm_routing_set_cal(int32_t cal_type, size_t data_size, void *data) { int ret = 0; int cal_index; pr_debug("%s\n", __func__); ret = cal_utils_set_cal(data_size, data, cal_data, 0, NULL); cal_index = get_cal_type_index(cal_type); if (cal_index < 0) { pr_err("%s: Could not get cal index %d\n", __func__, cal_index); ret = -EINVAL; goto done; } ret = cal_utils_set_cal(data_size, data, cal_data[cal_index], 0, NULL); if (ret < 0) { pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", __func__, ret, cal_type); Loading @@ -16426,7 +16465,7 @@ static void msm_routing_delete_cal_data(void) { pr_debug("%s\n", __func__); cal_utils_destroy_cal_types(1, &cal_data); cal_utils_destroy_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0]); return; } Loading @@ -16434,16 +16473,21 @@ static void msm_routing_delete_cal_data(void) static int msm_routing_init_cal_data(void) { int ret = 0; struct cal_type_info cal_type_info = { {ADM_TOPOLOGY_CAL_TYPE, struct cal_type_info cal_type_info[] = { {{ADM_TOPOLOGY_CAL_TYPE, {NULL, NULL, NULL, msm_routing_set_cal, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} }, {{ADM_LSM_TOPOLOGY_CAL_TYPE, {NULL, NULL, NULL, msm_routing_set_cal, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} {NULL, NULL, cal_utils_match_buf_num} }, }; pr_debug("%s\n", __func__); ret = cal_utils_create_cal_types(1, &cal_data, &cal_type_info); ret = cal_utils_create_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0], &cal_type_info[0]); if (ret < 0) { pr_err("%s: could not create cal type!\n", __func__); sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h +6 −0 Original line number Diff line number Diff line Loading @@ -416,6 +416,12 @@ enum { #define BE_DAI_PORT_SESSIONS_IDX_MAX 4 #define BE_DAI_FE_SESSIONS_IDX_MAX 2 enum { ADM_TOPOLOGY_CAL_TYPE_IDX = 0, ADM_LSM_TOPOLOGY_CAL_TYPE_IDX, MAX_ROUTING_CAL_TYPES }; struct msm_pcm_routing_evt { void (*event_func)(enum msm_pcm_routing_event, void *); void *priv_data; Loading Loading
include/sound/q6adm-v2.h +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ enum { ADM_CUSTOM_TOP_CAL = 0, ADM_AUDPROC_CAL, ADM_LSM_AUDPROC_CAL, ADM_AUDVOL_CAL, ADM_RTAC_INFO_CAL, ADM_RTAC_APR_CAL, Loading Loading @@ -196,4 +197,5 @@ int adm_programable_channel_mixer(int port_id, int copp_idx, int session_id, int session_type, struct msm_pcm_channel_mixer *ch_mixer, int channel_index); void adm_set_lsm_port_id(int port_id); #endif /* __Q6_ADM_V2_H__ */
include/uapi/linux/msm_audio_calibration.h +5 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,8 @@ enum { AFE_SIDETONE_IIR_CAL_TYPE, AFE_LSM_TOPOLOGY_CAL_TYPE, AFE_LSM_TX_CAL_TYPE, ADM_LSM_TOPOLOGY_CAL_TYPE, ADM_LSM_AUDPROC_CAL_TYPE, MAX_CAL_TYPES, }; Loading @@ -110,6 +112,9 @@ enum { #define AFE_SIDETONE_IIR_CAL_TYPE AFE_SIDETONE_IIR_CAL_TYPE #define AFE_LSM_TOPOLOGY_CAL_TYPE AFE_LSM_TOPOLOGY_CAL_TYPE #define AFE_LSM_TX_CAL_TYPE AFE_LSM_TX_CAL_TYPE #define ADM_LSM_TOPOLOGY_CAL_TYPE ADM_LSM_TOPOLOGY_CAL_TYPE #define ADM_LSM_AUDPROC_CAL_TYPE ADM_LSM_AUDPROC_CAL_TYPE #define LSM_CAL_TYPES enum { VERSION_0_0, Loading
sound/soc/msm/qdsp6v2/audio_cal_utils.c +4 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ size_t get_cal_info_size(int32_t cal_type) size = sizeof(struct audio_cal_info_voc_col); break; case ADM_TOPOLOGY_CAL_TYPE: case ADM_LSM_TOPOLOGY_CAL_TYPE: size = sizeof(struct audio_cal_info_adm_top); break; case ADM_CUST_TOPOLOGY_CAL_TYPE: Loading @@ -61,6 +62,7 @@ size_t get_cal_info_size(int32_t cal_type) size = 0; break; case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: size = sizeof(struct audio_cal_info_audproc); break; case ADM_AUDVOL_CAL_TYPE: Loading Loading @@ -202,6 +204,7 @@ size_t get_user_cal_type_size(int32_t cal_type) size = sizeof(struct audio_cal_type_voc_col); break; case ADM_TOPOLOGY_CAL_TYPE: case ADM_LSM_TOPOLOGY_CAL_TYPE: size = sizeof(struct audio_cal_type_adm_top); break; case ADM_CUST_TOPOLOGY_CAL_TYPE: Loading @@ -209,6 +212,7 @@ size_t get_user_cal_type_size(int32_t cal_type) size = sizeof(struct audio_cal_type_basic); break; case ADM_AUDPROC_CAL_TYPE: case ADM_LSM_AUDPROC_CAL_TYPE: size = sizeof(struct audio_cal_type_audproc); break; case ADM_AUDVOL_CAL_TYPE: Loading
sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +69 −25 Original line number Diff line number Diff line Loading @@ -59,7 +59,7 @@ static struct mutex routing_lock; static struct cal_type_data *cal_data; static struct cal_type_data *cal_data[MAX_ROUTING_CAL_TYPES]; static int fm_switch_enable; static int hfp_switch_enable; Loading Loading @@ -876,20 +876,21 @@ done: } EXPORT_SYMBOL(msm_pcm_routing_get_stream_app_type_cfg); static struct cal_block_data *msm_routing_find_topology_by_path(int path) static struct cal_block_data *msm_routing_find_topology_by_path(int path, int cal_index) { struct list_head *ptr, *next; struct cal_block_data *cal_block = NULL; pr_debug("%s\n", __func__); list_for_each_safe(ptr, next, &cal_data->cal_blocks) { &cal_data[cal_index]->cal_blocks) { cal_block = list_entry(ptr, struct cal_block_data, list); if (((struct audio_cal_info_adm_top *)cal_block->cal_info) ->path == path) { if (((struct audio_cal_info_adm_top *)cal_block ->cal_info)->path == path) { return cal_block; } } Loading @@ -899,7 +900,8 @@ static struct cal_block_data *msm_routing_find_topology_by_path(int path) static struct cal_block_data *msm_routing_find_topology(int path, int app_type, int acdb_id) int acdb_id, int cal_index) { struct list_head *ptr, *next; struct cal_block_data *cal_block = NULL; Loading @@ -907,7 +909,7 @@ static struct cal_block_data *msm_routing_find_topology(int path, pr_debug("%s\n", __func__); list_for_each_safe(ptr, next, &cal_data->cal_blocks) { &cal_data[cal_index]->cal_blocks) { cal_block = list_entry(ptr, struct cal_block_data, list); Loading @@ -922,7 +924,7 @@ static struct cal_block_data *msm_routing_find_topology(int path, } pr_debug("%s: Can't find topology for path %d, app %d, acdb_id %d defaulting to search by path\n", __func__, path, app_type, acdb_id); return msm_routing_find_topology_by_path(path); return msm_routing_find_topology_by_path(cal_index, path); } static int msm_routing_get_adm_topology(int fedai_id, int session_type, Loading @@ -938,21 +940,31 @@ static int msm_routing_get_adm_topology(int fedai_id, int session_type, if (cal_data == NULL) goto done; mutex_lock(&cal_data->lock); app_type = fe_dai_app_type_cfg[fedai_id][session_type][be_id].app_type; acdb_dev_id = fe_dai_app_type_cfg[fedai_id][session_type][be_id].acdb_dev_id; mutex_lock(&cal_data[ADM_TOPOLOGY_CAL_TYPE_IDX]->lock); cal_block = msm_routing_find_topology(session_type, app_type, acdb_dev_id); if (cal_block == NULL) goto unlock; acdb_dev_id, ADM_TOPOLOGY_CAL_TYPE_IDX); if (cal_block != NULL) topology = ((struct audio_cal_info_adm_top *) cal_block->cal_info)->topology; mutex_unlock(&cal_data[ADM_TOPOLOGY_CAL_TYPE_IDX]->lock); if (cal_block == NULL) { pr_debug("%s: Check for LSM topology\n", __func__); mutex_lock(&cal_data[ADM_LSM_TOPOLOGY_CAL_TYPE_IDX]->lock); cal_block = msm_routing_find_topology(session_type, app_type, acdb_dev_id, ADM_LSM_TOPOLOGY_CAL_TYPE_IDX); if (cal_block != NULL) topology = ((struct audio_cal_info_adm_top *) cal_block->cal_info)->topology; unlock: mutex_unlock(&cal_data->lock); mutex_unlock(&cal_data[ADM_LSM_TOPOLOGY_CAL_TYPE_IDX]->lock); } done: pr_debug("%s: Using topology %d\n", __func__, topology); return topology; Loading Loading @@ -2553,6 +2565,7 @@ static int msm_routing_lsm_func_put(struct snd_kcontrol *kcontrol, pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id, mad_type); adm_set_lsm_port_id(port_id); return afe_port_set_mad_type(port_id, mad_type); } Loading Loading @@ -16405,13 +16418,39 @@ int msm_routing_check_backend_enabled(int fedai_id) return 0; } static int get_cal_type_index(int32_t cal_type) { int ret = -EINVAL; switch (cal_type) { case ADM_TOPOLOGY_CAL_TYPE: ret = ADM_TOPOLOGY_CAL_TYPE_IDX; break; case ADM_LSM_TOPOLOGY_CAL_TYPE: ret = ADM_LSM_TOPOLOGY_CAL_TYPE_IDX; break; default: pr_err("%s: Invalid cal type %d\n", __func__, cal_type); } return ret; } static int msm_routing_set_cal(int32_t cal_type, size_t data_size, void *data) { int ret = 0; int cal_index; pr_debug("%s\n", __func__); ret = cal_utils_set_cal(data_size, data, cal_data, 0, NULL); cal_index = get_cal_type_index(cal_type); if (cal_index < 0) { pr_err("%s: Could not get cal index %d\n", __func__, cal_index); ret = -EINVAL; goto done; } ret = cal_utils_set_cal(data_size, data, cal_data[cal_index], 0, NULL); if (ret < 0) { pr_err("%s: cal_utils_set_cal failed, ret = %d, cal type = %d!\n", __func__, ret, cal_type); Loading @@ -16426,7 +16465,7 @@ static void msm_routing_delete_cal_data(void) { pr_debug("%s\n", __func__); cal_utils_destroy_cal_types(1, &cal_data); cal_utils_destroy_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0]); return; } Loading @@ -16434,16 +16473,21 @@ static void msm_routing_delete_cal_data(void) static int msm_routing_init_cal_data(void) { int ret = 0; struct cal_type_info cal_type_info = { {ADM_TOPOLOGY_CAL_TYPE, struct cal_type_info cal_type_info[] = { {{ADM_TOPOLOGY_CAL_TYPE, {NULL, NULL, NULL, msm_routing_set_cal, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} }, {{ADM_LSM_TOPOLOGY_CAL_TYPE, {NULL, NULL, NULL, msm_routing_set_cal, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} {NULL, NULL, cal_utils_match_buf_num} }, }; pr_debug("%s\n", __func__); ret = cal_utils_create_cal_types(1, &cal_data, &cal_type_info); ret = cal_utils_create_cal_types(MAX_ROUTING_CAL_TYPES, &cal_data[0], &cal_type_info[0]); if (ret < 0) { pr_err("%s: could not create cal type!\n", __func__);
sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h +6 −0 Original line number Diff line number Diff line Loading @@ -416,6 +416,12 @@ enum { #define BE_DAI_PORT_SESSIONS_IDX_MAX 4 #define BE_DAI_FE_SESSIONS_IDX_MAX 2 enum { ADM_TOPOLOGY_CAL_TYPE_IDX = 0, ADM_LSM_TOPOLOGY_CAL_TYPE_IDX, MAX_ROUTING_CAL_TYPES }; struct msm_pcm_routing_evt { void (*event_func)(enum msm_pcm_routing_event, void *); void *priv_data; Loading