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

Commit 68a7887a authored by Bhalchandra Gajare's avatar Bhalchandra Gajare Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: msm-cpe-lsm: Fix sequence for LAB data channel



It is observed that there is data loss during buffering for LAB due to
the sequence in which the AFE port is started and the data channel is
established. Fix the sequence to avoid data loss.

Change-Id: I95b365e20005d1cce0a62630417ba2f54489c4c4
Signed-off-by: default avatarBhalchandra Gajare <gajare@codeaurora.org>
parent 7b11e381
Loading
Loading
Loading
Loading
+31 −27
Original line number Diff line number Diff line
@@ -374,15 +374,6 @@ static int msm_cpe_lsm_lab_stop(struct snd_pcm_substream *substream)
			"%s: open data failed %d\n", __func__, rc);
	dma_data->ph = 0;

	rc = lsm_ops->lab_ch_setup(cpe->core_handle,
				   session,
				   WCD_CPE_POST_DISABLE);
	if (rc)
		dev_err(rtd->dev,
			"%s: POST ch teardown failed, err = %d\n",
			__func__, rc);
	lab_d->thread_status = MSM_LSM_LAB_THREAD_STOP;

	/*
	 * Even though LAB stop failed,
	 * output AFE port needs to be stopped
@@ -393,6 +384,16 @@ static int msm_cpe_lsm_lab_stop(struct snd_pcm_substream *substream)
		dev_err(rtd->dev,
			"%s: AFE out port stop failed, err = %d\n",
			__func__, rc);

	rc = lsm_ops->lab_ch_setup(cpe->core_handle,
				   session,
				   WCD_CPE_POST_DISABLE);
	if (rc)
		dev_err(rtd->dev,
			"%s: POST ch teardown failed, err = %d\n",
			__func__, rc);
	lab_d->thread_status = MSM_LSM_LAB_THREAD_STOP;

	return 0;
}

@@ -517,6 +518,7 @@ static int msm_cpe_lab_thread(void *data)
	struct cpe_hw_params *hw_params = &lsm_d->hw_params;
	struct cpe_priv *cpe = cpe_get_private_data(substream);
	struct wcd_cpe_lsm_ops *lsm_ops;
	struct wcd_cpe_afe_ops *afe_ops;
	struct cpe_data_pcm_buf *cur_buf, *next_buf;
	struct msm_slim_dma_data *dma_data = NULL;
	struct snd_soc_pcm_runtime *rtd = NULL;
@@ -553,6 +555,7 @@ static int msm_cpe_lab_thread(void *data)
	}

	lsm_ops = &cpe->lsm_ops;
	afe_ops = &cpe->afe_ops;

	if (!kthread_should_stop()) {
		rc = lsm_ops->lab_ch_setup(cpe->core_handle,
@@ -572,16 +575,6 @@ static int msm_cpe_lab_thread(void *data)
			goto done;
		}

		rc = lsm_ops->lab_ch_setup(cpe->core_handle,
					   session,
					   WCD_CPE_POST_ENABLE);
		if (rc) {
			dev_err(rtd->dev,
				"%s: POST ch setup failed, err = %d\n",
				__func__, rc);
			goto done;
		}

		dev_dbg(rtd->dev, "%s: Established data channel\n",
			__func__);

@@ -600,6 +593,25 @@ static int msm_cpe_lab_thread(void *data)

		cur_buf = &lab_d->pcm_buf[0];
		next_buf = &lab_d->pcm_buf[1];
		rc = lsm_ops->lab_ch_setup(cpe->core_handle,
					   session,
					   WCD_CPE_POST_ENABLE);
		if (rc) {
			dev_err(rtd->dev,
				"%s: POST ch setup failed, err = %d\n",
				__func__, rc);
			goto done;
		}

		rc = afe_ops->afe_port_start(cpe->core_handle,
				&session->afe_out_port_cfg);
		if (rc) {
			dev_err(rtd->dev,
				"%s: AFE out port start failed, err = %d\n",
				__func__, rc);
			goto done;
		}

	} else {
		dev_dbg(rtd->dev,
			"%s: LAB stopped before starting read\n",
@@ -1534,14 +1546,6 @@ static int msm_cpe_lsm_lab_start(struct snd_pcm_substream *substream,
			return rc;
		}

		rc = afe_ops->afe_port_start(cpe->core_handle, out_port);
		if (rc) {
			dev_err(rtd->dev,
				"%s: AFE out port start failed, err = %d\n",
				__func__, rc);
			return rc;
		}

		atomic_set(&lab_d->abort_read, 0);
		dev_dbg(rtd->dev,
			"%s: KW detected, scheduling LAB thread\n",