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

Commit 1fa7a4d8 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: set number of channels in voice call"

parents bcc5a9f7 fc74499f
Loading
Loading
Loading
Loading
+87 −37
Original line number Diff line number Diff line
@@ -274,7 +274,6 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
	{ SLIMBUS_5_RX, 0, 0, 0, 0, 0, 0, 0, LPASS_BE_SLIMBUS_5_RX},
};


/* Track ASM playback & capture sessions of DAI */
static struct msm_pcm_routing_fdai_data
	fe_dai_map[MSM_FRONTEND_DAI_MM_SIZE][2] = {
@@ -681,6 +680,43 @@ int msm_pcm_routing_reg_phy_compr_stream(int fe_id, int perf_mode,
	return 0;
}

static u32 msm_pcm_routing_get_voc_sessionid(u16 val)
{
	u32 session_id;

	switch (val) {
	case MSM_FRONTEND_DAI_CS_VOICE:
		session_id = voc_get_session_id(VOICE_SESSION_NAME);
		break;
	case MSM_FRONTEND_DAI_VOLTE:
		session_id = voc_get_session_id(VOLTE_SESSION_NAME);
		break;
	case MSM_FRONTEND_DAI_VOWLAN:
		session_id = voc_get_session_id(VOWLAN_SESSION_NAME);
		break;
	case MSM_FRONTEND_DAI_VOICE2:
		session_id = voc_get_session_id(VOICE2_SESSION_NAME);
		break;
	case MSM_FRONTEND_DAI_QCHAT:
		session_id = voc_get_session_id(QCHAT_SESSION_NAME);
		break;
	case MSM_FRONTEND_DAI_VOIP:
		session_id = voc_get_session_id(VOIP_SESSION_NAME);
		break;
	case MSM_FRONTEND_DAI_VOICEMMODE1:
		session_id = voc_get_session_id(VOICEMMODE1_NAME);
		break;
	case MSM_FRONTEND_DAI_VOICEMMODE2:
		session_id = voc_get_session_id(VOICEMMODE2_NAME);
		break;
	default:
		session_id = 0;
	}

	pr_debug("%s session_id 0x%x", __func__, session_id);
	return session_id;
}

int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode,
					int dspst_id, int stream_type)
{
@@ -920,6 +956,7 @@ static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
			((msm_bedais[reg].port_id == VOICE_PLAYBACK_TX) ||
			(msm_bedais[reg].port_id == VOICE2_PLAYBACK_TX)))
			voc_start_playback(set, msm_bedais[reg].port_id);

		set_bit(val, &msm_bedais[reg].fe_sessions);
		fdai = &fe_dai_map[val][session_type];
		if (msm_bedais[reg].active && fdai->strm_id !=
@@ -1076,25 +1113,11 @@ static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
{
	u32 session_id = 0;
	u16 path_type;

	pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);

	if (val == MSM_FRONTEND_DAI_CS_VOICE)
		session_id = voc_get_session_id(VOICE_SESSION_NAME);
	else if (val == MSM_FRONTEND_DAI_VOLTE)
		session_id = voc_get_session_id(VOLTE_SESSION_NAME);
	else if (val == MSM_FRONTEND_DAI_VOWLAN)
		session_id = voc_get_session_id(VOWLAN_SESSION_NAME);
	else if (val == MSM_FRONTEND_DAI_VOICE2)
		session_id = voc_get_session_id(VOICE2_SESSION_NAME);
	else if (val == MSM_FRONTEND_DAI_QCHAT)
		session_id = voc_get_session_id(QCHAT_SESSION_NAME);
	else if (val == MSM_FRONTEND_DAI_VOICEMMODE1)
		session_id = voc_get_session_id(VOICEMMODE1_NAME);
	else if (val == MSM_FRONTEND_DAI_VOICEMMODE2)
		session_id = voc_get_session_id(VOICEMMODE2_NAME);
	else
		session_id = voc_get_session_id(VOIP_SESSION_NAME);
	session_id = msm_pcm_routing_get_voc_sessionid(val);

	pr_debug("%s: FE DAI 0x%x session_id 0x%x\n",
		__func__, val, session_id);
@@ -1113,33 +1136,32 @@ static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
			 __func__, set, msm_bedais[reg].port_id);
		afe_set_dtmf_gen_rx_portid(msm_bedais[reg].port_id, set);
	}
	mutex_unlock(&routing_lock);

	if (afe_get_port_type(msm_bedais[reg].port_id) ==
						MSM_AFE_PORT_TYPE_RX) {
		voc_set_route_flag(session_id, RX_PATH, set);
						MSM_AFE_PORT_TYPE_RX)
		path_type = RX_PATH;
	else
		path_type = TX_PATH;

	if (set) {
			voc_set_rxtx_port(session_id,
				msm_bedais[reg].port_id, DEV_RX);
		if (msm_bedais[reg].active) {
			voc_set_route_flag(session_id, path_type, 1);
			voc_set_device_config(session_id, path_type,
			   msm_bedais[reg].channel, msm_bedais[reg].port_id);

			if (voc_get_route_flag(session_id, RX_PATH) &&
			   voc_get_route_flag(session_id, TX_PATH))
			if (voc_get_route_flag(session_id, TX_PATH) &&
				voc_get_route_flag(session_id, RX_PATH))
				voc_enable_device(session_id);
		} else {
			voc_disable_device(session_id);
			pr_debug("%s BE is not active\n", __func__);
		}
	} else {
		voc_set_route_flag(session_id, TX_PATH, set);
		if (set) {
			voc_set_rxtx_port(session_id,
				msm_bedais[reg].port_id, DEV_TX);
			if (voc_get_route_flag(session_id, RX_PATH) &&
			   voc_get_route_flag(session_id, TX_PATH))
				voc_enable_device(session_id);
		} else {
		voc_set_route_flag(session_id, path_type, 0);
		voc_disable_device(session_id);
	}
	}

	mutex_unlock(&routing_lock);

}

