Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5e74732 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ASoC: msm: qdsp6v2: Add support for new ADM LSM cal types"

parents 69a1512c a24d5f8a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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,
@@ -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__ */
+5 −0
Original line number Diff line number Diff line
@@ -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,
};

@@ -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,
+4 −0
Original line number Diff line number Diff line
@@ -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:
+69 −25
Original line number Diff line number Diff line
@@ -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;
@@ -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;
		}
	}
@@ -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;
@@ -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);
@@ -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,
@@ -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;
@@ -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);
}
@@ -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);
@@ -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;
}
@@ -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__);
+6 −0
Original line number Diff line number Diff line
@@ -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