Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 70f52433 authored by Kuirong Wang's avatar Kuirong Wang
Browse files

ASoC: wcd93xx: Remove delay for Slimbus during SSR recovery



When SLIMBUS data channel is to be torn down, CODEC driver
waits for channel removal interrupt from SLIMBUS slave device
with 1 second timeout as measure to prevent system from lock
down in case channel removal interrupt never arrive due to
known reason. When ADSP SSR happen, SLIMBUS would be reset
hence data channel will be gone inherently. Waiting for 1
second will only prolong SSR recovery latency. Update to
avoid the delay after SSR.

Change-Id: Ic6a94ddd1150ba143f4dd33aac1785d7d2ee7653
CRs-fixed: 653504
Signed-off-by: default avatarKuirong Wang <kuirongw@codeaurora.org>
parent 11e8434e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ struct wcd9xxx_codec_dai_data {
	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) \
+12 −2
Original line number Diff line number Diff line
@@ -4174,6 +4174,7 @@ static int tapan_codec_enable_slimrx(struct snd_soc_dapm_widget *w,

	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,
@@ -4182,6 +4183,7 @@ static int tapan_codec_enable_slimrx(struct snd_soc_dapm_widget *w,
	case SND_SOC_DAPM_POST_PMD:
		ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
						dai->grph);
		if (!dai->bus_down_in_recovery)
			ret = tapan_codec_enable_slim_chmask(dai, false);
		if (ret < 0) {
			ret = wcd9xxx_disconnect_port(core,
@@ -4197,6 +4199,7 @@ static int tapan_codec_enable_slimrx(struct snd_soc_dapm_widget *w,
			pm_runtime_put(core->dev->parent);
			dev_dbg(codec->dev, "%s: unvote requested", __func__);
		}
		dai->bus_down_in_recovery = false;
		break;
	}
	return ret;
@@ -4228,6 +4231,7 @@ static int tapan_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
	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,
@@ -4236,6 +4240,7 @@ static int tapan_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
	case SND_SOC_DAPM_POST_PMD:
		ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
						dai->grph);
		if (!dai->bus_down_in_recovery)
			ret = tapan_codec_enable_slim_chmask(dai, false);
		if (ret < 0) {
			ret = wcd9xxx_disconnect_port(core,
@@ -4251,6 +4256,7 @@ static int tapan_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
			pm_runtime_put(core->dev->parent);
			dev_dbg(codec->dev, "%s: unvote requested", __func__);
		}
		dai->bus_down_in_recovery = false;
		break;
	}
	return ret;
@@ -5750,6 +5756,7 @@ static int tapan_post_reset_cb(struct wcd9xxx *wcd9xxx)
	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);
@@ -5806,6 +5813,9 @@ static int tapan_post_reset_cb(struct wcd9xxx *wcd9xxx)

	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;
}
+19 −2
Original line number Diff line number Diff line
@@ -5190,6 +5190,7 @@ static int taiko_codec_enable_slimrx(struct snd_soc_dapm_widget *w,

	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,
@@ -5199,7 +5200,9 @@ static int taiko_codec_enable_slimrx(struct snd_soc_dapm_widget *w,
	case SND_SOC_DAPM_POST_PMD:
		ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
						dai->grph);
		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,
@@ -5207,6 +5210,7 @@ static int taiko_codec_enable_slimrx(struct snd_soc_dapm_widget *w,
			pr_debug("%s: Disconnect RX port, ret = %d\n",
				 __func__, ret);
		}
		dai->bus_down_in_recovery = false;
		break;
	}
	return ret;
