From 743a507eb04f57d119dee217eb70ab91b70e712a Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Mon, 23 Apr 2018 18:01:19 -0700 Subject: [PATCH] asoc: msm: add workqueue to handle SSR/PDR UP notification Use workqueue in machine driver to handle sending AFE configuration to DSP during SSR/PDR UP notification, so that the response to the notification is not delayed because of AVS not up or sound card not up. Change-Id: If537d214cfbbe7f85b66425cbd6a762f383c05ab Signed-off-by: Karthikeyan Mani --- asoc/sm8150.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/asoc/sm8150.c b/asoc/sm8150.c index 513d8447f913..f4bc02a0c5cb 100644 --- a/asoc/sm8150.c +++ b/asoc/sm8150.c @@ -167,6 +167,8 @@ struct msm_asoc_mach_data { struct device_node *hph_en1_gpio_p; /* used by pinctrl API */ struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ struct device_node *fsa_handle; + struct snd_soc_codec *codec; + struct work_struct adsp_power_up_work; }; struct msm_asoc_wcd93xx_codec { @@ -3878,6 +3880,19 @@ err: return ret; } +static void msm_adsp_power_up_config_work(struct work_struct *work) +{ + struct msm_asoc_mach_data *pdata; + struct snd_soc_codec *codec; + struct snd_card *card; + + pdata = container_of(work, struct msm_asoc_mach_data, + adsp_power_up_work); + codec = pdata->codec; + card = codec->component.card->snd_card; + msm_adsp_power_up_config(codec, card); +} + static int sm8150_notifier_service_cb(struct notifier_block *this, unsigned long opcode, void *ptr) { @@ -3886,6 +3901,7 @@ static int sm8150_notifier_service_cb(struct notifier_block *this, const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; struct snd_soc_pcm_runtime *rtd; struct snd_soc_codec *codec; + struct msm_asoc_mach_data *pdata; pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode); @@ -3920,13 +3936,9 @@ static int sm8150_notifier_service_cb(struct notifier_block *this, } codec = rtd->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", - __func__, ret); - goto err; - } + pdata = snd_soc_card_get_drvdata(card); + pdata->codec = codec; + schedule_work(&pdata->adsp_power_up_work); break; default: break; @@ -7414,6 +7426,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) dev_info(&pdev->dev, "Sound card %s registered\n", card->name); spdev = pdev; + INIT_WORK(&pdata->adsp_power_up_work, msm_adsp_power_up_config_work); + ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); if (ret) { dev_dbg(&pdev->dev, "%s: failed to add child nodes, ret=%d\n",