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

This commit is contained in:
Linux Build Service Account 2017-12-16 03:09:25 -08:00 committed by Gerrit - the friendly Code Review server
commit 3a6d24603e

View file

@ -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;
}