diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 0aed70c4b5..af0b40ed18 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -57,7 +57,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; @@ -883,21 +883,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; - + 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; } } @@ -907,7 +907,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; @@ -916,7 +917,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); @@ -931,7 +932,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, @@ -941,28 +942,37 @@ static int msm_routing_get_adm_topology(int fedai_id, int session_type, struct cal_block_data *cal_block = NULL; int app_type = 0, acdb_dev_id = 0; - pr_debug("%s: fedai_id %d, session_type %d, be_id %d\n", __func__, fedai_id, session_type, be_id); 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; + mutex_unlock(&cal_data[ADM_LSM_TOPOLOGY_CAL_TYPE_IDX]->lock); + } - topology = ((struct audio_cal_info_adm_top *) - cal_block->cal_info)->topology; -unlock: - mutex_unlock(&cal_data->lock); done: pr_debug("%s: Using topology %d\n", __func__, topology); return topology; @@ -2562,6 +2572,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); } @@ -17146,14 +17157,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); @@ -17168,22 +17204,27 @@ 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]); } 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} + {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} }, }; 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__); diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h index 5360b5b5f7..a1977b4b37 100644 --- a/asoc/msm-pcm-routing-v2.h +++ b/asoc/msm-pcm-routing-v2.h @@ -433,6 +433,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; diff --git a/dsp/audio_cal_utils.c b/dsp/audio_cal_utils.c index 743bd93ce8..ad1dc3d35c 100644 --- a/dsp/audio_cal_utils.c +++ b/dsp/audio_cal_utils.c @@ -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: @@ -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: @@ -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: @@ -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: diff --git a/dsp/q6adm.c b/dsp/q6adm.c index 77c28976e3..2539be54a9 100644 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -104,6 +104,7 @@ struct adm_ctl { int num_ec_ref_rx_chans; int ec_ref_rx_bit_width; int ec_ref_rx_sampling_rate; + int lsm_port_id; }; static struct adm_ctl this_adm; @@ -2144,7 +2145,8 @@ static struct cal_block_data *adm_find_cal_by_path(int cal_index, int path) cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_index == ADM_AUDPROC_CAL) { + if (cal_index == ADM_AUDPROC_CAL || + cal_index == ADM_LSM_AUDPROC_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (cal_block->cal_data.size > 0)) @@ -2177,7 +2179,8 @@ static struct cal_block_data *adm_find_cal_by_app_type(int cal_index, int path, cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_index == ADM_AUDPROC_CAL) { + if (cal_index == ADM_AUDPROC_CAL || + cal_index == ADM_LSM_AUDPROC_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (audproc_cal_info->app_type == app_type) && @@ -2214,7 +2217,8 @@ static struct cal_block_data *adm_find_cal(int cal_index, int path, cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_index == ADM_AUDPROC_CAL) { + if (cal_index == ADM_AUDPROC_CAL || + cal_index == ADM_LSM_AUDPROC_CAL) { audproc_cal_info = cal_block->cal_info; if ((audproc_cal_info->path == path) && (audproc_cal_info->app_type == app_type) && @@ -2295,13 +2299,22 @@ static int get_cal_path(int path) return TX_DEVICE; } +void adm_set_lsm_port_id(int port_id) +{ + this_adm.lsm_port_id = port_id; +} + static void send_adm_cal(int port_id, int copp_idx, int path, int perf_mode, int app_type, int acdb_id, int sample_rate) { pr_debug("%s: port id 0x%x copp_idx %d\n", __func__, port_id, copp_idx); - send_adm_cal_type(ADM_AUDPROC_CAL, path, port_id, copp_idx, perf_mode, - app_type, acdb_id, sample_rate); + if (port_id != this_adm.lsm_port_id) + send_adm_cal_type(ADM_AUDPROC_CAL, path, port_id, copp_idx, + perf_mode, app_type, acdb_id, sample_rate); + else + send_adm_cal_type(ADM_LSM_AUDPROC_CAL, path, port_id, copp_idx, + perf_mode, app_type, acdb_id, sample_rate); send_adm_cal_type(ADM_AUDVOL_CAL, path, port_id, copp_idx, perf_mode, app_type, acdb_id, sample_rate); } @@ -3447,6 +3460,9 @@ static int get_cal_type_index(int32_t cal_type) case ADM_AUDPROC_CAL_TYPE: ret = ADM_AUDPROC_CAL; break; + case ADM_LSM_AUDPROC_CAL_TYPE: + ret = ADM_LSM_AUDPROC_CAL; + break; case ADM_AUDVOL_CAL_TYPE: ret = ADM_AUDVOL_CAL; break; @@ -3654,6 +3670,12 @@ static int adm_init_cal_data(void) {adm_map_cal_data, adm_unmap_cal_data, cal_utils_match_buf_num} }, + {{ADM_LSM_AUDPROC_CAL_TYPE, + {adm_alloc_cal, adm_dealloc_cal, NULL, + adm_set_cal, NULL, NULL} }, + {adm_map_cal_data, adm_unmap_cal_data, + cal_utils_match_buf_num} }, + {{ADM_AUDVOL_CAL_TYPE, {adm_alloc_cal, adm_dealloc_cal, NULL, adm_set_cal, NULL, NULL} }, @@ -4460,7 +4482,7 @@ int adm_store_cal_data(int port_id, int copp_idx, int path, int perf_mode, goto unlock; } - if (cal_index == ADM_AUDPROC_CAL) { + if (cal_index == ADM_AUDPROC_CAL || cal_index == ADM_LSM_AUDPROC_CAL) { if (cal_block->cal_data.size > AUD_PROC_BLOCK_SIZE) { pr_err("%s:audproc:invalid size exp/actual[%zd, %d]\n", __func__, cal_block->cal_data.size, *size); diff --git a/include/dsp/q6adm-v2.h b/include/dsp/q6adm-v2.h index 6a6d3b23f1..19a844c316 100644 --- a/include/dsp/q6adm-v2.h +++ b/include/dsp/q6adm-v2.h @@ -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, @@ -186,4 +187,5 @@ int adm_programable_channel_mixer(int port_id, int copp_idx, int session_id, int channel_index); void msm_dts_srs_acquire_lock(void); void msm_dts_srs_release_lock(void); +void adm_set_lsm_port_id(int port_id); #endif /* __Q6_ADM_V2_H__ */ diff --git a/include/uapi/linux/msm_audio_calibration.h b/include/uapi/linux/msm_audio_calibration.h index 27dacde651..3b97ab2bf1 100644 --- a/include/uapi/linux/msm_audio_calibration.h +++ b/include/uapi/linux/msm_audio_calibration.h @@ -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, }; @@ -111,6 +113,9 @@ enum { #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 #define TOPOLOGY_SPECIFIC_CHANNEL_INFO #define MSM_SPKR_PROT_SPV3