OSDN Git Service

bluetooth: Fix slimbus shutdown sequence
authorSungjun Park <sjpark@codeaurora.org>
Thu, 23 Feb 2017 20:50:03 +0000 (12:50 -0800)
committerGerrit - the friendly Code Review server <code-review@localhost>
Fri, 24 Feb 2017 20:04:27 +0000 (12:04 -0800)
During slimbus shutdown process, registered codec
driver callback has been implemented in wrong seqeunce.
So, it causes audio data overflow and impact on next
audio streaming. To correct the sequence, slimbus port
disable routine should be performed when WCN codec shutdown
callback is called.

Change-Id: Id6ef22c34066adbb5b28bc31e605776c467bf03c
Signed-off-by: Sungjun Park <sjpark@codeaurora.org>
drivers/bluetooth/btfm_slim_codec.c

index 354b48b..0611771 100644 (file)
@@ -54,7 +54,7 @@ static int btfm_slim_dai_startup(struct snd_pcm_substream *substream,
        int ret;
        struct btfmslim *btfmslim = dai->dev->platform_data;
 
-       BTFMSLIM_DBG("substream = %s  stream = %d dai name = %s",
+       BTFMSLIM_DBG("substream = %s  stream = %d dai->name = %s",
                 substream->name, substream->stream, dai->name);
        ret = btfm_slim_hw_init(btfmslim);
        return ret;
@@ -63,33 +63,12 @@ static int btfm_slim_dai_startup(struct snd_pcm_substream *substream,
 static void btfm_slim_dai_shutdown(struct snd_pcm_substream *substream,
                struct snd_soc_dai *dai)
 {
-       struct btfmslim *btfmslim = dai->dev->platform_data;
-
-       BTFMSLIM_DBG("substream = %s  stream = %d dai name = %s",
-                substream->name, substream->stream, dai->name);
-       btfm_slim_hw_deinit(btfmslim);
-}
-
-static int btfm_slim_dai_hw_params(struct snd_pcm_substream *substream,
-                           struct snd_pcm_hw_params *params,
-                           struct snd_soc_dai *dai)
-{
-       BTFMSLIM_DBG("dai name = %s DAI-ID %x rate %d num_ch %d",
-               dai->name, dai->id, params_rate(params),
-               params_channels(params));
-
-       return 0;
-}
-
-int btfm_slim_dai_prepare(struct snd_pcm_substream *substream,
-       struct snd_soc_dai *dai)
-{
-       int i, ret = -EINVAL;
+       int i;
        struct btfmslim *btfmslim = dai->dev->platform_data;
        struct btfmslim_ch *ch;
        uint8_t rxport, grp = false, nchan = 1;
 
-       BTFMSLIM_DBG("dai name: %s, dai->id: %d, dai->rate: %d", dai->name,
+       BTFMSLIM_DBG("dai->name: %s, dai->id: %d, dai->rate: %d", dai->name,
                dai->id, dai->rate);
 
        switch (dai->id) {
@@ -110,7 +89,7 @@ int btfm_slim_dai_prepare(struct snd_pcm_substream *substream,
        case BTFM_SLIM_NUM_CODEC_DAIS:
        default:
                BTFMSLIM_ERR("dai->id is invalid:%d", dai->id);
-               return ret;
+               return;
        }
 
        /* Search for dai->id matched port handler */
@@ -122,14 +101,25 @@ int btfm_slim_dai_prepare(struct snd_pcm_substream *substream,
        if ((ch->port == BTFM_SLIM_PGD_PORT_LAST) ||
                (ch->id == BTFM_SLIM_NUM_CODEC_DAIS)) {
                BTFMSLIM_ERR("ch is invalid!!");
-               return ret;
+               return;
        }
 
-       ret = btfm_slim_enable_ch(btfmslim, ch, rxport, dai->rate, grp, nchan);
-       return ret;
+       btfm_slim_disable_ch(btfmslim, ch, rxport, grp, nchan);
+       btfm_slim_hw_deinit(btfmslim);
 }
 
-int btfm_slim_dai_hw_free(struct snd_pcm_substream *substream,
+static int btfm_slim_dai_hw_params(struct snd_pcm_substream *substream,
+                           struct snd_pcm_hw_params *params,
+                           struct snd_soc_dai *dai)
+{
+       BTFMSLIM_DBG("dai->name = %s DAI-ID %x rate %d num_ch %d",
+               dai->name, dai->id, params_rate(params),
+               params_channels(params));
+
+       return 0;
+}
+
+int btfm_slim_dai_prepare(struct snd_pcm_substream *substream,
        struct snd_soc_dai *dai)
 {
        int i, ret = -EINVAL;
@@ -137,7 +127,7 @@ int btfm_slim_dai_hw_free(struct snd_pcm_substream *substream,
        struct btfmslim_ch *ch;
        uint8_t rxport, grp = false, nchan = 1;
 
-       BTFMSLIM_DBG("dai name: %s, dai->id: %d, dai->rate: %d", dai->name,
+       BTFMSLIM_DBG("dai->name: %s, dai->id: %d, dai->rate: %d", dai->name,
                dai->id, dai->rate);
 
        switch (dai->id) {
@@ -172,7 +162,8 @@ int btfm_slim_dai_hw_free(struct snd_pcm_substream *substream,
                BTFMSLIM_ERR("ch is invalid!!");
                return ret;
        }
-       ret = btfm_slim_disable_ch(btfmslim, ch, rxport, grp, nchan);
+
+       ret = btfm_slim_enable_ch(btfmslim, ch, rxport, dai->rate, grp, nchan);
        return ret;
 }
 
@@ -315,7 +306,6 @@ static struct snd_soc_dai_ops btfmslim_dai_ops = {
        .shutdown = btfm_slim_dai_shutdown,
        .hw_params = btfm_slim_dai_hw_params,
        .prepare = btfm_slim_dai_prepare,
-       .hw_free = btfm_slim_dai_hw_free,
        .set_channel_map = btfm_slim_dai_set_channel_map,
        .get_channel_map = btfm_slim_dai_get_channel_map,
 };