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

Commit 3a6d2460 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "asoc: sdm845: check sound card status before sending AFE config"

parents 00559843 9e31a8a6
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -3641,31 +3641,44 @@ static void msm_afe_clear_config(void)
	afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG);
}

static int msm_adsp_power_up_config(struct snd_soc_codec *codec)
static int msm_adsp_power_up_config(struct snd_soc_codec *codec,
				    struct snd_card *card)
{
	int ret = 0;
	unsigned long timeout;
	int adsp_ready = 0;
	bool snd_card_online = 0;

	timeout = jiffies +
		msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS);

	do {
		if (q6core_is_adsp_ready()) {
			pr_debug("%s: ADSP Audio is ready\n", __func__);
			adsp_ready = 1;
			break;
		if (!snd_card_online) {
			snd_card_online = snd_card_is_online_state(card);
			pr_debug("%s: Sound card is %s\n", __func__,
				 snd_card_online ? "Online" : "Offline");
		}
		if (!adsp_ready) {
			adsp_ready = q6core_is_adsp_ready();
			pr_debug("%s: ADSP Audio is %s\n", __func__,
				 adsp_ready ? "ready" : "not ready");
		}
		if (snd_card_online && adsp_ready)
			break;

		/*
		 * ADSP will be coming up after subsystem restart and
		 * Sound card/ADSP will be coming up after subsystem restart and
		 * it might not be fully up when the control reaches
		 * here. So, wait for 50msec before checking ADSP state
		 */
		msleep(50);
	} while (time_after(timeout, jiffies));

	if (!adsp_ready) {
		pr_err("%s: timed out waiting for ADSP Audio\n", __func__);
	if (!snd_card_online || !adsp_ready) {
		pr_err("%s: Timeout. Sound card is %s, ADSP Audio is %s\n",
		       __func__,
		       snd_card_online ? "Online" : "Offline",
		       adsp_ready ? "ready" : "not ready");
		ret = -ETIMEDOUT;
		goto err;
	}
@@ -3723,7 +3736,7 @@ static int sdm845_notifier_service_cb(struct notifier_block *this,
		}
		codec = rtd->codec;

		ret = msm_adsp_power_up_config(codec);
		ret = msm_adsp_power_up_config(codec, card->snd_card);
		if (ret < 0) {
			dev_err(card->dev,
				"%s: msm_adsp_power_up_config failed ret = %d!\n",
@@ -3821,7 +3834,7 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)

	msm_codec_fn.get_afe_config_fn = tavil_get_afe_config;

	ret = msm_adsp_power_up_config(codec);
	ret = msm_adsp_power_up_config(codec, rtd->card->snd_card);
	if (ret) {
		pr_err("%s: Failed to set AFE config %d\n", __func__, ret);
		goto err;
@@ -7069,6 +7082,7 @@ static int msm_asoc_machine_remove(struct platform_device *pdev)
	struct msm_asoc_mach_data *pdata =
				snd_soc_card_get_drvdata(card);

	audio_notifier_deregister("sdm845");
	if (pdata->us_euro_gpio > 0) {
		gpio_free(pdata->us_euro_gpio);
		pdata->us_euro_gpio = 0;
@@ -7077,7 +7091,6 @@ static int msm_asoc_machine_remove(struct platform_device *pdev)

	msm_release_pinctrl(pdev);
	snd_soc_unregister_card(card);
	audio_notifier_deregister("sdm845");
	return 0;
}