static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol,
@@ -5990,6 +6012,9 @@ static int msm_pcm_routing_close(struct snd_pcm_substream *substream)
	struct msm_pcm_routing_bdai_data *bedai;
	struct msm_pcm_routing_fdai_data *fdai;

	pr_debug("%s: substream->pcm->id:%s\n",
		 __func__, substream->pcm->id);

	if (be_id >= MSM_BACKEND_DAI_MAX) {
		pr_err("%s: unexpected be_id %d\n", __func__, be_id);
		return -EINVAL;
@@ -6048,8 +6073,12 @@ static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
	struct msm_pcm_routing_bdai_data *bedai;
	u32 channels, sample_rate;
	bool playback, capture;
	uint16_t bits_per_sample = 16;
	uint16_t bits_per_sample = 16, voc_path_type;
	struct msm_pcm_routing_fdai_data *fdai;
	u32 session_id;

	pr_debug("%s: substream->pcm->id:%s\n",
		 __func__, substream->pcm->id);

	if (be_id >= MSM_BACKEND_DAI_MAX) {
		pr_err("%s: unexpected be_id %d\n", __func__, be_id);
@@ -6141,6 +6170,27 @@ static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
		}
	}

	for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MAX) {
		session_id = msm_pcm_routing_get_voc_sessionid(i);
		if (session_id) {
			pr_debug("%s voice session_id: 0x%x",
				 __func__, session_id);

			if (session_type == SESSION_TYPE_TX)
				voc_path_type = TX_PATH;
			else
				voc_path_type = RX_PATH;

			voc_set_route_flag(session_id, voc_path_type, 1);
			voc_set_device_config(session_id,  voc_path_type,
					      bedai->channel, bedai->port_id);

			if (voc_get_route_flag(session_id, RX_PATH) &&
				voc_get_route_flag(session_id, TX_PATH))
					voc_enable_device(session_id);
		}
	}

done:
	mutex_unlock(&routing_lock);

+438 −146

File changed.

Preview size limit exceeded, changes collapsed.

+52 −4
Original line number Diff line number Diff line
@@ -40,6 +40,20 @@
#define CVD_VERSION_STRING_MAX_SIZE          31
#define CVD_VERSION_DEFAULT                  ""
#define CVD_VERSION_0_0                      "0.0"
#define CVD_VERSION_2_1                      "2.1"
#define CVD_VERSION_2_2                      "2.2"

#define CVD_INT_VERSION_DEFAULT              0
#define CVD_INT_VERSION_0_0                  1
#define CVD_INT_VERSION_2_1                  2
#define CVD_INT_VERSION_2_2                  3
#define CVD_INT_VERSION_LAST                 CVD_INT_VERSION_2_2
#define CVD_INT_VERSION_MAX                  (CVD_INT_VERSION_LAST + 1)

