OSDN Git Service

Revert "ASoC: msm: decrement slim channel ref to set the property"
authorWalter Yang <yandongy@codeaurora.org>
Tue, 11 Apr 2017 03:22:41 +0000 (20:22 -0700)
committerGerrit - the friendly Code Review server <code-review@localhost>
Wed, 12 Apr 2017 05:38:59 +0000 (22:38 -0700)
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 <yandongy@codeaurora.org>
sound/soc/msm/qdsp6v2/msm-dai-slim.c

index 43a27eb..64ecd7e 100644 (file)
@@ -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);