summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSungjun Park <sjpark@codeaurora.org>2017-02-23 12:50:03 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-02-24 12:04:27 -0800
commitd28b85777aa90bf0f391f145e54b22c99641f6a6 (patch)
tree5068e7ad5eb6e68bc271b0d4677233d19d145e4b
parent98094e2149dad0658346d504edde8aac9a921500 (diff)
bluetooth: Fix slimbus shutdown sequence
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>
-rw-r--r--drivers/bluetooth/btfm_slim_codec.c54
1 files changed, 22 insertions, 32 deletions
diff --git a/drivers/bluetooth/btfm_slim_codec.c b/drivers/bluetooth/btfm_slim_codec.c
index 354b48bfa2a8..061177173ab8 100644
--- a/drivers/bluetooth/btfm_slim_codec.c
+++ b/drivers/bluetooth/btfm_slim_codec.c
@@ -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,
};