struct cvd_version_table {
	char cvd_ver[CVD_VERSION_STRING_MAX_SIZE];
	int cvd_ver_int;
};

int voc_get_cvd_version(char *);

@@ -90,6 +104,7 @@ struct device_data {
	uint32_t volume_step_value;
	uint32_t volume_ramp_duration_ms;
	uint32_t dev_mute_ramp_duration_ms;
	uint32_t no_of_channels;
};

struct voice_dev_route_state {
@@ -950,6 +965,12 @@ struct vss_istream_cmd_set_packet_exchange_mode_t {

#define VSS_IVOCPROC_CMD_SET_DEVICE_V2			0x000112C6

#define VSS_IVOCPROC_CMD_SET_DEVICE_V3			0x0001316A

#define VSS_IVOCPROC_CMD_TOPOLOGY_SET_DEV_CHANNELS	0x00013199

#define VSS_IVOCPROC_CMD_TOPOLOGY_COMMIT		0x00013198

#define VSS_IVOCPROC_CMD_SET_VP3_DATA			0x000110EB

#define VSS_IVOLUME_CMD_SET_STEP			0x000112C2
@@ -1032,6 +1053,12 @@ struct vss_istream_cmd_set_packet_exchange_mode_t {
/*CDMA EVRC-NW vocoder modem format */

#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2	0x000112BF
#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V3	0x00013169

#define VSS_NUM_DEV_CHANNELS_1 1
#define VSS_NUM_DEV_CHANNELS_2 2
#define VSS_NUM_DEV_CHANNELS_3 3
#define VSS_NUM_DEV_CHANNELS_4 4

struct vss_ivocproc_cmd_create_full_control_session_v2_t {
	uint16_t direction;
@@ -1197,6 +1224,24 @@ struct vss_ivocproc_cmd_register_volume_cal_data_t {
	 */
} __packed;

struct vss_ivocproc_cmd_topology_set_dev_channels_t {
	uint16_t tx_num_channels;
	/*
	 * Number of Mics.
	 * Supported values
	 * 1  VSS_NUM_DEV_CHANNELS_1
	 * 2  VSS_NUM_DEV_CHANNELS_2
	 * 3  VSS_NUM_DEV_CHANNELS_3
	 * 4  VSS_NUM_DEV_CHANNELS_4
	 */
	uint16_t rx_num_channels;
	/*
	 * Number of speaker channels.
	 * Supported values
	 * 1 VSS_NUM_DEV_CHANNELS_1
	 */
} __packed;

/* Starts a vocoder PCM session */
#define VSS_IVPCM_CMD_START_V2	0x00011339

@@ -1316,6 +1361,11 @@ struct cvp_set_device_cmd {
	struct vss_ivocproc_cmd_set_device_v2_t cvp_set_device_v2;
} __packed;

struct cvp_set_dev_channels_cmd {
	struct apr_hdr hdr;
	struct vss_ivocproc_cmd_topology_set_dev_channels_t cvp_set_channels;
} __packed;

struct cvp_set_vp3_data_cmd {
	struct apr_hdr hdr;
} __packed;
@@ -1670,9 +1720,6 @@ int voc_end_voice_call(uint32_t session_id);
int voc_standby_voice_call(uint32_t session_id);
int voc_resume_voice_call(uint32_t session_id);
int voc_set_lch(uint32_t session_id, enum voice_lch_mode lch_mode);
int voc_set_rxtx_port(uint32_t session_id,
		      uint32_t dev_port_id,
		      uint32_t dev_type);
int voc_set_rx_vol_step(uint32_t session_id, uint32_t dir, uint32_t vol_step,
			uint32_t ramp_duration);
int voc_set_tx_mute(uint32_t session_id, uint32_t dir, uint32_t mute,
@@ -1718,7 +1765,8 @@ int voc_enable_device(uint32_t session_id);
void voc_set_destroy_cvd_flag(bool is_destroy_cvd);
void voc_set_vote_bms_flag(bool is_vote_bms);
int voc_disable_topology(uint32_t session_id, uint32_t disable);

int voc_set_device_config(uint32_t session_id, uint8_t path_dir,
			  uint8_t no_of_channels, uint32_t dev_port_id);
uint32_t voice_get_topology(uint32_t topology_idx);
int voc_set_sound_focus(struct sound_focus_param sound_focus_param);
int voc_get_sound_focus(struct sound_focus_param *soundFocusData);