From 7b35d8ac229221bb6e26741575439eff0f2d8b59 Mon Sep 17 00:00:00 2001 From: Walter Yang Date: Mon, 10 Apr 2017 20:22:41 -0700 Subject: [PATCH] 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: Walter Yang --- sound/soc/msm/qdsp6v2/msm-dai-slim.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dai-slim.c b/sound/soc/msm/qdsp6v2/msm-dai-slim.c index 43a27eb35a44..64ecd7e031f0 100644 --- a/sound/soc/msm/qdsp6v2/msm-dai-slim.c +++ b/sound/soc/msm/qdsp6v2/msm-dai-slim.c @@ -1,5 +1,5 @@ /* - * 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 @@ -314,7 +314,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) { @@ -351,10 +351,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; @@ -378,6 +374,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; } @@ -387,6 +385,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); @@ -405,6 +404,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); -- 2.11.0