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

Commit c1f7a073 authored by Walter Yang's avatar Walter Yang Committed by Gerrit - the friendly Code Review server
Browse files

Revert "ASoC: msm: decrement slim channel ref to set the property"



This reverts commit 8777df6c6eabb099c5069081dc991bb819337ff6
("ASoC: msm: decrement slim channel ref to set the property").

Slimbus channel deallocate and slimbus channel query should
happen in pair to ensure the ref count and state of the
channel are both in correct value.

CRs-Fixed: 1102349
Change-Id: Ie15f6e65448194ba781160856dd3f4e2ab081de1
Signed-off-by: default avatarWalter Yang <yandongy@codeaurora.org>
parent cd2c6fa6
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -329,7 +329,7 @@ static int msm_dai_slim_prepare(struct snd_pcm_substream *substream,
	struct msm_slim_dai_data *dai_data = NULL;
	struct slim_ch prop;
	int rc;
	u8 i;
	u8 i, j;

	dai_data = msm_slim_get_dai_data(drv_data, dai);
	if (!dai_data) {
@@ -366,10 +366,6 @@ static int msm_dai_slim_prepare(struct snd_pcm_substream *substream,
		}
	}

	/* To decrement the channel ref count*/
	for (i = 0; i < dai_data->ch_cnt; i++)
		slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[i]);

	prop.prot = SLIM_AUTO_ISO;
	prop.baser = SLIM_RATE_4000HZ;
	prop.dataf = SLIM_CH_DATAF_NOT_DEFINED;
@@ -393,6 +389,8 @@ static int msm_dai_slim_prepare(struct snd_pcm_substream *substream,

error_define_chan:
error_chan_query:
	for (j = 0; j < i; j++)
		slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[j]);
	return rc;
}

@@ -402,6 +400,7 @@ static void msm_dai_slim_shutdown(struct snd_pcm_substream *stream,
	struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev);
	struct msm_slim_dma_data *dma_data = NULL;
	struct msm_slim_dai_data *dai_data;
	int i, rc = 0;

	dai_data = msm_slim_get_dai_data(drv_data, dai);
	dma_data = snd_soc_dai_get_dma_data(dai, stream);
@@ -420,6 +419,15 @@ static void msm_dai_slim_shutdown(struct snd_pcm_substream *stream,
		return;
	}

	for (i = 0; i < dai_data->ch_cnt; i++) {
		rc = slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[i]);
		if (rc) {
			dev_err(dai->dev,
				"%s: dealloc_ch failed, err = %d\n",
				__func__, rc);
		}
	}

	snd_soc_dai_set_dma_data(dai, stream, NULL);
	/* clear prepared state for the dai */
	CLR_DAI_STATE(dai_data->status, DAI_STATE_PREPARED);