@@ -5256,6 +5260,7 @@ static int taiko_codec_enable_slimvi_feedback(struct snd_soc_dapm_widget *w,
		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,
@@ -5272,6 +5277,8 @@ static int taiko_codec_enable_slimvi_feedback(struct snd_soc_dapm_widget *w,
		/*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:
@@ -5301,9 +5308,11 @@ static int taiko_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
		__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,
@@ -5312,7 +5321,9 @@ static int taiko_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
	case SND_SOC_DAPM_POST_PMD:
		ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
						dai->grph);
		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,
@@ -5320,6 +5331,8 @@ static int taiko_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
			pr_debug("%s: Disconnect RX port, ret = %d\n",
				 __func__, ret);
		}

		dai->bus_down_in_recovery = false;
		break;
	}
	return ret;
@@ -6856,6 +6869,7 @@ static int taiko_post_reset_cb(struct wcd9xxx *wcd9xxx)
	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);
@@ -6912,6 +6926,9 @@ static int taiko_post_reset_cb(struct wcd9xxx *wcd9xxx)
	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;
}
+17 −2
Original line number Diff line number Diff line
@@ -5222,6 +5222,7 @@ static int tomtom_codec_enable_slimrx(struct snd_soc_dapm_widget *w,

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		dai->bus_down_in_recovery = false;
		tomtom_codec_enable_int_port(dai, codec);
		(void) tomtom_codec_enable_slim_chmask(dai, true);
		ret = wcd9xxx_cfg_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
@@ -5231,6 +5232,7 @@ static int tomtom_codec_enable_slimrx(struct snd_soc_dapm_widget *w,
	case SND_SOC_DAPM_POST_PMD:
		ret = wcd9xxx_close_slim_sch_rx(core, &dai->wcd9xxx_ch_list,
						dai->grph);
		if (!dai->bus_down_in_recovery)
			ret = tomtom_codec_enable_slim_chmask(dai, false);
		if (ret < 0) {
			ret = wcd9xxx_disconnect_port(core,
@@ -5239,6 +5241,8 @@ static int tomtom_codec_enable_slimrx(struct snd_soc_dapm_widget *w,
			pr_debug("%s: Disconnect RX port, ret = %d\n",
				 __func__, ret);
		}

		dai->bus_down_in_recovery = false;
		break;
	}
	return ret;
@@ -5287,6 +5291,7 @@ static int tomtom_codec_enable_slimvi_feedback(struct snd_soc_dapm_widget *w,
		/*Enable spkr VI clocks*/
		snd_soc_update_bits(codec,
		TOMTOM_A_CDC_CLK_TX_CLK_EN_B2_CTL, 0xC, 0xC);
		dai->bus_down_in_recovery = false;
		tomtom_codec_enable_int_port(dai, codec);
		(void) tomtom_codec_enable_slim_chmask(dai, true);
		ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
@@ -5304,6 +5309,8 @@ static int tomtom_codec_enable_slimvi_feedback(struct snd_soc_dapm_widget *w,
		/*Disable V&I sensing*/
		snd_soc_update_bits(codec, TOMTOM_A_SPKR1_PROT_EN,
				0x88, 0x00);

		dai->bus_down_in_recovery = false;
		break;
	}
out_vi:
@@ -5335,6 +5342,7 @@ static int tomtom_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
	dai = &tomtom_p->dai[w->shift];
	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		dai->bus_down_in_recovery = false;
		tomtom_codec_enable_int_port(dai, codec);
		(void) tomtom_codec_enable_slim_chmask(dai, true);
		ret = wcd9xxx_cfg_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
@@ -5344,6 +5352,7 @@ static int tomtom_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
	case SND_SOC_DAPM_POST_PMD:
		ret = wcd9xxx_close_slim_sch_tx(core, &dai->wcd9xxx_ch_list,
						dai->grph);
		if (!dai->bus_down_in_recovery)
			ret = tomtom_codec_enable_slim_chmask(dai, false);
		if (ret < 0) {
			ret = wcd9xxx_disconnect_port(core,
@@ -5352,6 +5361,8 @@ static int tomtom_codec_enable_slimtx(struct snd_soc_dapm_widget *w,
			pr_debug("%s: Disconnect RX port, ret = %d\n",
				 __func__, ret);
		}

		dai->bus_down_in_recovery = false;
		break;
	}
	return ret;
@@ -6883,6 +6894,7 @@ static int tomtom_post_reset_cb(struct wcd9xxx *wcd9xxx)
	struct snd_soc_codec *codec;
	struct tomtom_priv *tomtom;
	int rco_clk_rate;
	int count;

	codec = (struct snd_soc_codec *)(wcd9xxx->ssr_priv);
	tomtom = snd_soc_codec_get_drvdata(codec);
@@ -6930,6 +6942,9 @@ static int tomtom_post_reset_cb(struct wcd9xxx *wcd9xxx)
	if (ret)
		pr_err("%s: Failed to setup irq: %d\n", __func__, ret);

	for (count = 0; count < NUM_CODEC_DAIS; count++)
		tomtom->dai[count].bus_down_in_recovery = true;

	mutex_unlock(&codec->mutex);
	return ret;
}