Merge "ASoC: wcd93xx: Remove delay for Slimbus during SSR recovery"
diff --git a/include/linux/mfd/wcd9xxx/core.h b/include/linux/mfd/wcd9xxx/core.h
index 85be7c3..a8e792b 100644
--- a/include/linux/mfd/wcd9xxx/core.h
+++ b/include/linux/mfd/wcd9xxx/core.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, 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
@@ -133,6 +133,7 @@
u16 grph; /* slimbus group handle */
unsigned long ch_mask;
wait_queue_head_t dai_wait;
+ bool bus_down_in_recovery;
};
#define WCD9XXX_CH(xport, xshift) \
diff --git a/sound/soc/codecs/wcd9306.c b/sound/soc/codecs/wcd9306.c
index 61a0682..38d7901 100644
--- a/sound/soc/codecs/wcd9306.c
+++ b/sound/soc/codecs/wcd9306.c
@@ -4154,6 +4154,7 @@
switch (event) {
case SND_SOC_DAPM_POST_PMU:
+ dai->bus_down_in_recovery = false;
(void) tapan_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -4162,7 +4163,8 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = tapan_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = tapan_codec_enable_slim_chmask(dai, false);
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -4177,6 +4179,7 @@
pm_runtime_put(core->dev->parent);
dev_dbg(codec->dev, "%s: unvote requested", __func__);
}
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -4208,6 +4211,7 @@
dai = &tapan_p->dai[w->shift];
switch (event) {
case SND_SOC_DAPM_POST_PMU:
+ dai->bus_down_in_recovery = false;
(void) tapan_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -4216,7 +4220,8 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = tapan_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = tapan_codec_enable_slim_chmask(dai, false);
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -4231,6 +4236,7 @@
pm_runtime_put(core->dev->parent);
dev_dbg(codec->dev, "%s: unvote requested", __func__);
}
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -5732,6 +5738,7 @@
int rco_clk_rate;
struct snd_soc_codec *codec;
struct tapan_priv *tapan;
+ int count;
codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
tapan = snd_soc_codec_get_drvdata(codec);
@@ -5788,6 +5795,9 @@
tapan->machine_codec_event_cb(codec, WCD9XXX_CODEC_EVENT_CODEC_UP);
+ for (count = 0; count < NUM_CODEC_DAIS; count++)
+ tapan->dai[count].bus_down_in_recovery = true;
+
mutex_unlock(&codec->mutex);
return ret;
}
diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c
index d749715..4c5d327 100644
--- a/sound/soc/codecs/wcd9320.c
+++ b/sound/soc/codecs/wcd9320.c
@@ -5144,6 +5144,7 @@
switch (event) {
case SND_SOC_DAPM_POST_PMU:
+ dai->bus_down_in_recovery = false;
taiko_codec_enable_int_port(dai, codec);
(void) taiko_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
@@ -5153,7 +5154,9 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = taiko_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = taiko_codec_enable_slim_chmask(dai, false);
+
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -5161,6 +5164,7 @@
pr_debug("%s: Disconnect RX port, ret = %d\n",
__func__, ret);
}
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -5210,6 +5214,7 @@
snd_soc_update_bits(codec,
TAIKO_A_CDC_CLK_TX_CLK_EN_B2_CTL, 0xC, 0xC);
taiko_codec_enable_int_port(dai, codec);
+ dai->bus_down_in_recovery = false;
(void) taiko_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -5226,6 +5231,8 @@
/*Disable V&I sensing*/
snd_soc_update_bits(codec, TAIKO_A_SPKR_PROT_EN,
0x88, 0x00);
+
+ dai->bus_down_in_recovery = false;
break;
}
out_vi:
@@ -5255,9 +5262,11 @@
__func__, w->name, event, w->shift);
dai = &taiko_p->dai[w->shift];
+
switch (event) {
case SND_SOC_DAPM_POST_PMU:
taiko_codec_enable_int_port(dai, codec);
+ dai->bus_down_in_recovery = false;
(void) taiko_codec_enable_slim_chmask(dai, true);
ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->rate, dai->bit_width,
@@ -5266,7 +5275,9 @@
case SND_SOC_DAPM_POST_PMD:
ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
dai->grph);
- ret = taiko_codec_enable_slim_chmask(dai, false);
+ if (!dai->bus_down_in_recovery)
+ ret = taiko_codec_enable_slim_chmask(dai, false);
+
if (ret < 0) {
ret = wcd9xxx_disconnect_port(core,
&dai->wcd9xxx_ch_list,
@@ -5274,6 +5285,8 @@
pr_debug("%s: Disconnect RX port, ret = %d\n",
__func__, ret);
}
+
+ dai->bus_down_in_recovery = false;
break;
}
return ret;
@@ -6810,6 +6823,7 @@
struct snd_soc_codec *codec;
struct taiko_priv *taiko;
int rco_clk_rate;
+ int count;
codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
taiko = snd_soc_codec_get_drvdata(codec);
@@ -6866,6 +6880,9 @@
if (ret)
pr_err("%s: Failed to setup irq: %d\n", __func__, ret);
+ for (count = 0; count < NUM_CODEC_DAIS; count++)
+ taiko->dai[count].bus_down_in_recovery = true;
+
mutex_unlock(&codec->mutex);
return ret;
}