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

Commit 6934044c 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: move tdm grp mgt to afe for anc support"

parents 2223ffa6 dc4f540f
Loading
Loading
Loading
Loading
+81 −0
Original line number Diff line number Diff line
@@ -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,
+0 −80
Original line number Diff line number Diff line
@@ -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);
+75 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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);
@@ -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);
@@ -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;
}

@@ -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;
}